/******************************************************************************* * Boap.h Boap RPC protocol * T.Barnaby, BEAM Ltd, 8/5/03 ******************************************************************************* */ #ifndef Boap_HH #define Boap_HH #include #include #include #include // Main BOAP Types typedef int8_t Int8; typedef uint8_t UInt8; typedef int16_t Int16; typedef uint16_t UInt16; typedef int32_t Int32; typedef uint32_t UInt32; typedef double Double; typedef uint32_t BoapService; enum BoapType { BoapTypeRpc, BoapTypeSignal }; // Boap packet header struct BoapPacketHead { UInt32 length; BoapType type; BoapService service; UInt32 cmd; UInt32 reserved[12]; }; // Boap packet class BoapPacket { public: BoapPacket(); ~BoapPacket(); int resize(int size); BError setData(void* data, int nbytes); int nbytes(); char* data(); int pushHead(BoapPacketHead& head); int push(Int8 v); int push(UInt8 v); int push(Int16 v); int push(UInt16 v); int push(Int32 v); int push(UInt32 v); int push(BString& v); int push(Double v); int push(BError& v); int push(UInt32 nBytes, const void* data); int popHead(BoapPacketHead& head); int pop(Int8& v); int pop(UInt8& v); int pop(Int16& v); int pop(UInt16& v); int pop(Int32& v); int pop(UInt32& v); int pop(BString& v); int pop(Double& v); int pop(BError& v); int pop(UInt32 nBytes, void* data); private: void updateLen(); int osize; int onbytes; char* odata; int opos; }; /******************************************************************************* * Main Client communications classes ******************************************************************************* */ /******************************************************************************* * Base for all Client Objects ******************************************************************************* */ class BoapClientObject : public BSocket { public: BoapClientObject(BString name); BError connectService(BString name); protected: BError performSend(BoapPacket& tx); // Performs a send to the named service BError performRecv(BoapPacket& rx); // Performs a receive BError performCall(BoapPacket& tx, BoapPacket& rx); // Performs a RPC call to the named service BString oname; BoapService oservice; int oconnected; BoapPacket otx; BoapPacket orx; }; class BoapSignalObject : public BSocket { public: BoapSignalObject(); protected: BError performSend(BoapPacket& tx); // Performs a send to the named service BoapPacket otx; BoapPacket orx; }; /******************************************************************************* * Main Server communications class ******************************************************************************* */ class BoapServiceObject; class BoapServiceEntry { public: BoapServiceEntry(BoapService service = 0, BoapServiceObject* object = 0){ oservice = service; oobject = object; } BoapService oservice; BoapServiceObject* oobject; }; class BoapServer { public: BoapServer(); BError init(int boapNs = 0); BError run(); BError processEvent(BoapPacket& rx); // Support routines BError addObject(BoapServiceObject* object); BError process(int fd); BError sendEvent(BoapPacket& tx); BSocket& getSocket(); BSocket& getEventSocket(); BError processEvent(int fd); BString getHostName(); private: int oboapNs; BoapPacket orx; BoapPacket otx; BList oservices; BPoll opoll; BSocket onet; BSocket onetEvent; BSocketAddressINET onetEventAddress; BString ohostName; }; /******************************************************************************* * Base for all Server Objects ******************************************************************************* */ class BoapServiceObject; typedef BError (BoapServiceObject::*BoapFunc)(BoapPacket& rx, BoapPacket& tx); class BoapFuncEntry { public: BoapFuncEntry(int cmd, BoapFunc func); UInt32 ocmd; BoapFunc ofunc; }; class BoapServiceObject { public: BoapServiceObject(BoapServer& server, BString name); virtual ~BoapServiceObject(); BError sendEvent(BString signalName, Int32 arg); virtual BError processEvent(BString objectName, BString name, Int32 arg); BString name(); BError process(BoapPacket& rx, BoapPacket& tx); virtual BError processEvent(BoapPacket& rx); protected: BError sendEvent(BoapPacket& tx); BoapServer& oserver; BString oname; BList ofuncList; }; #endif