You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ManagedListener.cxx 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. /* Copyright (C) 2005 RealVNC Ltd. All Rights Reserved.
  2. *
  3. * This is free software; you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License as published by
  5. * the Free Software Foundation; either version 2 of the License, or
  6. * (at your option) any later version.
  7. *
  8. * This software is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this software; if not, write to the Free Software
  15. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
  16. * USA.
  17. */
  18. #include <winvnc/ManagedListener.h>
  19. #include <rfb/LogWriter.h>
  20. using namespace winvnc;
  21. using namespace rfb;
  22. using namespace win32;
  23. static LogWriter vlog("ManagedListener");
  24. ManagedListener::ManagedListener(SocketManager* mgr)
  25. : filter(0), manager(mgr), addrChangeNotifier(0), server(0), port(0), localOnly(false) {
  26. }
  27. ManagedListener::~ManagedListener() {
  28. if (!sockets.empty()) {
  29. std::list<network::SocketListener*>::iterator iter;
  30. for (iter = sockets.begin(); iter != sockets.end(); ++iter)
  31. manager->remListener(*iter);
  32. sockets.clear();
  33. }
  34. delete filter;
  35. }
  36. void ManagedListener::setServer(network::SocketServer* svr) {
  37. if (svr == server)
  38. return;
  39. vlog.info("set server to %p", svr);
  40. server = svr;
  41. refresh();
  42. }
  43. void ManagedListener::setPort(int port_, bool localOnly_) {
  44. if ((port_ == port) && (localOnly == localOnly_))
  45. return;
  46. vlog.info("set port to %d", port_);
  47. port = port_;
  48. localOnly = localOnly_;
  49. refresh();
  50. }
  51. void ManagedListener::setFilter(const char* filterStr) {
  52. vlog.info("set filter to %s", filterStr);
  53. delete filter;
  54. filter = new network::TcpFilter(filterStr);
  55. if (!sockets.empty() && !localOnly) {
  56. std::list<network::SocketListener*>::iterator iter;
  57. for (iter = sockets.begin(); iter != sockets.end(); ++iter)
  58. (*iter)->setFilter(filter);
  59. }
  60. }
  61. void ManagedListener::setAddressChangeNotifier(SocketManager::AddressChangeNotifier* acn) {
  62. if (acn == addrChangeNotifier)
  63. return;
  64. addrChangeNotifier = acn;
  65. refresh();
  66. }
  67. bool ManagedListener::isListening() {
  68. return !sockets.empty();
  69. }
  70. void ManagedListener::refresh() {
  71. std::list<network::SocketListener*>::iterator iter;
  72. if (!sockets.empty()) {
  73. for (iter = sockets.begin(); iter != sockets.end(); ++iter)
  74. manager->remListener(*iter);
  75. sockets.clear();
  76. }
  77. if (!server)
  78. return;
  79. try {
  80. if (port) {
  81. if (localOnly)
  82. network::createLocalTcpListeners(&sockets, port);
  83. else
  84. network::createTcpListeners(&sockets, NULL, port);
  85. }
  86. } catch (rdr::Exception& e) {
  87. vlog.error("%s", e.str());
  88. }
  89. if (!sockets.empty()) {
  90. if (!localOnly) {
  91. for (iter = sockets.begin(); iter != sockets.end(); ++iter)
  92. (*iter)->setFilter(filter);
  93. }
  94. try {
  95. for (iter = sockets.begin(); iter != sockets.end(); ++iter)
  96. manager->addListener(*iter, server, addrChangeNotifier);
  97. } catch (...) {
  98. std::list<network::SocketListener*>::iterator iter2;
  99. for (iter2 = sockets.begin(); iter2 != iter; ++iter2)
  100. manager->remListener(*iter2);
  101. for (; iter2 != sockets.end(); ++iter2)
  102. delete *iter;
  103. sockets.clear();
  104. throw;
  105. }
  106. }
  107. }