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 wxString ServerETag = "";
299 if (IterwxS == FilenameETagOriginal.end()) {
305 ServerETag = IterwxS->second;
309 SettingLine = iter->first + wxT("|") + iter->second + wxT("|") + ServerETag;
311 ETagDBFile.InsertLine(SettingLine, LineSeek);
323 ProcessLock->unlock();
329 bool ETagDB::LoadETagDB(){
331 // Load the ETag database.
333 // Lock or wait if it is already locked.
337 // Load the ETag database.
339 wxString AccountETagDB;
340 wxString AccountDirPath;
342 #if defined(__HAIKU__)
344 #elif defined(__WIN32__)
346 AccountDirPath = GetAccountDir(AccountDir, FALSE);
348 AccountETagDB = AccountDirPath;
349 AccountETagDB.Append(wxT("\\etag.db"));
353 AccountDirPath = GetAccountDir(AccountDir, FALSE);
355 AccountETagDB = AccountDirPath;
356 AccountETagDB.Append(wxT("/etag.db"));
360 wxTextFile ETagDBFile;
362 if (wxFileExists(AccountETagDB) == FALSE){
364 if (ETagDBFile.Create(AccountETagDB) == FALSE){
372 if (ETagDBFile.Open(AccountETagDB, wxConvUTF8) == FALSE){
380 wxString wxSFilename;
382 wxString ETagContactFilename;
384 for (wxStringTokenizer ETagDBLine(ETagDBFile.GetFirstLine(), wxT("|"));
385 !ETagDBFile.Eof(); ETagDBLine.SetString(ETagDBFile.GetNextLine(), wxT("|"), wxTOKEN_DEFAULT) )
388 // Split the file into three.
390 wxSFilename = ETagDBLine.GetNextToken();
394 wxSValue = ETagDBLine.GetNextToken();
395 FilenameETag.insert(std::make_pair(wxSFilename, wxSValue));
397 // Get the original ETag.
399 wxSValue = ETagDBLine.GetNextToken();
401 FilenameETagOriginal.insert(std::make_pair(wxSFilename, wxSValue));
407 ProcessLock->unlock();
413 void ETagDB::DeleteETagDB(){
415 // Delete the ETag database.
417 // Lock or wait if it is already locked.
421 wxString AccountETagDB;
423 // Delete the ETagDB.
425 #if defined(__HAIKU__)
427 //preffilename = wxT("noo");
429 #elif defined(__WIN32__)
431 AccountETagDB.Clear();
432 AccountETagDB = GetAccountDir(AccountDir, FALSE);
433 AccountETagDB.Append(wxT("\\etag.db"));
435 wxRemoveFile(AccountETagDB);
439 AccountETagDB.Clear();
440 AccountETagDB = GetAccountDir(AccountDir, FALSE);
441 AccountETagDB.Append(wxT("/etag.db"));
443 wxRemoveFile(AccountETagDB);
449 ProcessLock->unlock();
453 bool ETagDB::CheckETagExists(wxString Filename){
455 if (FilenameETag.find(Filename) == FilenameETag.end()){
467 std::map<wxString,ETagData> ETagDB::GetETagData(){
469 // Get the ETag data.
471 // Lock the database.
475 // Go through each of the ETags and process them accordingly.
477 std::map<wxString,ETagData> DataSet;
479 for (std::map<wxString,wxString>::iterator iter = FilenameETag.begin();
480 iter != FilenameETag.end(); ++iter){
482 std::map<wxString,wxString>::iterator origiter = FilenameETagOriginal.find(iter->first);
486 etd.ETagValue = iter->second;
487 etd.ETagOrigValue = origiter->second;
489 DataSet.insert(std::make_pair(iter->first, etd));
493 // Unlock the database.
495 ProcessLock->unlock();
501 bool ETagDB::GetWriteStatus(){
503 // Check if the ETag database needs to be
504 // written to a file.