1 /* 2 * AbiCollab - Code to enable the modification of remote documents. 3 * Copyright (C) 2006 by Marc Maurer <uwog@uwog.net> 4 * Copyright (C) 2007 One Laptop Per Child 5 * Copyright (C) 2008 AbiSource Corporation B.V. 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License 9 * as published by the Free Software Foundation; either version 2 10 * of the License, or (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 20 * 02110-1301 USA. 21 */ 22 23 #ifndef ABICOLLAB_PACKET_H 24 #define ABICOLLAB_PACKET_H 25 26 #include <boost/format.hpp> 27 28 #include "ut_types.h" 29 #include "ut_string_class.h" 30 #include "px_ChangeRecord.h" 31 #include "ut_stack.h" 32 #include "Serialization.h" 33 34 #include <string> 35 #include <vector> 36 37 class Buddy; 38 39 enum PacketType 40 { 41 PT_Session = 0, 42 PT_Event, 43 PT_Handler 44 }; 45 46 enum PacketEventType 47 { 48 PTE_AccountAddBuddyRequest, 49 PTE_StartSession, 50 PTE_JoinSession, 51 PTE_DisjoinSession, 52 PTE_CloseSession 53 }; 54 55 enum PClassType // send over the net to identify classes 56 { 57 // NOTE: do not reshuffle these values: it will make the protocol incompatible with previous versions 58 59 // 60 // base 61 // 62 PCT_Packet = 0, 63 PCT_EventPacket, 64 PCT_Event, 65 PCT_ProtocolErrorPacket, 66 67 // 68 // session packets 69 // 70 /* misc. session packets */ 71 PCT_SignalSessionPacket = 0x10, // update _PCT_FirstSessionPacket if you move this 72 PCT_RevertSessionPacket, 73 PCT_RevertAckSessionPacket, 74 PCT_GlobSessionPacket, 75 /* changerecord session packets */ 76 PCT_ChangeRecordSessionPacket, // update _PCT_FirstChangeRecord if you move this 77 PCT_Props_ChangeRecordSessionPacket, 78 PCT_InsertSpan_ChangeRecordSessionPacket, 79 PCT_ChangeStrux_ChangeRecordSessionPacket, 80 PCT_DeleteStrux_ChangeRecordSessionPacket, 81 PCT_Object_ChangeRecordSessionPacket, 82 PCT_Data_ChangeRecordSessionPacket, 83 PCT_Glob_ChangeRecordSessionPacket, 84 PCT_RDF_ChangeRecordSessionPacket, // update _PCT_LastChangeRecord if you move this 85 /* session takeover packets */ 86 PCT_SessionTakeoverRequestPacket = 0x40, // update _PCT_FirstSessionTakeoverPacket if you move this 87 PCT_SessionTakeoverAckPacket, 88 PCT_SessionFlushedPacket, 89 PCT_SessionReconnectRequestPacket, 90 PCT_SessionReconnectAckPacket, // update _PCT_LastSessionTakeoverPacket and _PCT_LastSessionPacket if you move this 91 92 // 93 // events 94 // 95 PCT_AccountNewEvent = 0x80, 96 PCT_AccountOnlineEvent, 97 PCT_AccountOfflineEvent, 98 PCT_AccountAddBuddyEvent, 99 PCT_AccountDeleteBuddyEvent, 100 PCT_AccountBuddyOnlineEvent, 101 PCT_AccountBuddyOfflineEvent, 102 PCT_AccountAddBuddyRequestEvent, 103 PCT_AccountBuddyAddDocumentEvent, 104 PCT_StartSessionEvent, 105 PCT_JoinSessionEvent, 106 PCT_JoinSessionRequestEvent, 107 PCT_JoinSessionRequestResponseEvent, 108 PCT_DisjoinSessionEvent, 109 PCT_CloseSessionEvent, 110 PCT_GetSessionsEvent, 111 PCT_GetSessionsResponseEvent, 112 113 // 114 // meta values (KEEP THESE UPDATED WHEN ADDING NEW PACKET TYPES!!) 115 // 116 _PCT_FirstSessionPacket = PCT_SignalSessionPacket, 117 _PCT_LastSessionPacket = PCT_SessionReconnectAckPacket, 118 119 _PCT_FirstChangeRecord = PCT_ChangeRecordSessionPacket, 120 _PCT_LastChangeRecord = PCT_RDF_ChangeRecordSessionPacket, 121 122 _PCT_FirstSessionTakeoverPacket = PCT_SessionTakeoverRequestPacket, 123 _PCT_LastSessionTakeoverPacket = PCT_SessionReconnectAckPacket, 124 125 _PCT_FirstEvent = PCT_AccountNewEvent, 126 _PCT_LastEvent = PCT_GetSessionsResponseEvent 127 }; 128 129 class PX_ChangeRecord; 130 class SessionPacket; 131 class AbiCollab; 132 class AccountHandler; 133 134 /************************************************************* 135 * Packets * 136 *************************************************************/ 137 138 #define DECLARE_ABSTRACT_PACKET(Class) \ 139 virtual PClassType getClassType() const { return PCT_##Class; } 140 141 #define DECLARE_SERIALIZABLE_PACKET \ 142 virtual void serialize(Archive & ar); 143 144 #define DECLARE_PACKET(Class) \ 145 DECLARE_ABSTRACT_PACKET(Class) \ 146 DECLARE_SERIALIZABLE_PACKET \ 147 virtual Packet* clone() const { return new Class( *this ); } \ 148 static Packet* create() { return new Class(); } 149 150 #define REGISTER_PACKET(Class) \ 151 struct PacketRegister##Class { \ 152 PacketRegister##Class() { \ 153 Packet::registerPacketClass( PCT_##Class, Class::create, \ 154 #Class ); \ 155 } \ 156 }; \ 157 static PacketRegister##Class _PacketRegister##Class; 158 159 class Packet 160 { 161 public: 162 DECLARE_ABSTRACT_PACKET(Packet); 163 164 Packet(); 165 Packet( AbiCollab* session ); ~Packet()166 virtual ~Packet() {} 167 virtual Packet* clone() const = 0; 168 getSession()169 const AbiCollab* getSession() const { return m_pSession; } getSession()170 AbiCollab* getSession() { return m_pSession; } 171 virtual UT_sint32 getProtocolVersion() const; 172 173 virtual void serialize(Archive & ar); // overridden automatically throught DECLARE_PACKET setParent(Packet * pParent)174 void setParent( Packet* pParent ) { m_pParent = pParent; } getParent()175 Packet* getParent() { return m_pParent; } 176 177 virtual std::string toStr() const; 178 179 protected: 180 AbiCollab* m_pSession; 181 Packet* m_pParent; 182 183 /** Class reconstruction */ 184 public: 185 typedef Packet*(*PacketCreateFuncType)(); 186 static Packet* createPacket( PClassType eType ); 187 static const char* getPacketClassname( PClassType eType ); 188 static void registerPacketClass( PClassType eType, PacketCreateFuncType createFunc, const char* szClassName ); 189 private: 190 struct ClassData { 191 PacketCreateFuncType StaticConstructor; 192 const char* ClassName; ClassDataClassData193 ClassData() : StaticConstructor( NULL ), ClassName( NULL ) {} 194 }; 195 typedef std::map<PClassType,ClassData> ClassMap; 196 static ClassMap& GetClassMap(); 197 }; 198 199 /************************************************************* 200 * SessionPackets * 201 *************************************************************/ 202 203 class SessionPacket : public Packet 204 { 205 public: 206 DECLARE_SERIALIZABLE_PACKET 207 208 static bool isInstanceOf(const Packet& packet); 209 210 protected: SessionPacket()211 SessionPacket() : m_sSessionId(""), m_sDocUUID("") {} 212 SessionPacket(const UT_UTF8String& sSessionId, const UT_UTF8String& sDocUUID); 213 214 public: getSessionId()215 virtual const UT_UTF8String& getSessionId() const 216 { return m_sSessionId; } 217 setSessionId(const UT_UTF8String & sSessionId)218 void setSessionId(const UT_UTF8String& sSessionId) 219 { m_sSessionId = sSessionId; } 220 getDocUUID()221 virtual const UT_UTF8String& getDocUUID() const 222 { return m_sDocUUID; } 223 setDocUUID(const UT_UTF8String & sDocUUID)224 void setDocUUID(const UT_UTF8String& sDocUUID) 225 { m_sDocUUID = sDocUUID; } 226 227 virtual std::string toStr() const; 228 229 private: 230 UT_UTF8String m_sSessionId; 231 UT_UTF8String m_sDocUUID; 232 }; 233 234 class AbstractChangeRecordSessionPacket : public SessionPacket 235 { 236 public: AbstractChangeRecordSessionPacket()237 AbstractChangeRecordSessionPacket() 238 : SessionPacket("", "") 239 {} 240 AbstractChangeRecordSessionPacket(const UT_UTF8String & sSessionId,const UT_UTF8String & sDocUUID)241 AbstractChangeRecordSessionPacket(const UT_UTF8String& sSessionId, const UT_UTF8String& sDocUUID) 242 : SessionPacket(sSessionId, sDocUUID) 243 {} 244 245 static bool isInstanceOf(const SessionPacket& packet); 246 247 virtual PT_DocPosition getPos() const = 0; 248 virtual UT_sint32 getLength() const = 0; 249 virtual UT_sint32 getAdjust() const = 0; 250 virtual UT_sint32 getRev() const = 0; 251 virtual UT_sint32 getRemoteRev(void) const = 0; 252 }; 253 254 class ChangeRecordSessionPacket : public AbstractChangeRecordSessionPacket 255 { 256 public: 257 DECLARE_PACKET(ChangeRecordSessionPacket); ChangeRecordSessionPacket()258 ChangeRecordSessionPacket() 259 : m_cType(PX_ChangeRecord::PXType(0)), 260 m_iLength(0), 261 m_iAdjust(0), 262 m_iPos(0), 263 m_iRev(0), 264 m_iRemoteRev(0) {} 265 ChangeRecordSessionPacket( 266 const UT_UTF8String& sSessionId, 267 PX_ChangeRecord::PXType cType, 268 const UT_UTF8String& sDocUUID, 269 PT_DocPosition iPos, 270 int iRev, 271 int iRemoteRev); 272 getPXType()273 PX_ChangeRecord::PXType getPXType() const { return m_cType; } 274 getPos()275 virtual PT_DocPosition getPos() const { return m_iPos; } getLength()276 virtual UT_sint32 getLength() const { return m_iLength; } getAdjust()277 virtual UT_sint32 getAdjust() const { return m_iAdjust; } getRev()278 virtual UT_sint32 getRev() const { return m_iRev; } getRemoteRev(void)279 virtual UT_sint32 getRemoteRev(void) const { return m_iRemoteRev; } 280 setPos(UT_sint32 iPos)281 void setPos( UT_sint32 iPos ) { m_iPos = iPos; } setLength(UT_sint32 iLength)282 void setLength( UT_sint32 iLength ) { m_iLength = iLength; } setAdjust(UT_sint32 iAdjust)283 void setAdjust(UT_sint32 iAdjust) { m_iAdjust = iAdjust; } setRev(UT_sint32 iRev)284 void setRev( UT_sint32 iRev ) { m_iRev = iRev; } setRemoteRev(UT_sint32 iRemoteRev)285 void setRemoteRev( UT_sint32 iRemoteRev ) { m_iRemoteRev = iRemoteRev; } 286 287 virtual std::string toStr() const; 288 289 private: 290 PX_ChangeRecord::PXType m_cType; 291 292 UT_sint32 m_iLength; 293 UT_sint32 m_iAdjust; 294 295 PT_DocPosition m_iPos; 296 UT_sint32 m_iRev; 297 UT_sint32 m_iRemoteRev; 298 }; 299 300 class Props_ChangeRecordSessionPacket : public ChangeRecordSessionPacket { 301 public: 302 DECLARE_PACKET(Props_ChangeRecordSessionPacket); Props_ChangeRecordSessionPacket()303 Props_ChangeRecordSessionPacket() : m_szAtts(NULL), m_szProps(NULL) {} 304 Props_ChangeRecordSessionPacket( const Props_ChangeRecordSessionPacket& ); Props_ChangeRecordSessionPacket(const UT_UTF8String & sSessionId,PX_ChangeRecord::PXType cType,const UT_UTF8String & sDocUUID,PT_DocPosition iPos,int iRev,int iRemoteRev)305 Props_ChangeRecordSessionPacket( 306 const UT_UTF8String& sSessionId, 307 PX_ChangeRecord::PXType cType, 308 const UT_UTF8String& sDocUUID, 309 PT_DocPosition iPos, 310 int iRev, 311 int iRemoteRev) 312 : ChangeRecordSessionPacket( sSessionId, cType, sDocUUID, iPos, iRev, iRemoteRev ) 313 , m_szAtts( NULL ) 314 , m_szProps( NULL ) 315 {} ~Props_ChangeRecordSessionPacket()316 ~Props_ChangeRecordSessionPacket() 317 { 318 _freeProps(); 319 _freeAtts(); 320 } 321 getProps()322 gchar** getProps() const { return m_szProps; } getPropMap()323 const std::map<UT_UTF8String,UT_UTF8String>& getPropMap() const { return m_sProps; } getPropMap()324 std::map<UT_UTF8String,UT_UTF8String>& getPropMap() { return m_sProps; } 325 getAtts()326 gchar** getAtts() const { return m_szAtts; } getAttMap()327 const std::map<UT_UTF8String,UT_UTF8String>& getAttMap() const { return m_sAtts; } getAttMap()328 std::map<UT_UTF8String,UT_UTF8String>& getAttMap() { return m_sAtts; } 329 gchar* getAttribute( const gchar* attr ) const; 330 331 virtual std::string toStr() const; 332 333 protected: 334 gchar** m_szAtts; 335 gchar** m_szProps; 336 std::map<UT_UTF8String,UT_UTF8String> m_sAtts; 337 std::map<UT_UTF8String,UT_UTF8String> m_sProps; 338 339 void _freeProps(); 340 void _freeAtts(); 341 void _fillProps(); // uses m_sProps to make m_szProps 342 void _fillAtts(); // uses m_sAtts to make m_szAtts 343 }; 344 345 class InsertSpan_ChangeRecordSessionPacket : public Props_ChangeRecordSessionPacket { 346 public: 347 DECLARE_PACKET(InsertSpan_ChangeRecordSessionPacket); InsertSpan_ChangeRecordSessionPacket()348 InsertSpan_ChangeRecordSessionPacket() : m_sText("") {} InsertSpan_ChangeRecordSessionPacket(const UT_UTF8String & sSessionId,PX_ChangeRecord::PXType cType,const UT_UTF8String & sDocUUID,PT_DocPosition iPos,int iRev,int iRemoteRev)349 InsertSpan_ChangeRecordSessionPacket( 350 const UT_UTF8String& sSessionId, 351 PX_ChangeRecord::PXType cType, 352 const UT_UTF8String& sDocUUID, 353 PT_DocPosition iPos, 354 int iRev, 355 int iRemoteRev) 356 : Props_ChangeRecordSessionPacket( sSessionId, cType, sDocUUID, iPos, iRev, iRemoteRev ) 357 , m_sText("") 358 {} 359 360 virtual std::string toStr() const; 361 362 // XXX: make proper setters/getters when done! 363 UT_UTF8String m_sText; 364 }; 365 366 class ChangeStrux_ChangeRecordSessionPacket : public Props_ChangeRecordSessionPacket { 367 public: 368 DECLARE_PACKET(ChangeStrux_ChangeRecordSessionPacket); ChangeStrux_ChangeRecordSessionPacket()369 ChangeStrux_ChangeRecordSessionPacket() : m_eStruxType(PTStruxType(0)) {} // FIXME: 0 is not a good initializer ChangeStrux_ChangeRecordSessionPacket(const UT_UTF8String & sSessionId,PX_ChangeRecord::PXType cType,const UT_UTF8String & sDocUUID,PT_DocPosition iPos,int iRev,int iRemoteRev)370 ChangeStrux_ChangeRecordSessionPacket( 371 const UT_UTF8String& sSessionId, 372 PX_ChangeRecord::PXType cType, 373 const UT_UTF8String& sDocUUID, 374 PT_DocPosition iPos, 375 int iRev, 376 int iRemoteRev) 377 : Props_ChangeRecordSessionPacket( sSessionId, cType, sDocUUID, iPos, iRev, iRemoteRev ) 378 , m_eStruxType(PTStruxType(0)) // FIXME: 0 is not a good initializer 379 {} 380 381 virtual std::string toStr() const; 382 383 // XXX: make proper setters/getters when done! 384 PTStruxType m_eStruxType; 385 }; 386 387 class DeleteStrux_ChangeRecordSessionPacket : public ChangeRecordSessionPacket { 388 public: 389 DECLARE_PACKET(DeleteStrux_ChangeRecordSessionPacket); DeleteStrux_ChangeRecordSessionPacket()390 DeleteStrux_ChangeRecordSessionPacket(): m_eStruxType(PTStruxType(0)) // FIXME: 0 is not a good initializer 391 {} DeleteStrux_ChangeRecordSessionPacket(const UT_UTF8String & sSessionId,PX_ChangeRecord::PXType cType,const UT_UTF8String & sDocUUID,PT_DocPosition iPos,int iRev,int iRemoteRev)392 DeleteStrux_ChangeRecordSessionPacket( 393 const UT_UTF8String& sSessionId, 394 PX_ChangeRecord::PXType cType, 395 const UT_UTF8String& sDocUUID, 396 PT_DocPosition iPos, 397 int iRev, 398 int iRemoteRev) 399 : ChangeRecordSessionPacket( sSessionId, cType, sDocUUID, iPos, iRev, iRemoteRev ) 400 , m_eStruxType(PTStruxType(0)) // FIXME: 0 is not a good initializer 401 {} 402 403 virtual std::string toStr() const; 404 405 // XXX: make proper setters/getters when done! 406 PTStruxType m_eStruxType; 407 }; 408 409 class Object_ChangeRecordSessionPacket : public Props_ChangeRecordSessionPacket { 410 public: 411 DECLARE_PACKET(Object_ChangeRecordSessionPacket); Object_ChangeRecordSessionPacket()412 Object_ChangeRecordSessionPacket() : m_eObjectType(PTObjectType(0)) {} // FIXME: 0 is not a good initializer Object_ChangeRecordSessionPacket(const UT_UTF8String & sSessionId,PX_ChangeRecord::PXType cType,const UT_UTF8String & sDocUUID,PT_DocPosition iPos,int iRev,int iRemoteRev)413 Object_ChangeRecordSessionPacket( 414 const UT_UTF8String& sSessionId, 415 PX_ChangeRecord::PXType cType, 416 const UT_UTF8String& sDocUUID, 417 PT_DocPosition iPos, 418 int iRev, 419 int iRemoteRev) 420 : Props_ChangeRecordSessionPacket( sSessionId, cType, sDocUUID, iPos, iRev, iRemoteRev ) 421 , m_eObjectType(PTObjectType(0)) // FIXME: 0 is not a good initializer 422 {} 423 424 virtual std::string toStr() const; 425 getObjectType()426 PTObjectType getObjectType() const 427 { return m_eObjectType; } 428 setObjectType(PTObjectType eObjectType)429 void setObjectType(PTObjectType eObjectType) 430 { m_eObjectType = eObjectType; } 431 432 private: 433 PTObjectType m_eObjectType; 434 }; 435 436 class RDF_ChangeRecordSessionPacket : public Props_ChangeRecordSessionPacket { 437 public: 438 DECLARE_PACKET(RDF_ChangeRecordSessionPacket); RDF_ChangeRecordSessionPacket()439 RDF_ChangeRecordSessionPacket() {} // FIXME: 0 is not a good initializer RDF_ChangeRecordSessionPacket(const UT_UTF8String & sSessionId,PX_ChangeRecord::PXType cType,const UT_UTF8String & sDocUUID,PT_DocPosition iPos,int iRev,int iRemoteRev)440 RDF_ChangeRecordSessionPacket( 441 const UT_UTF8String& sSessionId, 442 PX_ChangeRecord::PXType cType, 443 const UT_UTF8String& sDocUUID, 444 PT_DocPosition iPos, 445 int iRev, 446 int iRemoteRev) 447 : Props_ChangeRecordSessionPacket( sSessionId, cType, sDocUUID, iPos, iRev, iRemoteRev ) 448 {} 449 450 virtual std::string toStr() const; 451 452 private: 453 }; 454 455 class Data_ChangeRecordSessionPacket : public Props_ChangeRecordSessionPacket { 456 public: 457 DECLARE_PACKET(Data_ChangeRecordSessionPacket); Data_ChangeRecordSessionPacket()458 Data_ChangeRecordSessionPacket() : m_bTokenSet(false) {} Data_ChangeRecordSessionPacket(const UT_UTF8String & sSessionId,PX_ChangeRecord::PXType cType,const UT_UTF8String & sDocUUID,PT_DocPosition iPos,int iRev,int iRemoteRev)459 Data_ChangeRecordSessionPacket( 460 const UT_UTF8String& sSessionId, 461 PX_ChangeRecord::PXType cType, 462 const UT_UTF8String& sDocUUID, 463 PT_DocPosition iPos, 464 int iRev, 465 int iRemoteRev) 466 : Props_ChangeRecordSessionPacket( sSessionId, cType, sDocUUID, iPos, iRev, iRemoteRev ) 467 , m_bTokenSet(false) 468 {} 469 470 virtual std::string toStr() const; 471 472 // XXX: make proper setters/getters when done! 473 std::vector<char> m_vecData; 474 bool m_bTokenSet; 475 std::string m_sToken; 476 }; 477 478 class Glob_ChangeRecordSessionPacket : public ChangeRecordSessionPacket 479 { 480 public: 481 DECLARE_PACKET(Glob_ChangeRecordSessionPacket); Glob_ChangeRecordSessionPacket()482 Glob_ChangeRecordSessionPacket() {} Glob_ChangeRecordSessionPacket(const UT_UTF8String & sSessionId,PX_ChangeRecord::PXType cType,const UT_UTF8String & sDocUUID,PT_DocPosition iPos,int iRev,int iRemoteRev)483 Glob_ChangeRecordSessionPacket( 484 const UT_UTF8String& sSessionId, 485 PX_ChangeRecord::PXType cType, 486 const UT_UTF8String& sDocUUID, 487 PT_DocPosition iPos, 488 int iRev, 489 int iRemoteRev) 490 : ChangeRecordSessionPacket( sSessionId, cType, sDocUUID, iPos, iRev, iRemoteRev ) 491 {} 492 493 virtual std::string toStr() const; 494 495 // XXX: make proper setters/getters when done! 496 UT_Byte m_iGLOBType; 497 }; 498 499 class GlobSessionPacket : public AbstractChangeRecordSessionPacket 500 { 501 public: 502 DECLARE_PACKET(GlobSessionPacket); GlobSessionPacket()503 GlobSessionPacket() {} 504 GlobSessionPacket( const GlobSessionPacket& Other ); GlobSessionPacket(const UT_UTF8String & sSessionId,const UT_UTF8String & sDocUUID)505 GlobSessionPacket( const UT_UTF8String& sSessionId, const UT_UTF8String& sDocUUID ) 506 : AbstractChangeRecordSessionPacket(sSessionId, sDocUUID) 507 {} 508 ~GlobSessionPacket(); 509 getPackets()510 const std::vector<SessionPacket*>& getPackets() const { return m_pPackets; } 511 512 void addPacket(SessionPacket* pPacket); 513 514 virtual PT_DocPosition getPos() const; 515 virtual UT_sint32 getLength() const; 516 virtual UT_sint32 getAdjust() const; 517 virtual UT_sint32 getRev() const; 518 virtual UT_sint32 getRemoteRev(void) const; 519 520 virtual std::string toStr() const; 521 522 private: 523 std::vector<SessionPacket*> m_pPackets; 524 }; 525 526 class SignalSessionPacket : public SessionPacket 527 { 528 public: 529 DECLARE_PACKET(SignalSessionPacket); SignalSessionPacket()530 SignalSessionPacket() {} 531 SignalSessionPacket(const UT_UTF8String& sSessionId, const UT_UTF8String& sDocUUID, UT_uint32 iSignal); 532 getSignalType()533 UT_uint32 getSignalType() const 534 { return m_iSignal; } 535 536 virtual std::string toStr() const; 537 538 private: 539 UT_uint32 m_iSignal; 540 }; 541 542 class RevertSessionPacket : public SessionPacket 543 { 544 public: 545 DECLARE_PACKET(RevertSessionPacket); RevertSessionPacket()546 RevertSessionPacket() {} 547 RevertSessionPacket(const UT_UTF8String& sSessionId, const UT_UTF8String& sDocUUID, UT_sint32 iRev); 548 getRev()549 UT_sint32 getRev() const 550 { return m_iRev; } 551 552 virtual std::string toStr() const; 553 554 private: 555 UT_sint32 m_iRev; 556 }; 557 558 class RevertAckSessionPacket : public SessionPacket 559 { 560 public: 561 DECLARE_PACKET(RevertAckSessionPacket); RevertAckSessionPacket()562 RevertAckSessionPacket() {} 563 RevertAckSessionPacket(const UT_UTF8String& sSessionId, const UT_UTF8String& sDocUUID, UT_sint32 iRev); 564 getRev()565 UT_sint32 getRev() const 566 { return m_iRev; } 567 568 virtual std::string toStr() const; 569 570 private: 571 UT_sint32 m_iRev; 572 }; 573 574 575 /************************************************************* 576 * Session Takeover Packets * 577 *************************************************************/ 578 579 class AbstractSessionTakeoverPacket : public SessionPacket 580 { 581 public: AbstractSessionTakeoverPacket()582 AbstractSessionTakeoverPacket() {} 583 AbstractSessionTakeoverPacket(const UT_UTF8String & sSessionId,const UT_UTF8String & sDocUUID)584 AbstractSessionTakeoverPacket(const UT_UTF8String& sSessionId, const UT_UTF8String& sDocUUID) 585 : SessionPacket(sSessionId, sDocUUID) 586 {} 587 588 static bool isInstanceOf(const SessionPacket& packet); 589 }; 590 591 class SessionTakeoverRequestPacket : public AbstractSessionTakeoverPacket 592 { 593 public: 594 DECLARE_PACKET(SessionTakeoverRequestPacket); SessionTakeoverRequestPacket()595 SessionTakeoverRequestPacket() {} 596 SessionTakeoverRequestPacket( 597 const UT_UTF8String& sSessionId, const UT_UTF8String& sDocUUID, 598 bool bPromote, const std::vector<std::string>& vBuddyIdentifiers 599 ); 600 promote()601 bool promote() const 602 { return m_bPromote; } 603 getBuddyIdentifiers()604 const std::vector<std::string>& getBuddyIdentifiers() const 605 { return m_vBuddyIdentifiers; } 606 607 virtual std::string toStr() const; 608 609 private: 610 bool m_bPromote; 611 std::vector<std::string> m_vBuddyIdentifiers; 612 }; 613 614 class SessionTakeoverAckPacket : public AbstractSessionTakeoverPacket 615 { 616 public: 617 DECLARE_PACKET(SessionTakeoverAckPacket); SessionTakeoverAckPacket()618 SessionTakeoverAckPacket() {} SessionTakeoverAckPacket(const UT_UTF8String & sSessionId,const UT_UTF8String & sDocUUID)619 SessionTakeoverAckPacket(const UT_UTF8String& sSessionId, const UT_UTF8String& sDocUUID) 620 : AbstractSessionTakeoverPacket(sSessionId, sDocUUID) { } 621 622 virtual std::string toStr() const; 623 }; 624 625 class SessionFlushedPacket : public AbstractSessionTakeoverPacket 626 { 627 public: 628 DECLARE_PACKET(SessionFlushedPacket); SessionFlushedPacket()629 SessionFlushedPacket() {} SessionFlushedPacket(const UT_UTF8String & sSessionId,const UT_UTF8String & sDocUUID)630 SessionFlushedPacket(const UT_UTF8String& sSessionId, const UT_UTF8String& sDocUUID) 631 : AbstractSessionTakeoverPacket(sSessionId, sDocUUID) { } 632 633 virtual std::string toStr() const; 634 }; 635 636 class SessionReconnectRequestPacket : public AbstractSessionTakeoverPacket 637 { 638 public: 639 DECLARE_PACKET(SessionReconnectRequestPacket); SessionReconnectRequestPacket()640 SessionReconnectRequestPacket() {} SessionReconnectRequestPacket(const UT_UTF8String & sSessionId,const UT_UTF8String & sDocUUID)641 SessionReconnectRequestPacket(const UT_UTF8String& sSessionId, const UT_UTF8String& sDocUUID) 642 : AbstractSessionTakeoverPacket(sSessionId, sDocUUID) { } 643 644 virtual std::string toStr() const; 645 }; 646 647 class SessionReconnectAckPacket : public AbstractSessionTakeoverPacket 648 { 649 public: 650 DECLARE_PACKET(SessionReconnectAckPacket); SessionReconnectAckPacket()651 SessionReconnectAckPacket() {} 652 SessionReconnectAckPacket(const UT_UTF8String& sSessionId, const UT_UTF8String& sDocUUID, 653 UT_sint32 iRev); 654 getRev()655 UT_sint32 getRev() const 656 { return m_iRev; } 657 658 virtual std::string toStr() const; 659 660 private: 661 UT_sint32 m_iRev; 662 }; 663 664 #endif /* ABICOLLAB_PACKET_H */ 665