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 //IterwxS = FilenameETag.find(Filename);
186 if (FilenameETag.find(Filename) != FilenameETag.end()){
188 IterwxS = FilenameETag.find(Filename);
190 ETagOut = IterwxS->second;
196 ProcessLock->unlock();
202 wxString ETagDB::GetETagOriginal(wxString Filename){
204 // Get the original ETag.
206 // Lock or wait if it is already locked.
208 wxString ETagOrigOut;
209 std::map<wxString,wxString>::iterator IterwxS;
215 //IterwxS = FilenameETag.find(Filename);
217 if (FilenameETagOriginal.find(Filename) != FilenameETagOriginal.end()){
219 IterwxS = FilenameETagOriginal.find(Filename);
221 ETagOrigOut = IterwxS->second;
227 ProcessLock->unlock();
233 bool ETagDB::WriteETagDB(){
235 // Write the ETag database.
237 // Lock or wait if it is already locked.
241 // Write the ETag database.
243 wxString AccountETagDB;
244 std::map<wxString,wxString>::iterator IterwxS;
247 #if defined(__HAIKU__)
249 //preffilename = wxT("noo");
251 #elif defined(__WIN32__)
253 AccountETagDB.Clear();
254 AccountETagDB = GetAccountDir(AccountDir, FALSE);
255 AccountETagDB.Append(wxT("\\etag.db"));
259 // This entry applies to OSX as well.
261 AccountETagDB.Clear();
262 AccountETagDB = GetAccountDir(AccountDir, FALSE);
263 AccountETagDB.Append(wxT("/etag.db"));
267 wxTextFile ETagDBFile;
268 wxString SettingLine;
270 if (wxFileExists(AccountETagDB) == FALSE){
272 if (ETagDBFile.Create(AccountETagDB) == FALSE){
273 ////ProcessLock.unlock();
280 if (ETagDBFile.Open(AccountETagDB) == FALSE){
281 ////ProcessLock.unlock();
290 for (std::map<wxString,wxString>::iterator iter = FilenameETag.begin();
291 iter != FilenameETag.end(); ++iter){
293 // Get Original ETag as well.
295 IterwxS = FilenameETagOriginal.find(iter->first);
297 if (iter->first.IsEmpty()){
301 SettingLine = iter->first + wxT("|") + iter->second + wxT("|") + IterwxS->second;
303 ETagDBFile.InsertLine(SettingLine, LineSeek);
315 ProcessLock->unlock();
321 bool ETagDB::LoadETagDB(){
323 // Load the ETag database.
325 // Lock or wait if it is already locked.
329 // Load the ETag database.
331 wxString AccountETagDB;
332 wxString AccountDirPath;
334 #if defined(__HAIKU__)
336 //preffilename = wxT("noo");
338 #elif defined(__WIN32__)
340 AccountDirPath = GetAccountDir(AccountDir, FALSE);
342 AccountETagDB = AccountDirPath;
343 AccountETagDB.Append(wxT("\\etag.db"));
347 AccountDirPath = GetAccountDir(AccountDir, FALSE);
349 AccountETagDB = AccountDirPath;
350 AccountETagDB.Append(wxT("/etag.db"));
354 wxTextFile ETagDBFile;
356 if (wxFileExists(AccountETagDB) == FALSE){
358 if (ETagDBFile.Create(AccountETagDB) == FALSE){
359 ////ProcessLock.unlock();
360 //ProcessLock->unlock();
368 if (ETagDBFile.Open(AccountETagDB, wxConvUTF8) == FALSE){
370 ////ProcessLock.unlock();
371 //ProcessLock->unlock();
378 wxString wxSFilename;
380 wxString ETagContactFilename;
382 for (wxStringTokenizer ETagDBLine(ETagDBFile.GetFirstLine(), wxT("|"));
383 !ETagDBFile.Eof(); ETagDBLine.SetString(ETagDBFile.GetNextLine(), wxT("|"), wxTOKEN_DEFAULT) )
386 // Split the file into three.
388 wxSFilename = ETagDBLine.GetNextToken();
392 wxSValue = ETagDBLine.GetNextToken();
393 FilenameETag.insert(std::make_pair(wxSFilename, wxSValue));
395 // Get the original ETag.
397 wxSValue = ETagDBLine.GetNextToken();
399 FilenameETagOriginal.insert(std::make_pair(wxSFilename, wxSValue));
405 ProcessLock->unlock();
411 void ETagDB::DeleteETagDB(){
413 // Delete the ETag database.
415 // Lock or wait if it is already locked.
419 wxString AccountETagDB;
421 // Delete the ETagDB.
423 #if defined(__HAIKU__)
425 //preffilename = wxT("noo");
427 #elif defined(__WIN32__)
429 AccountETagDB.Clear();
430 AccountETagDB = GetAccountDir(AccountDir, FALSE);
431 AccountETagDB.Append(wxT("\\etag.db"));
433 wxRemoveFile(AccountETagDB);
437 AccountETagDB.Clear();
438 AccountETagDB = GetAccountDir(AccountDir, FALSE);
439 AccountETagDB.Append(wxT("/etag.db"));
441 wxRemoveFile(AccountETagDB);
447 ProcessLock->unlock();
451 bool ETagDB::CheckETagExists(wxString Filename){
453 if (FilenameETag.find(Filename) == FilenameETag.end()){
465 std::map<wxString,ETagData> ETagDB::GetETagData(){
467 // Get the ETag data.
469 // Lock the database.
473 // Go through each of the ETags and process them accordingly.
475 std::map<wxString,ETagData> DataSet;
477 for (std::map<wxString,wxString>::iterator iter = FilenameETag.begin();
478 iter != FilenameETag.end(); ++iter){
480 std::map<wxString,wxString>::iterator origiter = FilenameETagOriginal.find(iter->first);
484 etd.ETagValue = iter->second;
485 etd.ETagOrigValue = origiter->second;
487 DataSet.insert(std::make_pair(iter->first, etd));
491 // Unlock the database.
493 ProcessLock->unlock();
499 bool ETagDB::GetWriteStatus(){
501 // Check if the ETag database needs to be
502 // written to a file.