Adding local prefix updating
diff --git a/src/chatdialog.cpp b/src/chatdialog.cpp
index 10d97f2..ce972c3 100644
--- a/src/chatdialog.cpp
+++ b/src/chatdialog.cpp
@@ -19,6 +19,7 @@
 
 #ifndef Q_MOC_RUN
 #include <ndn.cxx/security/identity/identity-manager.h>
+#include <ndn.cxx/security/policy/no-verify-policy-manager.h>
 #include <ndn.cxx/security/encryption/basic-encryption-manager.h>
 #include <sync-intro-certificate.h>
 #include <boost/random/random_device.hpp>
@@ -61,9 +62,10 @@
 
   ui->setupUi(this);
 
+  QString randString = getRandomString();
   m_localChatPrefix = m_localPrefix;
   m_localChatPrefix.append("%F0.").append(m_defaultIdentity);
-  m_localChatPrefix.append("chronos").append(m_chatroomPrefix.get(-1));
+  m_localChatPrefix.append("chronos").append(m_chatroomPrefix.get(-1)).append(randString.toStdString());
 
   m_session = time(NULL);
   m_scene = new DigestTreeScene(this);
@@ -136,29 +138,14 @@
 
   m_keychain = ndn::Ptr<ndn::security::Keychain>(new ndn::security::Keychain(m_identityManager, m_invitationPolicyManager, NULL));
 
+  ndn::Ptr<ndn::security::Keychain> noVerifyKeychain = ndn::Ptr<ndn::security::Keychain>(new ndn::security::Keychain(m_identityManager,
+ndn::Ptr<ndn::security::NoVerifyPolicyManager>::Create(), NULL));
   try{
     m_handler = ndn::Ptr<ndn::Wrapper>(new ndn::Wrapper(m_keychain));
+    m_localPrefixHandler = ndn::Ptr<ndn::Wrapper>(new ndn::Wrapper(noVerifyKeychain));
   }catch(ndn::Error::ndnOperation& e){
     emit noNdnConnection(QString::fromStdString("Cannot conect to ndnd!\n Have you started your ndnd?"));
   }
-
-
-  if(trial == true)
-    {
-      ndn::Ptr<ndn::Interest> interest = ndn::Ptr<ndn::Interest>(new ndn::Interest(ndn::Name("/local/ndn/prefix")));
-      ndn::Ptr<ndn::Closure> closure = ndn::Ptr<ndn::Closure>(new ndn::Closure(boost::bind(&ChatDialog::onUnverified,
-                                                                                           this,
-                                                                                           _1),
-                                                                               boost::bind(&ChatDialog::onTimeout,
-                                                                                           this,
-                                                                                           _1,
-                                                                                           _2),
-                                                                               boost::bind(&ChatDialog::onUnverified,
-                                                                                           this,
-                                                                                           _1)));
-
-      m_handler->sendInterest(interest, closure);
-    }
 }
 
 void
@@ -700,6 +687,94 @@
 }
 
 void
