Code

6601d5d879b43ffe762eb346e79bbc8907f7d852
[inkscape.git] / src / jabber_whiteboard / inkboard-session.cpp
1 /**
2  * Inkscape::Whiteboard::InkboardSession - Whiteboard implementation of XML::Session
3  *
4  * Authors:
5  * David Yip <yipdw@rose-hulman.edu>
6  *
7  * Copyright (c) 2005 Authors
8  *
9  * Released under GNU GPL, read the file 'COPYING' for more information
10  */
12 #include <glibmm.h>
13 #include <glib/gmessages.h>
14 #include <glib/gquark.h>
16 #include "jabber_whiteboard/inkboard-session.h"
17 #include "jabber_whiteboard/inkboard-document.h"
18 #include "jabber_whiteboard/defines.h"
20 #include "xml/node.h"
21 #include "xml/event.h"
22 #include "xml/element-node.h"
23 #include "xml/text-node.h"
24 #include "xml/comment-node.h"
26 #include "util/share.h"
27 #include "util/ucompose.hpp"
29 namespace Inkscape {
31 namespace Whiteboard {
33 using XML::Node;
35 void
36 InkboardSession::beginTransaction()
37 {
38     g_assert(!_in_transaction);
39     _in_transaction = true;
40 }
42 void
43 InkboardSession::rollback()
44 {
45     g_assert(_in_transaction);
46     _in_transaction = false;
47 }
49 void 
50 InkboardSession::commit()
51 {
52     g_assert(_in_transaction);
53     _in_transaction = false;
54 }
56 XML::Event*
57 InkboardSession::commitUndoable()
58 {
59     g_assert(_in_transaction);
60     _in_transaction = false;
61     return NULL;
62 }
64 XML::Node*
65 InkboardSession::createElementNode(char const* name)
66 {
67     return new XML::ElementNode(g_quark_from_string(name));
68 }
70 XML::Node*
71 InkboardSession::createTextNode(char const* content)
72 {
73     return new XML::TextNode(Util::share_string(content));
74 }
76 XML::Node*
77 InkboardSession::createCommentNode(char const* content)
78 {
79     return new XML::CommentNode(Util::share_string(content));
80 }
83 void InkboardSession::notifyChildAdded(Node &parent,
84                                      Node &child,
85                                      Node *prev)
86 {
87     if (_in_transaction && doc->state == State::IN_WHITEBOARD) {
89         XML::Node *node = (XML::Node *)&child;
91         this->doc->addNodeToTracker(node);
92         Message::Message message = this->doc->composeNewMessage(node);
94         this->doc->send(this->doc->getRecipient(),Message::NEW,message);
95     }
96 }
98 void InkboardSession::notifyChildRemoved(Node &parent,
99                                        Node &child,
100                                        Node *prev)
102     if (_in_transaction && doc->state == State::IN_WHITEBOARD) 
103     {
104         XML::Node *element = (XML::Node *)&child;
106         Message::Message message = String::ucompose(Vars::REMOVE_MESSAGE,
107             this->doc->tracker->get(element));
109         this->doc->send(this->doc->getRecipient(),Message::REMOVE,message);
110    }
113 void InkboardSession::notifyChildOrderChanged(Node &parent,
114                                             Node &child,
115                                             Node *old_prev,
116                                             Node *new_prev)
118     if (_in_transaction && doc->state == State::IN_WHITEBOARD) 
119     {
120         XML::Node *element = (XML::Node *)&child;
121         XML::Node *parentElement = (XML::Node *)&parent;
123         unsigned int index = parentElement->_childPosition(*element);
125         Message::Message message = String::ucompose(Vars::MOVE_MESSAGE,
126                 this->doc->tracker->get(element),index);
128         this->doc->send(this->doc->getRecipient(),Message::MOVE,message);
129     }
132 void InkboardSession::notifyContentChanged(Node &node,
133                                          Util::ptr_shared<char> old_content,
134                                          Util::ptr_shared<char> new_content)
136     if (_in_transaction && doc->state == State::IN_WHITEBOARD) 
137     {
138         XML::Node *element = (XML::Node *)&node;
140         if(new_content.pointer())
141         {
142             Message::Message message = String::ucompose(Vars::CONFIGURE_TEXT_MESSAGE,
143                 this->doc->tracker->get(element),"0",new_content.pointer());
145             this->doc->send(this->doc->getRecipient(),Message::CONFIGURE,message);
146         }
147     }
150 void InkboardSession::notifyAttributeChanged(Node &node,
151                                            GQuark name,
152                                            Util::ptr_shared<char> old_value,
153                                            Util::ptr_shared<char> new_value)
155     if (_in_transaction && doc->state == State::IN_WHITEBOARD) 
156     {
157         XML::Node *element = (XML::Node *)&node;
159         if(name && new_value.pointer())
160         {
161             Message::Message message = String::ucompose(Vars::CONFIGURE_MESSAGE,
162                 this->doc->tracker->get(element),"0",g_quark_to_string(name),new_value.pointer());
164             this->doc->send(this->doc->getRecipient(),Message::CONFIGURE,message);
165         }
166     }