FountainNode.h

Go to the documentation of this file.
00001 /* ex: set tabstop=4 expandtab: */
00002 /*                                                                                                                      */
00003 /*  (c) 2004-2006 Iowa State University                                         */
00004 /*      see the LICENSE file in the top level directory         */
00005 /*                                                                                                                      */
00006 /* $Header: /afs/scl/project/cvsroot/fountain/source/nodes/FountainNode.h,v 1.41 2006/03/08 05:09:16 samm Exp $ */
00015 #ifndef FOUNTAIN_NODE_H__
00016 #define FOUNTAIN_NODE_H__
00017 
00018 //forward class declarations
00019 template <class T> class FountainNodeCreator;
00020 
00021 #include "define.h"
00022 #include "FountainMessage.h"
00023 #include "NodeMessage.h"
00024 #include "FountainWireProt.h"
00025 #include "FountainSocketHandlers.h"
00026 #include "NodeID.h"
00027 #include "FountainErrors.h"
00028 #include "monitor/NodeMonitor.h"
00029 #include "TreeTopology.h"
00030 #include "LokiInclude.h"
00031 #include <bamboo/SSSXML.h>
00032 #include <string>
00033 #include <unistd.h>
00034 #include <memory>
00035 #include <sys/types.h> //for time_t
00036 
00049 class FountainNode {
00050     protected:
00051                 //member variables
00052         
00060                 FountainSocketHandlers socketHandlers_;
00061                         
00065                 TreeTopology::ChildNodeContainer children_;
00066                 
00072                 typedef TreeTopology::ChildNodeContainer::iterator childIterator;
00073                 
00079                 typedef TreeTopology::ChildNodeContainer::const_iterator constChildIterator;
00080                                                 
00084                 NodeID myID_;
00085                 
00089                 NodeID parentID_;
00090                 
00094                 FountainWireProtPtr parentConnectionPtr_;
00095                 
00096         private:
00097                 //member variables
00098                         
00102                 NodeID masterNodeID_;
00103         
00108                 NodeMonitorBase::NodeMonitorPtr myNodeInfoPtr_;
00109                 
00113                 time_t parentPulseLastSeen_;
00114                 
00115         public:
00116                 //member methods
00117                         
00122                 virtual void checkConnections();
00123                 
00124         protected:
00125                 //member methods
00126                                 
00135         virtual NodeResponsePtr processRequest(FountainMessage::MessageAction action, ConstParseMsgPtr request, time_t timeout=0);
00136 
00144                 virtual NodeResponsePtr processPingPong(ConstParseMsgPtr request, time_t timeout=0);
00145                 
00150                 void handleParentMessage();
00151         
00155                 void checkChildren();
00156                                 
00162                 void handleJoin(ConstParseMsgPtr request, FountainWireProtPtr requestConnection);
00163                 
00169                 FountainNode(const NodeID& myID, const NodeID& masterNodeID);
00170                 
00174                 virtual ~FountainNode() {}
00175         
00181         class forwardMessageToChildren {
00182             public:
00187                 forwardMessageToChildren(ConstParseMsgPtr request) : request_(request) {}
00188                 
00193                                 inline void operator() (TreeTopology::ChildNodeContainer::value_type element) {
00194                     element.second->forwardMessage(request_); 
00195                 }
00196             private:
00197                 ConstParseMsgPtr request_;
00198         };
00199         
00200     private:
00201                 //member methods
00202                 
00211                 int handleChildMessage(FountainWireProtPtr childCon, const NodeID& childID);
00212                 
00219                 virtual int handleLostChild(const NodeID& childID);
00220                 
00226                 virtual void handleLostParent(const char* message);
00227 
00232         void pokeParent();
00233         
00237         void pokeChildren();
00238         
00244                 void handleSync(ConstParseMsgPtr request, FountainWireProtPtr requestCon);
00245                 
00256                 void handleWakeup();
00257 
00262         virtual void joinMasterNode();
00263                 
00270                 int joinParentNode(const NodeID& newParentID);
00271                 
00276                 void checkParent();
00277                 
00281                 FountainNode& operator=(const FountainNode& rhs);
00282                 
00286                 FountainNode(const FountainNode& rhs);
00287                 
00288                 //these two classes have to be friends of us since they do the actual
00289                 //object instantiation
00290                 template <typename T> friend class Loki::CreateUsingNew;
00291                 template <typename T> friend class FountainNodeCreator;
00292 };
00293 
00299 template <class T>
00300 class FountainNodeCreator : public Loki::CreateUsingNew<T> {
00301         public:
00302                 static T* Create();
00303 };
00304 
00310 typedef Loki::SingletonHolder<FountainNode, FountainNodeCreator> SingleFountainNode;
00311 
00312 #endif

Generated on Wed Mar 8 14:43:31 2006 for Fountain by  doxygen 1.4.6