Home | News | Projects | Releases
Bugs | RFE | Repositories | Help
Implemented macOS (OSX) support for ConnectionObject/CardDAV2 and updated files neede...
[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__)
334                                                         ConnObjectIter->second->BypassSSLVerification(true);
335                                                         
336                                                         COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false);
337                                                         
338                                                         ConnObjectIter->second->BypassSSLVerification(false);
339                                                         
340                                                         int SSLResult = DisplayTrustPanel(ConnObjectIter->second->BuildSSLCollection(), AccountNameFriendly);
341                                                         
342                                                         if (SSLResult != NSOKButton){
343                                                                 
344                                                                 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnObjectIter->second->BuildSSLCollection());
345                                                                 iter->second = 2;
346                                                                 break;
347                                                                 
348                                                         } else {
349                                                                 
350                                                                 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection());
351                                                                 
352                                                         }
353                                                         
354 #elif defined(__WIN32__)
356                                                         ConnObjectIter->second->BypassSSLVerification(true);
358                                                         COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false);
360                                                         ConnObjectIter->second->BypassSSLVerification(false);
362                                                         BOOL ModifiedCertificateData = false;
363                                                         CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(ConnObjectIter->second, (HWND)frmMainPtrGet->GetHandle());
365                                                         if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)) {
366                                                                 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
367                                                         }
369                                                         if (ModifiedCertificateData == false) {
371                                                                 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnObjectIter->second->BuildSSLCollection());
372                                                                 iter->second = 2;
373                                                                 break;
375                                                         } else {
377                                                                 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection());
379                                                         }
381 #else
382         
383                                                         bool UsingSSLBypass = false;
384                                                         int SSLResult = 0;
385                                                         
386                                                         // Connect again and fetch SSL certificate information.
387                 
388                                                         ConnObjectIter->second->BypassSSLVerification(true);
389                 
390                                                         COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false);
392                                                         ConnObjectIter->second->BypassSSLVerification(false);
394                                                         SSLInvalidCertNotifObjString SSLICNProcData;
395                                                         
396                                                         SSLCertCollectionString certcol = ConnObjectIter->second->BuildSSLCollection();
397                                                                 
398                                                         bool *PauseMode = new bool;
399                                                         QRNotif qrn;
400                                                                 
401                                                         *PauseMode = TRUE;
402                                                         qrn.QResponse = &SSLResult;
403                                                         qrn.PausePtr = PauseMode;
404                                                                 
405                                                         SSLICNProcData.CertCollection = certcol;
406                                                         SSLICNProcData.QRNotifData = &qrn;
407                                                         SSLICNProcData.AccountName = AccountNameFriendly;
408                                                                 
409                                                         wxCommandEvent event(INVALIDSSLCERTSTRING);
410                                                         event.SetClientData(&SSLICNProcData);
411                                                         wxPostEvent(frmMainPtrGet, event);
412                                                                 
413                                                         while (*PauseMode == TRUE){
414                                                                 //nanosleep(&n1, &n2);
415                                                                 SleepFor(250000000);
416                                                         }
417                                                         
418                                                         // Process the response from the user.
419                                                         
420                                                         if (SSLResult == 1){
421                                                                 
422                                                                 // Accept the Certificate.
424                                                                 UsingSSLBypass = true;
425                                                                 ConnObjectIter->second->BypassSSLVerification(true);
426                 
427                                                                 COConnectResult TestConnectionResult = ConnObjectIter->second->Connect(true);
428                                                                 WriteServerCertificate(AccountDir, certcol);
429                                                                 
430                                                                 ConnObjectIter->second->BypassSSLVerification(false);
431                                                                 
432                                                         } else if (SSLResult == 2){
433                                                 
434                                                                 // Reject the certificate, abort the task and mark as failed.
436                                                                 iter->second = 2;
437                                                                 break;
438                                                                 
439                                                         }
440                 
441 #endif
442                                                         
443                                                         frmMainPtrGet->ResumeAllTimers();
444                                                         ExitLoop = true;
445                                                         
446                                                 } else if (ConnectResponse == COCONNECT_AUTHFAIL){
447                                                         
448                                                         ConnectResponse = ConnObjectIter->second->Connect(true);
449                                                         
450                                                         if (ConnectResponse == COCONNECT_OK){
451                                                                 
452                                                                 ExitLoop = true;
453                                                                 break;
454                                                                 
455                                                         } else {
456                                                                 
457                                                                 ExitLoop = true;                                                        
458                                                                 iter->second = 2;
459                                                                 break;
460                                                                 
461                                                         }
462                                                         
463                                                 } else if (ConnectResponse == COCONNECT_OK){
464                                                         
465                                                         ConnectResponse = ConnObjectIter->second->Connect(true);
466                                                         
467                                                         ExitLoop = true;
468                                                         break;
469                                                         
470                                                 } else {
471                                                         
472                                                         ExitLoop = true;                                                        
473                                                         iter->second = 2;
474                                                         break;
475                                                         
476                                                 }
477                                                 
478                                         }
479                                         
480                                         if (iter->second == 2 || iter->second == 3 || iter->second == 4){
481                                                 break;
482                                         }
483                                         
484 #if defined(__APPLE__)
485                                         
486                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection());
488 #elif defined(__WIN32__)
490                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection());
492 #else
493                                         
494                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection());
495                                         
496 #endif
497                                         
498                                         COServerResponse AddContactResponse = ConnObjectIter->second->AddContact(StringURLIter->second.ToStdString(), 
499                                                         StringDataIter->second.ToStdString());
500                                         
501                                         if (AddContactResponse.RequestResult != COREQUEST_OK){
502                                                 iter->second = 2;
503                                                 break;
504                                         }
505                                         
506                                         // Get the entity tag for the new contact.
507                                         
508                                         COServerResponse ETagGetResponse = ConnObjectIter->second->GetServerEntityTagValue(StringURLIter->second.ToStdString());
509                                         
510                                         if (ETagGetResponse.RequestResult != COREQUEST_OK){
511                                                 iter->second = 2;
512                                                 break;
513                                         }
514                                         
515                                         std::cout << ETagGetResponse.EntityTag << std::endl;
516                                         
517                                         ETagDBPtr->UpdateETag(ContactFilename, ETagGetResponse.EntityTag, ETagGetResponse.EntityTag);
518                                         
519                                         iter->second = 4;
520                                         break;
521                                         
522                                 }
523                                 
524                         } else if (TypeIter->second == 1){
525                                 
526                                 // Update a contact.
527                                 
528                                 StringDataIter = ActivityListData.find(iter->first);
529                                 StringURLIter = ActivityListURL.find(iter->first);
530                                 
531                                 AccountDir = StringAccountIter->second;
532                                 ContactFilename = StringFilenameIter->second;
533                                 wxString AccountNameFriendly;
534                                 
535                                 int AccountID = 0;
536                                 
537                                 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
538                                         
539                                         wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
540                                         
541                                         AccountDirCheck.Trim();
542                                         AccountDirCheck.Append(wxT(".carddav"));
543                                         
544                                         if (AccountDirCheck == StringAccountIter->second){
545                                                 
546                                                 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
547                                                 AccountID = i;
548                                                 
549                                         }
550                                         
551                                 }
552                                 
553                                 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
554                                 
555                                 ETag = StringETagIter->second;
556                                 ETagOriginal = StringETagOrigIter->second;
557                                 AccountDir = StringAccountIter->second;
558                                 ContactFilename = StringFilenameIter->second;
559                                 FullFilename = StringFullFilenameIter->second;
560                                 EditMode = ActivityListEditMode.find(iter->first)->second;
561                                 
562                                 bool KeepUpdating = true;
563                                 
564                                 while(KeepUpdating == true){
565                                         
566                                         COConnectResult ConnectResponse = ConnObjectIter->second->Connect(false);
567                                         
568                                         bool ExitLoop = false;
569                                         
570                                         while(ExitLoop == false){
571                                                 
572                                                 if (ConnObjectIter->second->SSLVerify() == COSSL_UNABLETOVERIFY){
573                                                         
574                                                         frmMainPtrGet->PauseAllTimers();
575                                                         
576 #if defined(__APPLE__)
577                                                         
578                                                         ConnObjectIter->second->BypassSSLVerification(true);
579                                                         
580                                                         COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false);
581                                                         
582                                                         ConnObjectIter->second->BypassSSLVerification(false);
583                                                         
584                                                         int SSLResult = DisplayTrustPanel(ConnObjectIter->second->BuildSSLCollection(), AccountNameFriendly);
585                                                         
586                                                         if (SSLResult != NSOKButton){
587                                                                 
588                                                                 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnObjectIter->second->BuildSSLCollection());
589                                                                 iter->second = 2;
590                                                                 break;
591                                                                 
592                                                         } else {
593                                                                 
594                                                                 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection());
595                                                                 
596                                                         }
597                                                         
598 #elif defined(__WIN32__)
600                                                         ConnObjectIter->second->BypassSSLVerification(true);
602                                                         COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false);
604                                                         ConnObjectIter->second->BypassSSLVerification(false);
606                                                         BOOL ModifiedCertificateData = false;
607                                                         CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(ConnObjectIter->second, (HWND)frmMainPtrGet->GetHandle());
609                                                         if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)) {
610                                                                 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
611                                                         }
613                                                         if (ModifiedCertificateData == FALSE) {
615                                                                 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnObjectIter->second->BuildSSLCollection());
616                                                                 iter->second = 2;
617                                                                 break;
619                                                         } else {
621                                                                 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection());
623                                                         }
625 #else
626         
627                                                         bool UsingSSLBypass = false;
628                                                         int SSLResult = 0;
629                                                         
630                                                         // Connect again and fetch SSL certificate information.
631                 
632                                                         ConnObjectIter->second->BypassSSLVerification(true);
633                 
634                                                         COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false);
636                                                         ConnObjectIter->second->BypassSSLVerification(false);
638                                                         SSLInvalidCertNotifObjString SSLICNProcData;
639                                                         
640                                                         SSLCertCollectionString certcol = ConnObjectIter->second->BuildSSLCollection();
641                                                                 
642                                                         bool *PauseMode = new bool;
643                                                         QRNotif qrn;
644                                                                 
645                                                         *PauseMode = TRUE;
646                                                         qrn.QResponse = &SSLResult;
647                                                         qrn.PausePtr = PauseMode;
648                                                                 
649                                                         SSLICNProcData.CertCollection = certcol;
650                                                         SSLICNProcData.QRNotifData = &qrn;
651                                                         SSLICNProcData.AccountName = AccountNameFriendly;
652                                                                 
653                                                         wxCommandEvent event(INVALIDSSLCERTSTRING);
654                                                         event.SetClientData(&SSLICNProcData);
655                                                         wxPostEvent(frmMainPtrGet, event);
656                                                                 
657                                                         while (*PauseMode == TRUE){
658                                                                 SleepFor(250000000);
659                                                         }
660                                                         
661                                                         // Process the response from the user.
662                                                         
663                                                         if (SSLResult == 1){
664                                                                 
665                                                                 // Accept the Certificate.
667                                                                 UsingSSLBypass = true;
668                                                                 ConnObjectIter->second->BypassSSLVerification(true);
669                 
670                                                                 COConnectResult TestConnectionResult = ConnObjectIter->second->Connect(true);
671                                                                 WriteServerCertificate(AccountDir, certcol);
672                                                                 
673                                                                 ConnObjectIter->second->BypassSSLVerification(false);
674                                                                 
675                                                         } else if (SSLResult == 2){
676                                                 
677                                                                 // Reject the certificate, abort the task and mark as failed.
679                                                                 iter->second = 2;
680                                                                 break;
681                                                                 
682                                                         }
683                 
684 #endif
685                                                         
686                                                         frmMainPtrGet->ResumeAllTimers();
687                                                         ExitLoop = true;
688                                                         
689                                                 } else if (ConnectResponse == COCONNECT_AUTHFAIL){
690                                                         
691                                                         ConnectResponse = ConnObjectIter->second->Connect(true);
692                                                         
693                                                         if (ConnectResponse == COCONNECT_OK){
694                                                                 
695                                                                 ExitLoop = true;
696                                                                 break;
697                                                                 
698                                                         } else {
699                                                                 
700                                                                 ExitLoop = true;                                                        
701                                                                 iter->second = 2;
702                                                                 break;
703                                                                 
704                                                         }
705                                                         
706                                                 } else if (ConnectResponse == COCONNECT_OK){
707                                                         
708                                                         ConnectResponse = ConnObjectIter->second->Connect(true);
709                                                         
710                                                         ExitLoop = true;
711                                                         break;
712                                                         
713                                                 } else {
714                                                         
715                                                         ExitLoop = true;                                                        
716                                                         iter->second = 2;
717                                                         break;
718                                                         
719                                                 }
720                                                 
721                                         }
722                                         
723                                         if (iter->second == 2 || iter->second == 3 || iter->second == 4){
724                                                 break;
725                                         }
726                                         
727                                         COServerResponse ETagGetResponse = ConnObjectIter->second->GetServerEntityTagValue(StringURLIter->second.ToStdString());
728                                         
729                                         if (ETagGetResponse.RequestResult != COREQUEST_OK){
730                                                 iter->second = 2;
731                                                 break;
732                                         }
733                                         
734                                         ETagServer = ETagGetResponse.EntityTag;
735                                         
736                                         // Compare the ETag with the Server ETag.
737                                         
738                                         if (ETagOriginal != ETagServer){
739                                                 
740                                                 // Server ETag is different from original ETag.
741                                                 // This is a conflict which the user will now
742                                                 // need to resolve.
743                                                 
744                                                 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
745                                                 
746                                                 vCard34Conv vCard34Obj;
747                                                 
748                                                 std::string ServerContactData;
749                                                 wxString wxStringServerContactData;
750                                                 vCard ClientData;
751                                                 vCard ConvertedV4Data;
752                                                 
753                                                 // Load the client data from the filename given.
754                                                 
755                                                 COServerResponse GetContactResponse = ConnObjectIter->second->GetContact(StringURLIter->second.ToStdString(),
756                                                         &ServerContactData);
757                                                 
758                                                 if (GetContactResponse.RequestResult != COREQUEST_OK){
759                                                         iter->second = 2;
760                                                         break;
761                                                 }
762                                                 
763                                                 wxStringServerContactData = wxString::FromUTF8((const char*)ServerContactData.c_str());
764                                                 
765                                                 // Process v3 version into v4 version.
766                                                 
767                                                 vCard34Obj.ConvertToV4(&wxStringServerContactData, &ConvertedV4Data);
768                                                 
769                                                 vCardConflictObj vCardProcData;
770                                                 
771                                                 vCardProcData.vCardLocalData = &ClientData;
772                                                 vCardProcData.vCardServerData = &ConvertedV4Data;
773                                                 ClientData.LoadFile(FullFilename);
774                                                 
775                                                 // Setup Conflict Resolution Dialog.
776                                                 
777                                                 // Fetch Data from Server and convert.
778                                                 
779                                                 bool *PauseMode = new bool;
780                                                 int ConflictResult;
781                                                 QRNotif qrn;
782                                                 
783                                                 *PauseMode = TRUE;
784                                                 qrn.QResponse = &ConflictResult;
785                                                 qrn.PausePtr = PauseMode;
786                                                 
787                                                 vCardProcData.QRNotifData = &qrn;
788                                                 
789                                                 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
790                                                 event.SetClientData(&vCardProcData);
791                                                 wxPostEvent(frmMainPtrGet, event);
792                                                 
793                                                 while (*PauseMode == TRUE){
794                                                         SleepFor(250000000);
795                                                 }
796                                                 
797                                                 delete PauseMode;
798                                                 PauseMode = NULL;
799                                                 
800                                                 if (ConflictResult == 0){
801                                                         
802                                                         // Decide Later.
803                                                         
804                                                         iter->second = 4;
805                                                         break;
806                                                         
807                                                 } else if (ConflictResult == 1){
808                                                         
809                                                         // Decided to use client version.
810                                                         
811                                                 } else if (ConflictResult == 2){
812                                                         
813                                                         // Decided to use server version.
814                                                         
815                                                         // Download server version.
816                                                         
817                                                         ConvertedV4Data.WriteFile(FullFilename);
818                                                         
819                                                 }
820                                                 
821                                         } else {
822                                                 
823                                                 // Upload the data to the server.
824                                                 
825                                                 COServerResponse EditContactResponse = ConnObjectIter->second->EditContact(StringURLIter->second.ToStdString(), 
826                                                         StringDataIter->second.ToStdString());
827                                         
828                                                 if (EditContactResponse.RequestResult != COREQUEST_OK){
829                                                         iter->second = 2;
830                                                         break;
831                                                 }
832                                                 
833                                         }
834                                         
835                                         ETagGetResponse = ConnObjectIter->second->GetServerEntityTagValue(StringURLIter->second.ToStdString());
836                                         
837                                         if (ETagGetResponse.RequestResult != COREQUEST_OK){
838                                                 iter->second = 2;
839                                                 break;
840                                         }
841                                         
842                                         ETagDBPtr->UpdateETag(ContactFilename, ETagGetResponse.EntityTag, ETagGetResponse.EntityTag);
843                                         
844                                         iter->second = 4;
845                                         break;
846                                         
847                                 }
848                         
849                         } else if (TypeIter->second == 2) {
850                         
851                                 // Delete the contact from the server and update the ETag DB.
852                                 
853                                 AccountDir = StringAccountIter->second;
854                                 ContactFilename = StringFilenameIter->second;
855                                 wxString AccountNameFriendly;
856                                 
857                                 int AccountID = 0;
858                                 
859                                 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
860                                         
861                                         wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
862                                         
863                                         AccountDirCheck.Trim();
864                                         AccountDirCheck.Append(wxT(".carddav"));
865                                         
866                                         if (AccountDirCheck == StringAccountIter->second){
867                                                 
868                                                 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
869                                                 AccountID = i;
870                                                 
871                                         }
872                                         
873                                 }
874                                 
875                                 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
876                                 
877                                 bool KeepUpdating = TRUE;
878                                 
879                                 while(KeepUpdating == TRUE){
880                                 
881                                         COConnectResult ConnectResponse = ConnObjectIter->second->Connect(false);
882                                         
883                                         bool ExitLoop = FALSE;
884                                         
885                                         while (ExitLoop == FALSE){
886                                                 
887                                                 if (ConnObjectIter->second->SSLVerify() == COSSL_UNABLETOVERIFY){
888                                                         
889                                                         frmMainPtrGet->PauseAllTimers();
890                                                         
891 #if defined(__APPLE__)
892                                                         
893                                                         ConnObjectIter->second->BypassSSLVerification(true);
894                                                         
895                                                         COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false);
896                                                         
897                                                         ConnObjectIter->second->BypassSSLVerification(false);
898                                                         
899                                                         int SSLResult = DisplayTrustPanel(ConnObjectIter->second->BuildSSLCollection(), AccountNameFriendly);
900                                                         
901                                                         if (SSLResult != NSOKButton){
902                                                                 
903                                                                 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnObjectIter->second->BuildSSLCollection());
904                                                                 iter->second = 2;
905                                                                 break;
906                                                                 
907                                                         } else {
908                                                                 
909                                                                 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection());
910                                                                 
911                                                         }
912                                                         
913 #elif defined(__WIN32__)
915                                                         ConnObjectIter->second->BypassSSLVerification(true);
917                                                         COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false);
919                                                         ConnObjectIter->second->BypassSSLVerification(false);
921                                                         BOOL ModifiedCertificateData = false;
922                                                         CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(ConnObjectIter->second, (HWND)frmMainPtrGet->GetHandle());
924                                                         if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)) {
925                                                                 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
926                                                         }
928                                                         if (ModifiedCertificateData == false) {
930                                                                 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnObjectIter->second->BuildSSLCollection());
931                                                                 iter->second = 2;
932                                                                 break;
934                                                         } else {
936                                                                 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection());
938                                                         }
940 #else
941         
942                                                         bool UsingSSLBypass = false;
943                                                         int SSLResult = 0;
944                                                         
945                                                         // Connect again and fetch SSL certificate information.
946                 
947                                                         ConnObjectIter->second->BypassSSLVerification(true);
948                 
949                                                         COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false);
951                                                         ConnObjectIter->second->BypassSSLVerification(false);
953                                                         SSLInvalidCertNotifObjString SSLICNProcData;
954                                                         
955                                                         SSLCertCollectionString certcol = ConnObjectIter->second->BuildSSLCollection();
956                                                                 
957                                                         bool *PauseMode = new bool;
958                                                         QRNotif qrn;
959                                                                 
960                                                         *PauseMode = TRUE;
961                                                         qrn.QResponse = &SSLResult;
962                                                         qrn.PausePtr = PauseMode;
963                                                                 
964                                                         SSLICNProcData.CertCollection = certcol;
965                                                         SSLICNProcData.QRNotifData = &qrn;
966                                                         SSLICNProcData.AccountName = AccountNameFriendly;
967                                                                 
968                                                         wxCommandEvent event(INVALIDSSLCERTSTRING);
969                                                         event.SetClientData(&SSLICNProcData);
970                                                         wxPostEvent(frmMainPtrGet, event);
971                                                                 
972                                                         while (*PauseMode == TRUE){
973                                                                 //nanosleep(&n1, &n2);
974                                                                 SleepFor(250000000);
975                                                         }
976                                                         
977                                                         // Process the response from the user.
978                                                         
979                                                         if (SSLResult == 1){
980                                                                 
981                                                                 // Accept the Certificate.
983                                                                 UsingSSLBypass = true;
984                                                                 ConnObjectIter->second->BypassSSLVerification(true);
985                 
986                                                                 COConnectResult TestConnectionResult = ConnObjectIter->second->Connect(true);
987                                                                 WriteServerCertificate(AccountDir, certcol);
988                                                                 
989                                                                 ConnObjectIter->second->BypassSSLVerification(false);
990                                                                 
991                                                         } else if (SSLResult == 2){
992                                                 
993                                                                 // Reject the certificate, abort the task and mark as failed.
995                                                                 iter->second = 2;
996                                                                 break;
997                                                                 
998                                                         }
999                 
1000 #endif
1001                                                         
1002                                                         frmMainPtrGet->ResumeAllTimers();
1003                                                         ExitLoop = true;
1004                                                         
1005                                                 } else if (ConnectResponse == COCONNECT_AUTHFAIL){
1006                                                         
1007                                                         ConnectResponse = ConnObjectIter->second->Connect(true);
1008                                                         
1009                                                         if (ConnectResponse == COCONNECT_OK){
1010                                                                 
1011                                                                 ExitLoop = true;
1012                                                                 break;
1013                                                                 
1014                                                         } else {
1015                                                                 
1016                                                                 ExitLoop = true;                                                        
1017                                                                 iter->second = 2;
1018                                                                 break;
1019                                                                 
1020                                                         }
1021                                                         
1022                                                 } else if (ConnectResponse == COCONNECT_OK){
1023                                                         
1024                                                         ConnectResponse = ConnObjectIter->second->Connect(true);
1025                                                         
1026                                                         ExitLoop = true;
1027                                                         break;
1028                                                         
1029                                                 } else {
1030                                                         
1031                                                         ExitLoop = true;                                                        
1032                                                         iter->second = 2;
1033                                                         break;
1034                                                         
1035                                                 }
1036                                         
1037                                         }
1038                                 
1039                                         if (iter->second == 2 || iter->second == 3 || iter->second == 4){
1040                                                 break;
1041                                         }
1042                         
1043 #if defined(__APPLE__)
1044                                 
1045                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection());
1047 #elif defined(__WIN32__)
1049                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection());
1051 #else
1052                                 
1053                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection());
1054                                 
1055 #endif
1056                                         
1057                                         COServerResponse DeleteContactResponse = ConnObjectIter->second->DeleteContact(ContactFilename.ToStdString());
1058                                         
1059                                         if (DeleteContactResponse.RequestResult != COREQUEST_OK){
1060                                                 iter->second = 2;
1061                                                 break;
1062                                         }
1063                                 
1064                                         ETagDBPtr->RemoveETag(ContactFilename);
1065                                 
1066                                         iter->second = 4;
1067                                         break;
1068                                 
1069                                 }
1070                         
1071                         } else if (TypeIter->second == 3) {
1073                                 wxString AccountNameFriendly;
1074         
1075                                 int AccountID = 0;
1077                                 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
1078         
1079                                         wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
1080                 
1081                                         AccountDirCheck.Trim();
1082                                         AccountDirCheck.Append(wxT(".carddav"));
1083         
1084                                         if (AccountDirCheck == StringAccountIter->second){
1085                                         
1086                                                 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
1087                                                 AccountID = i;
1088                 
1089                                         }
1090         
1091                                 }
1092                         
1093                                 bool KeepUpdating = TRUE;
1095                                 while (KeepUpdating == TRUE){
1097                                         StringTaskDetailIter = ActivityListTaskDetail.find(iter->first);
1098                         
1099                                         AccountDir = StringAccountIter->second;
1101                                         ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1102                                 
1103                                         wxArrayString vCardAdd;
1104                                         wxArrayString vCardDelete;
1105                                         wxArrayString vCardList;
1106                                         wxArrayString vCardUpdateLocal;
1107                                         wxArrayString vCardUpdateRemote;
1108                                         wxArrayString vCardUpdateLog;
1109                                         std::map<wxString,wxString> vCardETag;
1110                                 
1111                                         std::map<wxString,vCardDownloadDataFileClass> vCardDownloadData;
1112                                 
1113                                         // Get the list of vCard files locally.
1114         
1115                                         wxString AccountDirFinal;
1116                                         wxString AccountSyncTokenFilename;
1117                                         wxString SyncTokenLoad;
1118         
1119 #if defined(__HAIKU__)
1120     
1121                                             //preffilename = wxT("noo");
1123 #elif defined(__WIN32__)
1125                                         AccountDirFinal = GetAccountDir(AccountDir, FALSE);
1126                                         AccountSyncTokenFilename = AccountDirFinal;
1127                                         AccountSyncTokenFilename.Append(wxT("synctoken"));
1129 #else
1131                                         AccountDirFinal = GetAccountDir(AccountDir, FALSE);
1132                                         AccountSyncTokenFilename = AccountDirFinal;
1133                                         AccountSyncTokenFilename.Append(wxT("synctoken"));
1134         
1135 #endif
1137                                         // Suppress Error Messages.
1138                                 
1139                                         wxLogNull PleaseDoNotDisturb;
1141                                         wxFFile SyncLoad;
1142                                         SyncLoad.Open(AccountSyncTokenFilename, wxT("r"));
1143                                 
1144                                         if (SyncLoad.IsOpened()){
1145                                 
1146                                                 SyncLoad.ReadAll(&SyncTokenLoad, wxMBConvUTF8());
1147                                                 SyncLoad.Close();
1148                                 
1149                                         }
1151                                         // Get a list of vCard files from the server.
1153                                         // Get the list of vCard files from the ETagDB.
1154                                 
1155                                         std::map<wxString,ETagData> ETagDBData = ETagDBPtr->GetETagData();
1156                                         
1157                                         COConnectResult ConnectResponse = ConnObjectIter->second->Connect(false);
1158                                         
1159                                         bool ExitLoop = FALSE;
1160                                         
1161                                         while (ExitLoop == FALSE){                                              
1162                                                 
1163                                                 if (ConnObjectIter->second->SSLVerify() == COSSL_UNABLETOVERIFY){
1164                                                         
1165                                                         frmMainPtrGet->PauseAllTimers();
1166                                                         
1167 #if defined(__APPLE__)
1168                                                         
1169                                                         ConnObjectIter->second->BypassSSLVerification(true);
1170                                                         
1171                                                         COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false);
1172                                                         
1173                                                         ConnObjectIter->second->BypassSSLVerification(false);
1174                                                         
1175                                                         int SSLResult = DisplayTrustPanel(ConnObjectIter->second->BuildSSLCollection(), AccountNameFriendly);
1176                                                         
1177                                                         if (SSLResult != NSOKButton){
1178                                                                 
1179                                                                 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnObjectIter->second->BuildSSLCollection());
1180                                                                 iter->second = 2;
1181                                                                 break;
1182                                                                 
1183                                                         } else {
1184                                                                 
1185                                                                 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection());
1186                                                                 
1187                                                         }
1188                                                         
1189 #elif defined(__WIN32__)
1191                                                         ConnObjectIter->second->BypassSSLVerification(true);
1193                                                         COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false);
1195                                                         ConnObjectIter->second->BypassSSLVerification(false);
1197                                                         BOOL ModifiedCertificateData = false;
1198                                                         CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(ConnObjectIter->second, (HWND)frmMainPtrGet->GetHandle());
1200                                                         if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)) {
1201                                                                 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
1202                                                         }
1204                                                         if (ModifiedCertificateData == false) {
1206                                                                 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnObjectIter->second->BuildSSLCollection());
1207                                                                 iter->second = 2;
1208                                                                 break;
1210                                                         } else {
1212                                                                 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection());
1214                                                         }
1216 #else
1217         
1218                                                         bool UsingSSLBypass = false;
1219                                                         int SSLResult = 0;
1220                                                         
1221                                                         // Connect again and fetch SSL certificate information.
1222                 
1223                                                         ConnObjectIter->second->BypassSSLVerification(true);
1224                 
1225                                                         COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false);
1227                                                         ConnObjectIter->second->BypassSSLVerification(false);
1229                                                         SSLInvalidCertNotifObjString SSLICNProcData;
1230                                                         
1231                                                         SSLCertCollectionString certcol = ConnObjectIter->second->BuildSSLCollection();
1232                                                                 
1233                                                         bool *PauseMode = new bool;
1234                                                         QRNotif qrn;
1235                                                                 
1236                                                         *PauseMode = TRUE;
1237                                                         qrn.QResponse = &SSLResult;
1238                                                         qrn.PausePtr = PauseMode;
1239                                                                 
1240                                                         SSLICNProcData.CertCollection = certcol;
1241                                                         SSLICNProcData.QRNotifData = &qrn;
1242                                                         SSLICNProcData.AccountName = AccountNameFriendly;
1243                                                                 
1244                                                         wxCommandEvent event(INVALIDSSLCERTSTRING);
1245                                                         event.SetClientData(&SSLICNProcData);
1246                                                         wxPostEvent(frmMainPtrGet, event);
1247                                                                 
1248                                                         while (*PauseMode == TRUE){
1249                                                                 //nanosleep(&n1, &n2);
1250                                                                 SleepFor(250000000);
1251                                                         }
1252                                                         
1253                                                         // Process the response from the user.
1254                                                         
1255                                                         if (SSLResult == 1){
1256                                                                 
1257                                                                 // Accept the Certificate.
1259                                                                 UsingSSLBypass = true;
1260                                                                 ConnObjectIter->second->BypassSSLVerification(true);
1261                 
1262                                                                 COConnectResult TestConnectionResult = ConnObjectIter->second->Connect(true);
1263                                                                 WriteServerCertificate(AccountDir, certcol);
1264                                                                 
1265                                                                 ConnObjectIter->second->BypassSSLVerification(false);
1266                                                                 
1267                                                         } else if (SSLResult == 2){
1268                                                 
1269                                                                 // Reject the certificate, abort the task and mark as failed.
1271                                                                 iter->second = 2;
1272                                                                 break;
1273                                                                 
1274                                                         }
1275                 
1276 #endif
1277                                                         
1278                                                         frmMainPtrGet->ResumeAllTimers();
1279                                                         ExitLoop = true;
1280                                                         
1281                                                 } else if (ConnectResponse == COCONNECT_AUTHFAIL){
1282                                                         
1283                                                         ConnectResponse = ConnObjectIter->second->Connect(true);
1284                                                         
1285                                                         if (ConnectResponse == COCONNECT_OK){
1286                                                                 
1287                                                                 ExitLoop = true;
1288                                                                 break;
1289                                                                 
1290                                                         } else {
1291                                                                 
1292                                                                 ExitLoop = true;                                                        
1293                                                                 iter->second = 2;
1294                                                                 break;
1295                                                                 
1296                                                         }
1297                                                         
1298                                                 } else if (ConnectResponse == COCONNECT_OK){
1299                                                         
1300                                                         ConnectResponse = ConnObjectIter->second->Connect(true);
1301                                                         
1302                                                         if (ConnectResponse == COCONNECT_OK){
1303                                                                 
1304                                                                 ExitLoop = true;
1305                                                                 break;
1306                                                                 
1307                                                         } else {
1308                                                                 
1309                                                                 ExitLoop = true;
1310                                                                 iter->second = 2;
1311                                                                 break;
1312                                                                 
1313                                                         }
1314                                                         
1315                                                         ExitLoop = true;
1316                                                         break;
1317                                                         
1318                                                 } else {
1319                                                         
1320                                                         ExitLoop = true;                                                        
1321                                                         iter->second = 2;
1322                                                         break;
1323                                                         
1324                                                 }
1325                                         
1326                                         }
1327                                 
1328 #if defined(__APPLE__)
1329                                         
1330                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection());
1332 #elif defined(__WIN32__)
1334                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection());
1336 #else
1337                                         
1338                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnObjectIter->second->BuildSSLCollection());
1339                         
1340 #endif
1341                                         
1342                                         if (iter->second == 2 || iter->second == 3 || iter->second == 4){
1343                                                 break;
1344                                         }
1345                                         
1346                                         // Look in directory and see which vCards to add and delete
1347                                 
1348                                         // In short:
1349                                         // vCard exists but not in ETagDB - Add (and upload).
1350                                         // vCard missing but in ETagDB - Delete (from server).
1351                                 
1352                                         // Start by looking for vCards that are not in the ETagDB.
1353                                 
1354                                         wxDir AccDir(AccountDirFinal);
1355                                         wxString AccDirFilename;
1356                                 
1357                                         bool ContinueProcess = AccDir.GetFirst(&AccDirFilename, wxEmptyString, wxDIR_DEFAULT);
1358                                 
1359                                         COContactList ServerContactList2 = ConnObjectIter->second->GetContactList(SyncTokenLoad.ToStdString());
1361                                         // Process the server data.
1363                                         for (std::vector<COContactData>::iterator ContactInfo = ServerContactList2.ListData.begin();
1364                                                 ContactInfo != ServerContactList2.ListData.end(); ContactInfo++){
1365                                                 
1366                                                 if (ContactInfo->Status == COCS_UPDATED){
1367                                                         
1368                                                         vCardDownloadDataFileClass vCardNewData;
1369                                                         vCardNewData.DataType = 0;
1370                                                         vCardDownloadData.insert(std::make_pair(ContactInfo->Location, vCardNewData));
1371                                                         
1372                                                 } else if (ContactInfo->Status == COCS_DELETED){
1373                                                         
1374                                                         vCardDelete.Add(ContactInfo->Location, 1);
1375                                                         
1376                                                 }
1377                                                         
1378                                         }
1379                                 
1380                                         // Look for vCards that are missing but in the ETagDB.
1381         
1382                                         for (std::map<wxString,ETagData>::iterator etagiter = ETagDBData.begin();
1383                                                 etagiter != ETagDBData.end(); etagiter++){
1384                                 
1385                                                 // Check if the vCard exists.
1386                                         
1387                                                 if (!wxFileExists(AccountDirFinal + etagiter->first)){
1388                                         
1389                                                         // vCard doesn't exist so mark for deleting.
1390                                         
1391                                                         vCardDelete.Add(etagiter->first, 1);
1392                                         
1393                                                 }
1394                                 
1395                                         }
1397                                         // Compare Server with the ETag DB. Work out which
1398                                         // needs to updated remotely and which needs to be
1399                                         // updated locally.
1401                                         for (std::vector<COContactData>::iterator ContactInfo = ServerContactList2.ListData.begin();
1402                                                 ContactInfo != ServerContactList2.ListData.end(); ContactInfo++){
1403                                                 
1404                                                 if (ETagDBData.find(ContactInfo->Location) == ETagDBData.end()){
1405                                                         continue;
1406                                                 }
1408                                                 std::map<wxString,ETagData>::iterator lociter = ETagDBData.find(ContactInfo->Location);
1409                                                 
1410                                                 ETagData etd = lociter->second;
1411                                                 
1412                                                 wxString ETagSrv = ContactInfo->Data;
1414                                                 // Check if the local ETag value has 'DELETED' set and skip
1415                                                 // checking this file if it does.
1416                                         
1417                                                 if (etd.ETagValue == "DELETED"){
1418                                                         
1419                                                         continue;
1420                                                         
1421                                                 }
1422                                                 
1423                                                 // Compare local ETag with original local ETag.
1424                                                 // If different, update to server is required.
1425                                 
1426                                                 if (etd.ETagValue != etd.ETagOrigValue){
1427                                 
1428                                                         // Check if local original ETag is different from server ETag.
1429                                                         // If it is then throw up a conflict resolution dialog.
1430                                 
1431                                                         if (etd.ETagOrigValue != ETagSrv){
1432                                         
1433                                                                 vCard34Conv vCard34Obj;
1434                                                 
1435                                                                 wxString FullFilename;
1436                                                                 vCard ClientData;
1437                                                                 vCard ConvertedV4Data;
1438                                         
1439                                                                 std::string ServerContactDataString;
1440                                                                 wxString ServerContactData;
1441                                                                 
1442                                                                 // Conflict. Bring up conflict resolution dialog.
1443                                                         
1444                                                                 // Get the server contact data for comparison.
1445                                                         
1446                                                                 ConnObjectIter->second->GetContact(ContactInfo->Location, &ServerContactDataString);
1447                                                                 ServerContactData = wxString::FromUTF8(ServerContactDataString.c_str());
1448                                                         
1449                                                                 FullFilename = CreateFilenamePath(AccountDirFinal, ContactInfo->Location);
1450                                                         
1451                                                                 // Convert it to v4.
1452                                         
1453                                                                 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1454                                         
1455                                                                 vCardConflictObj vCardProcData;
1456                                         
1457                                                                 vCardProcData.vCardLocalData = &ClientData;
1458                                                                 vCardProcData.vCardServerData = &ConvertedV4Data;
1459                                                         
1460                                                                 // Load the client data from the filename given.
1461                                                         
1462                                                                 ClientData.LoadFile(FullFilename);
1463                                                         
1464                                                                 // Show dialog.
1465                                         
1466                                                                 bool *PauseMode = new bool;
1467                                                                 int ConflictResult;
1468                                                                 QRNotif qrn;
1469                                                                 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
1471                                                                 *PauseMode = TRUE;
1472                                                                 qrn.QResponse = &ConflictResult;
1473                                                                 qrn.PausePtr = PauseMode;
1474                                                 
1475                                                                 vCardProcData.QRNotifData = &qrn;
1476                                         
1477                                                                 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1478                                                                 event.SetClientData(&vCardProcData);
1479                                                                 wxPostEvent(frmMainPtrGet, event);
1480                                                 
1481                                                                 while (*PauseMode == TRUE){
1482                                                                         //nanosleep(&n1, &n2);
1483                                                                         SleepFor(250000000);
1484                                                                 }
1485                                         
1486                                                                 delete PauseMode;
1487                                                                 PauseMode = NULL;
1488                                                         
1489                                                                 // If replacing local version, store copy for now.
1490                                                                 // Otherwise upload to server.
1491                                         
1492                                                                 if (ConflictResult == 0){
1493                                         
1494                                                                         // Decide Later.
1495                                         
1496                                                                         continue;
1497                                         
1498                                                                 } else if (ConflictResult == 1){
1499                                         
1500                                                                         // Decided to use client version.
1501                                         
1502                                                                         vCardUpdateLocal.Remove(ContactInfo->Location);
1503                                                                         vCardUpdateRemote.Add(ContactInfo->Location, 1);                                                                
1504                                         
1505                                                                 } else if (ConflictResult == 2){
1506                                         
1507                                                                         // Decided to use server version.
1508                                                                         // Store the converted downloaded copy for
1509                                                                         // processing later.
1511                                                                         //vCardUpdateLocal.Add(srviter->first, 1);
1512                                                                 
1513                                                                         vCardDownloadDataFileClass vCardNewData;
1514                                                                         vCardNewData.DataType = 1;
1515                                                                         vCardNewData.FileData = ConvertedV4Data.WriteString();
1517                                                                         ConvertedV4Data.WriteFile(FullFilename);
1518                                                                 
1519                                                                         vCardDownloadData.insert(std::make_pair(ContactInfo->Location, vCardNewData));  
1520                                                                 
1521                                                                 
1522                                                                 
1523                                                                 }
1524                                         
1525                                                         } else {
1526                                         
1527                                                                 // Send vCard to the server.
1528                                                 
1529                                                                 vCardUpdateRemote.Add(ContactInfo->Location, 1);
1530                                         
1531                                                         }
1532                                 
1533                                                 } else {
1534                                 
1535                                                         // Check if local ETag is different from server ETag.
1536                                                         // If different, obtain the vCard from the server.
1537                                         
1538                                                         if (etd.ETagOrigValue != ETagSrv){
1539                                         
1540                                                                 vCardUpdateLocal.Add(ContactInfo->Location, 1);
1541                                         
1542                                                         }
1543                                 
1544                                                 }
1545                                                 
1546                                         }
1547                                 
1548                                         // Process the vCards that need to be downloaded and added/overwritten.
1549                                 
1550                                         wxString vCardFilenameFinal;
1551                                         wxString vCardOutputData;
1552                                         wxString vCardInputData;
1553                                         wxString ETagFileData;
1554                                         wxFFile vCardFile;
1555                                 
1556                                         for (std::map<wxString,vCardDownloadDataFileClass>::iterator additer = vCardDownloadData.begin();
1557                                                 additer != vCardDownloadData.end(); additer++){
1558                                         
1559                                                 vCardFilenameFinal.Clear();
1560                                                 vCardInputData.Clear();
1561                                                 vCardOutputData.Clear();
1562                                                 ETagFileData.Clear();
1563                                         
1564                                                 vCardFilenameFinal = CreateFilenamePath(AccountDirFinal, additer->first);
1565                                         
1566                                                 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1567                                         
1568                                                 if (additer->second.DataType == 0){
1569                                         
1570                                                         vCard ConvertedV4Data;
1571                                         
1572                                                         // Grab the file from the server and write the contact out.
1573                                         
1574                                                         vCard34Conv vCard34Obj;
1575                                                         
1576                                                         wxString ServerContactData;
1577                                                         std::string ServerContactDataString;
1578                                                                 
1579                                                         // Conflict. Bring up conflict resolution dialog.
1580                                                         
1581                                                         // Get the server contact data for comparison.
1582                                                         
1583                                                         ConnObjectIter->second->GetContact(additer->first.ToStdString(), &ServerContactDataString);
1584                                                         vCardInputData = wxString::FromUTF8(ServerContactDataString.c_str());
1585                                                 
1586                                                         vCard34Obj.ConvertToV4(&vCardInputData, &ConvertedV4Data);
1587                                                 
1588                                                         ConvertedV4Data.WriteFile(vCardFilenameFinal);
1589                                                 
1590                                                         // Get the server ETag.
1591                                                 
1592                                                         wxString ServerETag;
1593                                                         
1594                                                         COServerResponse ServerEntityTag = ConnObjectIter->second->GetServerEntityTagValue(additer->first.ToStdString());
1595                                                         
1596                                                         if (ServerEntityTag.RequestResult != COREQUEST_OK){
1597                                                                 iter->second = 2;
1598                                                                 break;
1599                                                         }
1600                                                         
1601                                                         ServerETag = wxString::FromUTF8(ServerEntityTag.EntityTag.c_str());
1603                                                         // Add to the ETag Database.
1604                                                 
1605                                                         ETagDBPtr->AddETag(additer->first, ServerETag, ServerETag);
1606                                                 
1607                                                 } else if (additer->second.DataType == 1){
1608                                         
1609                                                         // Write out the contact to the account directory.
1610                                         
1611                                                         vCardFilenameFinal = CreateFilenamePath(AccountDirFinal, additer->first);
1612                                                         vCardOutputData = additer->second.FileData;
1613                                                 
1614                                                         vCardFile.Open(vCardFilenameFinal, wxT("w"));
1615                                 
1616                                                         if (vCardFile.IsOpened()){
1617                                 
1618                                                                 vCardFile.Write(vCardOutputData, wxConvAuto());
1619                                                                 vCardFile.Close();
1620                                 
1621                                                         }
1622                                                 
1623                                                         // Update the ETagDB.
1625                                                         wxString ServerETag;
1626                                                         
1627                                                         COServerResponse ServerEntityTag = ConnObjectIter->second->GetServerEntityTagValue(additer->first.ToStdString());
1628                                                         
1629                                                         if (ServerEntityTag.RequestResult != COREQUEST_OK){
1630                                                                 iter->second = 2;
1631                                                                 break;
1632                                                         }
1633                                                         
1634                                                         ServerETag = wxString::FromUTF8(ServerEntityTag.EntityTag.c_str());
1635                                                 
1636                                                         // Add to the ETag Database.
1637                                                 
1638                                                         ETagDBPtr->AddETag(additer->first, ServerETag, ServerETag);
1639                                                                                         
1640                                                 }
1641                                         }
1642                                         
1643                                         // Check if any errors occured before continuing.
1644                                         
1645                                         if (iter->second != 1){
1646                                                 break;
1647                                         }
1648         
1649                                         // Look for vCard files which aren't in the ETagDB.
1650         
1651                                         while(ContinueProcess){
1652                                 
1653                                                 // Check and make sure that the filename ends in .vcf/.vcard
1654                                                 // Skip any file that beings with a dot.
1655                                         
1656                                                 if (AccDirFilename.Left(1) == wxT(".")){
1657                                         
1658                                                         ContinueProcess = AccDir.GetNext(&AccDirFilename);
1659                                                         continue;
1660                                         
1661                                                 }
1662                                         
1663                                                 if (AccDirFilename.Right(4) != wxT(".vcf") && 
1664                                                 AccDirFilename.Right(6) != wxT(".vcard")){
1665                                         
1666                                                         ContinueProcess = AccDir.GetNext(&AccDirFilename);
1667                                                         continue;
1668                                         
1669                                                 }
1670                                 
1671                                                 // Look in the ETagDB for the file.
1672                                         
1673                                                 bool ETagExists = ETagDBPtr->CheckETagExists(AccDirFilename);
1674                                         
1675                                                 if (ETagExists == FALSE){
1676                                         
1677                                                         // Add the vCard to the list to be added.
1678                                                 
1679                                                         vCardAdd.Add(AccDirFilename, 1);
1680                                         
1681                                                 }
1682                                         
1683                                                 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1684                                 
1685                                         }
1686                                 
1687                                         // Process the vCards to add/update to the server.
1688                                 
1689                                         for (int vi = 0; vi < vCardAdd.GetCount(); vi++){
1691                                                 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1692                                                 ETag = ETagDBPtr->GetETag(vCardAdd[vi]);
1693                                                 ETagOriginal = ETagDBPtr->GetETagOriginal(vCardAdd[vi]);
1694                                                 
1695                                                 ContactFilename = vCardAdd[vi];
1696                                                 FullFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1698                                                 ContactFilename.Trim();
1699                         
1700                                                 if (ETag == ETagOriginal && ETagDBPtr->ETagExists(vCardAdd[vi])){
1701                         
1702                                                         // Compare the ETag with the Server ETag.
1703                                                         
1704                                                         COServerResponse ServerEntityTag = ConnObjectIter->second->GetServerEntityTagValue(vCardAdd[vi].ToStdString());
1705                                                         
1706                                                         if (ServerEntityTag.RequestResult != COREQUEST_OK){
1707                                                                 iter->second = 2;
1708                                                                 break;
1709                                                         }
1710                                                         
1711                                                         // TODO: Continue from here!
1712                                                         
1713                                                         ETagServer = wxString::FromUTF8(ServerEntityTag.EntityTag.c_str());
1714                                 
1715                                                         if (ETagOriginal != ETagServer){
1716                                 
1717                                                                 // Server ETag is different from original ETag.
1718                                                                 // This is a conflict which the user will now
1719                                                                 // need to resolve.
1720                                         
1721                                                                 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
1722                                         
1723                                                                 vCard34Conv vCard34Obj;
1724                                                 
1725                                                                 wxString ServerContactData;
1726                                                                 std::string ServerContactDataString;
1727                                                                 vCard ClientData;
1728                                                                 vCard ConvertedV4Data;
1729                                         
1730                                                                 // Load the client data from the filename given.
1731                                                                 
1732                                                                 COServerResponse GetContactResponse = ConnObjectIter->second->GetContact(vCardAdd[vi].ToStdString(), &ServerContactDataString);
1733                                                 
1734                                                                 if (GetContactResponse.RequestResult != COREQUEST_OK){
1735                                                                         iter->second = 2;
1736                                                                         break;
1737                                                                 }
1738                                                                 
1739                                                                 ServerContactData = wxString::FromUTF8(ServerContactDataString.c_str());
1740                                                 
1741                                                                 // Process v3 version into v4 version.
1742                                                 
1743                                                                 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1744                                         
1745                                                                 vCardConflictObj vCardProcData;
1746                                         
1747                                                                 vCardProcData.vCardLocalData = &ClientData;
1748                                                                 vCardProcData.vCardServerData = &ConvertedV4Data;
1749                                                                 ClientData.LoadFile(FullFilename);
1751                                                                 // Setup Conflict Resolution Dialog.
1752                                         
1753                                                                 // Fetch Data from Server and convert.
1754                                         
1755                                                                 bool *PauseMode = new bool;
1756                                                                 int ConflictResult;
1757                                                                 QRNotif qrn;
1759                                                                 *PauseMode = TRUE;                                              
1760                                                                 qrn.QResponse = &ConflictResult;
1761                                                                 qrn.PausePtr = PauseMode;
1762                                                 
1763                                                                 vCardProcData.QRNotifData = &qrn;
1764                                         
1765                                                                 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1766                                                                 event.SetClientData(&vCardProcData);
1767                                                                 wxPostEvent(frmMainPtrGet, event);
1768                                                 
1769                                                                 while (*PauseMode == TRUE){
1770                                                                         //nanosleep(&n1, &n2);
1771                                                                         SleepFor(250000000);
1772                                                                 }
1773                                         
1774                                                                 delete PauseMode;
1775                                                                 PauseMode = NULL;
1776                                         
1777                                                                 if (ConflictResult == 0){
1778                                         
1779                                                                         // Decide Later.
1780                                         
1781                                                                         iter->second = 4;
1782                                                                         continue;
1783                                         
1784                                                                 } else if (ConflictResult == 1){
1785                                         
1786                                                                         // Decided to use client version.
1787                                         
1788                                                                         COServerResponse EditContactResponse = ConnObjectIter->second->EditContact(vCardAdd[vi].ToStdString(), ClientData.WriteString().ToStdString());
1789                                                 
1790                                                                         if (EditContactResponse.RequestResult != COREQUEST_OK){
1791                                                                                 iter->second = 2;
1792                                                                                 break;
1793                                                                         }
1794                                                                         
1795                                                                         iter->second = 4;
1796                                         
1797                                                                 } else if (ConflictResult == 2){
1798                                         
1799                                                                         // Decided to use server version.
1800                                                 
1801                                                                         // Download server version.
1802                                                                 
1803                                                                         ConvertedV4Data.WriteFile(CreateFilenamePath(AccountDirFinal, vCardAdd[vi]));
1804                                                 
1805                                                                         iter->second = 4;
1806                                         
1807                                                                 }
1808                                 
1809                                                         } else {
1810                                 
1811                                                                 // Setup the filename for the contact being added.
1812                                                         
1813                                                                 wxString wxSFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1814                                                                 wxString wxSCardData;
1815                                                                 wxString TaskData;
1816                                                         
1817                                                                 // Load the data from the file.
1818                                                         
1819                                                                 wxFFile wxFCard;
1820                                                                 wxFCard.Open(wxSFilename, wxT("r"));
1821                                 
1822                                                                 if (wxFCard.IsOpened()){
1823                                 
1824                                                                         wxFCard.ReadAll(&wxSCardData, wxConvAuto());
1825                                                                         wxFCard.Close();
1826                                 
1827                                                                 }
1828                                                         
1829                                                                 // Convert the data to v3.
1830                                                         
1831                                                                 vCard34Conv vCard34Obj;
1832                                                         
1833                                                                 vCard34Obj.ConvertToV3(wxSFilename, &TaskData);
1835                                                                 // Upload the data to the server.
1836                                                                 
1837                                                                 COServerResponse AddContactResponse = ConnObjectIter->second->AddContact(vCardAdd[vi].ToStdString(), TaskData.ToStdString());
1838                                                         
1839                                                                 if (AddContactResponse.RequestResult != COREQUEST_OK){
1840                                                                         iter->second = 2;
1841                                                                         break;
1842                                                                 }
1843                                                                 
1844                                                                 // Get the Server ETag and put it in the ETag database.
1846                                                                 COServerResponse EntityTagResponse = ConnObjectIter->second->GetServerEntityTagValue(vCardAdd[vi].ToStdString());
1847                                                                 
1848                                                                 if (EntityTagResponse.RequestResult != COREQUEST_OK){
1849                                                                         iter->second = 2;
1850                                                                         break;
1851                                                                 }
1852                                                                 
1853                                                                 ETagServer = wxString::FromUTF8(EntityTagResponse.EntityTag.c_str());
1854                                 
1855                                                                 ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer);
1856                                 
1857                                                         }
1858                         
1859                                                 } else {
1860                         
1861                                                         if (ETagOriginal != ETagServer){
1862                                 
1863                                                                 // Server ETag is different from original ETag.
1864                                                                 // This is a conflict which the user will now
1865                                                                 // need to resolve.
1866                                         
1867                                                                 frmMain *frmMainPtrGet = (frmMain *)frmMainPtr;
1868                                         
1869                                                                 vCard34Conv vCard34Obj;
1870                                                 
1871                                                                 std::string ServerContactDataString;
1872                                                                 wxString ServerContactData;
1873                                                                 vCard ClientData;
1874                                                                 vCard ConvertedV4Data;
1875                                         
1876                                                                 // Load the client data from the filename given.
1877                                         
1878                                                                 COServerResponse GetContactResponse = ConnObjectIter->second->GetContact(vCardAdd[vi].ToStdString(), &ServerContactDataString);
1879                                                 
1880                                                                 if (GetContactResponse.RequestResult != COREQUEST_OK){
1881                                                                         iter->second = 2;
1882                                                                         break;
1883                                                                 }
1884                                                                 
1885                                                                 ServerContactData = wxString::FromUTF8(ServerContactDataString.c_str());
1886                                                                 
1887                                                                 ClientData.LoadFile(FullFilename);
1888                                                 
1889                                                                 // Process v3 version into v4 version.
1890                                                 
1891                                                                 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1892                                         
1893                                                                 vCardConflictObj vCardProcData;
1894                                         
1895                                                                 vCardProcData.vCardLocalData = &ClientData;
1896                                                                 vCardProcData.vCardServerData = &ConvertedV4Data;
1897                                         
1898                                                                 bool *PauseMode = new bool;
1899                                                                 int ConflictResult;
1900                                                                 QRNotif qrn;
1902                                                                 *PauseMode = TRUE;                                              
1903                                                                 qrn.QResponse = &ConflictResult;
1904                                                                 qrn.PausePtr = PauseMode;
1905                                                 
1906                                                                 vCardProcData.QRNotifData = &qrn;
1907                                         
1908                                                                 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1909                                                                 event.SetClientData(&vCardProcData);
1910                                                                 wxPostEvent(frmMainPtrGet, event);
1912                                                                 while (*PauseMode == TRUE){
1913                                                                         SleepFor(250000000);
1914                                                                 }
1915                                         
1916                                                                 delete PauseMode;
1917                                                                 PauseMode = NULL;
1918                                         
1919                                                                 if (ConflictResult == 0){
1920                                         
1921                                                                         // Decide Later.
1922                                         
1923                                                                         iter->second = 4;
1924                                                                         continue;
1925                                         
1926                                                                 } else if (ConflictResult == 1){
1927                                         
1928                                                                         // Decided to use client version.
1929                                                                 
1930                                                                         COServerResponse EditContactResponse = ConnObjectIter->second->EditContact(vCardAdd[vi].ToStdString(), ClientData.WriteString().ToStdString());
1932                                                                         if (EditContactResponse.RequestResult != COREQUEST_OK){
1933                                                                                 iter->second = 2;
1934                                                                                 break;
1935                                                                         }
1936                                                                         
1937                                                                         iter->second = 4;
1938                                         
1939                                                                 } else if (ConflictResult == 2){
1940                                         
1941                                                                         // Decided to use server version.
1942                                                 
1943                                                                         // Write server version to file.
1944                                                                 
1945                                                                         ConvertedV4Data.WriteFile(CreateFilenamePath(AccountDirFinal, vCardAdd[vi]));
1946                                                 
1947                                                                         iter->second = 4;
1948                                         
1949                                                                 }
1950                                 
1951                                                         } else {
1952                                 
1953                                                                 // Setup the filename for the contact being added.
1954                                                         
1955                                                                 wxString wxSFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1956                                                                 wxString wxSCardData;
1957                                                                 wxString TaskData;
1958                                                         
1959                                                                 // Load the data from the file.
1960                                                         
1961                                                                 wxFFile wxFCard;
1962                                                                 wxFCard.Open(wxSFilename, wxT("r"));
1963                                 
1964                                                                 if (wxFCard.IsOpened()){
1965                                 
1966                                                                         wxFCard.ReadAll(&wxSCardData, wxConvAuto());
1967                                                                         wxFCard.Close();
1968                                 
1969                                                                 }
1970                                                         
1971                                                                 // Convert the data to v3.
1972                                                         
1973                                                                 vCard34Conv vCard34Obj;
1974                                                         
1975                                                                 vCard34Obj.ConvertToV3(wxSFilename, &TaskData);
1977                                                                 // Upload the data to the server.
1978                                                                 
1979                                                                 COServerResponse AddContactResponse = ConnObjectIter->second->AddContact(vCardAdd[vi].ToStdString(), TaskData.ToStdString());
1981                                                                 if (AddContactResponse.RequestResult != COREQUEST_OK){
1982                                                                         iter->second = 2;
1983                                                                         break;
1984                                                                 }
1985                                                                 
1986                                                                 // Get the Server ETag and put it in the ETag database.
1987                                                         
1988                                                                 COServerResponse EntityTagResponse = ConnObjectIter->second->GetServerEntityTagValue(vCardAdd[vi].ToStdString());
1989                                 
1990                                                                 if (EntityTagResponse.RequestResult != COREQUEST_OK){
1991                                                                         iter->second = 2;
1992                                                                         break;
1993                                                                 }
1994                                                                 
1995                                                                 ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer);
1996                                 
1997                                                         }
1998                                         
1999                                                 }
2001                                         }                       
2002                                 
2003                                         if (iter->second != 1){
2004                                                 break;
2005                                         }
2006                                         
2007                                         // Process the vCards to delete locally.
2008                                 
2009                                         for (int vi = 0; vi < vCardDelete.GetCount(); vi++){
2011                                                 if (!wxRemoveFile(CreateFilenamePath(AccountDirFinal, vCardDelete[vi]))){
2013                                                 } else {
2014                                         
2015                                                         ETagDBPtr->RemoveETag(vCardDelete[vi]);
2016                                         
2017                                                 }
2019                                         }
2020                                 
2021                                         // Process the vCards to delete from the server.
2022                                 
2023                                         std::map<wxString,wxString> *ETagFilenameMap = ETagDBPtr->GetFilenamePointer();
2024                                         std::list<wxString> DeleteList;
2025                                 
2026                                         for (std::map<wxString,wxString>::iterator deliter = ETagFilenameMap->begin();
2027                                                 deliter != ETagFilenameMap->end(); deliter++){
2028                                 
2029                                                 // Look through the ETagDB and find contacts which are marked as DELETED.
2030                                         
2031                                                 if (deliter->second == wxT("DELETED")){
2033                                                         ConnObjectIter->second->DeleteContact(deliter->first.ToStdString());
2034                                         
2035                                                         // Delete the ETag as the file has now been deleted.
2036                                         
2037                                                         DeleteList.push_back(deliter->first);
2038                                         
2039                                                 }
2040                                 
2041                                         }
2042                                         
2043                                         for (std::list<wxString>::iterator removeetagiter = DeleteList.begin();
2044                                                 removeetagiter != DeleteList.end(); removeetagiter++){
2045                                         
2046                                                 ETagDBPtr->RemoveETag(*removeetagiter);
2047                                                 
2048                                         }
2049                                 
2050                                         // Write out the update server sync token.
2052                                         wxString ServerSyncToken = wxString::FromUTF8(ServerContactList2.SyncToken.c_str());
2053                                 
2054                                         ServerSyncToken.Trim();
2055                                 
2056                                         if (!ServerSyncToken.IsEmpty()){
2057                                 
2058                                                 wxFFile SyncWrite;
2059                                                 SyncWrite.Open(AccountSyncTokenFilename, wxT("w"));
2060                                 
2061                                                 if (SyncWrite.IsOpened()){
2062                                 
2063                                                         SyncWrite.Write(ServerSyncToken, wxConvAuto());
2064                                                         SyncWrite.Close();
2065                                 
2066                                                 }
2067                                 
2068                                         }
2069                                 
2070                                         // Check for another sync token. If there is another 
2071                                         // sync token then repeat this. If token matches then stop processing.
2072                                 
2073                                         if (SyncTokenLoad == ServerSyncToken){
2074                                         
2075                                                 KeepUpdating = FALSE;
2076                                         
2077                                         }
2078                                         
2079                                 }
2080                                 
2081                                 // Mark as completed.
2082                         
2083                                 wxString AccountNameFinal;
2084                                 AccountNameFinal = PrefData.accounts.GetAccountDirectory(AccountID);
2085                                 AccountNameFinal.Append(wxT(".carddav"));
2086                                 
2087                                 wxCommandEvent reloadevent(RELOADCONTACTLIST);
2088                                 reloadevent.SetString(AccountNameFinal);
2089                                 wxPostEvent(this->GetParent(), reloadevent);
2090                                 
2091                                 iter->second = 4;
2092                                 continue;
2093                         
2094                         } else {
2095                         
2096                                 // Update the data to the server.
2098                                 iter->second = 4;
2099                                 continue;
2100                         
2101                         }
2103                         while (iter->second == 1){
2105                                 SleepFor(125000000);
2106         
2107                         }
2108                         
2109                         break;
2110                         
2111                 }
2113         }
2114         
2115         if (TasksFoundProc == FALSE){
2116         
2117                 TasksActive = FALSE;
2118                 ProcessTasksData = FALSE;
2119         
2120         } else {
2122                 wxCommandEvent eventp(ACTMGR_STARTTIMER);
2123                 wxPostEvent(this, eventp);
2124         
2125         }
2126         
2127         wxCommandEvent event(ACTMGR_STARTPROCESSTIMER);
2128         wxPostEvent(this, event);
2132 void frmActivityMgr::ProcessTasks()
2134         
2135         std::thread ProcessThread(&frmActivityMgr::ProcessTasksThread, this);
2136         ProcessThread.detach();
2140 void frmActivityMgr::SetupPointers(wxETagProcessTimer *ETagTmrPtrInc, void *frmMainPtrInc)
2143         ETagTmrPtr = ETagTmrPtrInc;
2144         
2145         frmMainPtr = frmMainPtrInc;
2149 void frmActivityMgr::ResumeProcessing(wxCommandEvent &event){
2151         QRNotif *qrn = (QRNotif *)event.GetClientData(); 
2152         
2153         int *QRes = qrn->QResponse;
2155         *qrn->PausePtr = FALSE;
2157         *QRes = event.GetInt();
2158         
2161 void frmActivityMgr::ToggleConnectionStatus( wxCommandEvent &event ){
2163         wxCommandEvent connevent(CONNSTAT_UPDATE);
2164         
2165         if (ApplicationSleepMode == FALSE){
2166         
2167                 connevent.SetInt(1);
2168                 ApplicationSleepMode = TRUE;
2169                 mnuSleepMode->Check(true);
2170         
2171         } else {
2172         
2173                 connevent.SetInt(0);
2174                 ApplicationSleepMode = FALSE;
2175                 mnuSleepMode->Check(false);
2176                 
2177                 wxCommandEvent event(ACTMGR_STARTTIMER);
2178                 wxPostEvent(this, event);
2180                 wxCommandEvent eventp(ACTMGR_STARTPROCESSTIMER);
2181                 wxPostEvent(this, eventp);
2182         
2183         }
2185         wxPostEvent(GetParent(), connevent);
2189 void frmActivityMgr::SleepMode( wxCommandEvent &event ){
2190         
2191         wxCommandEvent connevent(ACTMGR_TOGGLECONN);
2192         
2193         wxPostEvent(this, connevent);
2194         
2197 void frmActivityMgr::WriteServerCertificate(wxString AccountName, SSLCertCollection SSLCertInc){
2199         wxString ServerCertFinal;
2201         // Get the Cert section of the certificate and write it to the file.
2203         ServerCertFinal = GetAccountDir(AccountName, TRUE);
2205         wxFile CertFile;
2206         
2207         std::map<int, SSLCertData>::iterator SSLCDIter = SSLCertInc.SSLCollection.find(0);
2208         std::multimap<wxString,wxString>::iterator SSLDataIter = SSLCDIter->second.CertData.find(wxT("Cert"));
2209         
2210         CertFile.Open(ServerCertFinal, wxFile::write);  
2211         
2212         CertFile.Write(SSLDataIter->second, wxConvUTF8);
2213         CertFile.Close();
2217 void frmActivityMgr::WriteServerCertificate(wxString AccountName, SSLCertCollectionString SSLCertInc){
2219         wxString ServerCertFinal;
2221         // Get the Cert section of the certificate and write it to the file.
2223         ServerCertFinal = GetAccountDir(AccountName, TRUE);
2225         wxFile CertFile;
2226         
2227         std::map<int, SSLCertDataString>::iterator SSLCDIter = SSLCertInc.SSLCollection.find(0);
2228         std::multimap<string,string>::iterator SSLDataIter = SSLCDIter->second.CertData.find("Cert");
2229         
2230         CertFile.Open(ServerCertFinal, wxFile::write);  
2231         
2232         CertFile.Write(SSLDataIter->second, wxConvUTF8);
2233         CertFile.Close();
2237 void frmActivityMgr::StartTimer(wxCommandEvent& event){
2239         ActListProcTimer.Start(1000, FALSE);
2243 void frmActivityMgr::StopTimer(wxCommandEvent& event){
2245         ActListProcTimer.Stop();
2249 void frmActivityMgr::StartProcessTimer(wxCommandEvent& event){
2251         ActProcessTimer.Start(1000, FALSE);
2255 void frmActivityMgr::StopProcessTimer(wxCommandEvent& event){
2257         ActProcessTimer.Stop();
2261 void frmActivityMgr::StartAnimationTimer(wxCommandEvent& event){
2262         
2263         AnimationTimer.StartAnimation();
2264         
2267 void frmActivityMgr::UpdateStatusLabel(wxCommandEvent& event){
2269         ActivityMgrLabelUpdate *actmgrudata = (ActivityMgrLabelUpdate*)event.GetClientData();
2270         
2271         if (actmgrudata != NULL){
2272         
2273                 lstActivity->SetItem(actmgrudata->ItemIndex, 2, actmgrudata->ItemLabel);
2274         
2275                 delete actmgrudata;
2276                 actmgrudata = NULL;
2277         
2278         }
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