// etag.cpp - ETag subroutines.
//
// (c) 2012-2015 Xestia Software Development.
//
// This file is part of Xestia Address Book.
//
// Xestia Address Book is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by the
// Free Software Foundation, version 3 of the license.
//
// Xestia Address Book 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 Xestia Address Book. If not, see
#include "etag.h"
#include "../common/dirs.h"
ETagDB::~ETagDB(){
// Write out the database to file.
ProcessLock->try_lock();
if (NeedsWrite == TRUE){
WriteETagDB();
}
ProcessLock->unlock();
}
void ETagDB::SetupDB(wxString AccountDirInc){
// Setup the ETag Database.
AccountDir = AccountDirInc;
LoadETagDB();
}
void ETagDB::AddETag(wxString Filename, wxString ETag, wxString ETagOriginal){
// Lock or wait if it is already locked.
ProcessLock->lock();
// Process the ETag addition.
FilenameETag.insert(std::make_pair(Filename, ETag));
FilenameETagOriginal.insert(std::make_pair(Filename, ETagOriginal));
NeedsWrite = TRUE;
// Unlock.
ProcessLock->unlock();
}
void ETagDB::RemoveETag(wxString Filename){
// Remove the ETag.
// Lock or wait if it is already locked.
ProcessLock->lock();
// Remove the ETag.
Filename.Trim();
FilenameETag.erase(Filename);
FilenameETagOriginal.erase(Filename);
NeedsWrite = TRUE;
// Unlock.
ProcessLock->unlock();
}
void ETagDB::UpdateETag(wxString Filename, wxString ETag){
// Update the ETag.
// Lock or wait if it is already locked.
ProcessLock->lock();
// Update the ETag.
FilenameETag.erase(Filename);
FilenameETag.insert(std::make_pair(Filename, ETag));
NeedsWrite = TRUE;
// Unlock.
ProcessLock->unlock();
}
void ETagDB::UpdateETag(wxString Filename, wxString ETag, wxString ETagOriginal){
// Update the ETag with the tags given.
// Lock or wait if it is already locked.
ProcessLock->lock();
// Update the ETag.
FilenameETag.erase(Filename);
FilenameETagOriginal.erase(Filename);
FilenameETag.insert(std::make_pair(Filename, ETag));
FilenameETagOriginal.insert(std::make_pair(Filename, ETagOriginal));
std::map::iterator IterWxS;
IterWxS = FilenameETagOriginal.find(Filename);
NeedsWrite = TRUE;
// Unlock.
ProcessLock->unlock();
}
bool ETagDB::ETagExists(wxString Filename){
// Check if the ETag exists.
// Lock or wait if it is already locked.
ProcessLock->lock();
bool FileResult = FALSE;
if (FilenameETag.find(Filename) != FilenameETag.end()){
FileResult = TRUE;
} else {
FileResult = FALSE;
}
// Unlock.
ProcessLock->unlock();
return FileResult;
}
std::map* ETagDB::GetFilenamePointer(){
// Get the Filename Pointer.
return &FilenameETag;
}
wxString ETagDB::GetETag(wxString Filename){
// Get the ETag.
// Lock or wait if it is already locked.
wxString ETagOut;
std::map::iterator IterwxS;
ProcessLock->lock();
// Get the ETag.
if (FilenameETag.find(Filename) != FilenameETag.end()){
IterwxS = FilenameETag.find(Filename);
ETagOut = IterwxS->second;
}
// Unlock.
ProcessLock->unlock();
return ETagOut;
}
wxString ETagDB::GetETagOriginal(wxString Filename){
// Get the original ETag.
// Lock or wait if it is already locked.
wxString ETagOrigOut;
std::map::iterator IterwxS;
ProcessLock->lock();
// Get the ETag.
if (FilenameETagOriginal.find(Filename) != FilenameETagOriginal.end()){
IterwxS = FilenameETagOriginal.find(Filename);
ETagOrigOut = IterwxS->second;
}
// Unlock.
ProcessLock->unlock();
return ETagOrigOut;
}
bool ETagDB::WriteETagDB(){
// Write the ETag database.
// Lock or wait if it is already locked.
ProcessLock->lock();
// Write the ETag database.
wxString AccountETagDB;
std::map::iterator IterwxS;
int LineSeek = 0;
#if defined(__HAIKU__)
//preffilename = wxT("noo");
#elif defined(__WIN32__)
AccountETagDB.Clear();
AccountETagDB = GetAccountDir(AccountDir, FALSE);
AccountETagDB.Append(wxT("\\etag.db"));
#else
// This entry applies to OSX as well.
AccountETagDB.Clear();
AccountETagDB = GetAccountDir(AccountDir, FALSE);
AccountETagDB.Append(wxT("/etag.db"));
#endif
wxTextFile ETagDBFile;
wxString SettingLine;
if (wxFileExists(AccountETagDB) == FALSE){
if (ETagDBFile.Create(AccountETagDB) == FALSE){
return FALSE;
}
} else {
if (ETagDBFile.Open(AccountETagDB) == FALSE){
return FALSE;
}
}
ETagDBFile.Clear();
for (std::map::iterator iter = FilenameETag.begin();
iter != FilenameETag.end(); ++iter){
// Get Original ETag as well.
IterwxS = FilenameETagOriginal.find(iter->first);
if (iter->first.IsEmpty()){
continue;
}
wxString ServerETag = "";
if (IterwxS == FilenameETagOriginal.end()) {
ServerETag = "";
} else {
ServerETag = IterwxS->second;
}
SettingLine = iter->first + wxT("|") + iter->second + wxT("|") + ServerETag;
ETagDBFile.InsertLine(SettingLine, LineSeek);
LineSeek++;
}
ETagDBFile.Write();
NeedsWrite = FALSE;
// Unlock.
ProcessLock->unlock();
return TRUE;
}
bool ETagDB::LoadETagDB(){
// Load the ETag database.
// Lock or wait if it is already locked.
ProcessLock->lock();
// Load the ETag database.
wxString AccountETagDB;
wxString AccountDirPath;
#if defined(__HAIKU__)
#elif defined(__WIN32__)
AccountDirPath = GetAccountDir(AccountDir, FALSE);
AccountETagDB = AccountDirPath;
AccountETagDB.Append(wxT("\\etag.db"));
#else
AccountDirPath = GetAccountDir(AccountDir, FALSE);
AccountETagDB = AccountDirPath;
AccountETagDB.Append(wxT("/etag.db"));
#endif
wxTextFile ETagDBFile;
if (wxFileExists(AccountETagDB) == FALSE){
if (ETagDBFile.Create(AccountETagDB) == FALSE){
return FALSE;
}
} else {
if (ETagDBFile.Open(AccountETagDB, wxConvUTF8) == FALSE){
return FALSE;
}
}
wxString wxSFilename;
wxString wxSValue;
wxString ETagContactFilename;
for (wxStringTokenizer ETagDBLine(ETagDBFile.GetFirstLine(), wxT("|"));
!ETagDBFile.Eof(); ETagDBLine.SetString(ETagDBFile.GetNextLine(), wxT("|"), wxTOKEN_DEFAULT) )
{
// Split the file into three.
wxSFilename = ETagDBLine.GetNextToken();
// Get the ETag.
wxSValue = ETagDBLine.GetNextToken();
FilenameETag.insert(std::make_pair(wxSFilename, wxSValue));
// Get the original ETag.
wxSValue = ETagDBLine.GetNextToken();
wxSValue.Trim();
FilenameETagOriginal.insert(std::make_pair(wxSFilename, wxSValue));
}
// Unlock.
ProcessLock->unlock();
return TRUE;
}
void ETagDB::DeleteETagDB(){
// Delete the ETag database.
// Lock or wait if it is already locked.
ProcessLock->lock();
wxString AccountETagDB;
// Delete the ETagDB.
#if defined(__HAIKU__)
//preffilename = wxT("noo");
#elif defined(__WIN32__)
AccountETagDB.Clear();
AccountETagDB = GetAccountDir(AccountDir, FALSE);
AccountETagDB.Append(wxT("\\etag.db"));
wxRemoveFile(AccountETagDB);
#else
AccountETagDB.Clear();
AccountETagDB = GetAccountDir(AccountDir, FALSE);
AccountETagDB.Append(wxT("/etag.db"));
wxRemoveFile(AccountETagDB);
#endif
// Unlock.
ProcessLock->unlock();
}
bool ETagDB::CheckETagExists(wxString Filename){
if (FilenameETag.find(Filename) == FilenameETag.end()){
return FALSE;
} else {
return TRUE;
}
}
std::map ETagDB::GetETagData(){
// Get the ETag data.
// Lock the database.
ProcessLock->lock();
// Go through each of the ETags and process them accordingly.
std::map DataSet;
for (std::map::iterator iter = FilenameETag.begin();
iter != FilenameETag.end(); ++iter){
std::map::iterator origiter = FilenameETagOriginal.find(iter->first);
ETagData etd;
etd.ETagValue = iter->second;
etd.ETagOrigValue = origiter->second;
DataSet.insert(std::make_pair(iter->first, etd));
}
// Unlock the database.
ProcessLock->unlock();
return DataSet;
}
bool ETagDB::GetWriteStatus(){
// Check if the ETag database needs to be
// written to a file.
return NeedsWrite;
}