blob: abe0a814b458a7e9fdc7e1285312d3a257891062 [file] [log] [blame]
/*
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);
}