Code

force single single document over a node's lifetime
[inkscape.git] / src / jabber_whiteboard / inkboard-node.cpp
index c7d325ab99bb468fc3b73df6eb5a6d2e5bc9b0ee..e6eee7304eab1739c682fecbca4286912eb5ac7f 100644 (file)
 #include <glib.h>
 #include <glibmm.h>
 
-#include "jabber_whiteboard/inkboard-node.h"
+#include "util/ucompose.hpp"
+
+#include "pedro/pedrodom.h"
+
+#include "xml/attribute-record.h"
+#include "xml/element-node.h"
+#include "xml/text-node.h"
+
+#include "jabber_whiteboard/message-utilities.h"
+#include "jabber_whiteboard/defines.h"
+#include "jabber_whiteboard/inkboard-document.h"
 
 
 namespace Inkscape {
 
 namespace Whiteboard {
 
-InkboardNode::InkboardNode(int code, Inkscape::XML::NodeType type) :
-       XML::SimpleNode(code), version(0), nodetype(type)
+Glib::ustring
+InkboardDocument::addNodeToTracker(Inkscape::XML::Node *node)
+{
+    Glib::ustring rec = this->getRecipient();
+    Glib::ustring key = this->tracker->generateKey(rec);
+    this->tracker->put(key,node);
+    return key;
+}
+
+Message::Message
+InkboardDocument::composeNewMessage(Inkscape::XML::Node *node)
 {
+    Glib::ustring parentKey;
+    Glib::ustring key = this->tracker->get(node);
+    Inkscape::XML::Node *parent = node->parent();
+
+    Glib::ustring tempParentKey = this->tracker->get(node->parent());
+    if(tempParentKey.size() < 1)
+        parentKey = Vars::DOCUMENT_ROOT_NODE;
+    else
+        parentKey = tempParentKey;
+
+    unsigned int index = parent->_childPosition(*node);
+
+    Message::Message nodeMessage = MessageUtilities::objectToString(node);
+    Message::Message message = String::ucompose(Vars::NEW_MESSAGE,parentKey,key,index,0,nodeMessage);
+
+    return message;
+}
+
+void
+InkboardDocument::changeConfigureText(Glib::ustring target,
+                                      unsigned int /*version*/,
+                                      Glib::ustring text)
+{
+    XML::Node *node = this->tracker->get(target);
+    //unsigned int elementVersion = this->tracker->getVersion(node);
+
+    if(node)// && version == (elementVersion + 1))
+    {
+        this->tracker->incrementVersion(node);
+        this->tracker->addHistory(node, "text", text);
+        node->setContent(text.c_str());
+    }
+}
+
+void
+InkboardDocument::changeConfigure(Glib::ustring target,
+                                  unsigned int /*version*/, 
+                                  Glib::ustring attribute,
+                                                                 Glib::ustring value)
+{
+    XML::Node *node = this->tracker->get(target);
+    //unsigned int elementVersion = this->tracker->getVersion(node);
+
+    if(node)// && version == (elementVersion + 1))
+    {
+        this->tracker->incrementVersion(node);
+        this->tracker->addHistory(node, attribute, value.c_str());
+
+        if(attribute != "transform")
+            node->setAttribute(attribute.c_str(),value.c_str());
+    }
+}
+
+void 
+InkboardDocument::changeNew(Glib::ustring parentid, Glib::ustring id, 
+        signed int /*index*/, Pedro::Element* data)
+{
+
+    Glib::ustring name(data->getName());
+
+    if(name == "text")
+    { 
+        XML::Node *parent = this->tracker->get(parentid);
+        XML::Node *node = new XML::TextNode(Util::share_string(data->getValue().c_str()), this);
+
+        if(parent && node)
+        {
+            this->tracker->put(id,node);
+            parent->appendChild(node);
+        }
+    }else
+    {
+        XML::Node *node = new XML::ElementNode(g_quark_from_string(name.c_str()), this);
+        this->tracker->put(id,node);
+
+        XML::Node *parent = (parentid != "ROOT") 
+            ? this->tracker->get(parentid.c_str()) : this->root();
+
+        std::vector<Pedro::Attribute> attributes = data->getAttributes();
+
+        for (unsigned int i=0; i<attributes.size(); i++) 
+        {
+            node->setAttribute(
+                (attributes[i].getName()).c_str(),
+                (attributes[i].getValue()).c_str());
+        }
+
+        if(parent != NULL)
+            parent->appendChild(node);
+    }
 
 }