1 // etag.cpp - ETag subroutines.
3 // (c) 2012-2015 Xestia Software Development.
5 // This file is part of Xestia Address Book.
7 // Xestia Address Book is free software: you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License as published by the
9 // Free Software Foundation, version 3 of the license.
11 // Xestia Address Book is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License along
17 // with Xestia Address Book. If not, see <http://www.gnu.org/licenses/>
20 #include "../common/dirs.h"
24 // Write out the database to file.
26 ProcessLock->try_lock();
28 if (NeedsWrite == TRUE){
34 ProcessLock->unlock();
38 void ETagDB::SetupDB(wxString AccountDirInc){
40 // Setup the ETag Database.
42 AccountDir = AccountDirInc;
47 void ETagDB::AddETag(wxString Filename, wxString ETag, wxString ETagOriginal){
49 // Lock or wait if it is already locked.
53 // Process the ETag addition.
55 FilenameETag.insert(std::make_pair(Filename, ETag));
56 FilenameETagOriginal.insert(std::make_pair(Filename, ETagOriginal));
62 ProcessLock->unlock();
66 void ETagDB::RemoveETag(wxString Filename){
70 // Lock or wait if it is already locked.
78 FilenameETag.erase(Filename);
79 FilenameETagOriginal.erase(Filename);
85 ProcessLock->unlock();
89 void ETagDB::UpdateETag(wxString Filename, wxString ETag){
93 // Lock or wait if it is already locked.
99 FilenameETag.erase(Filename);
100 FilenameETag.insert(std::make_pair(Filename, ETag));
106 ProcessLock->unlock();
110 void ETagDB::UpdateETag(wxString Filename, wxString ETag, wxString ETagOriginal){
112 // Update the ETag with the tags given.
114 // Lock or wait if it is already locked.
120 FilenameETag.erase(Filename);
121 FilenameETagOriginal.erase(Filename);
122 FilenameETag.insert(std::make_pair(Filename, ETag));
123 FilenameETagOriginal.insert(std::make_pair(Filename, ETagOriginal));
125 std::map<wxString,wxString>::iterator IterWxS;
126 IterWxS = FilenameETagOriginal.find(Filename);
131 ProcessLock->unlock();
135 bool ETagDB::ETagExists(wxString Filename){
137 // Check if the ETag exists.
139 // Lock or wait if it is already locked.
143 bool FileResult = FALSE;
145 if (FilenameETag.find(Filename) != FilenameETag.end()){
157 ProcessLock->unlock();
163 std::map<wxString,wxString>* ETagDB::GetFilenamePointer(){
165 // Get the Filename Pointer.
167 return &FilenameETag;
171 wxString ETagDB::GetETag(wxString Filename){
175 // Lock or wait if it is already locked.
178 std::map<wxString,wxString>::iterator IterwxS;
184 if (FilenameETag.find(Filename) != FilenameETag.end()){
186 IterwxS = FilenameETag.find(Filename);
188 ETagOut = IterwxS->second;
194 ProcessLock->unlock();
200 wxString ETagDB::GetETagOriginal(wxString Filename){
202 // Get the original ETag.
204 // Lock or wait if it is already locked.
206 wxString ETagOrigOut;
207 std::map<wxString,wxString>::iterator IterwxS;
213 if (FilenameETagOriginal.find(Filename) != FilenameETagOriginal.end()){
215 IterwxS = FilenameETagOriginal.find(Filename);
217 ETagOrigOut = IterwxS->second;
223 ProcessLock->unlock();
229 bool ETagDB::WriteETagDB(){
231 // Write the ETag database.
233 // Lock or wait if it is already locked.
237 // Write the ETag database.
239 wxString AccountETagDB;
240 std::map<wxString,wxString>::iterator IterwxS;
243 #if defined(__HAIKU__)
245 //preffilename = wxT("noo");
247 #elif defined(__WIN32__)
249 AccountETagDB.Clear();
250 AccountETagDB = GetAccountDir(AccountDir, FALSE);
251 AccountETagDB.Append(wxT("\\etag.db"));
255 // This entry applies to OSX as well.
257 AccountETagDB.Clear();
258 AccountETagDB = GetAccountDir(AccountDir, FALSE);
259 AccountETagDB.Append(wxT("/etag.db"));
263 wxTextFile ETagDBFile;
264 wxString SettingLine;
266 if (wxFileExists(AccountETagDB) == FALSE){
268 if (ETagDBFile.Create(AccountETagDB) == FALSE){
276 if (ETagDBFile.Open(AccountETagDB) == FALSE){
286 for (std::map<wxString,wxString>::iterator iter = FilenameETag.begin();
287 iter != FilenameETag.end(); ++iter){
289 // Get Original ETag as well.
291 IterwxS = FilenameETagOriginal.find(iter->first);
293 if (iter->first.IsEmpty()){
297 SettingLine = iter->first + wxT("|") + iter->second + wxT("|") + IterwxS->second;
299 ETagDBFile.InsertLine(SettingLine, LineSeek);
311 ProcessLock->unlock();
317 bool ETagDB::LoadETagDB(){
319 // Load the ETag database.
321 // Lock or wait if it is already locked.
325 // Load the ETag database.
327 wxString AccountETagDB;
328 wxString AccountDirPath;
330 #if defined(__HAIKU__)
332 #elif defined(__WIN32__)
334 AccountDirPath = GetAccountDir(AccountDir, FALSE);
336 AccountETagDB = AccountDirPath;
337 AccountETagDB.Append(wxT("\\etag.db"));
341 AccountDirPath = GetAccountDir(AccountDir, FALSE);
343 AccountETagDB = AccountDirPath;
344 AccountETagDB.Append(wxT("/etag.db"));
348 wxTextFile ETagDBFile;
350 if (wxFileExists(AccountETagDB) == FALSE){
352 if (ETagDBFile.Create(AccountETagDB) == FALSE){
360 if (ETagDBFile.Open(AccountETagDB, wxConvUTF8) == FALSE){
368 wxString wxSFilename;
370 wxString ETagContactFilename;
372 for (wxStringTokenizer ETagDBLine(ETagDBFile.GetFirstLine(), wxT("|"));
373 !ETagDBFile.Eof(); ETagDBLine.SetString(ETagDBFile.GetNextLine(), wxT("|"), wxTOKEN_DEFAULT) )
376 // Split the file into three.
378 wxSFilename = ETagDBLine.GetNextToken();
382 wxSValue = ETagDBLine.GetNextToken();
383 FilenameETag.insert(std::make_pair(wxSFilename, wxSValue));
385 // Get the original ETag.
387 wxSValue = ETagDBLine.GetNextToken();
389 FilenameETagOriginal.insert(std::make_pair(wxSFilename, wxSValue));
395 ProcessLock->unlock();
401 void ETagDB::DeleteETagDB(){
403 // Delete the ETag database.
405 // Lock or wait if it is already locked.
409 wxString AccountETagDB;
411 // Delete the ETagDB.
413 #if defined(__HAIKU__)
415 //preffilename = wxT("noo");
417 #elif defined(__WIN32__)
419 AccountETagDB.Clear();
420 AccountETagDB = GetAccountDir(AccountDir, FALSE);
421 AccountETagDB.Append(wxT("\\etag.db"));
423 wxRemoveFile(AccountETagDB);
427 AccountETagDB.Clear();
428 AccountETagDB = GetAccountDir(AccountDir, FALSE);
429 AccountETagDB.Append(wxT("/etag.db"));
431 wxRemoveFile(AccountETagDB);
437 ProcessLock->unlock();
441 bool ETagDB::CheckETagExists(wxString Filename){
443 if (FilenameETag.find(Filename) == FilenameETag.end()){
455 std::map<wxString,ETagData> ETagDB::GetETagData(){
457 // Get the ETag data.
459 // Lock the database.
463 // Go through each of the ETags and process them accordingly.
465 std::map<wxString,ETagData> DataSet;
467 for (std::map<wxString,wxString>::iterator iter = FilenameETag.begin();
468 iter != FilenameETag.end(); ++iter){
470 std::map<wxString,wxString>::iterator origiter = FilenameETagOriginal.find(iter->first);
474 etd.ETagValue = iter->second;
475 etd.ETagOrigValue = origiter->second;
477 DataSet.insert(std::make_pair(iter->first, etd));
481 // Unlock the database.
483 ProcessLock->unlock();
489 bool ETagDB::GetWriteStatus(){
491 // Check if the ETag database needs to be
492 // written to a file.