Home | News | Projects | Releases
Bugs | RFE | Repositories | Help
Implemented support using ConnectionObject/CardDAV2 on Win32 systems.
[xestiaab/.git] / source / actmgr / frmActivityMgr.cpp
1 // frmActivityMgr.cpp - Activity Manager form.
2 //
3 // (c) 2012-2015 Xestia Software Development.
4 //
5 // This file is part of Xestia Address Book.
6 //
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.
10 //
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.
15 //
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/>
19 #include "frmActivityMgr.h"
20 #include <wx/mstream.h>
21 #include <wx/file.h>
22 #include <wx/ffile.h>
23 #include <wx/tokenzr.h>
24 #include <wx/dir.h>
25 #include <wx/filefn.h>
26 #include <thread>
27 #include <list>
28 #include <curl/curl.h>
30 #include "../bitmaps.h"
31 #include "../enums.h"
32 #include "../common/preferences.h"
33 #include "../frmConflictResolution.h"
34 #include "../frmInvalidSSLCertificate.h"
35 #include "../frmMain.h"
36 #include "../common/events.h"
37 #include "../common/filename.h"
38 #include "../vcard/vcard34conv.h"
39 #include "../vcard/vcard.h"
41 DEFINE_EVENT_TYPE(ACTMGR_RESUMEPROC);
42 DEFINE_EVENT_TYPE(ACTMGR_TOGGLECONN);
43 DEFINE_EVENT_TYPE(ACTMGR_STARTTIMER);
44 DEFINE_EVENT_TYPE(ACTMGR_STOPTIMER);
45 DEFINE_EVENT_TYPE(ACTMGR_STARTPROCESSTIMER);
46 DEFINE_EVENT_TYPE(ACTMGR_STOPPROCESSTIMER);
47 DEFINE_EVENT_TYPE(ACTMGR_UPDATESTATUSLABEL);
48 DEFINE_EVENT_TYPE(ACTMGR_STARTANIMATIONTIMER);
50 BEGIN_EVENT_TABLE(frmActivityMgr, wxWindow)
51   EVT_COMMAND(wxID_ANY, ACTMGR_RESUMEPROC, frmActivityMgr::ResumeProcessing)
52   EVT_COMMAND(wxID_ANY, ACTMGR_TOGGLECONN, frmActivityMgr::ToggleConnectionStatus)
53   EVT_COMMAND(wxID_ANY, ACTMGR_STARTTIMER, frmActivityMgr::StartTimer)
54   EVT_COMMAND(wxID_ANY, ACTMGR_STOPTIMER, frmActivityMgr::StopTimer)
55   EVT_COMMAND(wxID_ANY, ACTMGR_STARTPROCESSTIMER, frmActivityMgr::StartProcessTimer)
56   EVT_COMMAND(wxID_ANY, ACTMGR_STOPPROCESSTIMER, frmActivityMgr::StopProcessTimer)
57   EVT_COMMAND(wxID_ANY, ACTMGR_UPDATESTATUSLABEL, frmActivityMgr::UpdateStatusLabel)
58   EVT_COMMAND(wxID_ANY, ACTMGR_STARTANIMATIONTIMER, frmActivityMgr::StartAnimationTimer)
59 END_EVENT_TABLE()
61 frmActivityMgr::frmActivityMgr( wxWindow* parent )
62 :
63 frmActivityMgrADT( parent )
64 {
66         wxMemoryInputStream istream(icons_activitywindow_png, sizeof(icons_activitywindow_png));
67         wxImage icons_activitywindow_pngi(istream, wxBITMAP_TYPE_PNG);
68         wxBitmap activityiconbmp(icons_activitywindow_pngi, -1);
69         wxIcon activityicon;
70         activityicon.CopyFromBitmap(activityiconbmp);
71         this->SetIcon(activityicon); 
73         wxMemoryInputStream istream2(misc_activitysleep_png, sizeof(misc_activitysleep_png));
74         wxImage misc_activitysleep_pngi(istream2, wxBITMAP_TYPE_PNG);
75         wxBitmap sleepiconbmp(misc_activitysleep_pngi, -1);
76         SleepBitmap = sleepiconbmp;
77         bmpActivity->SetBitmap(SleepBitmap);
78         ActProcessTimer.SetupPointers(this);
79         lblDetails->SetLabel(_("No activity."));
80         
81         ActListProcTimer.SetupPointers(&ActivityList, &ActivityListIndex, &ActivityListTaskDetail, 
82                                         &TasksActive, lstActivity, lblDetails, GauProgress, this, &AnimationTimer,
83                                         &ActProcessTimer, &ActivityListFinDate, &ActivityListConnObject);
84         
85         AnimationTimer.SetBitmap(bmpActivity);
86         AnimationTimer.SetSleepBitmap(&SleepBitmap);
87         AnimationTimer.SetupPointer(this->GetParent());
88         
89         wxListItem ColumnData;
90         ColumnData.SetId(0);
91         ColumnData.SetText(_("Activity"));
92         ColumnData.SetWidth(175);
93         lstActivity->InsertColumn(0, ColumnData);
94         
95         wxListItem ColumnData2;
96         ColumnData2.SetId(1);
97         ColumnData2.SetText(_("Account"));
98         ColumnData2.SetWidth(100);
99         lstActivity->InsertColumn(1, ColumnData2);
101         wxListItem ColumnData3;
102         ColumnData3.SetId(2);
103         ColumnData3.SetText(_("Status"));
104         ColumnData3.SetWidth(100);
105         lstActivity->InsertColumn(2, ColumnData3);
106         
107         //AnimationTimer.StartAnimation();
108         
109         // Create recovery database if it doesn't exist.
110         
111         wxString RecoveryFilename = GetRecoveryDB();
112         
113         wxFile RecoveryDB;
114         
115         if (wxFile::Exists(RecoveryFilename) == FALSE){
116         
117                 // Create the recovery database.
119                 RecoveryDB.Open(RecoveryFilename.c_str(), wxFile::write);       
120         
121                 RecoveryDB.Write(wxT("BEGIN:XAB-RECOVERYDB\r\n"), wxConvUTF8);
122                 RecoveryDB.Write(wxT("VERSION:1.0\r\n"), wxConvUTF8);
123                 RecoveryDB.Write(wxT("COMMENT:Please do not alter or delete this file. DATA LOSS IS POSSIBLE!\r\n"), wxConvUTF8);
124                 RecoveryDB.Write(wxT("END:XAB-RECOVERYDB\r\n"), wxConvUTF8);
125                 RecoveryDB.Close();
127         }
128         
129         wxFFile RecoveryDBF;
130         
131 #if wxABI_VERSION < 20900
132         RecoveryDBF.Open(RecoveryFilename.c_str(), wxT("r"));
133 #else
134         RecoveryDBF.Open(RecoveryFilename, wxT("r"));
135 #endif  
136         
137         // Load the recovery database for tasks not done.
138         
139         if (RecoveryDBF.IsOpened() == TRUE){
140         
141                 wxString wxSRecoveryDB;
142                 wxString RecoveryLine;
143         
144                 // Check if we are using wxWidgets version 2.8 or less and
145                 // execute the required command accordingly.
146         
147                 RecoveryDBF.ReadAll(&wxSRecoveryDB, wxConvAuto());
148         
149                 // Split the lines.
150         
151                 std::map<int, wxString> RecoveryFileLines;
152                 std::map<int, wxString>::iterator striter;
153         
154                 wxStringTokenizer wSTRecoveryDBLines(wxSRecoveryDB, wxT("\r\n"));
156                 int RecoveryLineSeek = 0;
158                 while (wSTRecoveryDBLines.HasMoreTokens() == TRUE){
160                         RecoveryLine = wSTRecoveryDBLines.GetNextToken();
161                         RecoveryFileLines.insert(std::make_pair(RecoveryLineSeek, RecoveryLine));
162                         RecoveryLineSeek++;             
163         
164                 }
165         
166         }
167         
170         //TestTimer.Start(50, FALSE);
173 void frmActivityMgr::OpenWindow()
175         WindowOpen = TRUE;
178 void frmActivityMgr::CloseWindow( wxCommandEvent& event )
180         WindowOpen = FALSE;
181         this->Hide();
184 void frmActivityMgr::CloseWindow( wxCloseEvent& event )
186         WindowOpen = FALSE;
187         this->Hide();
190 void frmActivityMgr::ProcessTasksThread()
192         
193         if (ProcessTasksData == FALSE){
194         
195                 return;
196         
197         }
198         
199         if (ApplicationSleepMode == TRUE){
200                 
201                 return;
202                 
203         }
204         
205         std::map<int,int>::iterator TypeIter;
206         std::map<int,wxString>::iterator StringIter;
207         std::map<int,wxString>::iterator StringDataIter;
208         std::map<int,wxString>::iterator StringURLIter;
209         std::map<int,wxString>::iterator StringDetailIter;
210         std::map<int,wxString>::iterator StringAccountIter;
211         std::map<int,wxString>::iterator StringFilenameIter;
212         std::map<int,wxString>::iterator StringFullFilenameIter;
213         std::map<int,wxString>::iterator StringTaskDetailIter;
214         std::map<int,wxString>::iterator StringETagIter;
215         std::map<int,wxString>::iterator StringETagOrigIter;
216         std::map<int,ConnectionObject*>::iterator ConnObjectIter;
217         std::map<int,ActivityMgrAccountSettings>::iterator AccountSettingsIter;
218         std::map<int,long>::iterator LongIter;
219         bool TasksFoundProc = FALSE;
220         wxString TaskDetail;
221         
222         for (std::map<int,int>::iterator iter = ActivityList.begin(); 
223          iter != ActivityList.end(); ++iter){
224          
225                 // Check for any queued tasks and start one.
226                 
227                 if (iter->second > 4){
228                         continue;
229                 }
230                 
231                 wxCommandEvent StartAnimationEvent(ACTMGR_STARTANIMATIONTIMER);
232                 
233                 wxPostEvent(this, StartAnimationEvent);
234                 
235                 // Start the animation timer if it hasn't started.
236                 
237                 ConnObjectIter = ActivityListConnObject.find(iter->first);
238                 TypeIter = ActivityListType.find(iter->first);
239                 StringETagIter = ActivityListETag.find(iter->first);
240                 StringETagOrigIter = ActivityListETagOriginal.find(iter->first);
241                 StringAccountIter = ActivityListAccount.find(iter->first);
242                 StringFilenameIter = ActivityListFilename.find(iter->first);
243                 StringFullFilenameIter = ActivityListFullFilename.find(iter->first);
244                 AccountSettingsIter = ActivityListAccSettings.find(iter->first);
245                 
246                 // Setup the CardDAV object.
247                 
248                 // 0 = Queued.
249                 // 1 = Processing.
250                 // 2 = Failed.
251                 // 3 = Stopped.
252                 // 4 = Completed.
253                 // 5 = Failed (UI Updated).
254                 // 6 = Stopped (UI Updated).
255                 // 7 = (Reserved) (UI Updated).
256                 // 8 = Completed. (UI Updated). 
257                 
258                 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
259                 XABPreferences PrefData(GetUserPrefDir());
260                 
261                 if (iter->second == 0){
262                         
263                         // Wait for process to finish.
265                         TasksActive = TRUE;
266                         TasksFoundProc = TRUE;
267                         wxString ETag;
268                         wxString ETagOriginal;
269                         wxString ETagServer;
270                         wxString AccountDir;
271                         wxString ContactFilename;
272                         wxString FullFilename;
273                         wxString ETagResult;
274                         bool EditMode = FALSE;
276                         iter->second = 1;
277                         
278                         // Compare the ETags and work out if a conflict has occured.
279                         
280                         if (TypeIter->second == 0){
281                         
282                                 // Add a contact.
283                                 
284                                 StringDataIter = ActivityListData.find(iter->first);
285                                 StringURLIter = ActivityListURL.find(iter->first);
286                                 
287                                 AccountDir = StringAccountIter->second;
288                                 ContactFilename = StringFilenameIter->second;
289                                 wxString AccountNameFriendly;
290                                 
291                                 int AccountID = 0;
292                                 
293                                 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
294                                         
295                                         wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
296                                         
297                                         AccountDirCheck.Trim();
298                                         AccountDirCheck.Append(wxT(".carddav"));
299                                         
300                                         if (AccountDirCheck == StringAccountIter->second){
301                                                 
302                                                 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
303                                                 AccountID = i;
304                                                 
305                                         }
306                                         
307                                 }
308                                 
309                                 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
310                                 
311                                 ETag = StringETagIter->second;
312                                 ETagOriginal = StringETagOrigIter->second;
313                                 AccountDir = StringAccountIter->second;
314                                 ContactFilename = StringFilenameIter->second;
315                                 FullFilename = StringFullFilenameIter->second;
316                                 EditMode = ActivityListEditMode.find(iter->first)->second;
317                                 
318                                 bool KeepUpdating = true;
319                                 
320                                 while(KeepUpdating == true){
321                                         
322                                         COConnectResult ConnectResponse = ConnObjectIter->second->Connect(false);
323                                         
324                                         bool ExitLoop = false;
325                                         
326                                         while (ExitLoop == false){
327                                                 
328                                                 if (ConnObjectIter->second->SSLVerify() == COSSL_UNABLETOVERIFY){
329                                                         
330                                                         frmMainPtrGet->PauseAllTimers();
331                                                         
332 #if defined(__APPLE__)
333 #elif defined(__WIN32__)
335                                                         ConnObjectIter->second->BypassSSLVerification(true);
337                                                         COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false);
339                                                         ConnObjectIter->second->BypassSSLVerification(false);
341                                                         BOOL ModifiedCertificateData = false;
342                                                         CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(ConnObjectIter->second, (HWND)frmMainPtrGet->GetHandle());
344                                                         if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)) {
345                                                                 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
346                                                         }
348                                                         if (ModifiedCertificateData == false) {
350                                                                 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnObjectIter->second->BuildSSLCollection());
351                                                                 iter->second = 2;
352                                                                 break;
354                                                         } else {
356                                                                 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection());
358                                                         }
360 #else
361         
362                                                         bool UsingSSLBypass = false;
363                                                         int SSLResult = 0;
364                                                         
365                                                         // Connect again and fetch SSL certificate information.
366                 
367                                                         ConnObjectIter->second->BypassSSLVerification(true);
368                 
369                                                         COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false);
371                                                         ConnObjectIter->second->BypassSSLVerification(false);
373                                                         SSLInvalidCertNotifObjString SSLICNProcData;
374                                                         
375                                                         SSLCertCollectionString certcol = ConnObjectIter->second->BuildSSLCollection();
376                                                                 
377                                                         bool *PauseMode = new bool;
378                                                         QRNotif qrn;
379                                                                 
380                                                         *PauseMode = TRUE;
381                                                         qrn.QResponse = &SSLResult;
382                                                         qrn.PausePtr = PauseMode;
383                                                                 
384                                                         SSLICNProcData.CertCollection = certcol;
385                                                         SSLICNProcData.QRNotifData = &qrn;
386                                                         SSLICNProcData.AccountName = AccountNameFriendly;
387                                                                 
388                                                         wxCommandEvent event(INVALIDSSLCERTSTRING);
389                                                         event.SetClientData(&SSLICNProcData);
390                                                         wxPostEvent(frmMainPtrGet, event);
391                                                                 
392                                                         while (*PauseMode == TRUE){
393                                                                 //nanosleep(&n1, &n2);
394                                                                 SleepFor(250000000);
395                                                         }
396                                                         
397                                                         // Process the response from the user.
398                                                         
399                                                         if (SSLResult == 1){
400                                                                 
401                                                                 // Accept the Certificate.
403                                                                 UsingSSLBypass = true;
404                                                                 ConnObjectIter->second->BypassSSLVerification(true);
405                 
406                                                                 COConnectResult TestConnectionResult = ConnObjectIter->second->Connect(true);
407                                                                 WriteServerCertificate(AccountDir, certcol);
408                                                                 
409                                                                 ConnObjectIter->second->BypassSSLVerification(false);
410                                                                 
411                                                         } else if (SSLResult == 2){
412                                                 
413                                                                 // Reject the certificate, abort the task and mark as failed.
415                                                                 iter->second = 2;
416                                                                 break;
417                                                                 
418                                                         }
419                 
420 #endif
421                                                         
422                                                         frmMainPtrGet->ResumeAllTimers();
423                                                         ExitLoop = true;
424                                                         
425                                                 } else if (ConnectResponse == COCONNECT_AUTHFAIL){
426                                                         
427                                                         ConnectResponse = ConnObjectIter->second->Connect(true);
428                                                         
429                                                         if (ConnectResponse == COCONNECT_OK){
430                                                                 
431                                                                 ExitLoop = true;
432                                                                 break;
433                                                                 
434                                                         } else {
435                                                                 
436                                                                 ExitLoop = true;                                                        
437                                                                 iter->second = 2;
438                                                                 break;
439                                                                 
440                                                         }
441                                                         
442                                                 } else if (ConnectResponse == COCONNECT_OK){
443                                                         
444                                                         ConnectResponse = ConnObjectIter->second->Connect(true);
445                                                         
446                                                         ExitLoop = true;
447                                                         break;
448                                                         
449                                                 } else {
450                                                         
451                                                         ExitLoop = true;                                                        
452                                                         iter->second = 2;
453                                                         break;
454                                                         
455                                                 }
456                                                 
457                                         }
458                                         
459                                         if (iter->second == 2 || iter->second == 3 || iter->second == 4){
460                                                 break;
461                                         }
462                                         
463 #if defined(__APPLE__)
464                                         
465                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
467 #elif defined(__WIN32__)
469                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection());
471 #else
472                                         
473                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection());
474                                         
475 #endif
476                                         
477                                         COServerResponse AddContactResponse = ConnObjectIter->second->AddContact(StringURLIter->second.ToStdString(), 
478                                                         StringDataIter->second.ToStdString());
479                                         
480                                         if (AddContactResponse.RequestResult != COREQUEST_OK){
481                                                 iter->second = 2;
482                                                 break;
483                                         }
484                                         
485                                         // Get the entity tag for the new contact.
486                                         
487                                         COServerResponse ETagGetResponse = ConnObjectIter->second->GetServerEntityTagValue(StringURLIter->second.ToStdString());
488                                         
489                                         if (ETagGetResponse.RequestResult != COREQUEST_OK){
490                                                 iter->second = 2;
491                                                 break;
492                                         }
493                                         
494                                         std::cout << ETagGetResponse.EntityTag << std::endl;
495                                         
496                                         ETagDBPtr->UpdateETag(ContactFilename, ETagGetResponse.EntityTag, ETagGetResponse.EntityTag);
497                                         
498                                         iter->second = 4;
499                                         break;
500                                         
501                                 }
502                                 
503                         } else if (TypeIter->second == 1){
504                                 
505                                 // Update a contact.
506                                 
507                                 StringDataIter = ActivityListData.find(iter->first);
508                                 StringURLIter = ActivityListURL.find(iter->first);
509                                 
510                                 AccountDir = StringAccountIter->second;
511                                 ContactFilename = StringFilenameIter->second;
512                                 wxString AccountNameFriendly;
513                                 
514                                 int AccountID = 0;
515                                 
516                                 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
517                                         
518                                         wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
519                                         
520                                         AccountDirCheck.Trim();
521                                         AccountDirCheck.Append(wxT(".carddav"));
522                                         
523                                         if (AccountDirCheck == StringAccountIter->second){
524                                                 
525                                                 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
526                                                 AccountID = i;
527                                                 
528                                         }
529                                         
530                                 }
531                                 
532                                 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
533                                 
534                                 ETag = StringETagIter->second;
535                                 ETagOriginal = StringETagOrigIter->second;
536                                 AccountDir = StringAccountIter->second;
537                                 ContactFilename = StringFilenameIter->second;
538                                 FullFilename = StringFullFilenameIter->second;
539                                 EditMode = ActivityListEditMode.find(iter->first)->second;
540                                 
541                                 bool KeepUpdating = true;
542                                 
543                                 while(KeepUpdating == true){
544                                         
545                                         COConnectResult ConnectResponse = ConnObjectIter->second->Connect(false);
546                                         
547                                         bool ExitLoop = false;
548                                         
549                                         while(ExitLoop == false){
550                                                 
551                                                 if (ConnObjectIter->second->SSLVerify() == COSSL_UNABLETOVERIFY){
552                                                         
553                                                         frmMainPtrGet->PauseAllTimers();
554                                                         
555 #if defined(__APPLE__)
556 #elif defined(__WIN32__)
558                                                         ConnObjectIter->second->BypassSSLVerification(true);
560                                                         COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false);
562                                                         ConnObjectIter->second->BypassSSLVerification(false);
564                                                         BOOL ModifiedCertificateData = false;
565                                                         CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(ConnObjectIter->second, (HWND)frmMainPtrGet->GetHandle());
567                                                         if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)) {
568                                                                 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
569                                                         }
571                                                         if (ModifiedCertificateData == FALSE) {
573                                                                 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnObjectIter->second->BuildSSLCollection());
574                                                                 iter->second = 2;
575                                                                 break;
577                                                         } else {
579                                                                 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection());
581                                                         }
583 #else
584         
585                                                         bool UsingSSLBypass = false;
586                                                         int SSLResult = 0;
587                                                         
588                                                         // Connect again and fetch SSL certificate information.
589                 
590                                                         ConnObjectIter->second->BypassSSLVerification(true);
591                 
592                                                         COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false);
594                                                         ConnObjectIter->second->BypassSSLVerification(false);
596                                                         SSLInvalidCertNotifObjString SSLICNProcData;
597                                                         
598                                                         SSLCertCollectionString certcol = ConnObjectIter->second->BuildSSLCollection();
599                                                                 
600                                                         bool *PauseMode = new bool;
601                                                         QRNotif qrn;
602                                                                 
603                                                         *PauseMode = TRUE;
604                                                         qrn.QResponse = &SSLResult;
605                                                         qrn.PausePtr = PauseMode;
606                                                                 
607                                                         SSLICNProcData.CertCollection = certcol;
608                                                         SSLICNProcData.QRNotifData = &qrn;
609                                                         SSLICNProcData.AccountName = AccountNameFriendly;
610                                                                 
611                                                         wxCommandEvent event(INVALIDSSLCERTSTRING);
612                                                         event.SetClientData(&SSLICNProcData);
613                                                         wxPostEvent(frmMainPtrGet, event);
614                                                                 
615                                                         while (*PauseMode == TRUE){
616                                                                 SleepFor(250000000);
617                                                         }
618                                                         
619                                                         // Process the response from the user.
620                                                         
621                                                         if (SSLResult == 1){
622                                                                 
623                                                                 // Accept the Certificate.
625                                                                 UsingSSLBypass = true;
626                                                                 ConnObjectIter->second->BypassSSLVerification(true);
627                 
628                                                                 COConnectResult TestConnectionResult = ConnObjectIter->second->Connect(true);
629                                                                 WriteServerCertificate(AccountDir, certcol);
630                                                                 
631                                                                 ConnObjectIter->second->BypassSSLVerification(false);
632                                                                 
633                                                         } else if (SSLResult == 2){
634                                                 
635                                                                 // Reject the certificate, abort the task and mark as failed.
637                                                                 iter->second = 2;
638                                                                 break;
639                                                                 
640                                                         }
641                 
642 #endif
643                                                         
644                                                         frmMainPtrGet->ResumeAllTimers();
645                                                         ExitLoop = true;
646                                                         
647                                                 } else if (ConnectResponse == COCONNECT_AUTHFAIL){
648                                                         
649                                                         ConnectResponse = ConnObjectIter->second->Connect(true);
650                                                         
651                                                         if (ConnectResponse == COCONNECT_OK){
652                                                                 
653                                                                 ExitLoop = true;
654                                                                 break;
655                                                                 
656                                                         } else {
657                                                                 
658                                                                 ExitLoop = true;                                                        
659                                                                 iter->second = 2;
660                                                                 break;
661                                                                 
662                                                         }
663                                                         
664                                                 } else if (ConnectResponse == COCONNECT_OK){
665                                                         
666                                                         ConnectResponse = ConnObjectIter->second->Connect(true);
667                                                         
668                                                         ExitLoop = true;
669                                                         break;
670                                                         
671                                                 } else {
672                                                         
673                                                         ExitLoop = true;                                                        
674                                                         iter->second = 2;
675                                                         break;
676                                                         
677                                                 }
678                                                 
679                                         }
680                                         
681                                         if (iter->second == 2 || iter->second == 3 || iter->second == 4){
682                                                 break;
683                                         }
684                                         
685                                         COServerResponse ETagGetResponse = ConnObjectIter->second->GetServerEntityTagValue(StringURLIter->second.ToStdString());
686                                         
687                                         if (ETagGetResponse.RequestResult != COREQUEST_OK){
688                                                 iter->second = 2;
689                                                 break;
690                                         }
691                                         
692                                         ETagServer = ETagGetResponse.EntityTag;
693                                         
694                                         // Compare the ETag with the Server ETag.
695                                         
696                                         if (ETagOriginal != ETagServer){
697                                                 
698                                                 // Server ETag is different from original ETag.
699                                                 // This is a conflict which the user will now
700                                                 // need to resolve.
701                                                 
702                                                 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
703                                                 
704                                                 vCard34Conv vCard34Obj;
705                                                 
706                                                 std::string ServerContactData;
707                                                 wxString wxStringServerContactData;
708                                                 vCard ClientData;
709                                                 vCard ConvertedV4Data;
710                                                 
711                                                 // Load the client data from the filename given.
712                                                 
713                                                 COServerResponse GetContactResponse = ConnObjectIter->second->GetContact(StringURLIter->second.ToStdString(),
714                                                         &ServerContactData);
715                                                 
716                                                 if (GetContactResponse.RequestResult != COREQUEST_OK){
717                                                         iter->second = 2;
718                                                         break;
719                                                 }
720                                                 
721                                                 wxStringServerContactData = wxString::FromUTF8((const char*)ServerContactData.c_str());
722                                                 
723                                                 // Process v3 version into v4 version.
724                                                 
725                                                 vCard34Obj.ConvertToV4(&wxStringServerContactData, &ConvertedV4Data);
726                                                 
727                                                 vCardConflictObj vCardProcData;
728                                                 
729                                                 vCardProcData.vCardLocalData = &ClientData;
730                                                 vCardProcData.vCardServerData = &ConvertedV4Data;
731                                                 ClientData.LoadFile(FullFilename);
732                                                 
733                                                 // Setup Conflict Resolution Dialog.
734                                                 
735                                                 // Fetch Data from Server and convert.
736                                                 
737                                                 bool *PauseMode = new bool;
738                                                 int ConflictResult;
739                                                 QRNotif qrn;
740                                                 
741                                                 *PauseMode = TRUE;
742                                                 qrn.QResponse = &ConflictResult;
743                                                 qrn.PausePtr = PauseMode;
744                                                 
745                                                 vCardProcData.QRNotifData = &qrn;
746                                                 
747                                                 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
748                                                 event.SetClientData(&vCardProcData);
749                                                 wxPostEvent(frmMainPtrGet, event);
750                                                 
751                                                 while (*PauseMode == TRUE){
752                                                         SleepFor(250000000);
753                                                 }
754                                                 
755                                                 delete PauseMode;
756                                                 PauseMode = NULL;
757                                                 
758                                                 if (ConflictResult == 0){
759                                                         
760                                                         // Decide Later.
761                                                         
762                                                         iter->second = 4;
763                                                         break;
764                                                         
765                                                 } else if (ConflictResult == 1){
766                                                         
767                                                         // Decided to use client version.
768                                                         
769                                                 } else if (ConflictResult == 2){
770                                                         
771                                                         // Decided to use server version.
772                                                         
773                                                         // Download server version.
774                                                         
775                                                         ConvertedV4Data.WriteFile(FullFilename);
776                                                         
777                                                 }
778                                                 
779                                         } else {
780                                                 
781                                                 // Upload the data to the server.
782                                                 
783                                                 COServerResponse EditContactResponse = ConnObjectIter->second->EditContact(StringURLIter->second.ToStdString(), 
784                                                         StringDataIter->second.ToStdString());
785                                         
786                                                 if (EditContactResponse.RequestResult != COREQUEST_OK){
787                                                         iter->second = 2;
788                                                         break;
789                                                 }
790                                                 
791                                         }
792                                         
793                                         ETagGetResponse = ConnObjectIter->second->GetServerEntityTagValue(StringURLIter->second.ToStdString());
794                                         
795                                         if (ETagGetResponse.RequestResult != COREQUEST_OK){
796                                                 iter->second = 2;
797                                                 break;
798                                         }
799                                         
800                                         ETagDBPtr->UpdateETag(ContactFilename, ETagGetResponse.EntityTag, ETagGetResponse.EntityTag);
801                                         
802                                         iter->second = 4;
803                                         break;
804                                         
805                                 }
806                         
807                         } else if (TypeIter->second == 2) {
808                         
809                                 // Delete the contact from the server and update the ETag DB.
810                                 
811                                 AccountDir = StringAccountIter->second;
812                                 ContactFilename = StringFilenameIter->second;
813                                 wxString AccountNameFriendly;
814                                 
815                                 int AccountID = 0;
816                                 
817                                 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
818                                         
819                                         wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
820                                         
821                                         AccountDirCheck.Trim();
822                                         AccountDirCheck.Append(wxT(".carddav"));
823                                         
824                                         if (AccountDirCheck == StringAccountIter->second){
825                                                 
826                                                 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
827                                                 AccountID = i;
828                                                 
829                                         }
830                                         
831                                 }
832                                 
833                                 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
834                                 
835                                 bool KeepUpdating = TRUE;
836                                 
837                                 while(KeepUpdating == TRUE){
838                                 
839                                         COConnectResult ConnectResponse = ConnObjectIter->second->Connect(false);
840                                         
841                                         bool ExitLoop = FALSE;
842                                         
843                                         while (ExitLoop == FALSE){
844                                                 
845                                                 if (ConnObjectIter->second->SSLVerify() == COSSL_UNABLETOVERIFY){
846                                                         
847                                                         frmMainPtrGet->PauseAllTimers();
848                                                         
849 #if defined(__APPLE__)
850 #elif defined(__WIN32__)
852                                                         ConnObjectIter->second->BypassSSLVerification(true);
854                                                         COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false);
856                                                         ConnObjectIter->second->BypassSSLVerification(false);
858                                                         BOOL ModifiedCertificateData = false;
859                                                         CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(ConnObjectIter->second, (HWND)frmMainPtrGet->GetHandle());
861                                                         if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)) {
862                                                                 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
863                                                         }
865                                                         if (ModifiedCertificateData == false) {
867                                                                 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnObjectIter->second->BuildSSLCollection());
868                                                                 iter->second = 2;
869                                                                 break;
871                                                         } else {
873                                                                 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection());
875                                                         }
877 #else
878         
879                                                         bool UsingSSLBypass = false;
880                                                         int SSLResult = 0;
881                                                         
882                                                         // Connect again and fetch SSL certificate information.
883                 
884                                                         ConnObjectIter->second->BypassSSLVerification(true);
885                 
886                                                         COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false);
888                                                         ConnObjectIter->second->BypassSSLVerification(false);
890                                                         SSLInvalidCertNotifObjString SSLICNProcData;
891                                                         
892                                                         SSLCertCollectionString certcol = ConnObjectIter->second->BuildSSLCollection();
893                                                                 
894                                                         bool *PauseMode = new bool;
895                                                         QRNotif qrn;
896                                                                 
897                                                         *PauseMode = TRUE;
898                                                         qrn.QResponse = &SSLResult;
899                                                         qrn.PausePtr = PauseMode;
900                                                                 
901                                                         SSLICNProcData.CertCollection = certcol;
902                                                         SSLICNProcData.QRNotifData = &qrn;
903                                                         SSLICNProcData.AccountName = AccountNameFriendly;
904                                                                 
905                                                         wxCommandEvent event(INVALIDSSLCERTSTRING);
906                                                         event.SetClientData(&SSLICNProcData);
907                                                         wxPostEvent(frmMainPtrGet, event);
908                                                                 
909                                                         while (*PauseMode == TRUE){
910                                                                 //nanosleep(&n1, &n2);
911                                                                 SleepFor(250000000);
912                                                         }
913                                                         
914                                                         // Process the response from the user.
915                                                         
916                                                         if (SSLResult == 1){
917                                                                 
918                                                                 // Accept the Certificate.
920                                                                 UsingSSLBypass = true;
921                                                                 ConnObjectIter->second->BypassSSLVerification(true);
922                 
923                                                                 COConnectResult TestConnectionResult = ConnObjectIter->second->Connect(true);
924                                                                 WriteServerCertificate(AccountDir, certcol);
925                                                                 
926                                                                 ConnObjectIter->second->BypassSSLVerification(false);
927                                                                 
928                                                         } else if (SSLResult == 2){
929                                                 
930                                                                 // Reject the certificate, abort the task and mark as failed.
932                                                                 iter->second = 2;
933                                                                 break;
934                                                                 
935                                                         }
936                 
937 #endif
938                                                         
939                                                         frmMainPtrGet->ResumeAllTimers();
940                                                         ExitLoop = true;
941                                                         
942                                                 } else if (ConnectResponse == COCONNECT_AUTHFAIL){
943                                                         
944                                                         ConnectResponse = ConnObjectIter->second->Connect(true);
945                                                         
946                                                         if (ConnectResponse == COCONNECT_OK){
947                                                                 
948                                                                 ExitLoop = true;
949                                                                 break;
950                                                                 
951                                                         } else {
952                                                                 
953                                                                 ExitLoop = true;                                                        
954                                                                 iter->second = 2;
955                                                                 break;
956                                                                 
957                                                         }
958                                                         
959                                                 } else if (ConnectResponse == COCONNECT_OK){
960                                                         
961                                                         ConnectResponse = ConnObjectIter->second->Connect(true);
962                                                         
963                                                         ExitLoop = true;
964                                                         break;
965                                                         
966                                                 } else {
967                                                         
968                                                         ExitLoop = true;                                                        
969                                                         iter->second = 2;
970                                                         break;
971                                                         
972                                                 }
973                                         
974                                         }
975                                 
976                                         if (iter->second == 2 || iter->second == 3 || iter->second == 4){
977                                                 break;
978                                         }
979                         
980 #if defined(__APPLE__)
981                                 
982                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
984 #elif defined(__WIN32__)
986                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection());
988 #else
989                                 
990                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection());
991                                 
992 #endif
993                                         
994                                         COServerResponse DeleteContactResponse = ConnObjectIter->second->DeleteContact(ContactFilename.ToStdString());
995                                         
996                                         if (DeleteContactResponse.RequestResult != COREQUEST_OK){
997                                                 iter->second = 2;
998                                                 break;
999                                         }
1000                                 
1001                                         ETagDBPtr->RemoveETag(ContactFilename);
1002                                 
1003                                         iter->second = 4;
1004                                         break;
1005                                 
1006                                 }
1007                         
1008                         } else if (TypeIter->second == 3) {
1010                                 wxString AccountNameFriendly;
1011         
1012                                 int AccountID = 0;
1014                                 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
1015         
1016                                         wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
1017                 
1018                                         AccountDirCheck.Trim();
1019                                         AccountDirCheck.Append(wxT(".carddav"));
1020         
1021                                         if (AccountDirCheck == StringAccountIter->second){
1022                                         
1023                                                 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
1024                                                 AccountID = i;
1025                 
1026                                         }
1027         
1028                                 }
1029                         
1030                                 bool KeepUpdating = TRUE;
1032                                 while (KeepUpdating == TRUE){
1034                                         StringTaskDetailIter = ActivityListTaskDetail.find(iter->first);
1035                         
1036                                         AccountDir = StringAccountIter->second;
1038                                         ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1039                                 
1040                                         wxArrayString vCardAdd;
1041                                         wxArrayString vCardDelete;
1042                                         wxArrayString vCardList;
1043                                         wxArrayString vCardUpdateLocal;
1044                                         wxArrayString vCardUpdateRemote;
1045                                         wxArrayString vCardUpdateLog;
1046                                         std::map<wxString,wxString> vCardETag;
1047                                 
1048                                         std::map<wxString,vCardDownloadDataFileClass> vCardDownloadData;
1049                                 
1050                                         // Get the list of vCard files locally.
1051         
1052                                         wxString AccountDirFinal;
1053                                         wxString AccountSyncTokenFilename;
1054                                         wxString SyncTokenLoad;
1055         
1056 #if defined(__HAIKU__)
1057     
1058                                             //preffilename = wxT("noo");
1060 #elif defined(__WIN32__)
1062                                         AccountDirFinal = GetAccountDir(AccountDir, FALSE);
1063                                         AccountSyncTokenFilename = AccountDirFinal;
1064                                         AccountSyncTokenFilename.Append(wxT("synctoken"));
1066 #else
1068                                         AccountDirFinal = GetAccountDir(AccountDir, FALSE);
1069                                         AccountSyncTokenFilename = AccountDirFinal;
1070                                         AccountSyncTokenFilename.Append(wxT("synctoken"));
1071         
1072 #endif
1074                                         // Suppress Error Messages.
1075                                 
1076                                         wxLogNull PleaseDoNotDisturb;
1078                                         wxFFile SyncLoad;
1079                                         SyncLoad.Open(AccountSyncTokenFilename, wxT("r"));
1080                                 
1081                                         if (SyncLoad.IsOpened()){
1082                                 
1083                                                 SyncLoad.ReadAll(&SyncTokenLoad, wxMBConvUTF8());
1084                                                 SyncLoad.Close();
1085                                 
1086                                         }
1088                                         // Get a list of vCard files from the server.
1090                                         // Get the list of vCard files from the ETagDB.
1091                                 
1092                                         std::map<wxString,ETagData> ETagDBData = ETagDBPtr->GetETagData();
1093                                         
1094                                         COConnectResult ConnectResponse = ConnObjectIter->second->Connect(false);
1095                                         
1096                                         bool ExitLoop = FALSE;
1097                                         
1098                                         while (ExitLoop == FALSE){                                              
1099                                                 
1100                                                 if (ConnObjectIter->second->SSLVerify() == COSSL_UNABLETOVERIFY){
1101                                                         
1102                                                         frmMainPtrGet->PauseAllTimers();
1103                                                         
1104 #if defined(__APPLE__)
1105 #elif defined(__WIN32__)
1107                                                         ConnObjectIter->second->BypassSSLVerification(true);
1109                                                         COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false);
1111                                                         ConnObjectIter->second->BypassSSLVerification(false);
1113                                                         BOOL ModifiedCertificateData = false;
1114                                                         CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(ConnObjectIter->second, (HWND)frmMainPtrGet->GetHandle());
1116                                                         if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)) {
1117                                                                 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
1118                                                         }
1120                                                         if (ModifiedCertificateData == false) {
1122                                                                 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnObjectIter->second->BuildSSLCollection());
1123                                                                 iter->second = 2;
1124                                                                 break;
1126                                                         } else {
1128                                                                 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection());
1130                                                         }
1132 #else
1133         
1134                                                         bool UsingSSLBypass = false;
1135                                                         int SSLResult = 0;
1136                                                         
1137                                                         // Connect again and fetch SSL certificate information.
1138                 
1139                                                         ConnObjectIter->second->BypassSSLVerification(true);
1140                 
1141                                                         COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false);
1143                                                         ConnObjectIter->second->BypassSSLVerification(false);
1145                                                         SSLInvalidCertNotifObjString SSLICNProcData;
1146                                                         
1147                                                         SSLCertCollectionString certcol = ConnObjectIter->second->BuildSSLCollection();
1148                                                                 
1149                                                         bool *PauseMode = new bool;
1150                                                         QRNotif qrn;
1151                                                                 
1152                                                         *PauseMode = TRUE;
1153                                                         qrn.QResponse = &SSLResult;
1154                                                         qrn.PausePtr = PauseMode;
1155                                                                 
1156                                                         SSLICNProcData.CertCollection = certcol;
1157                                                         SSLICNProcData.QRNotifData = &qrn;
1158                                                         SSLICNProcData.AccountName = AccountNameFriendly;
1159                                                                 
1160                                                         wxCommandEvent event(INVALIDSSLCERTSTRING);
1161                                                         event.SetClientData(&SSLICNProcData);
1162                                                         wxPostEvent(frmMainPtrGet, event);
1163                                                                 
1164                                                         while (*PauseMode == TRUE){
1165                                                                 //nanosleep(&n1, &n2);
1166                                                                 SleepFor(250000000);
1167                                                         }
1168                                                         
1169                                                         // Process the response from the user.
1170                                                         
1171                                                         if (SSLResult == 1){
1172                                                                 
1173                                                                 // Accept the Certificate.
1175                                                                 UsingSSLBypass = true;
1176                                                                 ConnObjectIter->second->BypassSSLVerification(true);
1177                 
1178                                                                 COConnectResult TestConnectionResult = ConnObjectIter->second->Connect(true);
1179                                                                 WriteServerCertificate(AccountDir, certcol);
1180                                                                 
1181                                                                 ConnObjectIter->second->BypassSSLVerification(false);
1182                                                                 
1183                                                         } else if (SSLResult == 2){
1184                                                 
1185                                                                 // Reject the certificate, abort the task and mark as failed.
1187                                                                 iter->second = 2;
1188                                                                 break;
1189                                                                 
1190                                                         }
1191                 
1192 #endif
1193                                                         
1194                                                         frmMainPtrGet->ResumeAllTimers();
1195                                                         ExitLoop = true;
1196                                                         
1197                                                 } else if (ConnectResponse == COCONNECT_AUTHFAIL){
1198                                                         
1199                                                         ConnectResponse = ConnObjectIter->second->Connect(true);
1200                                                         
1201                                                         if (ConnectResponse == COCONNECT_OK){
1202                                                                 
1203                                                                 ExitLoop = true;
1204                                                                 break;
1205                                                                 
1206                                                         } else {
1207                                                                 
1208                                                                 ExitLoop = true;                                                        
1209                                                                 iter->second = 2;
1210                                                                 break;
1211                                                                 
1212                                                         }
1213                                                         
1214                                                 } else if (ConnectResponse == COCONNECT_OK){
1215                                                         
1216                                                         ConnectResponse = ConnObjectIter->second->Connect(true);
1217                                                         
1218                                                         ExitLoop = true;
1219                                                         break;
1220                                                         
1221                                                 } else {
1222                                                         
1223                                                         ExitLoop = true;                                                        
1224                                                         iter->second = 2;
1225                                                         break;
1226                                                         
1227                                                 }
1228                                         
1229                                         }
1230                                 
1231 #if defined(__APPLE__)
1232                                         
1233                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1235 #elif defined(__WIN32__)
1237                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection());
1239 #else
1240                                         
1241                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection());
1242                         
1243 #endif
1244                                         
1245                                         if (iter->second == 2 || iter->second == 3 || iter->second == 4){
1246                                                 break;
1247                                         }
1248                                         
1249                                         // Look in directory and see which vCards to add and delete
1250                                 
1251                                         // In short:
1252                                         // vCard exists but not in ETagDB - Add (and upload).
1253                                         // vCard missing but in ETagDB - Delete (from server).
1254                                 
1255                                         // Start by looking for vCards that are not in the ETagDB.
1256                                 
1257                                         wxDir AccDir(AccountDirFinal);
1258                                         wxString AccDirFilename;
1259                                 
1260                                         bool ContinueProcess = AccDir.GetFirst(&AccDirFilename, wxEmptyString, wxDIR_DEFAULT);
1261                                 
1262                                         COContactList ServerContactList2 = ConnObjectIter->second->GetContactList(SyncTokenLoad.ToStdString());
1264                                         // Process the server data.
1266                                         for (std::vector<COContactData>::iterator ContactInfo = ServerContactList2.ListData.begin();
1267                                                 ContactInfo != ServerContactList2.ListData.end(); ContactInfo++){
1268                                                 
1269                                                 if (ContactInfo->Status == COCS_UPDATED){
1270                                                         
1271                                                         vCardDownloadDataFileClass vCardNewData;
1272                                                         vCardNewData.DataType = 0;
1273                                                         vCardDownloadData.insert(std::make_pair(ContactInfo->Location, vCardNewData));
1274                                                         
1275                                                 } else if (ContactInfo->Status == COCS_DELETED){
1276                                                         
1277                                                         vCardDelete.Add(ContactInfo->Location, 1);
1278                                                         
1279                                                 }
1280                                                         
1281                                         }
1282                                 
1283                                         // Look for vCards that are missing but in the ETagDB.
1284         
1285                                         for (std::map<wxString,ETagData>::iterator etagiter = ETagDBData.begin();
1286                                                 etagiter != ETagDBData.end(); etagiter++){
1287                                 
1288                                                 // Check if the vCard exists.
1289                                         
1290                                                 if (!wxFileExists(AccountDirFinal + etagiter->first)){
1291                                         
1292                                                         // vCard doesn't exist so mark for deleting.
1293                                         
1294                                                         vCardDelete.Add(etagiter->first, 1);
1295                                         
1296                                                 }
1297                                 
1298                                         }
1300                                         // Compare Server with the ETag DB. Work out which
1301                                         // needs to updated remotely and which needs to be
1302                                         // updated locally.
1304                                         for (std::vector<COContactData>::iterator ContactInfo = ServerContactList2.ListData.begin();
1305                                                 ContactInfo != ServerContactList2.ListData.end(); ContactInfo++){
1306                                                 
1307                                                 if (ETagDBData.find(ContactInfo->Location) == ETagDBData.end()){
1308                                                         continue;
1309                                                 }
1311                                                 std::map<wxString,ETagData>::iterator lociter = ETagDBData.find(ContactInfo->Location);
1312                                                 
1313                                                 ETagData etd = lociter->second;
1314                                                 
1315                                                 wxString ETagSrv = ContactInfo->Data;
1317                                                 // Check if the local ETag value has 'DELETED' set and skip
1318                                                 // checking this file if it does.
1319                                         
1320                                                 if (etd.ETagValue == "DELETED"){
1321                                                         
1322                                                         continue;
1323                                                         
1324                                                 }
1325                                                 
1326                                                 // Compare local ETag with original local ETag.
1327                                                 // If different, update to server is required.
1328                                 
1329                                                 if (etd.ETagValue != etd.ETagOrigValue){
1330                                 
1331                                                         // Check if local original ETag is different from server ETag.
1332                                                         // If it is then throw up a conflict resolution dialog.
1333                                 
1334                                                         if (etd.ETagOrigValue != ETagSrv){
1335                                         
1336                                                                 vCard34Conv vCard34Obj;
1337                                                 
1338                                                                 wxString FullFilename;
1339                                                                 vCard ClientData;
1340                                                                 vCard ConvertedV4Data;
1341                                         
1342                                                                 std::string ServerContactDataString;
1343                                                                 wxString ServerContactData;
1344                                                                 
1345                                                                 // Conflict. Bring up conflict resolution dialog.
1346                                                         
1347                                                                 // Get the server contact data for comparison.
1348                                                         
1349                                                                 ConnObjectIter->second->GetContact(ContactInfo->Location, &ServerContactDataString);
1350                                                                 ServerContactData = wxString::FromUTF8(ServerContactDataString.c_str());
1351                                                         
1352                                                                 FullFilename = CreateFilenamePath(AccountDirFinal, ContactInfo->Location);
1353                                                         
1354                                                                 // Convert it to v4.
1355                                         
1356                                                                 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1357                                         
1358                                                                 vCardConflictObj vCardProcData;
1359                                         
1360                                                                 vCardProcData.vCardLocalData = &ClientData;
1361                                                                 vCardProcData.vCardServerData = &ConvertedV4Data;
1362                                                         
1363                                                                 // Load the client data from the filename given.
1364                                                         
1365                                                                 ClientData.LoadFile(FullFilename);
1366                                                         
1367                                                                 // Show dialog.
1368                                         
1369                                                                 bool *PauseMode = new bool;
1370                                                                 int ConflictResult;
1371                                                                 QRNotif qrn;
1372                                                                 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
1374                                                                 *PauseMode = TRUE;
1375                                                                 qrn.QResponse = &ConflictResult;
1376                                                                 qrn.PausePtr = PauseMode;
1377                                                 
1378                                                                 vCardProcData.QRNotifData = &qrn;
1379                                         
1380                                                                 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1381                                                                 event.SetClientData(&vCardProcData);
1382                                                                 wxPostEvent(frmMainPtrGet, event);
1383                                                 
1384                                                                 while (*PauseMode == TRUE){
1385                                                                         //nanosleep(&n1, &n2);
1386                                                                         SleepFor(250000000);
1387                                                                 }
1388                                         
1389                                                                 delete PauseMode;
1390                                                                 PauseMode = NULL;
1391                                                         
1392                                                                 // If replacing local version, store copy for now.
1393                                                                 // Otherwise upload to server.
1394                                         
1395                                                                 if (ConflictResult == 0){
1396                                         
1397                                                                         // Decide Later.
1398                                         
1399                                                                         continue;
1400                                         
1401                                                                 } else if (ConflictResult == 1){
1402                                         
1403                                                                         // Decided to use client version.
1404                                         
1405                                                                         vCardUpdateLocal.Remove(ContactInfo->Location);
1406                                                                         vCardUpdateRemote.Add(ContactInfo->Location, 1);                                                                
1407                                         
1408                                                                 } else if (ConflictResult == 2){
1409                                         
1410                                                                         // Decided to use server version.
1411                                                                         // Store the converted downloaded copy for
1412                                                                         // processing later.
1414                                                                         //vCardUpdateLocal.Add(srviter->first, 1);
1415                                                                 
1416                                                                         vCardDownloadDataFileClass vCardNewData;
1417                                                                         vCardNewData.DataType = 1;
1418                                                                         vCardNewData.FileData = ConvertedV4Data.WriteString();
1420                                                                         ConvertedV4Data.WriteFile(FullFilename);
1421                                                                 
1422                                                                         vCardDownloadData.insert(std::make_pair(ContactInfo->Location, vCardNewData));  
1423                                                                 
1424                                                                 
1425                                                                 
1426                                                                 }
1427                                         
1428                                                         } else {
1429                                         
1430                                                                 // Send vCard to the server.
1431                                                 
1432                                                                 vCardUpdateRemote.Add(ContactInfo->Location, 1);
1433                                         
1434                                                         }
1435                                 
1436                                                 } else {
1437                                 
1438                                                         // Check if local ETag is different from server ETag.
1439                                                         // If different, obtain the vCard from the server.
1440                                         
1441                                                         if (etd.ETagOrigValue != ETagSrv){
1442                                         
1443                                                                 vCardUpdateLocal.Add(ContactInfo->Location, 1);
1444                                         
1445                                                         }
1446                                 
1447                                                 }
1448                                                 
1449                                         }
1450                                 
1451                                         // Process the vCards that need to be downloaded and added/overwritten.
1452                                 
1453                                         wxString vCardFilenameFinal;
1454                                         wxString vCardOutputData;
1455                                         wxString vCardInputData;
1456                                         wxString ETagFileData;
1457                                         wxFFile vCardFile;
1458                                 
1459                                         for (std::map<wxString,vCardDownloadDataFileClass>::iterator additer = vCardDownloadData.begin();
1460                                                 additer != vCardDownloadData.end(); additer++){
1461                                         
1462                                                 vCardFilenameFinal.Clear();
1463                                                 vCardInputData.Clear();
1464                                                 vCardOutputData.Clear();
1465                                                 ETagFileData.Clear();
1466                                         
1467                                                 vCardFilenameFinal = CreateFilenamePath(AccountDirFinal, additer->first);
1468                                         
1469                                                 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1470                                         
1471                                                 if (additer->second.DataType == 0){
1472                                         
1473                                                         vCard ConvertedV4Data;
1474                                         
1475                                                         // Grab the file from the server and write the contact out.
1476                                         
1477                                                         vCard34Conv vCard34Obj;
1478                                                         
1479                                                         wxString ServerContactData;
1480                                                         std::string ServerContactDataString;
1481                                                                 
1482                                                         // Conflict. Bring up conflict resolution dialog.
1483                                                         
1484                                                         // Get the server contact data for comparison.
1485                                                         
1486                                                         ConnObjectIter->second->GetContact(additer->first.ToStdString(), &ServerContactDataString);
1487                                                         vCardInputData = wxString::FromUTF8(ServerContactDataString.c_str());
1488                                                 
1489                                                         vCard34Obj.ConvertToV4(&vCardInputData, &ConvertedV4Data);
1490                                                 
1491                                                         ConvertedV4Data.WriteFile(vCardFilenameFinal);
1492                                                 
1493                                                         // Get the server ETag.
1494                                                 
1495                                                         wxString ServerETag;
1496                                                         
1497                                                         COServerResponse ServerEntityTag = ConnObjectIter->second->GetServerEntityTagValue(additer->first.ToStdString());
1498                                                         
1499                                                         if (ServerEntityTag.RequestResult != COREQUEST_OK){
1500                                                                 iter->second = 2;
1501                                                                 break;
1502                                                         }
1503                                                         
1504                                                         ServerETag = wxString::FromUTF8(ServerEntityTag.EntityTag.c_str());
1506                                                         // Add to the ETag Database.
1507                                                 
1508                                                         ETagDBPtr->AddETag(additer->first, ServerETag, ServerETag);
1509                                                 
1510                                                 } else if (additer->second.DataType == 1){
1511                                         
1512                                                         // Write out the contact to the account directory.
1513                                         
1514                                                         vCardFilenameFinal = CreateFilenamePath(AccountDirFinal, additer->first);
1515                                                         vCardOutputData = additer->second.FileData;
1516                                                 
1517                                                         vCardFile.Open(vCardFilenameFinal, wxT("w"));
1518                                 
1519                                                         if (vCardFile.IsOpened()){
1520                                 
1521                                                                 vCardFile.Write(vCardOutputData, wxConvAuto());
1522                                                                 vCardFile.Close();
1523                                 
1524                                                         }
1525                                                 
1526                                                         // Update the ETagDB.
1528                                                         wxString ServerETag;
1529                                                         
1530                                                         COServerResponse ServerEntityTag = ConnObjectIter->second->GetServerEntityTagValue(additer->first.ToStdString());
1531                                                         
1532                                                         if (ServerEntityTag.RequestResult != COREQUEST_OK){
1533                                                                 iter->second = 2;
1534                                                                 break;
1535                                                         }
1536                                                         
1537                                                         ServerETag = wxString::FromUTF8(ServerEntityTag.EntityTag.c_str());
1538                                                 
1539                                                         // Add to the ETag Database.
1540                                                 
1541                                                         ETagDBPtr->AddETag(additer->first, ServerETag, ServerETag);
1542                                                                                         
1543                                                 }
1544                                         }
1545                                         
1546                                         // Check if any errors occured before continuing.
1547                                         
1548                                         if (iter->second != 1){
1549                                                 break;
1550                                         }
1551         
1552                                         // Look for vCard files which aren't in the ETagDB.
1553         
1554                                         while(ContinueProcess){
1555                                 
1556                                                 // Check and make sure that the filename ends in .vcf/.vcard
1557                                                 // Skip any file that beings with a dot.
1558                                         
1559                                                 if (AccDirFilename.Left(1) == wxT(".")){
1560                                         
1561                                                         ContinueProcess = AccDir.GetNext(&AccDirFilename);
1562                                                         continue;
1563                                         
1564                                                 }
1565                                         
1566                                                 if (AccDirFilename.Right(4) != wxT(".vcf") && 
1567                                                 AccDirFilename.Right(6) != wxT(".vcard")){
1568                                         
1569                                                         ContinueProcess = AccDir.GetNext(&AccDirFilename);
1570                                                         continue;
1571                                         
1572                                                 }
1573                                 
1574                                                 // Look in the ETagDB for the file.
1575                                         
1576                                                 bool ETagExists = ETagDBPtr->CheckETagExists(AccDirFilename);
1577                                         
1578                                                 if (ETagExists == FALSE){
1579                                         
1580                                                         // Add the vCard to the list to be added.
1581                                                 
1582                                                         vCardAdd.Add(AccDirFilename, 1);
1583                                         
1584                                                 }
1585                                         
1586                                                 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1587                                 
1588                                         }
1589                                 
1590                                         // Process the vCards to add/update to the server.
1591                                 
1592                                         for (int vi = 0; vi < vCardAdd.GetCount(); vi++){
1594                                                 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1595                                                 ETag = ETagDBPtr->GetETag(vCardAdd[vi]);
1596                                                 ETagOriginal = ETagDBPtr->GetETagOriginal(vCardAdd[vi]);
1597                                                 
1598                                                 ContactFilename = vCardAdd[vi];
1599                                                 FullFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1601                                                 ContactFilename.Trim();
1602                         
1603                                                 if (ETag == ETagOriginal && ETagDBPtr->ETagExists(vCardAdd[vi])){
1604                         
1605                                                         // Compare the ETag with the Server ETag.
1606                                                         
1607                                                         COServerResponse ServerEntityTag = ConnObjectIter->second->GetServerEntityTagValue(vCardAdd[vi].ToStdString());
1608                                                         
1609                                                         if (ServerEntityTag.RequestResult != COREQUEST_OK){
1610                                                                 iter->second = 2;
1611                                                                 break;
1612                                                         }
1613                                                         
1614                                                         // TODO: Continue from here!
1615                                                         
1616                                                         ETagServer = wxString::FromUTF8(ServerEntityTag.EntityTag.c_str());
1617                                 
1618                                                         if (ETagOriginal != ETagServer){
1619                                 
1620                                                                 // Server ETag is different from original ETag.
1621                                                                 // This is a conflict which the user will now
1622                                                                 // need to resolve.
1623                                         
1624                                                                 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
1625                                         
1626                                                                 vCard34Conv vCard34Obj;
1627                                                 
1628                                                                 wxString ServerContactData;
1629                                                                 std::string ServerContactDataString;
1630                                                                 vCard ClientData;
1631                                                                 vCard ConvertedV4Data;
1632                                         
1633                                                                 // Load the client data from the filename given.
1634                                                                 
1635                                                                 COServerResponse GetContactResponse = ConnObjectIter->second->GetContact(vCardAdd[vi].ToStdString(), &ServerContactDataString);
1636                                                 
1637                                                                 if (GetContactResponse.RequestResult != COREQUEST_OK){
1638                                                                         iter->second = 2;
1639                                                                         break;
1640                                                                 }
1641                                                                 
1642                                                                 ServerContactData = wxString::FromUTF8(ServerContactDataString.c_str());
1643                                                 
1644                                                                 // Process v3 version into v4 version.
1645                                                 
1646                                                                 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1647                                         
1648                                                                 vCardConflictObj vCardProcData;
1649                                         
1650                                                                 vCardProcData.vCardLocalData = &ClientData;
1651                                                                 vCardProcData.vCardServerData = &ConvertedV4Data;
1652                                                                 ClientData.LoadFile(FullFilename);
1654                                                                 // Setup Conflict Resolution Dialog.
1655                                         
1656                                                                 // Fetch Data from Server and convert.
1657                                         
1658                                                                 bool *PauseMode = new bool;
1659                                                                 int ConflictResult;
1660                                                                 QRNotif qrn;
1662                                                                 *PauseMode = TRUE;                                              
1663                                                                 qrn.QResponse = &ConflictResult;
1664                                                                 qrn.PausePtr = PauseMode;
1665                                                 
1666                                                                 vCardProcData.QRNotifData = &qrn;
1667                                         
1668                                                                 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1669                                                                 event.SetClientData(&vCardProcData);
1670                                                                 wxPostEvent(frmMainPtrGet, event);
1671                                                 
1672                                                                 while (*PauseMode == TRUE){
1673                                                                         //nanosleep(&n1, &n2);
1674                                                                         SleepFor(250000000);
1675                                                                 }
1676                                         
1677                                                                 delete PauseMode;
1678                                                                 PauseMode = NULL;
1679                                         
1680                                                                 if (ConflictResult == 0){
1681                                         
1682                                                                         // Decide Later.
1683                                         
1684                                                                         iter->second = 4;
1685                                                                         continue;
1686                                         
1687                                                                 } else if (ConflictResult == 1){
1688                                         
1689                                                                         // Decided to use client version.
1690                                         
1691                                                                         COServerResponse EditContactResponse = ConnObjectIter->second->EditContact(vCardAdd[vi].ToStdString(), ClientData.WriteString().ToStdString());
1692                                                 
1693                                                                         if (EditContactResponse.RequestResult != COREQUEST_OK){
1694                                                                                 iter->second = 2;
1695                                                                                 break;
1696                                                                         }
1697                                                                         
1698                                                                         iter->second = 4;
1699                                         
1700                                                                 } else if (ConflictResult == 2){
1701                                         
1702                                                                         // Decided to use server version.
1703                                                 
1704                                                                         // Download server version.
1705                                                                 
1706                                                                         ConvertedV4Data.WriteFile(CreateFilenamePath(AccountDirFinal, vCardAdd[vi]));
1707                                                 
1708                                                                         iter->second = 4;
1709                                         
1710                                                                 }
1711                                 
1712                                                         } else {
1713                                 
1714                                                                 // Setup the filename for the contact being added.
1715                                                         
1716                                                                 wxString wxSFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1717                                                                 wxString wxSCardData;
1718                                                                 wxString TaskData;
1719                                                         
1720                                                                 // Load the data from the file.
1721                                                         
1722                                                                 wxFFile wxFCard;
1723                                                                 wxFCard.Open(wxSFilename, wxT("r"));
1724                                 
1725                                                                 if (wxFCard.IsOpened()){
1726                                 
1727                                                                         wxFCard.ReadAll(&wxSCardData, wxConvAuto());
1728                                                                         wxFCard.Close();
1729                                 
1730                                                                 }
1731                                                         
1732                                                                 // Convert the data to v3.
1733                                                         
1734                                                                 vCard34Conv vCard34Obj;
1735                                                         
1736                                                                 vCard34Obj.ConvertToV3(wxSFilename, &TaskData);
1738                                                                 // Upload the data to the server.
1739                                                                 
1740                                                                 COServerResponse AddContactResponse = ConnObjectIter->second->AddContact(vCardAdd[vi].ToStdString(), TaskData.ToStdString());
1741                                                         
1742                                                                 if (AddContactResponse.RequestResult != COREQUEST_OK){
1743                                                                         iter->second = 2;
1744                                                                         break;
1745                                                                 }
1746                                                                 
1747                                                                 // Get the Server ETag and put it in the ETag database.
1749                                                                 COServerResponse EntityTagResponse = ConnObjectIter->second->GetServerEntityTagValue(vCardAdd[vi].ToStdString());
1750                                                                 
1751                                                                 if (EntityTagResponse.RequestResult != COREQUEST_OK){
1752                                                                         iter->second = 2;
1753                                                                         break;
1754                                                                 }
1755                                                                 
1756                                                                 ETagServer = wxString::FromUTF8(EntityTagResponse.EntityTag.c_str());
1757                                 
1758                                                                 ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer);
1759                                 
1760                                                         }
1761                         
1762                                                 } else {
1763                         
1764                                                         if (ETagOriginal != ETagServer){
1765                                 
1766                                                                 // Server ETag is different from original ETag.
1767                                                                 // This is a conflict which the user will now
1768                                                                 // need to resolve.
1769                                         
1770                                                                 frmMain *frmMainPtrGet = (frmMain *)frmMainPtr;
1771                                         
1772                                                                 vCard34Conv vCard34Obj;
1773                                                 
1774                                                                 std::string ServerContactDataString;
1775                                                                 wxString ServerContactData;
1776                                                                 vCard ClientData;
1777                                                                 vCard ConvertedV4Data;
1778                                         
1779                                                                 // Load the client data from the filename given.
1780                                         
1781                                                                 COServerResponse GetContactResponse = ConnObjectIter->second->GetContact(vCardAdd[vi].ToStdString(), &ServerContactDataString);
1782                                                 
1783                                                                 if (GetContactResponse.RequestResult != COREQUEST_OK){
1784                                                                         iter->second = 2;
1785                                                                         break;
1786                                                                 }
1787                                                                 
1788                                                                 ServerContactData = wxString::FromUTF8(ServerContactDataString.c_str());
1789                                                                 
1790                                                                 ClientData.LoadFile(FullFilename);
1791                                                 
1792                                                                 // Process v3 version into v4 version.
1793                                                 
1794                                                                 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1795                                         
1796                                                                 vCardConflictObj vCardProcData;
1797                                         
1798                                                                 vCardProcData.vCardLocalData = &ClientData;
1799                                                                 vCardProcData.vCardServerData = &ConvertedV4Data;
1800                                         
1801                                                                 bool *PauseMode = new bool;
1802                                                                 int ConflictResult;
1803                                                                 QRNotif qrn;
1805                                                                 *PauseMode = TRUE;                                              
1806                                                                 qrn.QResponse = &ConflictResult;
1807                                                                 qrn.PausePtr = PauseMode;
1808                                                 
1809                                                                 vCardProcData.QRNotifData = &qrn;
1810                                         
1811                                                                 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1812                                                                 event.SetClientData(&vCardProcData);
1813                                                                 wxPostEvent(frmMainPtrGet, event);
1815                                                                 while (*PauseMode == TRUE){
1816                                                                         SleepFor(250000000);
1817                                                                 }
1818                                         
1819                                                                 delete PauseMode;
1820                                                                 PauseMode = NULL;
1821                                         
1822                                                                 if (ConflictResult == 0){
1823                                         
1824                                                                         // Decide Later.
1825                                         
1826                                                                         iter->second = 4;
1827                                                                         continue;
1828                                         
1829                                                                 } else if (ConflictResult == 1){
1830                                         
1831                                                                         // Decided to use client version.
1832                                                                 
1833                                                                         COServerResponse EditContactResponse = ConnObjectIter->second->EditContact(vCardAdd[vi].ToStdString(), ClientData.WriteString().ToStdString());
1835                                                                         if (EditContactResponse.RequestResult != COREQUEST_OK){
1836                                                                                 iter->second = 2;
1837                                                                                 break;
1838                                                                         }
1839                                                                         
1840                                                                         iter->second = 4;
1841                                         
1842                                                                 } else if (ConflictResult == 2){
1843                                         
1844                                                                         // Decided to use server version.
1845                                                 
1846                                                                         // Write server version to file.
1847                                                                 
1848                                                                         ConvertedV4Data.WriteFile(CreateFilenamePath(AccountDirFinal, vCardAdd[vi]));
1849                                                 
1850                                                                         iter->second = 4;
1851                                         
1852                                                                 }
1853                                 
1854                                                         } else {
1855                                 
1856                                                                 // Setup the filename for the contact being added.
1857                                                         
1858                                                                 wxString wxSFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1859                                                                 wxString wxSCardData;
1860                                                                 wxString TaskData;
1861                                                         
1862                                                                 // Load the data from the file.
1863                                                         
1864                                                                 wxFFile wxFCard;
1865                                                                 wxFCard.Open(wxSFilename, wxT("r"));
1866                                 
1867                                                                 if (wxFCard.IsOpened()){
1868                                 
1869                                                                         wxFCard.ReadAll(&wxSCardData, wxConvAuto());
1870                                                                         wxFCard.Close();
1871                                 
1872                                                                 }
1873                                                         
1874                                                                 // Convert the data to v3.
1875                                                         
1876                                                                 vCard34Conv vCard34Obj;
1877                                                         
1878                                                                 vCard34Obj.ConvertToV3(wxSFilename, &TaskData);
1880                                                                 // Upload the data to the server.
1881                                                                 
1882                                                                 COServerResponse AddContactResponse = ConnObjectIter->second->AddContact(vCardAdd[vi].ToStdString(), TaskData.ToStdString());
1884                                                                 if (AddContactResponse.RequestResult != COREQUEST_OK){
1885                                                                         iter->second = 2;
1886                                                                         break;
1887                                                                 }
1888                                                                 
1889                                                                 // Get the Server ETag and put it in the ETag database.
1890                                                         
1891                                                                 COServerResponse EntityTagResponse = ConnObjectIter->second->GetServerEntityTagValue(vCardAdd[vi].ToStdString());
1892                                 
1893                                                                 if (EntityTagResponse.RequestResult != COREQUEST_OK){
1894                                                                         iter->second = 2;
1895                                                                         break;
1896                                                                 }
1897                                                                 
1898                                                                 ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer);
1899                                 
1900                                                         }
1901                                         
1902                                                 }
1904                                         }                       
1905                                 
1906                                         if (iter->second != 1){
1907                                                 break;
1908                                         }
1909                                         
1910                                         // Process the vCards to delete locally.
1911                                 
1912                                         for (int vi = 0; vi < vCardDelete.GetCount(); vi++){
1914                                                 if (!wxRemoveFile(CreateFilenamePath(AccountDirFinal, vCardDelete[vi]))){
1916                                                 } else {
1917                                         
1918                                                         ETagDBPtr->RemoveETag(vCardDelete[vi]);
1919                                         
1920                                                 }
1922                                         }
1923                                 
1924                                         // Process the vCards to delete from the server.
1925                                 
1926                                         std::map<wxString,wxString> *ETagFilenameMap = ETagDBPtr->GetFilenamePointer();
1927                                         std::list<wxString> DeleteList;
1928                                 
1929                                         for (std::map<wxString,wxString>::iterator deliter = ETagFilenameMap->begin();
1930                                                 deliter != ETagFilenameMap->end(); deliter++){
1931                                 
1932                                                 // Look through the ETagDB and find contacts which are marked as DELETED.
1933                                         
1934                                                 if (deliter->second == wxT("DELETED")){
1936                                                         ConnObjectIter->second->DeleteContact(deliter->first.ToStdString());
1937                                         
1938                                                         // Delete the ETag as the file has now been deleted.
1939                                         
1940                                                         DeleteList.push_back(deliter->first);
1941                                         
1942                                                 }
1943                                 
1944                                         }
1945                                         
1946                                         for (std::list<wxString>::iterator removeetagiter = DeleteList.begin();
1947                                                 removeetagiter != DeleteList.end(); removeetagiter++){
1948                                         
1949                                                 ETagDBPtr->RemoveETag(*removeetagiter);
1950                                                 
1951                                         }
1952                                 
1953                                         // Write out the update server sync token.
1955                                         wxString ServerSyncToken = wxString::FromUTF8(ServerContactList2.SyncToken.c_str());
1956                                 
1957                                         ServerSyncToken.Trim();
1958                                 
1959                                         if (!ServerSyncToken.IsEmpty()){
1960                                 
1961                                                 wxFFile SyncWrite;
1962                                                 SyncWrite.Open(AccountSyncTokenFilename, wxT("w"));
1963                                 
1964                                                 if (SyncWrite.IsOpened()){
1965                                 
1966                                                         SyncWrite.Write(ServerSyncToken, wxConvAuto());
1967                                                         SyncWrite.Close();
1968                                 
1969                                                 }
1970                                 
1971                                         }
1972                                 
1973                                         // Check for another sync token. If there is another 
1974                                         // sync token then repeat this. If token matches then stop processing.
1975                                 
1976                                         if (SyncTokenLoad == ServerSyncToken){
1977                                         
1978                                                 KeepUpdating = FALSE;
1979                                         
1980                                         }
1981                                         
1982                                 }
1983                                 
1984                                 // Mark as completed.
1985                         
1986                                 wxString AccountNameFinal;
1987                                 AccountNameFinal = PrefData.accounts.GetAccountDirectory(AccountID);
1988                                 AccountNameFinal.Append(wxT(".carddav"));
1989                                 
1990                                 wxCommandEvent reloadevent(RELOADCONTACTLIST);
1991                                 reloadevent.SetString(AccountNameFinal);
1992                                 wxPostEvent(this->GetParent(), reloadevent);
1993                                 
1994                                 iter->second = 4;
1995                                 continue;
1996                         
1997                         } else {
1998                         
1999                                 // Update the data to the server.
2001                                 iter->second = 4;
2002                                 continue;
2003                         
2004                         }
2006                         while (iter->second == 1){
2008                                 SleepFor(125000000);
2009         
2010                         }
2011                         
2012                         break;
2013                         
2014                 }
2016         }
2017         
2018         if (TasksFoundProc == FALSE){
2019         
2020                 TasksActive = FALSE;
2021                 ProcessTasksData = FALSE;
2022         
2023         } else {
2025                 wxCommandEvent eventp(ACTMGR_STARTTIMER);
2026                 wxPostEvent(this, eventp);
2027         
2028         }
2029         
2030         wxCommandEvent event(ACTMGR_STARTPROCESSTIMER);
2031         wxPostEvent(this, event);
2035 void frmActivityMgr::ProcessTasks()
2037         
2038         std::thread ProcessThread(&frmActivityMgr::ProcessTasksThread, this);
2039         ProcessThread.detach();
2043 void frmActivityMgr::SetupPointers(wxETagProcessTimer *ETagTmrPtrInc, void *frmMainPtrInc)
2046         ETagTmrPtr = ETagTmrPtrInc;
2047         
2048         frmMainPtr = frmMainPtrInc;
2052 void frmActivityMgr::ResumeProcessing(wxCommandEvent &event){
2054         QRNotif *qrn = (QRNotif *)event.GetClientData(); 
2055         
2056         int *QRes = qrn->QResponse;
2058         *qrn->PausePtr = FALSE;
2060         *QRes = event.GetInt();
2061         
2064 void frmActivityMgr::ToggleConnectionStatus( wxCommandEvent &event ){
2066         wxCommandEvent connevent(CONNSTAT_UPDATE);
2067         
2068         if (ApplicationSleepMode == FALSE){
2069         
2070                 connevent.SetInt(1);
2071                 ApplicationSleepMode = TRUE;
2072                 mnuSleepMode->Check(true);
2073         
2074         } else {
2075         
2076                 connevent.SetInt(0);
2077                 ApplicationSleepMode = FALSE;
2078                 mnuSleepMode->Check(false);
2079                 
2080                 wxCommandEvent event(ACTMGR_STARTTIMER);
2081                 wxPostEvent(this, event);
2083                 wxCommandEvent eventp(ACTMGR_STARTPROCESSTIMER);
2084                 wxPostEvent(this, eventp);
2085         
2086         }
2088         wxPostEvent(GetParent(), connevent);
2092 void frmActivityMgr::SleepMode( wxCommandEvent &event ){
2093         
2094         wxCommandEvent connevent(ACTMGR_TOGGLECONN);
2095         
2096         wxPostEvent(this, connevent);
2097         
2100 void frmActivityMgr::WriteServerCertificate(wxString AccountName, SSLCertCollection SSLCertInc){
2102         wxString ServerCertFinal;
2104         // Get the Cert section of the certificate and write it to the file.
2106         ServerCertFinal = GetAccountDir(AccountName, TRUE);
2108         wxFile CertFile;
2109         
2110         std::map<int, SSLCertData>::iterator SSLCDIter = SSLCertInc.SSLCollection.find(0);
2111         std::multimap<wxString,wxString>::iterator SSLDataIter = SSLCDIter->second.CertData.find(wxT("Cert"));
2112         
2113         CertFile.Open(ServerCertFinal, wxFile::write);  
2114         
2115         CertFile.Write(SSLDataIter->second, wxConvUTF8);
2116         CertFile.Close();
2120 void frmActivityMgr::WriteServerCertificate(wxString AccountName, SSLCertCollectionString SSLCertInc){
2122         wxString ServerCertFinal;
2124         // Get the Cert section of the certificate and write it to the file.
2126         ServerCertFinal = GetAccountDir(AccountName, TRUE);
2128         wxFile CertFile;
2129         
2130         std::map<int, SSLCertDataString>::iterator SSLCDIter = SSLCertInc.SSLCollection.find(0);
2131         std::multimap<string,string>::iterator SSLDataIter = SSLCDIter->second.CertData.find("Cert");
2132         
2133         CertFile.Open(ServerCertFinal, wxFile::write);  
2134         
2135         CertFile.Write(SSLDataIter->second, wxConvUTF8);
2136         CertFile.Close();
2140 void frmActivityMgr::StartTimer(wxCommandEvent& event){
2142         ActListProcTimer.Start(1000, FALSE);
2146 void frmActivityMgr::StopTimer(wxCommandEvent& event){
2148         ActListProcTimer.Stop();
2152 void frmActivityMgr::StartProcessTimer(wxCommandEvent& event){
2154         ActProcessTimer.Start(1000, FALSE);
2158 void frmActivityMgr::StopProcessTimer(wxCommandEvent& event){
2160         ActProcessTimer.Stop();
2164 void frmActivityMgr::StartAnimationTimer(wxCommandEvent& event){
2165         
2166         AnimationTimer.StartAnimation();
2167         
2170 void frmActivityMgr::UpdateStatusLabel(wxCommandEvent& event){
2172         ActivityMgrLabelUpdate *actmgrudata = (ActivityMgrLabelUpdate*)event.GetClientData();
2173         
2174         if (actmgrudata != NULL){
2175         
2176                 lstActivity->SetItem(actmgrudata->ItemIndex, 2, actmgrudata->ItemLabel);
2177         
2178                 delete actmgrudata;
2179                 actmgrudata = NULL;
2180         
2181         }
Xestia Software Development
Yn Maystri
© 2006 - 2019 Xestia Software Development
Software

Xestia Address Book
Xestia Calendar
Development

Xestia Gelforn
Everything else

About
News
Privacy Policy