/home/tetron/hack/vos/libs/vos/vos/localvipsite.hh
Go to the documentation of this file.00001 #ifndef _LOCALVIPSITE_HH_
00002 #define _LOCALVIPSITE_HH_
00003
00004 #include <stdexcept>
00005 #include <set>
00006
00007 namespace VOS {
00008 class LocalVipSiteExtension;
00009 }
00010
00011 #include <vos/vip/socketmultiplexer.hh>
00012 #include <vos/vos/siteextension.hh>
00013 #include <vos/vos/remotevipsite.hh>
00014 #include <vos/vos/iterator.hh>
00015 #include <vos/vos/sitepeering.hh>
00016
00017 #define VOS_DEFAULT_PORT 4231
00018
00019 namespace VOS {
00020
00021
00022
00023
00024
00025
00026 class VOS_API RVSEIterator : public VUtil::Iterator<RemoteVipSiteExtension*>
00027 {
00028 public:
00029 RVSEIterator(const RVSEIterator& i) : VUtil::Iterator<RemoteVipSiteExtension*>(i) { }
00030 RVSEIterator(const std::set<RemoteVipSiteExtension*>& rsses) {
00031 items->resize(rsses.size());
00032 int n = 0;
00033 for(std::set<RemoteVipSiteExtension*>::const_iterator i = rsses.begin();
00034 i != rsses.end();
00035 i++)
00036 {
00037 (*items)[n] = *i;
00038 n++;
00039 }
00040 }
00041
00042 RemoteVipSiteExtension* operator*() {
00043 if(pos < items->size()) return (*items)[pos];
00044 else return 0;
00045 }
00046 };
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 class VOS_API LocalVipSiteExtension : public LocalSiteExtension, public VIP::NewConnectionCallback
00057 {
00058 private:
00059 unsigned short int listenport;
00060
00061 VUtil::read_write_mutex remoteSites_mutex;
00062 std::set<RemoteVipSiteExtension*> remoteSites;
00063
00064 VUtil::vRef<VIP::SocketMultiplexer> sktmpx;
00065
00066 void init(const std::string& defaultHostname, unsigned short int port);
00067 public:
00068
00069
00070
00071 static LocalVipSiteExtension* defaultLocalVipSite;
00072
00073
00074
00075
00076
00077
00078
00079 LocalVipSiteExtension();
00080
00081
00082
00083
00084
00085
00086 LocalVipSiteExtension(const std::string& defaultHostname, unsigned short int port);
00087
00088
00089
00090
00091
00092 LocalVipSiteExtension(const std::string& defaultHostname);
00093
00094
00095
00096
00097
00098
00099
00100
00101 LocalVipSiteExtension(unsigned short int port);
00102
00103
00104 virtual ~LocalVipSiteExtension();
00105
00106
00107
00108
00109
00110 virtual void addRemoteSite(VOS::RemoteSiteExtension* rs);
00111
00112
00113
00114
00115
00116 virtual void removeRemoteSite(VOS::RemoteSiteExtension* rs);
00117
00118
00119 RVSEIterator getRemoteSites();
00120
00121
00122
00123
00124 virtual void siteExtensionAttachedTo(Site* st);
00125
00126 VUtil::vRef<VIP::SocketMultiplexer> getSocketMultiplexer()
00127 { return sktmpx; }
00128
00129 virtual void notifyNewConnection(VIP::Connection* m, bool inbound);
00130 };
00131
00132 class VOS_API VipSitePeeringThread : public SitePeeringThread
00133 {
00134 private:
00135 LocalVipSiteExtension* lvse;
00136 RemoteVipSiteExtension* rvse;
00137 std::string host;
00138 int port;
00139 VUtil::vRef<VIP::Connection> conn;
00140
00141 public:
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153 VipSitePeeringThread(LocalVipSiteExtension* l, VIP::Connection* c,
00154 bool isClient = false);
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165 VipSitePeeringThread(LocalVipSiteExtension* l,
00166 const std::string& host,
00167 int port, bool isClient = true);
00168
00169
00170
00171
00172 VipSitePeeringThread(const VipSitePeeringThread& spt);
00173
00174 virtual void init();
00175
00176 virtual void done();
00177 };
00178
00179 }
00180
00181 #endif