Add ContactItem
diff --git a/src/contact-item.cpp b/src/contact-item.cpp
new file mode 100644
index 0000000..08f4fa6
--- /dev/null
+++ b/src/contact-item.cpp
@@ -0,0 +1,40 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2013, Regents of the University of California
+ *                     Yingdi Yu
+ *
+ * BSD license, See the LICENSE file for more information
+ *
+ * Author: Yingdi Yu <yingdi@cs.ucla.edu>
+ */
+
+#include "contact-item.h"
+#include "exception.h"
+
+#include <ndn.cxx/fields/signature-sha256-with-rsa.h>
+
+using namespace std;
+using namespace ndn;
+using namespace ndn::security;
+
+ContactItem::ContactItem(const EndorseCertificate& selfEndorseCertificate,
+                         const string& alias)
+  : m_selfEndorseCertificate(selfEndorseCertificate)
+{
+  Name endorsedkeyName = selfEndorseCertificate.getPublicKeyName();
+  Ptr<const signature::Sha256WithRsa> endorseSig = boost::dynamic_pointer_cast<const signature::Sha256WithRsa>(selfEndorseCertificate.getSignature());
+  const Name& signingKeyName = endorseSig->getKeyLocator().getKeyName();
+
+  if(endorsedkeyName != signingKeyName)
+    throw LnException("not a self-claimed");
+
+  m_namespace = endorsedkeyName.getSubName(0, endorsedkeyName.size() - 1);
+  m_alias = alias.empty() ? m_namespace.toUri() : alias;
+
+  Ptr<ProfileData> profileData = selfEndorseCertificate.getProfileData();
+  Ptr<const Blob> nameBlob = profileData->getProfile().getProfileEntry("name");
+  m_name = string(nameBlob->buf(), nameBlob->size());
+  Ptr<const Blob> institutionBlob = profileData->getProfile().getProfileEntry("institution");
+  m_institution = string(institutionBlob->buf(), institutionBlob->size());
+}
+