+ChatDialog::settingUpdated(QString nick, QString chatroom, QString originPrefix)
+{
+  QString randString = getRandomString();
+  bool needWrite = false;
+  bool needFresh = false;
+
+  QString oldPrefix = m_user.getPrefix();
+  if (!originPrefix.isEmpty() && originPrefix != m_user.getOriginPrefix()) {
+    m_user.setOriginPrefix(originPrefix);
+
+    m_localPrefix = ndn::Name(originPrefix.toStdString());
+    m_localChatPrefix = m_localPrefix;
+    m_localChatPrefix.append("%F0.").append(m_defaultIdentity);
+    m_localChatPrefix.append("chronos").append(m_chatroomPrefix.get(-1)).append(randString.toStdString());
+    m_user.setPrefix(QString::fromStdString(m_localChatPrefix.toUri()));
+    m_scene->setCurrentPrefix(QString::fromStdString(m_localChatPrefix.toUri()));
+    needWrite = true;
+    needFresh = true;
+  }
+
+  if (needWrite) {
+    updateLabels();
+  }
+
+  if (needFresh && m_sock != NULL)
+  {
+
+    {
+      boost::recursive_mutex::scoped_lock lock(m_sceneMutex);
+      m_scene->clearAll();
+      m_scene->plot("Empty");
+    }
+
+    // ui->textEdit->clear();
+
+    // keep the new prefix
+    QString newPrefix = m_user.getPrefix();
+    // send leave for the old
+    m_user.setPrefix(oldPrefix);
+    // there is no point to send leave if we haven't joined yet
+    if (m_joined)
+    {
+      sendLeave();
+    }
+    // resume new prefix
+    m_user.setPrefix(newPrefix);
+    // Sync::CcnxWrapperPtr handle = Sync::CcnxWrapper::Create();
+    // handle->clearInterestFilter(oldPrefix.toStdString());
+    delete m_sock;
+    m_sock = NULL;
+
+    try
+    {
+      usleep(100000);
+      m_sock = new Sync::SyncSocket(m_chatroomPrefix.toUri(),
+                                    m_syncPolicyManager,
+                                    bind(&ChatDialog::processTreeUpdateWrapper, this, _1, _2),
+                                    bind(&ChatDialog::processRemoveWrapper, this, _1));
+      usleep(100000);
+      // Sync::CcnxWrapperPtr handle = boost::make_shared<Sync::CcnxWrapper> ();
+      // handle->setInterestFilter(m_user.getPrefix().toStdString(), bind(&ChatDialog::respondHistoryRequest, this, _1));
+      sendJoin();
+      m_timer->start(FRESHNESS * 1000);
+      disableTreeDisplay();
+      enableTreeDisplay();
+    }catch(ndn::Error::ndnOperation& e){
+      emit noNdnConnection(QString::fromStdString("Cannot conect to ndnd!\n Have you started your ndnd?"));
+    }
+  }
+  else if (needFresh && m_sock == NULL)
+  {
+    initializeSync();
+  }
+  else if (m_sock == NULL)
+  {
+    initializeSync();
+  }
+  else
+  {
+// #ifdef __DEBUG
+//     std::cout << "Just changing nicks, we're good. " << std::endl;
+// #endif
+  }
+
+  fitView();
+}
+
+void
 ChatDialog::iconActivated(QSystemTrayIcon::ActivationReason reason)
 {
   switch (reason)
@@ -739,8 +814,8 @@
 
   // settingsAction->setMenuRole (QAction::PreferencesRole);
 
-  // updateLocalPrefixAction = new QAction(tr("Update local prefix"), this);
-  // connect (updateLocalPrefixAction, SIGNAL(triggered()), this, SLOT(updateLocalPrefix()));
+  updateLocalPrefixAction = new QAction(tr("Update local prefix"), this);
+  connect (updateLocalPrefixAction, SIGNAL(triggered()), this, SLOT(updateLocalPrefix()));
 
   quitAction = new QAction(tr("Quit"), this);
   connect(quitAction, SIGNAL(triggered()), this, SLOT(quit()));
@@ -755,8 +830,8 @@
   trayIconMenu->addAction(restoreAction);
   // trayIconMenu->addSeparator();
   // trayIconMenu->addAction(settingsAction);
-  // trayIconMenu->addSeparator();
-  // trayIconMenu->addAction(updateLocalPrefixAction);
+  trayIconMenu->addSeparator();
+  trayIconMenu->addAction(updateLocalPrefixAction);
   trayIconMenu->addSeparator();
   trayIconMenu->addAction(quitAction);
 
@@ -813,6 +888,57 @@
 }
 
 void
+ChatDialog::updateLocalPrefix()
+{
+  ndn::Ptr<ndn::Interest> interest = ndn::Ptr<ndn::Interest>(new ndn::Interest(ndn::Name("/local/ndn/prefix")));
+  interest->setChildSelector(ndn::Interest::CHILD_RIGHT);
+
+  ndn::Ptr<ndn::Closure> closure = ndn::Ptr<ndn::Closure>(new ndn::Closure(boost::bind(&ChatDialog::getLocalPrefix,
+                                                                                       this,
+                                                                                       _1),
+                                                                           boost::bind(&ChatDialog::getLocalPrefixTimeout,
+                                                                                       this,
+                                                                                       _1,
+                                                                                       _2),
+                                                                           boost::bind(&ChatDialog::getLocalPrefix,
+                                                                                       this,
+                                                                                       _1)));
+  
+  m_localPrefixHandler->sendInterest(interest, closure);
+
+}
+
+static std::string chars2("qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789");
+
+QString
+ChatDialog::getRandomString()
+{
+  std::string randStr;
+  boost::random::random_device rng;
+  boost::random::uniform_int_distribution<> index_dist(0, chars2.size() - 1);
+  for (int i = 0; i < 10; i ++)
+  {
+    randStr += chars2[index_dist(rng)];
+  }
+  return randStr.c_str();
+}
+
+void
+ChatDialog::getLocalPrefix(ndn::Ptr<ndn::Data> data)
+{
+  string dataString(data->content().buf(), data->content().size());
+  QString originPrefix = QString::fromStdString (dataString).trimmed ();
+  
+  if (originPrefix != "" && m_user.getOriginPrefix () != originPrefix)
+      emit settingUpdated(m_user.getNick (), m_user.getChatroom (), originPrefix);
+}
+
+void
+ChatDialog::getLocalPrefixTimeout(ndn::Ptr<ndn::Closure> closure, ndn::Ptr<ndn::Interest> interest)
+{
+}
+
+void
 ChatDialog::changeEvent(QEvent *e)
 {
   switch(e->type())