00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef ABI_COLLAB_H
00025 #define ABI_COLLAB_H
00026
00027 #include <map>
00028 #include <vector>
00029 #include "ev_EditBits.h"
00030 #include "ev_MouseListener.h"
00031 #include "ut_types.h"
00032 #include "pt_Types.h"
00033 #include "px_ChangeRecord.h"
00034 #include "stdio.h"
00035 #include "xav_Listener.h"
00036 #include "pl_Listener.h"
00037 #include "ut_string_class.h"
00038 #include "ut_uuid.h"
00039
00040 #include <account/xp/Buddy.h>
00041 #include <packet/xp/AbiCollab_Packet.h>
00042 #include <session/xp/AbiCollab_Import.h>
00043 #include <session/xp/AbiCollab_Export.h>
00044
00045 class FL_DocLayout;
00046 class PD_Document;
00047 class PX_ChangeRecord;
00048 class CommandLine;
00049 class Buddy;
00050 class AccountHandler;
00051
00052 enum SessionTakeoverState
00053 {
00054 STS_NONE,
00055 STS_SENT_TAKEOVER_REQUEST,
00056 STS_SENT_TAKEOVER_ACK,
00057 STS_SENT_SESSION_RECONNECT_REQUEST
00058 };
00059
00060 class ChangeAdjust
00061 {
00062 friend class AbiCollab_ImportRuleSet;
00063
00064 public:
00065 ChangeAdjust(const AbstractChangeRecordSessionPacket& packet, PT_DocPosition iOrigDocPos, const UT_UTF8String& sRemoteDocUUID);
00066 ~ChangeAdjust();
00067
00068 PT_DocPosition getLocalPos() const { return m_iLocalPos; }
00069 void setLocalPos(PT_DocPosition iLocalPos) { m_iLocalPos = iLocalPos; }
00070 UT_sint32 getLocalLength() const { return m_pPacket->getLength(); }
00071 UT_sint32 getLocalAdjust() const { return m_pPacket->getAdjust(); }
00072 UT_sint32 getLocalRev() const { return m_pPacket->getRev(); }
00073
00074 PT_DocPosition getRemoteDocPos() const { return m_iRemoteDocPos; }
00075 const UT_UTF8String& getRemoteDocUUID() const { return m_sRemoteDocUUID; }
00076
00077 private:
00078
00079 const AbstractChangeRecordSessionPacket* m_pPacket;
00080 PT_DocPosition m_iLocalPos;
00081
00082
00083 PT_DocPosition m_iRemoteDocPos;
00084 UT_UTF8String m_sRemoteDocUUID;
00085 };
00086
00087 class AbiCollab;
00088 class SessionRecorderInterface
00089 {
00090 public:
00091 SessionRecorderInterface( AbiCollab* Session ) : m_pAbiCollab(Session) {}
00092 virtual ~SessionRecorderInterface() {}
00093 virtual void storeOutgoing(const Packet* pPacket ) = 0;
00094 virtual void storeOutgoing(const Packet* pPacket, BuddyPtr toBuddy) = 0;
00095 virtual void storeIncoming(const Packet* pPacket, BuddyPtr fromBuddy) = 0;
00096 protected:
00097 AbiCollab* m_pAbiCollab;
00098 };
00099
00100 class AbiCollab : public EV_MouseListener
00101 {
00102 friend class ABI_Collab_Export;
00103
00104 public:
00105
00106 AbiCollab(PD_Document* pDoc,
00107 const UT_UTF8String& sSessionId,
00108 AccountHandler* pAclAccount,
00109 bool bLocallyOwned);
00110
00111
00112 AbiCollab(const UT_UTF8String& sSessionId,
00113 PD_Document* pDoc,
00114 const UT_UTF8String& docUUID,
00115 UT_sint32 iRev,
00116 BuddyPtr pControler,
00117 AccountHandler* pAclAccount,
00118 bool m_bLocallyOwned);
00119
00120 virtual ~AbiCollab();
00121
00122
00123 void addCollaborator(BuddyPtr pCollaborator);
00124 void removeCollaborator(BuddyPtr pCollaborator);
00125 const std::map<BuddyPtr, std::string>& getCollaborators() const
00126 { return m_vCollaborators; }
00127 bool isController(BuddyPtr pCollaborator) const
00128 { return m_pController == pCollaborator; }
00129 bool isLocallyOwned() const
00130 { return m_bLocallyOwned; }
00131 const std::vector<std::string>& getAcl()
00132 { return m_vAcl; }
00133 AccountHandler* getAclAccount()
00134 { return m_pAclAccount; }
00135 void setAcl(const std::vector<std::string> vAcl);
00136
00137
00138
00139 ABI_Collab_Import* getImport(void)
00140 { return &m_Import; }
00141 ABI_Collab_Export* getExport(void)
00142 { return &m_Export; }
00143 void push(SessionPacket* pPacket);
00144 bool push(SessionPacket* pPacket, BuddyPtr collaborator);
00145 void maskExport();
00146 virtual const std::vector<SessionPacket*>& unmaskExport();
00147 bool isExportMasked(void) const
00148 { return m_bExportMasked; }
00149 void import(SessionPacket* pPacket, BuddyPtr collaborator);
00150 void addChangeAdjust(ChangeAdjust* pAdjust);
00151 const AbstractChangeRecordSessionPacket* getActivePacket() const
00152 { return m_pActivePacket; }
00153
00154
00155 PD_Document* getDocument(void) const
00156 { return m_pDoc; }
00157
00158 const UT_UTF8String getSessionId() const
00159 { return m_sId; }
00160 bool isLocallyControlled() const
00161 { return m_pController == NULL; }
00162
00163 void setIsReverting(bool bIsReverting)
00164 { m_bIsReverting = bIsReverting; }
00165
00166
00167 void initiateSessionTakeover(BuddyPtr pNewMaster);
00168
00169
00170 bool isRecording()
00171 { return m_pRecorder != NULL; }
00172 void startRecording(SessionRecorderInterface* pRecorder);
00173 void stopRecording();
00174
00175
00176 virtual void signalMouse(EV_EditBits eb, UT_sint32 xPos, UT_sint32 yPos);
00177 virtual void removeMouse(EV_Mouse* pMouse);
00178
00179 protected:
00180
00181 class SessionPacketVector : public std::vector<SessionPacket*>
00182 {
00183 public:
00184 ~SessionPacketVector() { clear(); }
00185 void clear()
00186 {
00187 for (size_t i=0; i<size(); ++i)
00188 {
00189 DELETEP((*this)[i]);
00190 }
00191 std::vector<SessionPacket*>::clear();
00192 };
00193 } m_vecMaskedPackets;
00194
00195 private:
00196
00197 void _removeCollaborator(BuddyPtr pCollaborator, const std::string& docUUID);
00198 void _checkRevokeAccess(BuddyPtr pCollaborator);
00199
00200
00201
00202 void _setDocument(PD_Document* pDoc);
00203 void _setDocListenerId(UT_uint32 iDocListenerId)
00204 { m_iDocListenerId = iDocListenerId; }
00205
00206 void _fillRemoteRev(Packet* pPacket, BuddyPtr pBuddy);
00207
00208
00209 void _releaseMouseDrag();
00210
00211
00212 bool _handleSessionTakeover(AbstractSessionTakeoverPacket* pPacket, BuddyPtr collaborator);
00213 bool _hasAckedSessionTakeover(BuddyPtr collaborator);
00214 bool _allSlavesAckedSessionTakeover();
00215 void _switchMaster();
00216 void _becomeMaster();
00217 bool _restartAsSlave(const UT_UTF8String& sDocUUID, UT_sint32 iRev);
00218 void _shutdownAsMaster();
00219 bool _allSlavesReconnected();
00220 void _checkRestartAsMaster();
00221 void _restartAsMaster();
00222 void _pushOutgoingQueue();
00223
00224 PD_Document * m_pDoc;
00225 ABI_Collab_Import m_Import;
00226 ABI_Collab_Export m_Export;
00227
00228
00229 std::map<BuddyPtr, std::string> m_vCollaborators;
00230 std::vector<std::string> m_vAcl;
00231 AccountHandler* m_pAclAccount;
00232 UT_uint32 m_iDocListenerId;
00233 bool m_bExportMasked;
00234
00235 UT_UTF8String m_sId;
00236
00237 BuddyPtr m_pController;
00238 bool m_bLocallyOwned;
00239
00240 CommandLine * m_pCommandLine;
00241 bool m_bCloseNow;
00242
00243 const AbstractChangeRecordSessionPacket* m_pActivePacket;
00244 bool m_bIsReverting;
00245
00246 SessionRecorderInterface* m_pRecorder;
00247
00248 std::map<EV_Mouse*, UT_sint32> m_mMouseListenerIds;
00249 bool m_bDoingMouseDrag;
00250
00251 std::vector<std::pair<SessionPacket*,BuddyPtr> >
00252 m_vIncomingQueue;
00253
00254
00255
00256 SessionTakeoverState m_eTakeoveState;
00257 bool m_bProposedController;
00258 BuddyPtr m_pProposedController;
00259 std::map<std::string, bool> m_vApprovedReconnectBuddies;
00260 std::map<BuddyPtr, bool> m_mAckedSessionTakeoverBuddies;
00261 bool m_bSessionFlushed;
00262 SessionPacketVector m_vOutgoingQueue;
00263 };
00264
00265 #endif