00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _SITE_HH_
00024 #define _SITE_HH_
00025
00026
00027
00028
00029
00030 #include <deque>
00031 #include <map>
00032 #include <string>
00033
00034 namespace VOS
00035 {
00036 class Site;
00037 }
00038
00039 #include <vos/vos/vosdefs.hh>
00040 #include <vos/vutil/refcount.hh>
00041 #include <vos/vutil/url.hh>
00042 #include <vos/vos/siteextension.hh>
00043 #include <vos/vos/messageblock.hh>
00044 #include <vos/vos/meta_cast.hh>
00045
00046 #define VOS_DEFAULT_PORT 4231
00047
00048
00049 namespace VOS
00050 {
00051 class Message;
00052 class MessageBlock;
00053 class MessageContext;
00054 class ChildChangeListener;
00055 class ParentChangeListener;
00056 class TypeChangeListener;
00057 class VobjectEvent;
00058 class LocalSite;
00059 class SiteIterator;
00060 class SiteExtension;
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071 class VOS_API MessageFilter
00072 {
00073 public:
00074 virtual ~MessageFilter();
00075
00076
00077
00078
00079
00080
00081 virtual bool checkMessage(Message* m) = 0;
00082
00083
00084 virtual bool checkMessage(MessageBlock* m);
00085 };
00086
00087
00088
00089
00090
00091
00092
00093 class VOS_API ProtocolHandler
00094 {
00095 public:
00096 virtual ~ProtocolHandler() { }
00097 virtual VUtil::vRef<Site> connectToSite(const VUtil::URL& u) = 0;
00098 };
00099
00100
00101
00102
00103
00104 class VOS_API NoSuchMessageBlockError : public std::runtime_error {
00105 public:
00106 NoSuchMessageBlockError(const std::string& s) : std::runtime_error(s) { };
00107 };
00108
00109
00110
00111
00112
00113
00114 class VOS_API NameAlreadyUsedError : public std::runtime_error {
00115 public:
00116 NameAlreadyUsedError(const std::string& s) : std::runtime_error(s) { };
00117 static const char* errorCode() { return "409"; }
00118 };
00119
00120
00121
00122
00123
00124 class VOS_API ProtocolError : public std::runtime_error
00125 {
00126 public:
00127 ProtocolError(const std::string& s) : std::runtime_error(s) { };
00128 };
00129
00130
00131
00132
00133
00134
00135
00136 class VOS_API ProgressMeterCallback {
00137 public:
00138 virtual ~ProgressMeterCallback() { }
00139
00140
00141
00142
00143
00144
00145
00146 virtual void notifyTaskStart(const std::string& task, unsigned int total) = 0;
00147
00148
00149
00150
00151
00152
00153
00154 virtual void notifyProgress(unsigned int progress) = 0;
00155 };
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166 class VOS_API Site : public VobjectBase
00167 {
00168 public:
00169 typedef MetaObject* (*metaobject_extender_t)(VobjectBase* superobject, const std::string& type);
00170 private:
00171 boost::mutex hostnames_mutex;
00172 std::set<std::string> hostnames;
00173
00174 static boost::mutex& siteTable_mutex();
00175 static std::map<std::string, Site*>& siteTable();
00176
00177 static boost::mutex& protocolHandlers_mutex();
00178 static std::map<std::string, ProtocolHandler*>& protocolHandlers();
00179
00180 boost::mutex messageBlockTable_mutex;
00181 std::map<std::string, MessageBlock*> messageBlockTable;
00182
00183 boost::mutex messagefilters_mutex;
00184 std::vector<MessageFilter*> messagefilters;
00185
00186 VUtil::read_write_mutex site_extensions_mutex;
00187 std::vector< std::pair<const char*, SiteExtension*> > site_extensions;
00188
00189 VUtil::vRef<Identity> myIdentity;
00190 VUtil::vRef<Identity> peerIdentity;
00191
00192 VUtil::vRef<Site> localSite;
00193
00194 static boost::mutex& localMetaObjectFactoryTable_mutex();
00195 static std::map<std::string, metaobject_extender_t>& localMetaObjectFactoryTable();
00196
00197 static boost::mutex& remoteMetaObjectFactoryTable_mutex();
00198 static std::map<std::string, metaobject_extender_t>& remoteMetaObjectFactoryTable();
00199
00200 static boost::mutex& classnameToVOStype_mutex();
00201 static std::map<std::string, std::string>& classnameToVOStype();
00202
00203 protected:
00204 virtual void msgSendImpl(boost::mutex& usehandlers_mutex, HandlerMap& usehandlers, Message* msg);
00205
00206 public:
00207
00208
00209
00210
00211 Site(bool islocal = true);
00212
00213
00214 virtual ~Site();
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228 virtual VUtil::vRef<Vobject> createVobjectT(Vobject* requester, const char* name,
00229 const std::deque<std::string>& typelist);
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241 virtual VUtil::vRef<Vobject> createVobjectT(const char* name,
00242 const std::deque<std::string>& typelist)
00243 { return createVobjectT(0, name, typelist); }
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258 VUtil::vRef<Vobject> createVobjectA(const char* name = "", const char* t1 = 0, const char* t2 = 0,
00259 const char* t3 = 0, const char* t4 = 0, const char* t5 = 0)
00260 {
00261 std::deque<std::string> typelist;
00262 if(t1) typelist.push_back(t1);
00263 if(t2) typelist.push_back(t2);
00264 if(t3) typelist.push_back(t3);
00265 if(t4) typelist.push_back(t4);
00266 if(t5) typelist.push_back(t5);
00267 return createVobjectT(name, typelist);
00268 }
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282 template<class T>
00283 VUtil::vRef<T> createVobject(const std::string& name = "", const std::string& ac = "")
00284 {
00285 VUtil::vRef<T> obj = meta_cast<T>(createVobjectA(name.c_str(), typeid(T).name()));
00286 if(obj.isValid()) obj->setDefaultPolicy(ac);
00287 return obj;
00288 }
00289
00290
00291 template<class T, class T2>
00292 VUtil::vRef<T> createVobject2(const std::string& name = "", const std::string& ac = "")
00293 {
00294 VUtil::vRef<T> obj = meta_cast<T>(createVobjectA(name.c_str(), typeid(T).name(),
00295 typeid(T2).name()));
00296 if(obj.isValid()) obj->setDefaultPolicy(ac);
00297 return obj;
00298 }
00299
00300
00301 template<class T, class T2, class T3>
00302 VUtil::vRef<T> createVobject3(const std::string& name = "", const std::string& ac = "")
00303 {
00304 VUtil::vRef<T> obj = meta_cast<T>(createVobjectA(name.c_str(), typeid(T).name(),
00305 typeid(T2).name(), typeid(T3).name()));
00306 if(obj.isValid()) obj->setDefaultPolicy(ac);
00307 return obj;
00308 }
00309
00310
00311 template<class T, class T2, class T3, class T4>
00312 VUtil::vRef<T> createVobject4(const std::string& name = "", const std::string& ac = "")
00313 {
00314 VUtil::vRef<T> obj = meta_cast<T>(createVobjectA(name.c_str(), typeid(T).name(),
00315 typeid(T2).name(), typeid(T3).name(), typeid(T4).name()));
00316 if(obj.isValid()) obj->setDefaultPolicy(ac);
00317 return obj;
00318 }
00319
00320
00321 template<class T, class T2, class T3, class T4, class T5>
00322 VUtil::vRef<T> createVobject5(const std::string& name = "", const std::string& ac = "")
00323 {
00324 VUtil::vRef<T> obj = meta_cast<T>(createVobjectA(name.c_str(), typeid(T).name(),
00325 typeid(T2).name(), typeid(T3).name(), typeid(T4).name(),
00326 typeid(T5).name()));
00327 if(obj.isValid()) obj->setDefaultPolicy(ac);
00328 return obj;
00329 }
00330
00331
00332
00333
00334
00335
00336
00337
00338 virtual std::string uniqueName(const char* base);
00339
00340
00341 virtual std::string generateUniqueName();
00342
00343
00344
00345
00346
00347 virtual void addHostAlias(const std::string& h);
00348
00349
00350
00351
00352 virtual void removeHostAlias(const std::string& h);
00353
00354
00355
00356
00357
00358 virtual bool hasHostAlias(const std::string& h);
00359
00360
00361
00362
00363 virtual StringIterator getHostAliases();
00364
00365
00366
00367
00368
00369
00370
00371 virtual void addURL(const VUtil::URL& u);
00372
00373
00374
00375
00376 static void addSite(Site& s);
00377
00378
00379
00380
00381 static void removeSite(Site& s);
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392 static VUtil::vRef<Site> findSite(const std::string& s, bool contact = true);
00393
00394
00395
00396
00397 static SiteIterator getAllSites();
00398
00399
00400
00401
00402 virtual void addMessageBlock(MessageBlock* m);
00403
00404
00405
00406
00407 virtual void removeMessageBlock(MessageBlock* m);
00408
00409
00410
00411
00412
00413
00414 virtual VUtil::vRef<MessageBlock> getMessageBlock(const std::string& s);
00415
00416 virtual void sendMessage(Message* m);
00417 virtual void sendMessage(MessageBlock* m);
00418
00419 virtual VUtil::vRef<Site> getSite() const;
00420
00421
00422
00423
00424 virtual void insertMessageFilter(int pos, MessageFilter* mf);
00425
00426
00427
00428
00429 virtual void removeMessageFilter(int pos);
00430
00431
00432
00433
00434 virtual void removeMessageFilter(MessageFilter* m);
00435
00436
00437
00438
00439
00440
00441
00442 virtual void addSiteExtension(SiteExtension* sx);
00443
00444 virtual void excise();
00445
00446
00447
00448
00449
00450
00451
00452 static std::string convertClassnameToVOStype(const std::string& n);
00453
00454
00455
00456
00457
00458
00459
00460 static void addRemoteMetaObjectFactory(const char* classname, const char* vostype, metaobject_extender_t newmethod);
00461
00462
00463
00464
00465
00466
00467
00468 static metaobject_extender_t getRemoteMetaObjectFactory(const char* classname);
00469
00470
00471
00472
00473
00474
00475
00476 static void removeRemoteMetaObjectFactory(const char* classname,
00477 metaobject_extender_t oldmethod);
00478
00479
00480
00481
00482
00483
00484
00485 static void addLocalMetaObjectFactory(const char* classname, metaobject_extender_t newmethod);
00486
00487
00488
00489
00490
00491
00492
00493 static metaobject_extender_t getLocalMetaObjectFactory(const char* classname);
00494
00495
00496
00497
00498
00499
00500
00501 static void removeLocalMetaObjectFactory(const char* classname,
00502 metaobject_extender_t oldmethod);
00503
00504
00505
00506 static void dumpFactoryTables();
00507
00508
00509
00510
00511
00512
00513
00514
00515 virtual void renameVobject(Vobject* requester, const std::string& oldname,
00516 const std::string& newname);
00517
00518
00519
00520
00521
00522
00523 virtual void renameVobject(const std::string& oldname, const std::string& newname)
00524 { renameVobject(0, oldname, newname); }
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534 virtual VUtil::vRef<Identity> getMyIdentity();
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544 virtual void setMyIdentity(Identity* id);
00545
00546
00547
00548
00549
00550
00551
00552
00553 virtual VUtil::vRef<Identity> getPeerIdentity();
00554
00555
00556
00557
00558
00559
00560
00561 virtual void setPeerIdentity(Identity* id);
00562
00563
00564
00565 void setLocalSite(Site* s) { localSite.assign(s, true); }
00566
00567
00568
00569 VUtil::vRef<Site> getLocalSite() {
00570 if(isRemote()) return localSite;
00571 else return VUtil::vRef<Site>(this, true);
00572 }
00573
00574
00575
00576
00577
00578 template<class C> C* querySiteExtension()
00579 {
00580 VUtil::scoped_read_lock lk(site_extensions_mutex);
00581
00582 for(std::vector< std::pair<const char*, SiteExtension*> >::iterator i = site_extensions.begin();
00583 i != site_extensions.end();
00584 i++)
00585 {
00586 if(C* ret = dynamic_cast<C*>((*i).second)) return ret;
00587 }
00588 return 0;
00589 }
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601 static void addProtocolHandler(const std::string& protocol, ProtocolHandler& ph);
00602
00603
00604 static ProtocolHandler* getProtocolHandler(const std::string& protocol);
00605
00606
00607 static void removeProtocolHandler(const std::string& protocol);
00608 };
00609
00610 #ifndef SWIG
00611
00612 struct WaitingThread
00613 {
00614 boost::condition cond;
00615 bool nonceSeen;
00616 bool wantProgress;
00617 unsigned int bytesReceived;
00618 unsigned int bytesTotal;
00619 VUtil::vRef<Site> localsite;
00620 VUtil::vRef<MessageBlock> msgblock;
00621 };
00622
00623 #endif
00624
00625 }
00626
00627
00628 #ifndef SWIG
00629
00630 namespace VUtil {
00631 template<> inline void iteratorReleaseItem(VOS::Site** v)
00632 {
00633 (*v)->release();
00634 }
00635 }
00636
00637
00638 namespace VOS {
00639
00640
00641
00642
00643
00644 class SiteIterator : public VUtil::Iterator<Site*>
00645 {
00646 public:
00647 SiteIterator() : VUtil::Iterator<Site*>() { }
00648 SiteIterator(const SiteIterator& i) : VUtil::Iterator<Site*>(i) { }
00649 SiteIterator(const std::map<std::string, Site*> sites) {
00650 std::set<Site*> tmp;
00651 for(std::map<std::string, Site*>::const_iterator i = sites.begin();
00652 i != sites.end();
00653 i++)
00654 {
00655 tmp.insert((*i).second);
00656 }
00657 items->resize(tmp.size());
00658 int c = 0;
00659 for(std::set<Site*>::const_iterator i = tmp.begin();
00660 i != tmp.end();
00661 i++)
00662 {
00663 (*i)->acquire();
00664 (*items)[c] = (*i);
00665 c++;
00666 }
00667 }
00668 VUtil::vRef<Site> operator*() {
00669 if(pos < items->size()) return VUtil::vRef<Site>((*items)[pos], true);
00670 else return VUtil::vRef<Site>();
00671 }
00672 };
00673
00674 }
00675
00676 #endif // ifndef SWIG
00677
00678
00679 #include <vos/vos/identity.hh>
00680
00681 namespace VOS {
00682 template<class AccessControlType> inline std::vector<AccessControlType*>
00683
00684 VobjectBase::getAccessControlsFor(Vobject* requester,
00685 PolicyDomain<AccessControlType>& accessControlPolicies)
00686 {
00687 VUtil::vRef<Identity> ident = requester->getSite()->getPeerIdentity();
00688
00689 std::vector<AccessControlType*> accesscontrols;
00690 if(ident.isValid()) {
00691 StringIterator acs = accesscontrolstate->getPolicy(accessControlPolicies.getDomain(), ident);
00692 for(; acs.hasMore(); acs++) {
00693 AccessControlType* act = accessControlPolicies.getPolicyImpl(*acs);
00694 if(act) accesscontrols.push_back(act);
00695 }
00696 } else {
00697 AccessControlType* act = accessControlPolicies.getPolicyImpl(accesscontrolstate->getDefaultPolicy(accessControlPolicies.getDomain()));
00698 if(act) accesscontrols.push_back(act);
00699 }
00700 return accesscontrols;
00701 }
00702
00703 }
00704
00705 #endif