* #35924 (zrtp): switch to libzrtpcpp
diff --git a/jni/libzrtp/sources/zrtp/ZIDCacheDb.cpp b/jni/libzrtp/sources/zrtp/ZIDCacheDb.cpp
new file mode 100644
index 0000000..abe0a81
--- /dev/null
+++ b/jni/libzrtp/sources/zrtp/ZIDCacheDb.cpp
@@ -0,0 +1,137 @@
+/*
+  Copyright (C) 2006-2013 Werner Dittmann
+
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/*
+ * Authors: Werner Dittmann <Werner.Dittmann@t-online.de>
+ */
+// #define UNIT_TEST
+
+#include <string>
+#include <time.h>
+#include <stdlib.h>
+
+#include <libzrtpcpp/ZIDCacheDb.h>
+
+
+static ZIDCacheDb* instance;
+
+/**
+ * A poor man's factory.
+ *
+ * The build process must not allow to implementation classes linked
+ * into the same library.
+ */
+
+ZIDCache* getZidCacheInstance() {
+
+    if (instance == NULL) {
+        instance = new ZIDCacheDb();
+    }
+    return instance;
+}
+
+
+ZIDCacheDb::~ZIDCacheDb() {
+    close();
+}
+
+int ZIDCacheDb::open(char* name) {
+
+    // check for an already active ZID file
+    if (zidFile != NULL) {
+        return 0;
+    }
+    if (cacheOps.openCache(name, &zidFile, errorBuffer) == 0)
+        cacheOps.readLocalZid(zidFile, associatedZid, NULL, errorBuffer);
+    else {
+        cacheOps.closeCache(zidFile);
+        zidFile = NULL;
+    }
+
+    return ((zidFile == NULL) ? -1 : 1);
+}
+
+void ZIDCacheDb::close() {
+
+    if (zidFile != NULL) {
+        cacheOps.closeCache(zidFile);
+        zidFile = NULL;
+    }
+}
+
+ZIDRecord *ZIDCacheDb::getRecord(unsigned char *zid) {
+    ZIDRecordDb *zidRecord = new ZIDRecordDb();
+
+    cacheOps.readRemoteZidRecord(zidFile, zid, associatedZid, zidRecord->getRecordData(), errorBuffer);
+
+    zidRecord->setZid(zid);
+
+    // We need to create a new ZID record.
+    if (!zidRecord->isValid()) {
+        zidRecord->setValid();
+        zidRecord->getRecordData()->secureSince = (int64_t)time(NULL);
+        cacheOps.insertRemoteZidRecord(zidFile, zid, associatedZid, zidRecord->getRecordData(), errorBuffer);
+    }
+    return zidRecord;
+}
+
+unsigned int ZIDCacheDb::saveRecord(ZIDRecord *zidRec) {
+    ZIDRecordDb *zidRecord = reinterpret_cast<ZIDRecordDb *>(zidRec);
+
+    cacheOps.updateRemoteZidRecord(zidFile, zidRecord->getIdentifier(), associatedZid, zidRecord->getRecordData(), errorBuffer);
+    return 1;
+}
+
+int32_t ZIDCacheDb::getPeerName(const uint8_t *peerZid, std::string *name) {
+    zidNameRecord_t nameRec;
+    char buffer[201] = {'\0'};
+
+    nameRec.name = buffer;
+    nameRec.nameLength = 200;
+    cacheOps.readZidNameRecord(zidFile, peerZid, associatedZid, NULL, &nameRec, errorBuffer);
+    if ((nameRec.flags & Valid) != Valid) {
+        return 0;
+    }
+    name->assign(buffer);
+    return name->length();
+}
+
+void ZIDCacheDb::putPeerName(const uint8_t *peerZid, const std::string name) {
+    zidNameRecord_t nameRec;
+    char buffer[201] = {'\0'};
+
+    nameRec.name = buffer;
+    nameRec.nameLength = 200;
+    cacheOps.readZidNameRecord(zidFile, peerZid, associatedZid, NULL, &nameRec, errorBuffer);
+
+    nameRec.name = (char*)name.c_str();
+    nameRec.nameLength = name.length();
+    nameRec.nameLength = nameRec.nameLength > 200 ? 200 : nameRec.nameLength;
+    if ((nameRec.flags & Valid) != Valid) {
+        nameRec.flags = Valid;
+        cacheOps.insertZidNameRecord(zidFile, peerZid, associatedZid, NULL, &nameRec, errorBuffer);
+    }
+    else
+        cacheOps.updateZidNameRecord(zidFile, peerZid, associatedZid, NULL, &nameRec, errorBuffer);
+
+    return;
+}
+
+void ZIDCacheDb::cleanup() {
+    cacheOps.cleanCache(zidFile, errorBuffer);
+    cacheOps.readLocalZid(zidFile, associatedZid, NULL, errorBuffer);
+}