00001
00002 #ifndef SCT_SUBSCRIPTIONMANAGER_H
00003 #define SCT_SUBSCRIPTIONMANAGER_H
00004
00005 #include "SubscriptionManagerImpl.fwd"
00006
00007 #include <boost/thread.hpp>
00008 #include <ipc/object.h>
00009 #include <ipc/server.h>
00010 #include "SubscriptionManager.hh"
00011 #include "SpecialSubscribeRequest.h"
00012
00013 namespace Sct {
00014
00015 class SubscriptionManagerImpl : public IPCNamedObject<POA_SubscriptionManagerModule::SubscriptionManager>, public IPCServer {
00016 private:
00017 typedef boost::recursive_mutex::scoped_lock LOCK;
00018 private:
00019 SubscriptionManagerImpl() :
00020 IPCNamedObject<POA_SubscriptionManagerModule::SubscriptionManager>("SCT",
00021 SubscriptionManagerModule::SubscriptionManager::instanceName) {
00022 };
00023
00024 public:
00025 static SubscriptionManagerImpl & instance() {
00026 static SubscriptionManagerImpl * theInstance = new SubscriptionManagerImpl();
00027 return *theInstance;
00028 };
00029
00031
00033
00034 virtual CORBA::Long whatNumberIsThis(CORBA::Long number) {
00035
00036 return number;
00037 };
00038
00039 virtual void registerNewIsServer(const char* serverName);
00040
00041 virtual void subscribe_special(const char* serverPattern,
00042 const char* objectPattern,
00043 CORBA::Boolean server_is_regular_expression,
00044 CORBA::Boolean object_is_regular_expression,
00045 is::callback_ptr cb);
00047 virtual void debugDumpSubscriptions();
00048
00049 virtual void shutdownNOW() {
00050 tidyUpAndWithdrawEtcNOW();
00051 this->stop();
00052 };
00053
00055
00057
00059 virtual void shutdown() {
00060
00061 LOCK lock(m_busy);
00062 this->shutdownNOW();
00063 };
00065 void startCatchingSignals();
00066 ~SubscriptionManagerImpl() {
00067 std::cout << "Withdrawing from service due to demise of self." << std::endl;
00068 this->tidyUpAndWithdrawEtc();
00069 };
00070
00071 static void acceptSignal(int signum);
00072 private:
00073 void tidyUpAndWithdrawEtc();
00074 void tidyUpAndWithdrawEtcNOW();
00075 void launchOrdinarySubscriptionTo(const std::string & serverName, const SpecialSubscribeRequest & ssr);
00076 typedef std::list<SpecialSubscribeRequest *> SpecialSubscribeRequests;
00077 SpecialSubscribeRequests m_specialSubscribeRequests;
00078 boost::recursive_mutex m_busy;
00079 };
00080
00081 };
00082
00083 #endif