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 if(this->doc->tracker->get(node) == "")
92 {
93 this->doc->addNodeToTracker(node);
94 Message::Message message = this->doc->composeNewMessage(node);
96 this->doc->send(this->doc->getRecipient(),Message::NEW,message);
97 }
98 }
99 }
101 void InkboardSession::notifyChildRemoved(Node &parent,
102 Node &child,
103 Node *prev)
104 {
105 if (_in_transaction && doc->state == State::IN_WHITEBOARD)
106 {
107 XML::Node *element = (XML::Node *)&child;
109 Message::Message message = String::ucompose(Vars::REMOVE_MESSAGE,
110 this->doc->tracker->get(element));
112 this->doc->send(this->doc->getRecipient(),Message::REMOVE,message);
113 }
114 }
116 void InkboardSession::notifyChildOrderChanged(Node &parent,
117 Node &child,
118 Node *old_prev,
119 Node *new_prev)
120 {
121 if (_in_transaction && doc->state == State::IN_WHITEBOARD)
122 {
123 XML::Node *element = (XML::Node *)&child;
124 XML::Node *parentElement = (XML::Node *)&parent;
126 unsigned int index = parentElement->_childPosition(*element);
128 Message::Message message = String::ucompose(Vars::MOVE_MESSAGE,
129 this->doc->tracker->get(element),index);
131 this->doc->send(this->doc->getRecipient(),Message::MOVE,message);
132 }
133 }
135 void InkboardSession::notifyContentChanged(Node &node,
136 Util::ptr_shared<char> old_content,
137 Util::ptr_shared<char> new_content)
138 {
139 if (_in_transaction && doc->state == State::IN_WHITEBOARD)
140 {
141 XML::Node *element = (XML::Node *)&node;
143 if(new_content.pointer())
144 {
145 unsigned int version = this->doc->tracker->incrementVersion(element);
147 Message::Message message = String::ucompose(Vars::CONFIGURE_TEXT_MESSAGE,
148 this->doc->tracker->get(element),version,new_content.pointer());
150 this->doc->send(this->doc->getRecipient(),Message::CONFIGURE,message);
151 }
152 }
153 }
155 void InkboardSession::notifyAttributeChanged(Node &node,
156 GQuark name,
157 Util::ptr_shared<char> old_value,
158 Util::ptr_shared<char> new_value)
159 {
160 if (_in_transaction && doc->state == State::IN_WHITEBOARD)
161 {
162 XML::Node *element = (XML::Node *)&node;
164 Glib::ustring value(new_value.pointer());
165 Glib::ustring attribute(g_quark_to_string(name));
167 Configure change = this->doc->tracker->getLastHistory(element);
169 if(change.first == attribute && change.second == value)
170 return;
172 if(name && new_value.pointer())
173 {
174 unsigned int version = this->doc->tracker->incrementVersion(element);
176 Message::Message message = String::ucompose(Vars::CONFIGURE_MESSAGE,
177 this->doc->tracker->get(element),version,attribute.c_str(),value.c_str());
179 this->doc->send(this->doc->getRecipient(),Message::CONFIGURE,message);
180 }
181 }
182 }
184 }
186 }