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