Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

ManagedListener.cxx 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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. #ifdef HAVE_CONFIG_H
  19. #include <config.h>
  20. #endif
  21. #include <winvnc/ManagedListener.h>
  22. #include <rfb/LogWriter.h>
  23. using namespace winvnc;
  24. using namespace rfb;
  25. using namespace win32;
  26. static LogWriter vlog("ManagedListener");
  27. ManagedListener::ManagedListener(SocketManager* mgr)
  28. : filter(0), manager(mgr), addrChangeNotifier(0), server(0), port(0), localOnly(false) {
  29. }
  30. ManagedListener::~ManagedListener() {
  31. if (!sockets.empty()) {
  32. std::list<network::SocketListener*>::iterator iter;
  33. for (iter = sockets.begin(); iter != sockets.end(); ++iter)
  34. manager->remListener(*iter);
  35. sockets.clear();
  36. }
  37. delete filter;
  38. }
  39. void ManagedListener::setServer(network::SocketServer* svr) {
  40. if (svr == server)
  41. return;
  42. vlog.info("set server to %p", svr);
  43. server = svr;
  44. refresh();
  45. }
  46. void ManagedListener::setPort(int port_, bool localOnly_) {
  47. if ((port_ == port) && (localOnly == localOnly_))
  48. return;
  49. vlog.info("set port to %d", port_);
  50. port = port_;
  51. localOnly = localOnly_;
  52. refresh();
  53. }
  54. void ManagedListener::setFilter(const char* filterStr) {
  55. vlog.info("set filter to %s", filterStr);
  56. delete filter;
  57. filter = new network::TcpFilter(filterStr);
  58. if (!sockets.empty() && !localOnly) {
  59. std::list<network::SocketListener*>::iterator iter;
  60. for (iter = sockets.begin(); iter != sockets.end(); ++iter)
  61. (*iter)->setFilter(filter);
  62. }
  63. }
  64. void ManagedListener::setAddressChangeNotifier(SocketManager::AddressChangeNotifier* acn) {
  65. if (acn == addrChangeNotifier)
  66. return;
  67. addrChangeNotifier = acn;
  68. refresh();
  69. }
  70. bool ManagedListener::isListening() {
  71. return !sockets.empty();
  72. }
  73. void ManagedListener::refresh() {
  74. std::list<network::SocketListener*>::iterator iter;
  75. if (!sockets.empty()) {
  76. for (iter = sockets.begin(); iter != sockets.end(); ++iter)
  77. manager->remListener(*iter);
  78. sockets.clear();
  79. }
  80. if (!server)
  81. return;
  82. try {
  83. if (port) {
  84. if (localOnly)
  85. network::createLocalTcpListeners(&sockets, port);
  86. else
  87. network::createTcpListeners(&sockets, NULL, port);
  88. }
  89. } catch (rdr::Exception& e) {
  90. vlog.error("%s", e.str());
  91. }
  92. if (!sockets.empty()) {
  93. if (!localOnly) {
  94. for (iter = sockets.begin(); iter != sockets.end(); ++iter)
  95. (*iter)->setFilter(filter);
  96. }
  97. try {
  98. for (iter = sockets.begin(); iter != sockets.end(); ++iter)
  99. manager->addListener(*iter, server, addrChangeNotifier);
  100. } catch (...) {
  101. std::list<network::SocketListener*>::iterator iter2;
  102. for (iter2 = sockets.begin(); iter2 != iter; ++iter2)
  103. manager->remListener(*iter2);
  104. for (; iter2 != sockets.end(); ++iter2)
  105. delete *iter;
  106. sockets.clear();
  107. throw;
  108. }
  109. }
  110. }