diff options
| -rw-r--r-- | src/messagehandler.cc | 47 | ||||
| -rw-r--r-- | src/messageparser.cc | 8 | ||||
| -rw-r--r-- | src/messageparser.h | 1 | ||||
| -rw-r--r-- | src/munia_proto.cc | 53 | ||||
| -rw-r--r-- | src/taskmanager.cc | 21 | ||||
| -rw-r--r-- | src/taskmanager.h | 5 | ||||
| -rw-r--r-- | src/tasktree.cc | 3 | ||||
| -rw-r--r-- | src/tasktree.h | 2 | 
8 files changed, 115 insertions, 25 deletions
| diff --git a/src/messagehandler.cc b/src/messagehandler.cc index cdc7246..a394f08 100644 --- a/src/messagehandler.cc +++ b/src/messagehandler.cc @@ -86,8 +86,51 @@ MessageList handle_msg(MessageList msgList, clientid_t wsi) {        {          INFO(messagehandler, "Handling move command\n");          try { -          m.nodes = task_manager.moveTask(m.move.id, m.move.parentid); -          outmsgs.push_back(m); +          task_t removetask = task_manager.task(m.move.id); +          TaskIdListPair tilpair = task_manager.moveTask(m.move.id, m.move.parentid); +          task_t createtask = task_manager.task(m.move.id); + +          /* +          TaskIdList commonAncestors; +          TaskIdList removeAncestors; +          TaskIdList createAncestors; +           +          // find command ancestors and fill ancestors for remove command +          for(TaskIdList::iterator it_remove = tilpair.first.begin(); +              it_remove != tilpair.first.end(); it_remove++) { +            taskid_t removeid = *it; +            bool common = false; +            for(TaskIdList::iterator it_create = tilpair.second.begin(); +                it_create = != tilpair.second.end(); it_create++) { +              taskid_t createid = *id; +              if(removeid == createid) { +                commandAncestors.push_back(removeid); +                common = true; +              } +            } +            if(!common) { +              removeAncestors.push_back(removeid); +            } +          } + +          // fill ancestors for create command +          for(TaskIdList::iterator it_create = tilpair.second.begin(); +              it_create = != tilpair.second.end(); it_create++) { +            taskid_t createid = *id; +            if(removeid == createid) { +              commandAncestors.push_back(removeid); +              common = true; +            } +          } +          */ + +          message_t removemsg = create_msg_remove(removetask); +          removemsg.nodes = tilpair.first; +          message_t createmsg = create_msg_create(createtask); +          createmsg.nodes = tilpair.second; + +          outmsgs.push_back(removemsg); +          outmsgs.push_back(createmsg);          }          catch (std::exception& e) {            DEBUG(messagehandler, "Error moving task\n"); diff --git a/src/messageparser.cc b/src/messageparser.cc index 804eb12..62923be 100644 --- a/src/messageparser.cc +++ b/src/messageparser.cc @@ -245,6 +245,14 @@ message_t create_msg_remove(task_t t) {    return m;  } +message_t create_msg_move(taskid_t id, taskid_t to) { +  message_t m; +  m.cmd = cmd::move; +  m.move.id = id; +  m.move.parentid = to; +  return m; +} +  #ifdef TEST_MSGPARSER  //Additional dependency files  //deps: diff --git a/src/messageparser.h b/src/messageparser.h index 6ebac3e..11b11cb 100644 --- a/src/messageparser.h +++ b/src/messageparser.h @@ -38,5 +38,6 @@ std::string msg_tostring(message_t msg);  message_t create_msg_create(task_t task);  message_t create_msg_update(task_t task);  message_t create_msg_remove(task_t task); +message_t create_msg_move(taskid_t id, taskid_t to);   #endif/*__MUNIA_MESSAGEPARSER_H__*/ diff --git a/src/munia_proto.cc b/src/munia_proto.cc index d9b068f..3022042 100644 --- a/src/munia_proto.cc +++ b/src/munia_proto.cc @@ -147,30 +147,62 @@ int callback_lws_task(struct libwebsocket_context * context,        std::string msgstr;        msgstr.append((size_t)LWS_SEND_BUFFER_PRE_PADDING, ' '); +      int c = 0; +      message_t prevmsg; +      std::queue<message_t> messages;        while(msgqueue[wsi].size() > 0) {          message_t msg = msgqueue[wsi].front();          msgqueue[wsi].pop(); +         +        //Rewriting delete id followed by create id to move to_id from_id +        // look at previous message from create commands +        if(c > 0 && // look backward (skip first entry) +           msg.cmd == cmd::create && // look from create commands +           prevmsg.cmd == cmd::remove && // if  previous msg is a remove command +           msg.create.id == prevmsg.remove.id) { // and commands have same id +         +          printf("\tprevmsg: %s, msg: %s\n", msg_tostring(prevmsg).c_str(),  +                 msg_tostring(msg).c_str()); +          message_t movemsg = create_msg_move(msg.create.id, msg.create.parentid); +          msg = movemsg; +        } +        else if(c > 0) { +          messages.push(prevmsg); +        } +       +        prevmsg = msg; +        c++; +      } +      if(c > 0) { // Push last msg +        messages.push(prevmsg); +      } +       +      // create msg string +      //      while(msgqueue[wsi].size() > 0) { +      while(messages.size() > 0) { +        message_t msg = messages.front(); +        messages.pop();          char buf[32];          sprintf(buf, "%d", msg.tid); +        printf("msg: %s\n", msg_tostring(msg).c_str());          if(msgstr.size() > LWS_SEND_BUFFER_PRE_PADDING) msgstr += " ";          msgstr += std::string(buf) + " " + msg_tostring(msg);        }        msgstr.append((size_t)LWS_SEND_BUFFER_POST_PADDING, ' '); - +              int n = libwebsocket_write(wsi, (unsigned char *) -                                 msgstr.c_str() + -                                 LWS_SEND_BUFFER_PRE_PADDING, -                                 msgstr.length() - -                                 LWS_SEND_BUFFER_POST_PADDING - -                                 LWS_SEND_BUFFER_PRE_PADDING, -                                 LWS_WRITE_TEXT); +                               msgstr.c_str() + +                               LWS_SEND_BUFFER_PRE_PADDING, +                               msgstr.length() - +                               LWS_SEND_BUFFER_POST_PADDING - +                               LWS_SEND_BUFFER_PRE_PADDING, +                               LWS_WRITE_TEXT);        if(n < 0) {          fprintf(stderr, "ERROR writing to socket");          exit(1); -      } -    } - +      }    } +          break;      /* @@ -228,7 +260,6 @@ int callback_lws_task(struct libwebsocket_context * context,              id++;            } -          } else {            printf("%d nodes affected by command\n", omi->nodes.size()); diff --git a/src/taskmanager.cc b/src/taskmanager.cc index 6ebffd5..1ca0b63 100644 --- a/src/taskmanager.cc +++ b/src/taskmanager.cc @@ -98,23 +98,24 @@ taskid_t TaskManager::createId() {    return idCount++;  } -TaskIdList TaskManager::moveTask(taskid_t id, taskid_t to)  +TaskIdListPair TaskManager::moveTask(taskid_t id, taskid_t to)     throw (std::exception) { -  if(isProtected(id)) return TaskIdList(); +  if(isProtected(id)) return TaskIdListPair(); -  TaskIdList affectedTasks; +  task_t t = tree.data(id); +  t.parentid = to; -  try { -    affectedTasks = tree.move(id, to); -  } -  catch (std::exception& e) { -    throw e; -  } +  TaskIdList tilremove = tree.remove(id); +  TaskIdList tilcreate = tree.insertAsChild(to, id, t); + +  TaskIdListPair tilpair; +  tilpair.first = tilremove; +  tilpair.second = tilcreate;    flushTasks(); -  return affectedTasks; +  return tilpair;  }  TaskIdList TaskManager::removeTask(taskid_t id)  diff --git a/src/taskmanager.h b/src/taskmanager.h index fbd38ec..52daa05 100644 --- a/src/taskmanager.h +++ b/src/taskmanager.h @@ -36,6 +36,8 @@  #include "task.h"  #include "tasktree.h" +typedef std::pair<TaskIdList, TaskIdList> TaskIdListPair; +  class TaskManager {  public:    TaskManager(std::string file = "/tmp/munia.xml"); @@ -44,7 +46,8 @@ public:    TaskIdList createTask(taskid_t parentid, taskid_t *id) throw (std::exception);    TaskIdList updateTask(taskid_t id, task_t task) throw (std::exception);    TaskIdList removeTask(taskid_t id) throw (std::exception); -  TaskIdList moveTask(taskid_t id, taskid_t newParent) throw (std::exception); +   +  TaskIdListPair moveTask(taskid_t id, taskid_t newParent) throw (std::exception);    TaskIdList subTasks(taskid_t) throw (std::exception); diff --git a/src/tasktree.cc b/src/tasktree.cc index 2576600..ee181eb 100644 --- a/src/tasktree.cc +++ b/src/tasktree.cc @@ -153,6 +153,7 @@ TaskIdList TaskTree::remove(taskid_t id)    return affectedNodes;  } +/*  TaskIdList TaskTree::move(taskid_t id, taskid_t toid)     throw (std::exception)   { @@ -185,7 +186,9 @@ TaskIdList TaskTree::move(taskid_t id, taskid_t toid)    return affectedNodes;  } +*/ +  TaskIdList TaskTree::updateData(taskid_t id, task_t t)     throw (std::exception)   { diff --git a/src/tasktree.h b/src/tasktree.h index 64ce0b6..d5e215f 100644 --- a/src/tasktree.h +++ b/src/tasktree.h @@ -58,7 +58,7 @@ public:    TaskIdList insertAsChild(taskid_t parentid, taskid_t id, task_t data) throw (std::exception);    TaskIdList remove(taskid_t id) throw (std::exception); -  TaskIdList move(taskid_t id, taskid_t newParentId) throw (std::exception); +  //  TaskIdList move(taskid_t id, taskid_t newParentId) throw (std::exception);    TaskIdList updateData(taskid_t id, task_t t) throw (std::exception);    task_t data(taskid_t id) throw (std::exception); | 
