Invitation works
diff --git a/src/chatdialog.cpp b/src/chatdialog.cpp
index 1c3e37e..5f1d3eb 100644
--- a/src/chatdialog.cpp
+++ b/src/chatdialog.cpp
@@ -11,31 +11,142 @@
#include "chatdialog.h"
#include "ui_chatdialog.h"
+#ifndef Q_MOC_RUN
+#include <ndn.cxx/security/identity/identity-manager.h>
+#include <ndn.cxx/security/identity/basic-identity-storage.h>
+#include <ndn.cxx/security/identity/osx-privatekey-storage.h>
+#include <ndn.cxx/security/encryption/basic-encryption-manager.h>
+#include "logging.h"
+#endif
+
using namespace std;
using namespace ndn;
+INIT_LOGGER("ChatDialog");
+
ChatDialog::ChatDialog(const Name& chatroomPrefix,
const Name& localPrefix,
+ const Name& defaultIdentity,
QWidget *parent)
: QDialog(parent)
, m_chatroomPrefix(chatroomPrefix)
, m_localPrefix(localPrefix)
+ , m_defaultIdentity(defaultIdentity)
+ , m_policyManager(Ptr<ChatroomPolicyManager>(new ChatroomPolicyManager))
, ui(new Ui::ChatDialog)
{
- ui->setupUi(this);
+ ui->setupUi(this);
+
+ setWrapper();
}
ChatDialog::~ChatDialog()
{
- delete ui;
+ delete ui;
+ m_handler->shutdown();
}
void
-ChatDialog::sendInvitation()
+ChatDialog::setWrapper()
{
-
+ Ptr<security::OSXPrivatekeyStorage> privateStorage = Ptr<security::OSXPrivatekeyStorage>::Create();
+ m_identityManager = Ptr<security::IdentityManager>(new security::IdentityManager(Ptr<security::BasicIdentityStorage>::Create(), privateStorage));
+ Ptr<security::EncryptionManager> encryptionManager = Ptr<security::EncryptionManager>(new security::BasicEncryptionManager(privateStorage, "/tmp/encryption.db"));
+
+ m_keychain = Ptr<security::Keychain>(new security::Keychain(m_identityManager, m_policyManager, encryptionManager));
+
+ m_handler = Ptr<Wrapper>(new Wrapper(m_keychain));
}
+void
+ChatDialog::sendInvitation(Ptr<ContactItem> contact)
+{
+ m_policyManager->addTrustAnchor(contact->getSelfEndorseCertificate());
+
+ Name certificateName = m_identityManager->getDefaultCertificateNameByIdentity(m_defaultIdentity);
+
+ Name interestName("/ndn/broadcast/chronos/invitation");
+ interestName.append(contact->getNameSpace());
+ interestName.append("chatroom");
+ interestName.append(m_chatroomPrefix.get(-1));
+ interestName.append("inviter-prefix");
+ interestName.append(m_localPrefix);
+ interestName.append("inviter");
+ interestName.append(certificateName);
+
+ string signedUri = interestName.toUri();
+ Blob signedBlob(signedUri.c_str(), signedUri.size());
+
+ Ptr<const signature::Sha256WithRsa> sha256sig = DynamicCast<const signature::Sha256WithRsa>(m_identityManager->signByCertificate(signedBlob, certificateName));
+ const Blob& sigBits = sha256sig->getSignatureBits();
+
+ interestName.append(sigBits.buf(), sigBits.size());
+
+ Ptr<Interest> interest = Ptr<Interest>(new Interest(interestName));
+ Ptr<Closure> closure = Ptr<Closure>(new Closure(boost::bind(&ChatDialog::onInviteReplyVerified,
+ this,
+ _1,
+ contact->getNameSpace()),
+ boost::bind(&ChatDialog::onInviteTimeout,
+ this,
+ _1,
+ _2,
+ contact->getNameSpace(),
+ 7),
+ boost::bind(&ChatDialog::onUnverified,
+ this,
+ _1)));
+
+ m_handler->sendInterest(interest, closure);
+}
+
+void
+ChatDialog::invitationRejected(const Name& identity)
+{
+ _LOG_DEBUG(" " << identity.toUri() << " rejected your invitation!");
+}
+
+void
+ChatDialog::invitationAccepted(const Name& identity)
+{
+ _LOG_DEBUG(" " << identity.toUri() << " accepted your invitation!");
+}
+
+void
+ChatDialog::onInviteReplyVerified(Ptr<Data> data, const Name& identity)
+{
+ string content(data->content().buf(), data->content().size());
+ if(content.empty())
+ invitationRejected(identity);
+ else
+ invitationAccepted(identity);
+}
+
+void
+ChatDialog::onInviteTimeout(Ptr<Closure> closure, Ptr<Interest> interest, const Name& identity, int retry)
+{
+ if(retry > 0)
+ {
+ Ptr<Closure> newClosure = Ptr<Closure>(new Closure(closure->m_dataCallback,
+ boost::bind(&ChatDialog::onInviteTimeout,
+ this,
+ _1,
+ _2,
+ identity,
+ retry - 1),
+ closure->m_unverifiedCallback,
+ closure->m_stepCount)
+ );
+ m_handler->sendInterest(interest, newClosure);
+ }
+ else
+ invitationRejected(identity);
+}
+
+void
+ChatDialog::onUnverified(Ptr<Data> data)
+{}
+
#if WAF
#include "chatdialog.moc"
#include "chatdialog.cpp.moc"