summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authordaleharvey <daleharvey@users.sourceforge.net>2006-08-03 01:55:09 +0000
committerdaleharvey <daleharvey@users.sourceforge.net>2006-08-03 01:55:09 +0000
commit0e839531f63d65156208e0a7f9c7e9645981be4e (patch)
tree540abfbc403e773f9d98d9aa6d3153e0db1d959c /src
parentcompile fix (diff)
downloadinkscape-0e839531f63d65156208e0a7f9c7e9645981be4e.tar.gz
inkscape-0e839531f63d65156208e0a7f9c7e9645981be4e.zip
added StateHandling to whiteboard
(bzr r1545)
Diffstat (limited to 'src')
-rw-r--r--src/jabber_whiteboard/defines.h22
-rw-r--r--src/jabber_whiteboard/inkboard-document.cpp110
-rw-r--r--src/jabber_whiteboard/inkboard-document.h9
-rw-r--r--src/jabber_whiteboard/inkboard-session.h85
-rw-r--r--src/jabber_whiteboard/session-manager.cpp5
5 files changed, 166 insertions, 65 deletions
diff --git a/src/jabber_whiteboard/defines.h b/src/jabber_whiteboard/defines.h
index e08d876a6..e1cc8cb8b 100644
--- a/src/jabber_whiteboard/defines.h
+++ b/src/jabber_whiteboard/defines.h
@@ -98,16 +98,28 @@ namespace State {
extern SessionType WHITEBOARD_MUC;
extern SessionType WHITEBOARD_PEER;
- typedef char const* SessionState;
+ enum SessionState {
+
+ INITIAL = 0,
+ AWAITING_INVITATION_REPLY = 1,
+ CONNECTING = 2,
+ INVITATION_RECIEVED = 3,
+ AWAITING_CONNECTED = 4,
+ CONNECTED = 5,
+ AWAITING_DOCUMENT_BEGIN = 6,
+ SYNCHRONISING = 7,
+ IN_WHITEBOARD = 8
+
+ };
}
namespace Dialog {
-enum DialogReply {
+ enum DialogReply {
- ACCEPT_INVITATION = 0,
- DECLINE_INVITATION = 1
-};
+ ACCEPT_INVITATION = 0,
+ DECLINE_INVITATION = 1
+ };
}
diff --git a/src/jabber_whiteboard/inkboard-document.cpp b/src/jabber_whiteboard/inkboard-document.cpp
index bf72d3c2a..514b3acc4 100644
--- a/src/jabber_whiteboard/inkboard-document.cpp
+++ b/src/jabber_whiteboard/inkboard-document.cpp
@@ -33,6 +33,7 @@ void
InkboardDocument::_initBindings()
{
this->_sm = &SessionManager::instance();
+ this->state = State::INITIAL;
_bindDocument(*this);
_bindLogger(*(new XML::SimpleSession()));
}
@@ -50,13 +51,13 @@ InkboardDocument::getRecipient() const
}
void
-InkboardDocument::setSessionIdent(Glib::ustring const& val)
+InkboardDocument::setSessionId(Glib::ustring const& val)
{
this->_session = val;
}
Glib::ustring
-InkboardDocument::getSessionIdent() const
+InkboardDocument::getSessionId() const
{
return this->_session;
}
@@ -77,29 +78,108 @@ void
InkboardDocument::processInkboardEvent(Message::Wrapper mtype, Glib::ustring const& data)
{
g_log(NULL, G_LOG_LEVEL_DEBUG, "Processing Inkboard event: mtype=%s data=%s\n",mtype,data.c_str());
+
}
bool
InkboardDocument::sendProtocol(const Glib::ustring &destJid, Message::Wrapper wrapper,
Message::Message message)
{
- char *fmt=
- "<message type='%s' from='%s' to='%s'>"
- "<wb xmlns='%s' session='%s'>"
- "<%s>"
- "<%s />"
- "</%s>"
- "</wb>"
- "<body> </body>"
- "</message>";
- if (!_sm->getClient().write(
- fmt,_type,_sm->getClient().getJid().c_str(),destJid.c_str(),
- Vars::INKBOARD_XMLNS,this->getSessionIdent().c_str(),wrapper,message,wrapper))
+ if(this->handleOutgoingState(wrapper,message))
+ {
+ char *fmt=
+ "<message type='%s' from='%s' to='%s'>"
+ "<wb xmlns='%s' session='%s'>"
+ "<%s>"
+ "<%s />"
+ "</%s>"
+ "</wb>"
+ "<body> </body>"
+ "</message>";
+
+ if (!_sm->getClient().write(fmt,
+ _type,_sm->getClient().getJid().c_str(),destJid.c_str(),Vars::INKBOARD_XMLNS,
+ this->getSessionId().c_str(),wrapper,message,wrapper))
+ return false;
+
+ return true;
+
+ }else
return false;
+}
+
+bool
+InkboardDocument::handleOutgoingState(Message::Wrapper wrapper,Message::Message message)
+{
+ g_warning("state %d, message %s",this->state,message);
+ if(wrapper == Message::PROTOCOL)
+ {
+ if(message == Message::CONNECT_REQUEST)
+ return this->handleState(State::INITIAL,State::AWAITING_INVITATION_REPLY);
+
+ else if(message == Message::ACCEPT_INVITATION)
+ return this->handleState(State::CONNECTING,State::AWAITING_CONNECTED);
+
+ else if(message == Message::CONNECTED)
+ return this->handleState(State::INVITATION_RECIEVED,State::CONNECTED);
+
+ else if(message == Message::DOCUMENT_BEGIN)
+ return this->handleState(State::CONNECTED,State::SYNCHRONISING);
- return true;
+ else if(message == Message::DOCUMENT_END)
+ return this->handleState(State::SYNCHRONISING,State::IN_WHITEBOARD);
+
+ else
+ return false;
+
+ } else
+ if(this->state == State::SYNCHRONISING && wrapper == Message::NEW)
+ return true;
+
+ return this->state == State::IN_WHITEBOARD;
}
+bool
+InkboardDocument::handleIncomingState(Message::Wrapper wrapper,Glib::ustring const& message)
+{
+ if(wrapper == Message::PROTOCOL)
+ {
+ // Connect Requests are handled in SessionManager
+ if(message == Message::ACCEPT_INVITATION)
+ return this->handleState(State::AWAITING_INVITATION_REPLY,State::INVITATION_RECIEVED);
+
+ else if(message == Message::CONNECTED)
+ return this->handleState(State::AWAITING_CONNECTED,State::AWAITING_DOCUMENT_BEGIN);
+
+ else if(message == Message::DOCUMENT_BEGIN)
+ return this->handleState(State::AWAITING_DOCUMENT_BEGIN,State::SYNCHRONISING);
+
+ else if(message == Message::DOCUMENT_END)
+ return this->handleState(State::SYNCHRONISING,State::IN_WHITEBOARD);
+
+ else
+ return false;
+
+ } else
+ if(this->state == State::SYNCHRONISING && wrapper == Message::NEW)
+ return true;
+
+ return this->state == State::IN_WHITEBOARD;
+}
+
+bool
+InkboardDocument::handleState(State::SessionState expectedState, State::SessionState newState)
+{
+ if(this->state == expectedState)
+ {
+ this->state = newState;
+ return true;
+ }
+
+ return false;
+}
+
+
} // namespace Whiteboard
} // namespace Inkscape
diff --git a/src/jabber_whiteboard/inkboard-document.h b/src/jabber_whiteboard/inkboard-document.h
index 71de75e19..c09640852 100644
--- a/src/jabber_whiteboard/inkboard-document.h
+++ b/src/jabber_whiteboard/inkboard-document.h
@@ -38,8 +38,8 @@ public:
void setRecipient(Glib::ustring const& val);
Glib::ustring getRecipient() const;
- void setSessionIdent(Glib::ustring const& val);
- Glib::ustring getSessionIdent() const;
+ void setSessionId(Glib::ustring const& val);
+ Glib::ustring getSessionId() const;
void startSessionNegotiation();
void terminateSession();
@@ -48,6 +48,10 @@ public:
bool sendProtocol(const Glib::ustring &destJid, Message::Wrapper mwrapper,
Message::Message message);
+ bool handleOutgoingState(Message::Wrapper wrapper,Message::Message message);
+ bool handleIncomingState(Message::Wrapper wrapper,Glib::ustring const& message);
+
+ bool handleState(State::SessionState expectedState, State::SessionState newstate);
protected:
/**
@@ -72,6 +76,7 @@ private:
SessionManager *_sm;
State::SessionType _type;
+ State::SessionState state;
Glib::ustring _session;
Glib::ustring _recipient;
diff --git a/src/jabber_whiteboard/inkboard-session.h b/src/jabber_whiteboard/inkboard-session.h
index 28e844f23..9b1209e05 100644
--- a/src/jabber_whiteboard/inkboard-session.h
+++ b/src/jabber_whiteboard/inkboard-session.h
@@ -49,46 +49,46 @@ public:
virtual void setName(const Glib::ustring &val)
{ _name = val; }
- /**
- * Returns status attributes of this session.
- *
- * \return Status of this session.
- */
- virtual std::bitset< NUM_FLAGS > const& getStatus() const
- {
- return status;
- }
-
- //
- // XML::TransactionLogger methods
- //
- Session& session()
- {
- return *this;
- }
-
- //
- // XML::Session methods
- //
- bool inTransaction()
- {
- return _in_transaction;
- }
-
- void beginTransaction();
- void rollback();
- void commit();
-
- XML::Event* commitUndoable();
-
- XML::Node* createElementNode(char const* name);
- XML::Node* createTextNode(char const* content);
- XML::Node* createCommentNode(char const* content);
-
- //
- // XML::NodeObserver methods
- // (inherited from XML::TransactionLogger)
- //
+ /**
+ * Returns status attributes of this session.
+ *
+ * \return Status of this session.
+ */
+ virtual std::bitset< NUM_FLAGS > const& getStatus() const
+ {
+ return status;
+ }
+
+ //
+ // XML::TransactionLogger methods
+ //
+ Session& session()
+ {
+ return *this;
+ }
+
+ //
+ // XML::Session methods
+ //
+ bool inTransaction()
+ {
+ return _in_transaction;
+ }
+
+ void beginTransaction();
+ void rollback();
+ void commit();
+
+ XML::Event* commitUndoable();
+
+ XML::Node* createElementNode(char const* name);
+ XML::Node* createTextNode(char const* content);
+ XML::Node* createCommentNode(char const* content);
+
+ //
+ // XML::NodeObserver methods
+ // (inherited from XML::TransactionLogger)
+ //
void notifyChildAdded(Inkscape::XML::Node &parent, Inkscape::XML::Node &child, Inkscape::XML::Node *prev);
void notifyChildRemoved(Inkscape::XML::Node &parent, Inkscape::XML::Node &child, Inkscape::XML::Node *prev);
@@ -105,13 +105,14 @@ public:
Util::ptr_shared<char> new_value);
private:
+
InkboardSession(InkboardSession const &); // no copy
void operator=(InkboardSession const &); // no assign
- bool _in_transaction;
+ bool _in_transaction;
std::bitset< NUM_FLAGS > status;
- Glib::ustring _name;
+ Glib::ustring _name;
};
}
diff --git a/src/jabber_whiteboard/session-manager.cpp b/src/jabber_whiteboard/session-manager.cpp
index dd392c845..7ca490212 100644
--- a/src/jabber_whiteboard/session-manager.cpp
+++ b/src/jabber_whiteboard/session-manager.cpp
@@ -175,7 +175,7 @@ SessionManager::initialiseSession(Glib::ustring const& to, State::SessionType ty
char * sessionId = createSessionId(10);
- inkdoc->setSessionIdent(sessionId);
+ inkdoc->setSessionId(sessionId);
addSession(WhiteboardRecord(sessionId, inkdoc));
@@ -315,9 +315,12 @@ SessionManager::checkInvitationQueue()
SPDocument* doc = makeInkboardDocument(g_quark_from_static_string("xml"), "svg:svg", State::WHITEBOARD_PEER, from);
+
InkboardDocument* inkdoc = dynamic_cast< InkboardDocument* >(doc->rdoc);
if(inkdoc == NULL) return true;
+ inkdoc->handleState(State::INITIAL,State::CONNECTING);
+ inkdoc->setSessionId(sessionId);
addSession(WhiteboardRecord(sessionId, inkdoc));
switch (reply) {