00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef ABICOLLAB_PACKET_H
00024 #define ABICOLLAB_PACKET_H
00025
00026 #include <boost/format.hpp>
00027
00028 #include "ut_types.h"
00029 #include "ut_string_class.h"
00030 #include "px_ChangeRecord.h"
00031 #include "ut_stack.h"
00032 #include "Serialization.h"
00033
00034 #include <string>
00035 #include <vector>
00036
00037 class Buddy;
00038
00039 enum PacketType
00040 {
00041 PT_Session = 0,
00042 PT_Event,
00043 PT_Handler
00044 };
00045
00046 enum PacketEventType
00047 {
00048 PTE_AccountAddBuddyRequest,
00049 PTE_StartSession,
00050 PTE_JoinSession,
00051 PTE_DisjoinSession,
00052 PTE_CloseSession
00053 };
00054
00055 enum PClassType
00056 {
00057
00058
00059
00060
00061
00062 PCT_Packet = 0,
00063 PCT_EventPacket,
00064 PCT_Event,
00065 PCT_ProtocolErrorPacket,
00066
00067
00068
00069
00070
00071 PCT_SignalSessionPacket = 0x10,
00072 PCT_RevertSessionPacket,
00073 PCT_RevertAckSessionPacket,
00074 PCT_GlobSessionPacket,
00075
00076 PCT_ChangeRecordSessionPacket,
00077 PCT_Props_ChangeRecordSessionPacket,
00078 PCT_InsertSpan_ChangeRecordSessionPacket,
00079 PCT_ChangeStrux_ChangeRecordSessionPacket,
00080 PCT_DeleteStrux_ChangeRecordSessionPacket,
00081 PCT_Object_ChangeRecordSessionPacket,
00082 PCT_Data_ChangeRecordSessionPacket,
00083 PCT_Glob_ChangeRecordSessionPacket,
00084
00085 PCT_SessionTakeoverRequestPacket = 0x40,
00086 PCT_SessionTakeoverAckPacket,
00087 PCT_SessionFlushedPacket,
00088 PCT_SessionReconnectRequestPacket,
00089 PCT_SessionReconnectAckPacket,
00090
00091
00092
00093
00094 PCT_AccountNewEvent = 0x80,
00095 PCT_AccountOnlineEvent,
00096 PCT_AccountOfflineEvent,
00097 PCT_AccountAddBuddyEvent,
00098 PCT_AccountDeleteBuddyEvent,
00099 PCT_AccountBuddyOnlineEvent,
00100 PCT_AccountBuddyOfflineEvent,
00101 PCT_AccountAddBuddyRequestEvent,
00102 PCT_AccountBuddyAddDocumentEvent,
00103 PCT_StartSessionEvent,
00104 PCT_JoinSessionEvent,
00105 PCT_JoinSessionRequestEvent,
00106 PCT_JoinSessionRequestResponseEvent,
00107 PCT_DisjoinSessionEvent,
00108 PCT_CloseSessionEvent,
00109 PCT_GetSessionsEvent,
00110 PCT_GetSessionsResponseEvent,
00111
00112
00113
00114
00115 _PCT_FirstSessionPacket = PCT_SignalSessionPacket,
00116 _PCT_LastSessionPacket = PCT_SessionReconnectAckPacket,
00117
00118 _PCT_FirstChangeRecord = PCT_ChangeRecordSessionPacket,
00119 _PCT_LastChangeRecord = PCT_Glob_ChangeRecordSessionPacket,
00120
00121 _PCT_FirstSessionTakeoverPacket = PCT_SessionTakeoverRequestPacket,
00122 _PCT_LastSessionTakeoverPacket = PCT_SessionReconnectAckPacket,
00123
00124 _PCT_FirstEvent = PCT_AccountNewEvent,
00125 _PCT_LastEvent = PCT_GetSessionsResponseEvent
00126 };
00127
00128 class PX_ChangeRecord;
00129 class SessionPacket;
00130 class AbiCollab;
00131 class AccountHandler;
00132
00133
00134
00135
00136
00137 #define DECLARE_ABSTRACT_PACKET(Class) \
00138 virtual PClassType getClassType() const { return PCT_##Class; }
00139
00140 #define DECLARE_SERIALIZABLE_PACKET \
00141 virtual void serialize(Archive & ar);
00142
00143 #define DECLARE_PACKET(Class) \
00144 DECLARE_ABSTRACT_PACKET(Class) \
00145 DECLARE_SERIALIZABLE_PACKET \
00146 virtual Packet* clone() const { return new Class( *this ); } \
00147 static Packet* create() { return new Class(); }
00148
00149 #define REGISTER_PACKET(Class) \
00150 struct PacketRegister##Class { \
00151 PacketRegister##Class() { \
00152 Packet::registerPacketClass( PCT_##Class, Class::create, \
00153 #Class ); \
00154 } \
00155 }; \
00156 static PacketRegister##Class _PacketRegister##Class;
00157
00158 class Packet
00159 {
00160 public:
00161 DECLARE_ABSTRACT_PACKET(Packet);
00162
00163 Packet();
00164 Packet( AbiCollab* session );
00165 virtual ~Packet() {}
00166 virtual Packet* clone() const = 0;
00167
00168 const AbiCollab* getSession() const { return m_pSession; }
00169 AbiCollab* getSession() { return m_pSession; }
00170 virtual UT_sint32 getProtocolVersion() const;
00171
00172 virtual void serialize(Archive & ar);
00173 void setParent( Packet* pParent ) { m_pParent = pParent; }
00174 Packet* getParent() { return m_pParent; }
00175
00176 virtual std::string toStr() const;
00177
00178 protected:
00179 AbiCollab* m_pSession;
00180 Packet* m_pParent;
00181
00183 public:
00184 typedef Packet*(*PacketCreateFuncType)();
00185 static Packet* createPacket( PClassType eType );
00186 static const char* getPacketClassname( PClassType eType );
00187 static void registerPacketClass( PClassType eType, PacketCreateFuncType createFunc, const char* szClassName );
00188 private:
00189 struct ClassData {
00190 PacketCreateFuncType StaticConstructor;
00191 const char* ClassName;
00192 ClassData() : StaticConstructor( NULL ), ClassName( NULL ) {}
00193 };
00194 typedef std::map<PClassType,ClassData> ClassMap;
00195 static ClassMap& GetClassMap();
00196 };
00197
00198
00199
00200
00201
00202 class SessionPacket : public Packet
00203 {
00204 public:
00205 DECLARE_SERIALIZABLE_PACKET
00206
00207 static bool isInstanceOf(const Packet& packet);
00208
00209 protected:
00210 SessionPacket() : m_sSessionId(""), m_sDocUUID("") {}
00211 SessionPacket(const UT_UTF8String& sSessionId, const UT_UTF8String& sDocUUID);
00212
00213 public:
00214 virtual const UT_UTF8String& getSessionId() const
00215 { return m_sSessionId; }
00216
00217 void setSessionId(const UT_UTF8String& sSessionId)
00218 { m_sSessionId = sSessionId; }
00219
00220 virtual const UT_UTF8String& getDocUUID() const
00221 { return m_sDocUUID; }
00222
00223 void setDocUUID(const UT_UTF8String& sDocUUID)
00224 { m_sDocUUID = sDocUUID; }
00225
00226 virtual std::string toStr() const;
00227
00228 private:
00229 UT_UTF8String m_sSessionId;
00230 UT_UTF8String m_sDocUUID;
00231 };
00232
00233 class AbstractChangeRecordSessionPacket : public SessionPacket
00234 {
00235 public:
00236 AbstractChangeRecordSessionPacket()
00237 : SessionPacket("", "")
00238 {}
00239
00240 AbstractChangeRecordSessionPacket(const UT_UTF8String& sSessionId, const UT_UTF8String& sDocUUID)
00241 : SessionPacket(sSessionId, sDocUUID)
00242 {}
00243
00244 static bool isInstanceOf(const SessionPacket& packet);
00245
00246 virtual PT_DocPosition getPos() const = 0;
00247 virtual UT_sint32 getLength() const = 0;
00248 virtual UT_sint32 getAdjust() const = 0;
00249 virtual UT_sint32 getRev() const = 0;
00250 virtual UT_sint32 getRemoteRev(void) const = 0;
00251 };
00252
00253 class ChangeRecordSessionPacket : public AbstractChangeRecordSessionPacket
00254 {
00255 public:
00256 DECLARE_PACKET(ChangeRecordSessionPacket);
00257 ChangeRecordSessionPacket()
00258 : m_cType(PX_ChangeRecord::PXType(0)),
00259 m_iLength(0),
00260 m_iAdjust(0),
00261 m_iPos(0),
00262 m_iRev(0),
00263 m_iRemoteRev(0) {}
00264 ChangeRecordSessionPacket(
00265 const UT_UTF8String& sSessionId,
00266 PX_ChangeRecord::PXType cType,
00267 const UT_UTF8String& sDocUUID,
00268 PT_DocPosition iPos,
00269 int iRev,
00270 int iRemoteRev);
00271
00272 PX_ChangeRecord::PXType getPXType() const { return m_cType; }
00273
00274 virtual PT_DocPosition getPos() const { return m_iPos; }
00275 virtual UT_sint32 getLength() const { return m_iLength; }
00276 virtual UT_sint32 getAdjust() const { return m_iAdjust; }
00277 virtual UT_sint32 getRev() const { return m_iRev; }
00278 virtual UT_sint32 getRemoteRev(void) const { return m_iRemoteRev; }
00279
00280 void setPos( UT_sint32 iPos ) { m_iPos = iPos; }
00281 void setLength( UT_sint32 iLength ) { m_iLength = iLength; }
00282 void setAdjust(UT_sint32 iAdjust) { m_iAdjust = iAdjust; }
00283 void setRev( UT_sint32 iRev ) { m_iRev = iRev; }
00284 void setRemoteRev( UT_sint32 iRemoteRev ) { m_iRemoteRev = iRemoteRev; }
00285
00286 virtual std::string toStr() const;
00287
00288 private:
00289 PX_ChangeRecord::PXType m_cType;
00290
00291 UT_sint32 m_iLength;
00292 UT_sint32 m_iAdjust;
00293
00294 PT_DocPosition m_iPos;
00295 UT_sint32 m_iRev;
00296 UT_sint32 m_iRemoteRev;
00297 };
00298
00299 class Props_ChangeRecordSessionPacket : public ChangeRecordSessionPacket {
00300 public:
00301 DECLARE_PACKET(Props_ChangeRecordSessionPacket);
00302 Props_ChangeRecordSessionPacket() : m_szAtts(NULL), m_szProps(NULL) {}
00303 Props_ChangeRecordSessionPacket( const Props_ChangeRecordSessionPacket& );
00304 Props_ChangeRecordSessionPacket(
00305 const UT_UTF8String& sSessionId,
00306 PX_ChangeRecord::PXType cType,
00307 const UT_UTF8String& sDocUUID,
00308 PT_DocPosition iPos,
00309 int iRev,
00310 int iRemoteRev)
00311 : ChangeRecordSessionPacket( sSessionId, cType, sDocUUID, iPos, iRev, iRemoteRev )
00312 , m_szAtts( NULL )
00313 , m_szProps( NULL )
00314 {}
00315 ~Props_ChangeRecordSessionPacket()
00316 {
00317 _freeProps();
00318 _freeAtts();
00319 }
00320
00321 gchar** getProps() const { return m_szProps; }
00322 const std::map<UT_UTF8String,UT_UTF8String>& getPropMap() const { return m_sProps; }
00323 std::map<UT_UTF8String,UT_UTF8String>& getPropMap() { return m_sProps; }
00324
00325 gchar** getAtts() const { return m_szAtts; }
00326 const std::map<UT_UTF8String,UT_UTF8String>& getAttMap() const { return m_sAtts; }
00327 std::map<UT_UTF8String,UT_UTF8String>& getAttMap() { return m_sAtts; }
00328 gchar* getAttribute( const gchar* attr ) const;
00329
00330 virtual std::string toStr() const;
00331
00332 protected:
00333 gchar** m_szAtts;
00334 gchar** m_szProps;
00335 std::map<UT_UTF8String,UT_UTF8String> m_sAtts;
00336 std::map<UT_UTF8String,UT_UTF8String> m_sProps;
00337
00338 void _freeProps();
00339 void _freeAtts();
00340 void _fillProps();
00341 void _fillAtts();
00342 };
00343
00344 class InsertSpan_ChangeRecordSessionPacket : public Props_ChangeRecordSessionPacket {
00345 public:
00346 DECLARE_PACKET(InsertSpan_ChangeRecordSessionPacket);
00347 InsertSpan_ChangeRecordSessionPacket() : m_sText("") {}
00348 InsertSpan_ChangeRecordSessionPacket(
00349 const UT_UTF8String& sSessionId,
00350 PX_ChangeRecord::PXType cType,
00351 const UT_UTF8String& sDocUUID,
00352 PT_DocPosition iPos,
00353 int iRev,
00354 int iRemoteRev)
00355 : Props_ChangeRecordSessionPacket( sSessionId, cType, sDocUUID, iPos, iRev, iRemoteRev )
00356 , m_sText("")
00357 {}
00358
00359 virtual std::string toStr() const;
00360
00361
00362 UT_UTF8String m_sText;
00363 };
00364
00365 class ChangeStrux_ChangeRecordSessionPacket : public Props_ChangeRecordSessionPacket {
00366 public:
00367 DECLARE_PACKET(ChangeStrux_ChangeRecordSessionPacket);
00368 ChangeStrux_ChangeRecordSessionPacket() : m_eStruxType(PTStruxType(0)) {}
00369 ChangeStrux_ChangeRecordSessionPacket(
00370 const UT_UTF8String& sSessionId,
00371 PX_ChangeRecord::PXType cType,
00372 const UT_UTF8String& sDocUUID,
00373 PT_DocPosition iPos,
00374 int iRev,
00375 int iRemoteRev)
00376 : Props_ChangeRecordSessionPacket( sSessionId, cType, sDocUUID, iPos, iRev, iRemoteRev )
00377 , m_eStruxType(PTStruxType(0))
00378 {}
00379
00380 virtual std::string toStr() const;
00381
00382
00383 PTStruxType m_eStruxType;
00384 };
00385
00386 class DeleteStrux_ChangeRecordSessionPacket : public ChangeRecordSessionPacket {
00387 public:
00388 DECLARE_PACKET(DeleteStrux_ChangeRecordSessionPacket);
00389 DeleteStrux_ChangeRecordSessionPacket(): m_eStruxType(PTStruxType(0))
00390 {}
00391 DeleteStrux_ChangeRecordSessionPacket(
00392 const UT_UTF8String& sSessionId,
00393 PX_ChangeRecord::PXType cType,
00394 const UT_UTF8String& sDocUUID,
00395 PT_DocPosition iPos,
00396 int iRev,
00397 int iRemoteRev)
00398 : ChangeRecordSessionPacket( sSessionId, cType, sDocUUID, iPos, iRev, iRemoteRev )
00399 , m_eStruxType(PTStruxType(0))
00400 {}
00401
00402 virtual std::string toStr() const;
00403
00404
00405 PTStruxType m_eStruxType;
00406 };
00407
00408 class Object_ChangeRecordSessionPacket : public Props_ChangeRecordSessionPacket {
00409 public:
00410 DECLARE_PACKET(Object_ChangeRecordSessionPacket);
00411 Object_ChangeRecordSessionPacket() : m_eObjectType(PTObjectType(0)) {}
00412 Object_ChangeRecordSessionPacket(
00413 const UT_UTF8String& sSessionId,
00414 PX_ChangeRecord::PXType cType,
00415 const UT_UTF8String& sDocUUID,
00416 PT_DocPosition iPos,
00417 int iRev,
00418 int iRemoteRev)
00419 : Props_ChangeRecordSessionPacket( sSessionId, cType, sDocUUID, iPos, iRev, iRemoteRev )
00420 , m_eObjectType(PTObjectType(0))
00421 {}
00422
00423 virtual std::string toStr() const;
00424
00425 PTObjectType getObjectType() const
00426 { return m_eObjectType; }
00427
00428 void setObjectType(PTObjectType eObjectType)
00429 { m_eObjectType = eObjectType; }
00430
00431 private:
00432 PTObjectType m_eObjectType;
00433 };
00434
00435 class Data_ChangeRecordSessionPacket : public Props_ChangeRecordSessionPacket {
00436 public:
00437 DECLARE_PACKET(Data_ChangeRecordSessionPacket);
00438 Data_ChangeRecordSessionPacket() : m_bTokenSet(false) {}
00439 Data_ChangeRecordSessionPacket(
00440 const UT_UTF8String& sSessionId,
00441 PX_ChangeRecord::PXType cType,
00442 const UT_UTF8String& sDocUUID,
00443 PT_DocPosition iPos,
00444 int iRev,
00445 int iRemoteRev)
00446 : Props_ChangeRecordSessionPacket( sSessionId, cType, sDocUUID, iPos, iRev, iRemoteRev )
00447 , m_bTokenSet(false)
00448 {}
00449
00450 virtual std::string toStr() const;
00451
00452
00453 std::vector<char> m_vecData;
00454 bool m_bTokenSet;
00455 std::string m_sToken;
00456 };
00457
00458 class Glob_ChangeRecordSessionPacket : public ChangeRecordSessionPacket
00459 {
00460 public:
00461 DECLARE_PACKET(Glob_ChangeRecordSessionPacket);
00462 Glob_ChangeRecordSessionPacket() {}
00463 Glob_ChangeRecordSessionPacket(
00464 const UT_UTF8String& sSessionId,
00465 PX_ChangeRecord::PXType cType,
00466 const UT_UTF8String& sDocUUID,
00467 PT_DocPosition iPos,
00468 int iRev,
00469 int iRemoteRev)
00470 : ChangeRecordSessionPacket( sSessionId, cType, sDocUUID, iPos, iRev, iRemoteRev )
00471 {}
00472
00473 virtual std::string toStr() const;
00474
00475
00476 UT_Byte m_iGLOBType;
00477 };
00478
00479 class GlobSessionPacket : public AbstractChangeRecordSessionPacket
00480 {
00481 public:
00482 DECLARE_PACKET(GlobSessionPacket);
00483 GlobSessionPacket() {}
00484 GlobSessionPacket( const GlobSessionPacket& Other );
00485 GlobSessionPacket( const UT_UTF8String& sSessionId, const UT_UTF8String& sDocUUID )
00486 : AbstractChangeRecordSessionPacket(sSessionId, sDocUUID)
00487 {}
00488 ~GlobSessionPacket();
00489
00490 const std::vector<SessionPacket*>& getPackets() const { return m_pPackets; }
00491
00492 void addPacket(SessionPacket* pPacket);
00493
00494 virtual PT_DocPosition getPos() const;
00495 virtual UT_sint32 getLength() const;
00496 virtual UT_sint32 getAdjust() const;
00497 virtual UT_sint32 getRev() const;
00498 virtual UT_sint32 getRemoteRev(void) const;
00499
00500 virtual std::string toStr() const;
00501
00502 private:
00503 std::vector<SessionPacket*> m_pPackets;
00504 };
00505
00506 class SignalSessionPacket : public SessionPacket
00507 {
00508 public:
00509 DECLARE_PACKET(SignalSessionPacket);
00510 SignalSessionPacket() {}
00511 SignalSessionPacket(const UT_UTF8String& sSessionId, const UT_UTF8String& sDocUUID, UT_uint32 iSignal);
00512
00513 UT_uint32 getSignalType() const
00514 { return m_iSignal; }
00515
00516 virtual std::string toStr() const;
00517
00518 private:
00519 UT_uint32 m_iSignal;
00520 };
00521
00522 class RevertSessionPacket : public SessionPacket
00523 {
00524 public:
00525 DECLARE_PACKET(RevertSessionPacket);
00526 RevertSessionPacket() {}
00527 RevertSessionPacket(const UT_UTF8String& sSessionId, const UT_UTF8String& sDocUUID, UT_sint32 iRev);
00528
00529 UT_sint32 getRev() const
00530 { return m_iRev; }
00531
00532 virtual std::string toStr() const;
00533
00534 private:
00535 UT_sint32 m_iRev;
00536 };
00537
00538 class RevertAckSessionPacket : public SessionPacket
00539 {
00540 public:
00541 DECLARE_PACKET(RevertAckSessionPacket);
00542 RevertAckSessionPacket() {}
00543 RevertAckSessionPacket(const UT_UTF8String& sSessionId, const UT_UTF8String& sDocUUID, UT_sint32 iRev);
00544
00545 UT_sint32 getRev() const
00546 { return m_iRev; }
00547
00548 virtual std::string toStr() const;
00549
00550 private:
00551 UT_sint32 m_iRev;
00552 };
00553
00554
00555
00556
00557
00558
00559 class AbstractSessionTakeoverPacket : public SessionPacket
00560 {
00561 public:
00562 AbstractSessionTakeoverPacket() {}
00563
00564 AbstractSessionTakeoverPacket(const UT_UTF8String& sSessionId, const UT_UTF8String& sDocUUID)
00565 : SessionPacket(sSessionId, sDocUUID)
00566 {}
00567
00568 static bool isInstanceOf(const SessionPacket& packet);
00569 };
00570
00571 class SessionTakeoverRequestPacket : public AbstractSessionTakeoverPacket
00572 {
00573 public:
00574 DECLARE_PACKET(SessionTakeoverRequestPacket);
00575 SessionTakeoverRequestPacket() {}
00576 SessionTakeoverRequestPacket(
00577 const UT_UTF8String& sSessionId, const UT_UTF8String& sDocUUID,
00578 bool bPromote, const std::vector<std::string>& vBuddyIdentifiers
00579 );
00580
00581 bool promote() const
00582 { return m_bPromote; }
00583
00584 const std::vector<std::string>& getBuddyIdentifiers() const
00585 { return m_vBuddyIdentifiers; }
00586
00587 virtual std::string toStr() const;
00588
00589 private:
00590 bool m_bPromote;
00591 std::vector<std::string> m_vBuddyIdentifiers;
00592 };
00593
00594 class SessionTakeoverAckPacket : public AbstractSessionTakeoverPacket
00595 {
00596 public:
00597 DECLARE_PACKET(SessionTakeoverAckPacket);
00598 SessionTakeoverAckPacket() {}
00599 SessionTakeoverAckPacket(const UT_UTF8String& sSessionId, const UT_UTF8String& sDocUUID)
00600 : AbstractSessionTakeoverPacket(sSessionId, sDocUUID) { }
00601
00602 virtual std::string toStr() const;
00603 };
00604
00605 class SessionFlushedPacket : public AbstractSessionTakeoverPacket
00606 {
00607 public:
00608 DECLARE_PACKET(SessionFlushedPacket);
00609 SessionFlushedPacket() {}
00610 SessionFlushedPacket(const UT_UTF8String& sSessionId, const UT_UTF8String& sDocUUID)
00611 : AbstractSessionTakeoverPacket(sSessionId, sDocUUID) { }
00612
00613 virtual std::string toStr() const;
00614 };
00615
00616 class SessionReconnectRequestPacket : public AbstractSessionTakeoverPacket
00617 {
00618 public:
00619 DECLARE_PACKET(SessionReconnectRequestPacket);
00620 SessionReconnectRequestPacket() {}
00621 SessionReconnectRequestPacket(const UT_UTF8String& sSessionId, const UT_UTF8String& sDocUUID)
00622 : AbstractSessionTakeoverPacket(sSessionId, sDocUUID) { }
00623
00624 virtual std::string toStr() const;
00625 };
00626
00627 class SessionReconnectAckPacket : public AbstractSessionTakeoverPacket
00628 {
00629 public:
00630 DECLARE_PACKET(SessionReconnectAckPacket);
00631 SessionReconnectAckPacket() {}
00632 SessionReconnectAckPacket(const UT_UTF8String& sSessionId, const UT_UTF8String& sDocUUID,
00633 UT_sint32 iRev);
00634
00635 UT_sint32 getRev() const
00636 { return m_iRev; }
00637
00638 virtual std::string toStr() const;
00639
00640 private:
00641 UT_sint32 m_iRev;
00642 };
00643
00644 #endif