Home | News | Projects | Releases
Bugs | RFE | Repositories | Help
Merge commits from upstream
[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, &ActivityListConn);
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,CardDAV*>::iterator CardDAVIter;
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                 CardDAVIter = ActivityListConn.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                 CardDAV ConnHandle;
249                 
250                 ConnHandle.SetupConnection(AccountSettingsIter->second.Address,
251                                          AccountSettingsIter->second.Port,
252                                          AccountSettingsIter->second.Username,
253                                          AccountSettingsIter->second.Password,
254                                          AccountSettingsIter->second.SSL,
255                                          AccountSettingsIter->second.Prefix,
256                                          AccountSettingsIter->second.Dir);
257                 ConnHandle.SetupVariables(&ActivityList, iter->first);
258                 ConnHandle.SetupResultBools(&BlankBool, &BlankBool);
259                 
260                 // 0 = Queued.
261                 // 1 = Processing.
262                 // 2 = Failed.
263                 // 3 = Stopped.
264                 // 4 = Completed.
265                 // 5 = Failed (UI Updated).
266                 // 6 = Stopped (UI Updated).
267                 // 7 = (Reserved) (UI Updated).
268                 // 8 = Completed. (UI Updated). 
269                 
270                 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
271                 XABPreferences PrefData(GetUserPrefDir());
272                 
273                 if (iter->second == 0){
274                 
275                         //CardDAVIter->second.
276                         
277                         // Wait for process to finish.
279                         TasksActive = TRUE;
280                         TasksFoundProc = TRUE;
281                         wxString ETag;
282                         wxString ETagOriginal;
283                         wxString ETagServer;
284                         wxString AccountDir;
285                         wxString ContactFilename;
286                         wxString FullFilename;
287                         wxString ETagResult;
288                         bool EditMode = FALSE;
290                         iter->second = 1;
291                         
292                         // Compare the ETags and work out if a conflict has occured.
293                         
294                         if (TypeIter->second == 0){
295                         
296                                 // Add a contact.
297                                 
298                                 StringDataIter = ActivityListData.find(iter->first);
299                                 StringURLIter = ActivityListURL.find(iter->first);
300                                 
301                                 AccountDir = StringAccountIter->second;
302                                 ContactFilename = StringFilenameIter->second;
303                                 wxString AccountNameFriendly;
304                                 
305                                 int AccountID = 0;
306                                 
307                                 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
308                                         
309                                         wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
310                                         
311                                         AccountDirCheck.Trim();
312                                         AccountDirCheck.Append(wxT(".carddav"));
313                                         
314                                         if (AccountDirCheck == StringAccountIter->second){
315                                                 
316                                                 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
317                                                 AccountID = i;
318                                                 
319                                         }
320                                         
321                                 }
322                                 
323                                 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
324                                 
325                                 ETag = StringETagIter->second;
326                                 ETagOriginal = StringETagOrigIter->second;
327                                 AccountDir = StringAccountIter->second;
328                                 ContactFilename = StringFilenameIter->second;
329                                 FullFilename = StringFullFilenameIter->second;
330                                 EditMode = ActivityListEditMode.find(iter->first)->second;
331                                 
332                                 bool KeepUpdating = TRUE;
333                                 
334                                 while(KeepUpdating == TRUE){
335                                         
336                                         bool ExitLoop = FALSE;
337                                         
338                                         while (ExitLoop == FALSE){
339                                                 
340                                                 // Verify that we have a trusted SSL connection first.
341                                                 
342                                                 int ErrorCode = ConnHandle.SSLVerifyTest();
344                                                 if (ErrorCode != CURLE_OK){
345                                                         
346                                                         if (ErrorCode == CURLE_SSL_CACERT ||
347                                                                 ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
348                                                                 ErrorCode == CURLE_SSL_CONNECT_ERROR){
349                                                                 
350                                                                 // Invalid SSL certificate so bring up a dialog to the user
351                                                                 // explaining what has happened and the options available.
352                                                                 
353                                                                 // Stop all the timers.
354                                                                 
355                                                                 frmMainPtrGet->PauseAllTimers();
356                                                                 
357                                                                 int SSLResult;
358                                                                 
359 #if defined(__APPLE__)
360                                                                 
361                                                                 // Bring up the trust panel and display the SSL certificate dialog.
362                                                                 
363                                                                 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
364                                                                 
365                                                                 // Update the SSL account with the trust object.
366                                                                 
367                                                                 if (SSLResult != NSOKButton){
368                                                                         
369                                                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
370                                                                         iter->second = 2;
371                                                                         break;
372                                                                         
373                                                                 } else {
374                                                                         
375                                                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
376                                                                         
378                                                                 }
380 #elif defined(__WIN32__)
382                                                                 BOOL ModifiedCertificateData;
383                                                                 CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle());
385                                                                 if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){
386                                                                         wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
387                                                                 }
389                                                                 if (ModifiedCertificateData == FALSE){
391                                                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateContextPointer());
392                                                                         iter->second = 2;
393                                                                         break;
395                                                                 } else {
397                                                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
399                                                                 }
401 #else
402                                                                 
403                                                                 // Setup the data to be sent in the wxPostEvent command.
404                                                                 
405                                                                 SSLInvalidCertNotifObj SSLICNProcData;
406                                                                 
407                                                                 SSLCertCollection certcol = ConnHandle.GetSSLVerifyResults();
408                                                                 
409                                                                 bool *PauseMode = new bool;
410                                                                 QRNotif qrn;
411                                                                 
412                                                                 *PauseMode = TRUE;
413                                                                 qrn.QResponse = &SSLResult;
414                                                                 qrn.PausePtr = PauseMode;
415                                                                 
416                                                                 SSLICNProcData.CertCollection = certcol;
417                                                                 SSLICNProcData.QRNotifData = &qrn;
418                                                                 SSLICNProcData.AccountName = AccountNameFriendly;
419                                                                 
420                                                                 wxCommandEvent event(INVALIDSSLCERT);
421                                                                 event.SetClientData(&SSLICNProcData);
422                                                                 wxPostEvent(frmMainPtrGet, event);
423                                                                 
424                                                                 /*timespec n1, n2;
425                                                                  
426                                                                         // Fall asleep until we get an response.
427                                                                  
428                                                                         n1.tv_sec = 0;
429                                                                         n1.tv_nsec = 250000000L;*/
430                                                                 
431                                                                 while (*PauseMode == TRUE){
432                                                                         //nanosleep(&n1, &n2);
433                                                                         SleepFor(250000000);
434                                                                 }
435                                                                 
436                                                                 // Process the response from the user.
437                                                                 
438                                                                 if (SSLResult == 1){
439                                                                         
440                                                                         // Accept the certificate. Write the certificate into the account
441                                                                         // directory (as server.crt) - will overwrite old certificate.
442                                                                         
443                                                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
444                                                                         WriteServerCertificate(AccountDir, ConnHandle.GetCertificateData());
445                                                                         
446                                                                 } else if (SSLResult == 2){
447                                                                         
448                                                                         // Reject the certificate, abort the task and mark as failed.
449                                                                         
450                                                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateData());
451                                                                         iter->second = 2;
452                                                                         break;
453                                                                         
454                                                                 }
455                                                                 
456 #endif
457                                                                 
458                                                                 // Resume all the timers.
459                                                                 
460                                                                 frmMainPtrGet->ResumeAllTimers();
461                                                                 ExitLoop = TRUE;
462                                                                 
463                                                         } else {
464                                                                 
465                                                                 iter->second = 2;
466                                                                 break;
467                                                                 
468                                                         }
469                                                         
470                                                 } else {
471                                                         
472                                                         ExitLoop = TRUE;
473                                                         
474                                                 }
475                                                 
476                                         }
477                                         
478                                         if (iter->second == 2 || iter->second == 3 || iter->second == 4){
479                                                 break;
480                                         }
481                                         
482 #if defined(__APPLE__)
483                                         
484                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
486 #elif defined(__WIN32__)
488                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
490 #else
491                                         
492                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
493                                         
494 #endif
495                                         
496                                         ConnHandle.SetUploadMode(TRUE);
497                                         ConnHandle.SetupData(wxT("PUT"), StringURLIter->second, StringDataIter->second);
498                                         ConnHandle.SetEditMode(EditMode);
499                                         ConnHandle.ProcessData();
501                                         int ErrorCode = ConnHandle.GetResultCode();
503                                         if (ErrorCode != CURLE_OK){
505                                                 iter->second = 4;
506                                                 break;
508                                         }
510                                         // Add contact to the ETag DB.
511                                         
512                                         ConnHandle.GetServerETagValueThread();
513                                         ETagServer = ConnHandle.ETagValueResult();
514                                         ETagDBPtr->AddETag(ContactFilename, ETagServer, ETagServer);
515                                         
516                                         iter->second = 4;
517                                         break;
518                                         
519                                 }
520                                 
521                         } else if (TypeIter->second == 1){
522                                 
523                                 // Update a contact.
524                                 
525                                 StringDataIter = ActivityListData.find(iter->first);
526                                 StringURLIter = ActivityListURL.find(iter->first);
527                                 
528                                 AccountDir = StringAccountIter->second;
529                                 ContactFilename = StringFilenameIter->second;
530                                 wxString AccountNameFriendly;
531                                 
532                                 int AccountID = 0;
533                                 
534                                 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
535                                         
536                                         wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
537                                         
538                                         AccountDirCheck.Trim();
539                                         AccountDirCheck.Append(wxT(".carddav"));
540                                         
541                                         if (AccountDirCheck == StringAccountIter->second){
542                                                 
543                                                 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
544                                                 AccountID = i;
545                                                 
546                                         }
547                                         
548                                 }
549                                 
550                                 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
551                                 
552                                 ETag = StringETagIter->second;
553                                 ETagOriginal = StringETagOrigIter->second;
554                                 AccountDir = StringAccountIter->second;
555                                 ContactFilename = StringFilenameIter->second;
556                                 FullFilename = StringFullFilenameIter->second;
557                                 EditMode = ActivityListEditMode.find(iter->first)->second;
558                                 
559                                 bool KeepUpdating = TRUE;
560                                 
561                                 while(KeepUpdating == TRUE){
562                                         
563                                         bool ExitLoop = FALSE;
564                                         
565                                         while (ExitLoop == FALSE){
566                                                  
567                                                 int ErrorCode = ConnHandle.SSLVerifyTest();
568                                                 
569                                                 if (ErrorCode != CURLE_OK){
570                                                         
571                                                         if (ErrorCode == CURLE_SSL_CACERT ||
572                                                                 ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
573                                                                 ErrorCode == CURLE_SSL_CONNECT_ERROR){
574                                                                 
575                                                                 // Invalid SSL certificate so bring up a dialog to the user
576                                                                 // explaining what has happened and the options available.
577                                                                 
578                                                                 // Stop all the timers.
579                                                                 
580                                                                 frmMainPtrGet->PauseAllTimers();
581                                                                 
582                                                                 int SSLResult;
583                                                                 
584 #if defined(__APPLE__)
585                                                                 
586                                                                 // Bring up the trust panel and display the SSL certificate dialog.
587                                                                 
588                                                                 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
589                                                                 
590                                                                 // Update the SSL account with the trust object.
591                                                                 
592                                                                 if (SSLResult != NSOKButton){
593                                                                         
594                                                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
595                                                                         iter->second = 2;
596                                                                         break;
597                                                                         
598                                                                 } else {
599                                                                         
600                                                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
601                                                                         
602                                                                 }
604 #elif defined(__WIN32__)
606                                                                 BOOL ModifiedCertificateData;
607                                                                 CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (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, ConnHandle.GetCertificateContextPointer());
616                                                                         iter->second = 2;
617                                                                         break;
619                                                                 } else {
621                                                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
623                                                                 }
625 #else
626                                                                 
627                                                                 // Setup the data to be sent in the wxPostEvent command.
628                                                                 
629                                                                 SSLInvalidCertNotifObj SSLICNProcData;
630                                                                 
631                                                                 SSLCertCollection certcol = ConnHandle.GetSSLVerifyResults();
632                                                                 
633                                                                 bool *PauseMode = new bool;
634                                                                 QRNotif qrn;
635                                                                 
636                                                                 *PauseMode = TRUE;
637                                                                 qrn.QResponse = &SSLResult;
638                                                                 qrn.PausePtr = PauseMode;
639                                                                 
640                                                                 SSLICNProcData.CertCollection = certcol;
641                                                                 SSLICNProcData.QRNotifData = &qrn;
642                                                                 SSLICNProcData.AccountName = AccountNameFriendly;
643                                                                 
644                                                                 wxCommandEvent event(INVALIDSSLCERT);
645                                                                 event.SetClientData(&SSLICNProcData);
646                                                                 wxPostEvent(frmMainPtrGet, event);
647                                                                 
648                                                                 while (*PauseMode == TRUE){
649                                                                         //nanosleep(&n1, &n2);
650                                                                         SleepFor(250000000);
651                                                                 }
652                                                                 
653                                                                 // Process the response from the user.
654                                                                 
655                                                                 if (SSLResult == 1){
656                                                                         
657                                                                         // Accept the certificate. Write the certificate into the account
658                                                                         // directory (as server.crt) - will overwrite old certificate.
659                                                                         
660                                                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
661                                                                         WriteServerCertificate(AccountDir, ConnHandle.GetSSLVerifyResults());
662                                                                         
663                                                                 } else if (SSLResult == 2){
664                                                                         
665                                                                         // Reject the certificate, abort the task and mark as failed.
666                                                                         
667                                                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetSSLVerifyResults());
668                                                                         iter->second = 2;
669                                                                         break;
670                                                                         
671                                                                 }
672                                                                 
673 #endif
674                                                                 
675                                                                 // Resume all the timers.
676                                                                 
677                                                                 frmMainPtrGet->ResumeAllTimers();
678                                                                 ExitLoop = TRUE;
679                                                                 
680                                                         } else {
681                                                                 
682                                                                 iter->second = 2;
683                                                                 break;
684                                                                 
685                                                         }
686                                                         
687                                                 } else {
688                                                         
689                                                         ExitLoop = TRUE;
690                                                         
691                                                 }
692                                                 
693                                         }
694                                         
695                                         if (iter->second == 2 || iter->second == 3 || iter->second == 4){
696                                                 break;
697                                         }
698                                         
699 #if defined(__APPLE__)
700                                         
701                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
703 #elif defined(__WIN32__)
705                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
707 #else
708                                         
709                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
710                                         
711 #endif
712                                         
713                                         ConnHandle.SetUploadMode(TRUE);
714                                         ConnHandle.SetupData(wxT("PUT"), StringURLIter->second, StringDataIter->second);
715                                         ConnHandle.SetEditMode(EditMode);
716                                         ConnHandle.GetServerETagValueThread();
717                                         ETagServer = ConnHandle.ETagValueResult();
719                                         int ErrorCode = ConnHandle.GetResultCode();
721                                         if (ErrorCode != CURLE_OK){
722                                                 iter->second = 2;
723                                                 break;
724                                         }
726                                         // Compare the ETag with the Server ETag.
727                                         
728                                         if (ETagOriginal != ETagServer){
729                                                 
730                                                 // Server ETag is different from original ETag.
731                                                 // This is a conflict which the user will now
732                                                 // need to resolve.
733                                                 
734                                                 vCard Moo1;
735                                                 vCard Moo2;
736                                                 
737                                                 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
738                                                 
739                                                 vCard34Conv vCard34Obj;
740                                                 
741                                                 wxString ServerContactData;
742                                                 vCard ClientData;
743                                                 vCard ConvertedV4Data;
744                                                 
745                                                 // Load the client data from the filename given.
746                                                 
747                                                 ConnHandle.GetServerContactData();
748                                                 ServerContactData = ConnHandle.GetPageData();
749                                                 
750                                                 // Process v3 version into v4 version.
751                                                 
752                                                 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
753                                                 
754                                                 vCardConflictObj vCardProcData;
755                                                 
756                                                 vCardProcData.vCardLocalData = &ClientData;
757                                                 vCardProcData.vCardServerData = &ConvertedV4Data;
758                                                 ClientData.LoadFile(FullFilename);
759                                                 
760                                                 //ContactConflictEvent event(ContactConflictCmdEnv);
761                                                 //event.SetData(ContactFilename, Moo1, Moo2);
762                                                 
763                                                 //wxPostEvent(frmMainPtrGet, event);
764                                                 
765                                                 // Setup Conflict Resolution Dialog.
766                                                 
767                                                 // Fetch Data from Server and convert.
768                                                 
769                                                 bool *PauseMode = new bool;
770                                                 int ConflictResult;
771                                                 QRNotif qrn;
772                                                 
773                                                 *PauseMode = TRUE;
774                                                 qrn.QResponse = &ConflictResult;
775                                                 qrn.PausePtr = PauseMode;
776                                                 
777                                                 vCardProcData.QRNotifData = &qrn;
778                                                 
779                                                 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
780                                                 event.SetClientData(&vCardProcData);
781                                                 wxPostEvent(frmMainPtrGet, event);
782                                                 
783                                                 while (*PauseMode == TRUE){
784                                                         //nanosleep(&n1, &n2);
785                                                         SleepFor(250000000);
786                                                 }
787                                                 
788                                                 delete PauseMode;
789                                                 PauseMode = NULL;
790                                                 
791                                                 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
792                                                 
793                                                 if (ConflictResult == 0){
794                                                         
795                                                         // Decide Later.
796                                                         
797                                                         iter->second = 4;
798                                                         break;
799                                                         
800                                                 } else if (ConflictResult == 1){
801                                                         
802                                                         // Decided to use client version.
803                                                         
804                                                         ConnHandle.ProcessData();
805                                                         
806                                                 } else if (ConflictResult == 2){
807                                                         
808                                                         // Decided to use server version.
809                                                         
810                                                         // Download server version.
811                                                         
812                                                         ConvertedV4Data.WriteFile(FullFilename);
813                                                         
814                                                 }
815                                                 
816                                         } else {
817                                                 
818                                                 // Update the data to the server.
819                                                 
820                                                 ConnHandle.ProcessData();
821                                                 
822                                         }
823                                         
824                                         // Update the ETag DB.
825                                         
826                                         ConnHandle.GetServerETagValueThread();
827                                         ETagServer = ConnHandle.ETagValueResult();
828                                         ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
829                                         
830                                         iter->second = 4;
831                                         break;
832                                         
833                                 }
834                         
835                         } else if (TypeIter->second == 2) {
836                         
837                                 // Delete the contact from the server and update the ETag DB.
838                                 
839                                 AccountDir = StringAccountIter->second;
840                                 ContactFilename = StringFilenameIter->second;
841                                 wxString AccountNameFriendly;
842                                 
843                                 int AccountID = 0;
844                                 
845                                 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
846                                         
847                                         wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
848                                         
849                                         AccountDirCheck.Trim();
850                                         AccountDirCheck.Append(wxT(".carddav"));
851                                         
852                                         if (AccountDirCheck == StringAccountIter->second){
853                                                 
854                                                 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
855                                                 AccountID = i;
856                                                 
857                                         }
858                                         
859                                 }
860                                 
861                                 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
862                                 
863                                 bool KeepUpdating = TRUE;
864                                 
865                                 while(KeepUpdating == TRUE){
866                                 
867                                         bool ExitLoop = FALSE;
868                                         
869                                         while (ExitLoop == FALSE){
870                                                 
871                                                 int ErrorCode = ConnHandle.SSLVerifyTest();
873                                                 if (ErrorCode != CURLE_OK){
874                                                         
875                                                         if (ErrorCode == CURLE_SSL_CACERT ||
876                                                                 ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
877                                                                 ErrorCode == CURLE_SSL_CONNECT_ERROR){
878                                                                 
879                                                                 // Invalid SSL certificate so bring up a dialog to the user
880                                                                 // explaining what has happened and the options available.
881                                                                 
882                                                                 // Stop all the timers.
883                                                                 
884                                                                 frmMainPtrGet->PauseAllTimers();
885                                                                 
886                                                                 int SSLResult;
887                                                                 
888 #if defined(__APPLE__)
889                                                                 
890                                                                 // Bring up the trust panel and display the SSL certificate dialog.
891                                                                 
892                                                                 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
893                                                                 
894                                                                 // Update the SSL account with the trust object.
895                                                                 
896                                                                 if (SSLResult != NSOKButton){
897                                                                         
898                                                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
899                                                                         iter->second = 2;
900                                                                         break;
901                                                                         
902                                                                 } else {
903                                                                         
904                                                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
905                                                                         
906                                                                 }
908 #elif defined(__WIN32__)
910                                                                 BOOL ModifiedCertificateData;
911                                                                 CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle());
913                                                                 if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){
914                                                                         wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
915                                                                 }
917                                                                 if (ModifiedCertificateData == FALSE){
919                                                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateContextPointer());
920                                                                         iter->second = 2;
921                                                                         break;
923                                                                 } else {
925                                                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
927                                                                 }
929 #else
930                                                                 
931                                                                 // Setup the data to be sent in the wxPostEvent command.
932                                                                 
933                                                                 SSLInvalidCertNotifObj SSLICNProcData;
934                                                                 
935                                                                 SSLCertCollection certcol = ConnHandle.GetSSLVerifyResults();
936                                                                 
937                                                                 bool *PauseMode = new bool;
938                                                                 QRNotif qrn;
939                                                                 
940                                                                 *PauseMode = TRUE;
941                                                                 qrn.QResponse = &SSLResult;
942                                                                 qrn.PausePtr = PauseMode;
943                                                                 
944                                                                 SSLICNProcData.CertCollection = certcol;
945                                                                 SSLICNProcData.QRNotifData = &qrn;
946                                                                 SSLICNProcData.AccountName = AccountNameFriendly;
947                                                                 
948                                                                 wxCommandEvent event(INVALIDSSLCERT);
949                                                                 event.SetClientData(&SSLICNProcData);
950                                                                 wxPostEvent(frmMainPtrGet, event);
951                                                                 
952                                                                 /*timespec n1, n2;
953                                                                  
954                                                                         // Fall asleep until we get an response.
955                                                                  
956                                                                         n1.tv_sec = 0;
957                                                                         n1.tv_nsec = 250000000L;*/
958                                                                 
959                                                                 while (*PauseMode == TRUE){
960                                                                         //nanosleep(&n1, &n2);
961                                                                         SleepFor(250000000);
962                                                                 }
963                                                         
964                                                                 // Process the response from the user.
965                                                         
966                                                                 if (SSLResult == 1){
967                                                                 
968                                                                         // Accept the certificate. Write the certificate into the account
969                                                                         // directory (as server.crt) - will overwrite old certificate.
970                                                                 
971                                                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
972                                                                         WriteServerCertificate(AccountDir, ConnHandle.GetSSLVerifyResults());
973                                                                 
974                                                                 } else if (SSLResult == 2){
975                                                                 
976                                                                 // Reject the certificate, abort the task and mark as failed.
977                                                                 
978                                                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetSSLVerifyResults());
979                                                                         iter->second = 2;
980                                                                         break;
981                                                                 
982                                                                 }
983                                                         
984 #endif
985                                                         
986                                                                 // Resume all the timers.
987                                                         
988                                                                 frmMainPtrGet->ResumeAllTimers();
989                                                                 ExitLoop = TRUE;
990                                                         
991                                                         } else {
992                                                         
993                                                                 iter->second = 4;
994                                                                 break;
995                                                         
996                                                         }
997                                                 
998                                                 } else {
999                                                 
1000                                                         ExitLoop = TRUE;
1001                                                 
1002                                                 }
1003                                         
1004                                         }
1005                                 
1006                                         if (iter->second == 2 || iter->second == 3 || iter->second == 4){
1007                                                 break;
1008                                         }
1009                         
1010 #if defined(__APPLE__)
1011                                 
1012                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1014 #elif defined(__WIN32__)
1016                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
1018 #else
1019                                 
1020                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
1021                                 
1022 #endif
1024                                         ConnHandle.SetUploadMode(FALSE);
1025                                         ConnHandle.SetupData(wxT("DELETE"), ContactFilename, wxT(""));
1026                                         ConnHandle.ProcessData();
1027                                         
1028                                         SSLCertCollection certcol = ConnHandle.GetCertificateData();
1030                                         // Check if any errors have occured whilst getting the data.
1032                                         int ErrorCode = ConnHandle.GetResultCode();
1034                                         if (ErrorCode != CURLE_OK){
1035                                                 iter->second = 2;
1036                                                 break;
1037                                         }
1038                                 
1039                                         ETagDBPtr->RemoveETag(ContactFilename);
1040                                 
1041                                         iter->second = 4;
1042                                         CardDAVIter->second = NULL;
1043                                         break;
1044                                 
1045                                 }
1046                         
1047                         } else if (TypeIter->second == 3) {
1049                                 wxString AccountNameFriendly;
1050         
1051                                 int AccountID = 0;
1053                                 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
1054         
1055                                         wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
1056                 
1057                                         AccountDirCheck.Trim();
1058                                         AccountDirCheck.Append(wxT(".carddav"));
1059         
1060                                         if (AccountDirCheck == StringAccountIter->second){
1061                                         
1062                                                 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
1063                                                 AccountID = i;
1064                 
1065                                         }
1066         
1067                                 }
1068                         
1069                                 bool KeepUpdating = TRUE;
1071                                 while (KeepUpdating == TRUE){
1073                                         StringTaskDetailIter = ActivityListTaskDetail.find(iter->first);
1074                         
1075                                         AccountDir = StringAccountIter->second;
1077                                         ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1078                                 
1079                                         wxArrayString vCardAdd;
1080                                         wxArrayString vCardDelete;
1081                                         wxArrayString vCardList;
1082                                         wxArrayString vCardUpdateLocal;
1083                                         wxArrayString vCardUpdateRemote;
1084                                         wxArrayString vCardUpdateLog;
1085                                         std::map<wxString,wxString> vCardETag;
1086                                         ContactListData ServerContactList;
1087                                 
1088                                         std::map<wxString,vCardDownloadDataFileClass> vCardDownloadData;
1089                                         //wxArrayString vCardDownload;
1090                                         //std::map<wxString,wxString> vCardDownloadData;
1091                                 
1092                                         // Get the list of vCard files locally.
1093         
1094                                         wxString AccountDirFinal;
1095                                         wxString AccountSyncTokenFilename;
1096                                         wxString SyncTokenLoad;
1097         
1098 #if defined(__HAIKU__)
1099     
1100                                             //preffilename = wxT("noo");
1102 #elif defined(__WIN32__)
1104                                         AccountDirFinal = GetAccountDir(AccountDir, FALSE);
1105                                         AccountSyncTokenFilename = AccountDirFinal;
1106                                         AccountSyncTokenFilename.Append(wxT("synctoken"));
1108 #else
1110                                         AccountDirFinal = GetAccountDir(AccountDir, FALSE);
1111                                         AccountSyncTokenFilename = AccountDirFinal;
1112                                         AccountSyncTokenFilename.Append(wxT("synctoken"));
1113         
1114 #endif
1116                                         // Suppress Error Messages.
1117                                 
1118                                         wxLogNull PleaseDoNotDisturb;
1120                                         wxFFile SyncLoad;
1121                                         SyncLoad.Open(AccountSyncTokenFilename, wxT("r"));
1122                                 
1123                                         if (SyncLoad.IsOpened()){
1124                                 
1125                                                 SyncLoad.ReadAll(&SyncTokenLoad, wxMBConvUTF8());
1126                                                 SyncLoad.Close();
1127                                 
1128                                         }
1130                                         // Get a list of vCard files from the server.
1132                                         // Get the list of vCard files from the ETagDB.
1133                                 
1134                                         std::map<wxString,ETagData> ETagDBData = ETagDBPtr->GetETagData();
1135                                         
1136                                         bool ExitLoop = FALSE;
1138                                         std::map<wxString,FileSyncData> *SCListData = NULL;
1139                                         
1140                                         while (ExitLoop == FALSE){
1141                                 
1142                                                 // Check if any errors have occured whilst getting the data.
1143                                 
1144                                                 int ErrorCode = ConnHandle.SSLVerifyTest();
1145                                 
1146                                                 if (ErrorCode != CURLE_OK){
1147                                         
1148                                                         if (ErrorCode == CURLE_SSL_CACERT ||
1149                                                                 ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
1150                                                                 ErrorCode == CURLE_SSL_CONNECT_ERROR){
1151                                                 
1152                                                                 // Invalid SSL certificate so bring up a dialog to the user
1153                                                                 // explaining what has happened and the options available.
1154                                                         
1155                                                                 // Stop all the timers.
1156                                                                 
1157                                                                 frmMainPtrGet->PauseAllTimers();
1158                                                         
1159                                                                 int SSLResult;
1161 #if defined(__APPLE__)
1162                                                                 
1163                                                                 // Bring up the trust panel and display the SSL certificate dialog.
1164                                                                 
1165                                                                 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
1166                                 
1167                                                                 // Update the SSL account with the trust object.
1168                                                                 
1169                                                                 if (SSLResult != NSOKButton){
1170                                                                         
1171                                                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
1172                                                                         iter->second = 2;
1173                                                                         break;
1174                                                                         
1175                                                                 } else {
1177                                                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1178                                                                         
1179                                                                 }
1181 #elif defined(__WIN32__)
1183                                                                 BOOL ModifiedCertificateData;
1184                                                                 CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle());
1186                                                                 if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){
1187                                                                         wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
1188                                                                 }
1190                                                                 if (ModifiedCertificateData == FALSE){
1192                                                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateContextPointer());
1193                                                                         iter->second = 2;
1194                                                                         break;
1196                                                                 } else {
1198                                                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
1200                                                                 }
1201 #else
1202                                 
1203                                                                 // Setup the data to be sent in the wxPostEvent command.
1205                                                                 SSLInvalidCertNotifObj SSLICNProcData;
1207                                                                 SSLCertCollection certcol = ConnHandle.GetSSLVerifyResults();
1209                                                                 bool *PauseMode = new bool;
1210                                                                 QRNotif qrn;
1212                                                                 *PauseMode = TRUE;                                              
1213                                                                 qrn.QResponse = &SSLResult;
1214                                                                 qrn.PausePtr = PauseMode;
1215                                                                 
1216                                                                 SSLICNProcData.CertCollection = certcol;
1217                                                                 SSLICNProcData.QRNotifData = &qrn;
1218                                                                 SSLICNProcData.AccountName = AccountNameFriendly;
1219                                                         
1220                                                                 wxCommandEvent event(INVALIDSSLCERT);
1221                                                                 event.SetClientData(&SSLICNProcData);
1222                                                                 wxPostEvent(frmMainPtrGet, event);
1223                                         
1224                                                                 /*timespec n1, n2;
1225                                                 
1226                                                                 // Fall asleep until we get an response.
1227                                                 
1228                                                                 n1.tv_sec = 0;
1229                                                                 n1.tv_nsec = 250000000L;*/
1230                                         
1231                                                                 while (*PauseMode == TRUE){
1232                                                                         //nanosleep(&n1, &n2);
1233                                                                         SleepFor(250000000);
1234                                                                 }
1235                                                         
1236                                                                 // Process the response from the user.
1237                                                         
1238                                                                 if (SSLResult == 1){
1239                                                                 
1240                                                                         // Accept the certificate. Write the certificate into the account
1241                                                                         // directory (as server.crt) - will overwrite old certificate.
1243                                                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
1244                                                                         WriteServerCertificate(AccountDir, ConnHandle.GetSSLVerifyResults());
1245                                                                 
1246                                                                 } else if (SSLResult == 2){
1247                                                                 
1248                                                                         // Reject the certificate, abort the task and mark as failed.
1250                                                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetSSLVerifyResults());
1251                                                                         iter->second = 2;
1252                                                                         break;
1253                                                                 
1254                                                                 }
1255                                                                 
1256 #endif
1257                                                         
1258                                                                 // Resume all the timers.
1259                                                                 
1260                                                                 frmMainPtrGet->ResumeAllTimers();
1261                                                                 ExitLoop = TRUE;
1262                                                 
1263                                                         } else {
1264                                                         
1265                                                                 iter->second = 4;
1266                                                                 break;
1267                                                         
1268                                                         }
1269                                         
1270                                                 } else {
1271                                         
1272                                                         ExitLoop = TRUE;
1273                                         
1274                                                 }
1275                                         
1276                                         }
1277                                         
1278                                         if (iter->second == 2 || iter->second == 3 || iter->second == 4){
1279                                                 break;
1280                                         }
1281                                 
1282 #if defined(__APPLE__)
1283                                         
1284                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1286 #elif defined(__WIN32__)
1288                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
1290 #else
1291                                         
1292                                         frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
1293                         
1294 #endif
1295                                         
1296                                         // Look in directory and see which vCards to add and delete
1297                                 
1298                                         // In short:
1299                                         // vCard exists but not in ETagDB - Add (and upload).
1300                                         // vCard missing but in ETagDB - Delete (from server).
1301                                 
1302                                         // Start by looking for vCards that are not in the ETagDB.
1303                                 
1304                                         wxDir AccDir(AccountDirFinal);
1305                                         wxString AccDirFilename;
1306                                 
1307                                         bool ContinueProcess = AccDir.GetFirst(&AccDirFilename, wxEmptyString, wxDIR_DEFAULT);
1308                                 
1309                                         ServerContactList = ConnHandle.GetContactList(SyncTokenLoad.ToUTF8());
1311                                         int ErrorCode = ConnHandle.GetResultCode();
1313                                         if (ErrorCode != CURLE_OK){
1315                                                 iter->second = 4;
1316                                                 break;
1318                                         }
1320                                         SSLCertCollection certcol = ConnHandle.GetCertificateData();
1322                                         // Create a pointer for the std::map<wxString,FileSyncData>.
1324                                         SCListData = &ServerContactList.ListData;
1326                                         // Process the server data.
1328                                         if (SCListData != NULL){
1330                                                 for (std::map<wxString, FileSyncData>::iterator fsiter = SCListData->begin();
1331                                                         fsiter != SCListData->end(); fsiter++){
1333                                                         // Check the mode of the file before adding.
1335                                                         // Get the HTTP status of the file from the list.
1337                                                         FileSyncData fsd = fsiter->second;
1339                                                         if (fsd.DataFlag == 1){
1341                                                                 // Added or modified contact.
1343                                                                 //vCardAdd.Add(fsiter->first, 1);
1345                                                                 vCardDownloadDataFileClass vCardNewData;
1346                                                                 vCardNewData.DataType = 0;
1347                                                                 vCardDownloadData.insert(std::make_pair(fsiter->first, vCardNewData));
1349                                                                 //} else if (fsd.DataFlag == 1){
1351                                                                 // Contact has been modified on the server.
1353                                                                 //      vCardUpdateLocal.Add(fsiter->first, 1);
1355                                                         }
1356                                                         else if (fsd.DataFlag == 2){
1358                                                                 // Contact has been deleted.
1360                                                                 vCardDelete.Add(fsiter->first, 1);
1362                                                         }
1364                                                 }
1366                                         }
1367                                 
1368                                         // Look for vCards that are missing but in the ETagDB.
1369         
1370                                         for (std::map<wxString,ETagData>::iterator etagiter = ETagDBData.begin();
1371                                                 etagiter != ETagDBData.end(); etagiter++){
1372                                 
1373                                                 // Check if the vCard exists.
1374                                         
1375                                                 if (!wxFileExists(AccountDirFinal + etagiter->first)){
1376                                         
1377                                                         // vCard doesn't exist so mark for deleting.
1378                                         
1379                                                         vCardDelete.Add(etagiter->first, 1);
1380                                         
1381                                                 }
1382                                 
1383                                         }
1385                                         // Compare Server with the ETag DB. Work out which
1386                                         // needs to updated remotely and which needs to be
1387                                         // updated locally.
1389                                         for (std::map<wxString,FileSyncData>::iterator srviter = SCListData->begin();
1390                                                 srviter != SCListData->end(); srviter++){
1392                                                 if (ETagDBData.find(srviter->first) == ETagDBData.end()){
1393                                                         continue;
1394                                                 }
1395                                         
1396                                                 std::map<wxString,ETagData>::iterator lociter = ETagDBData.find(srviter->first);
1397                                 
1398                                                 ETagData etd = lociter->second;
1399                                                 FileSyncData fsd = srviter->second;
1400                                         
1401                                                 wxString ETagSrv = fsd.ETagData;
1403                                                 // Check if the local ETag value has 'DELETED' set and skip
1404                                                 // checking this file if it does.
1405                                         
1406                                                 if (etd.ETagValue == "DELETED"){
1407                                                         
1408                                                         continue;
1409                                                         
1410                                                 }
1411                                                 
1412                                                 // Compare local ETag with original local ETag.
1413                                                 // If different, update to server is required.
1414                                 
1415                                                 if (etd.ETagValue != etd.ETagOrigValue){
1416                                 
1417                                                         // Check if local original ETag is different from server ETag.
1418                                                         // If it is then throw up a conflict resolution dialog.
1419                                 
1420                                                         if (etd.ETagOrigValue != ETagSrv){
1421                                         
1422                                                                 vCard34Conv vCard34Obj;
1423                                                 
1424                                                                 wxString ServerContactData;
1425                                                                 wxString FullFilename;
1426                                                                 vCard ClientData;
1427                                                                 vCard ConvertedV4Data;
1428                                         
1429                                                                 // Conflict. Bring up conflict resolution dialog.
1430                                                         
1431                                                                 // Get the server contact data for comparison.
1432                                                         
1433                                                                 ConnHandle.SetServerFilename(srviter->first);
1434                                                                 ConnHandle.GetServerContactData();
1435                                                                 ServerContactData = ConnHandle.GetPageData();
1436                                                         
1437                                                                 FullFilename = CreateFilenamePath(AccountDirFinal, srviter->first);
1438                                                         
1439                                                                 // Convert it to v4.
1440                                         
1441                                                                 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1442                                         
1443                                                                 vCardConflictObj vCardProcData;
1444                                         
1445                                                                 vCardProcData.vCardLocalData = &ClientData;
1446                                                                 vCardProcData.vCardServerData = &ConvertedV4Data;
1447                                                         
1448                                                                 // Load the client data from the filename given.
1449                                                         
1450                                                                 ClientData.LoadFile(FullFilename);
1451                                                         
1452                                                                 // Show dialog.
1453                                         
1454                                                                 bool *PauseMode = new bool;
1455                                                                 int ConflictResult;
1456                                                                 QRNotif qrn;
1457                                                                 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
1459                                                                 *PauseMode = TRUE;
1460                                                                 qrn.QResponse = &ConflictResult;
1461                                                                 qrn.PausePtr = PauseMode;
1462                                                 
1463                                                                 vCardProcData.QRNotifData = &qrn;
1464                                         
1465                                                                 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1466                                                                 event.SetClientData(&vCardProcData);
1467                                                                 wxPostEvent(frmMainPtrGet, event);
1468                                                 
1469                                                                 /*timespec n1, n2;
1470                                                 
1471                                                                 n1.tv_sec = 0;
1472                                                                 n1.tv_nsec = 250000000L;*/
1473                                                 
1474                                                                 while (*PauseMode == TRUE){
1475                                                                         //nanosleep(&n1, &n2);
1476                                                                         SleepFor(250000000);
1477                                                                 }
1478                                         
1479                                                                 delete PauseMode;
1480                                                                 PauseMode = NULL;
1481                                                         
1482                                                                 // If replacing local version, store copy for now.
1483                                                                 // Otherwise upload to server.
1484                                         
1485                                                                 if (ConflictResult == 0){
1486                                         
1487                                                                         // Decide Later.
1488                                         
1489                                                                         continue;
1490                                         
1491                                                                 } else if (ConflictResult == 1){
1492                                         
1493                                                                         // Decided to use client version.
1494                                         
1495                                                                         vCardUpdateLocal.Remove(srviter->first);
1496                                                                         vCardUpdateRemote.Add(srviter->first, 1);                                                               
1497                                         
1498                                                                 } else if (ConflictResult == 2){
1499                                         
1500                                                                         // Decided to use server version.
1501                                                                         // Store the converted downloaded copy for
1502                                                                         // processing later.
1504                                                                         //vCardUpdateLocal.Add(srviter->first, 1);
1505                                                                 
1506                                                                         vCardDownloadDataFileClass vCardNewData;
1507                                                                         vCardNewData.DataType = 1;
1508                                                                         vCardNewData.FileData = ConvertedV4Data.WriteString();
1510                                                                         ConvertedV4Data.WriteFile(FullFilename);
1511                                                                 
1512                                                                         vCardDownloadData.insert(std::make_pair(srviter->first, vCardNewData)); 
1513                                                                 
1514                                                                 
1515                                                                 
1516                                                                 }
1517                                         
1518                                                         } else {
1519                                         
1520                                                                 // Send vCard to the server.
1521                                                 
1522                                                                 vCardUpdateRemote.Add(srviter->first, 1);
1523                                         
1524                                                         }
1525                                 
1526                                                 } else {
1527                                 
1528                                                         // Check if local ETag is different from server ETag.
1529                                                         // If different, obtain the vCard from the server.
1530                                         
1531                                                         if (etd.ETagOrigValue != ETagSrv){
1532                                         
1533                                                                 vCardUpdateLocal.Add(srviter->first, 1);
1534                                         
1535                                                         }
1536                                 
1537                                                 }
1538                         
1539                                         }
1540                                 
1541                                         // Process the vCards that need to be downloaded and added/overwritten.
1542                                 
1543                                         wxString vCardFilenameFinal;
1544                                         wxString vCardOutputData;
1545                                         wxString vCardInputData;
1546                                         wxString ETagFileData;
1547                                         wxFFile vCardFile;
1548                                 
1549                                         for (std::map<wxString,vCardDownloadDataFileClass>::iterator additer = vCardDownloadData.begin();
1550                                                 additer != vCardDownloadData.end(); additer++){
1551                                         
1552                                                 vCardFilenameFinal.Clear();
1553                                                 vCardInputData.Clear();
1554                                                 vCardOutputData.Clear();
1555                                                 ETagFileData.Clear();
1556                                         
1557                                                 vCardFilenameFinal = CreateFilenamePath(AccountDirFinal, additer->first);
1558                                         
1559                                                 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1560                                         
1561                                                 if (additer->second.DataType == 0){
1562                                         
1563                                                         vCard ConvertedV4Data;
1564                                         
1565                                                         // Grab the file from the server and write the contact out.
1566                                         
1567                                                         vCard34Conv vCard34Obj;
1568                                                 
1569                                                         ConnHandle.SetServerFilename(additer->first);
1570                                                         ConnHandle.GetServerContactData();
1571                                                         vCardInputData = ConnHandle.GetPageData();
1572                                                 
1573                                                         vCard34Obj.ConvertToV4(&vCardInputData, &ConvertedV4Data);
1574                                                 
1575                                                         ConvertedV4Data.WriteFile(vCardFilenameFinal);
1576                                                 
1577                                                         // Update the ETagDB.
1578                                                 
1579                                                         //vCardFile.Open(vCardFilenameFinal, wxT("w"));
1580                                 
1581                                                         //if (vCardFile.IsOpened()){
1582                                 
1583                                                         //      vCardFile.Write(vCardOutputData, wxConvAuto());
1584                                                         //      vCardFile.Close();
1585                                 
1586                                                         //}
1587                                                 
1588                                                         // Get the server ETag.
1589                                                 
1590                                                         wxString ServerETag;
1591                                                         ConnHandle.GetServerETagValueThread();
1592                                                         ServerETag = ConnHandle.ETagValueResult();
1593                                                 
1594                                                         // Add to the ETag Database.
1595                                                 
1596                                                         ETagDBPtr->AddETag(additer->first, ServerETag, ServerETag);
1597                                                 
1598                                                 } else if (additer->second.DataType == 1){
1599                                         
1600                                                         // Write out the contact to the account directory.
1601                                         
1602                                                         vCardFilenameFinal = CreateFilenamePath(AccountDirFinal, additer->first);
1603                                                         vCardOutputData = additer->second.FileData;
1604                                                 
1605                                                         vCardFile.Open(vCardFilenameFinal, wxT("w"));
1606                                 
1607                                                         if (vCardFile.IsOpened()){
1608                                 
1609                                                                 vCardFile.Write(vCardOutputData, wxConvAuto());
1610                                                                 vCardFile.Close();
1611                                 
1612                                                         }
1613                                                 
1614                                                         // Update the ETagDB.
1616                                                         wxString ServerETag;
1617                                                         ConnHandle.GetServerETagValueThread();
1618                                                         ServerETag = ConnHandle.ETagValueResult();
1619                                                 
1620                                                         // Add to the ETag Database.
1621                                                 
1622                                                         ETagDBPtr->AddETag(additer->first, ServerETag, ServerETag);
1623                                                                                         
1624                                                 }
1625                                         }
1626         
1627                                         // Look for vCard files which aren't in the ETagDB.
1628         
1629                                         while(ContinueProcess){
1630                                 
1631                                                 // Check and make sure that the filename ends in .vcf/.vcard
1632                                                 // Skip any file that beings with a dot.
1633                                         
1634                                                 if (AccDirFilename.Left(1) == wxT(".")){
1635                                         
1636                                                         ContinueProcess = AccDir.GetNext(&AccDirFilename);
1637                                                         continue;
1638                                         
1639                                                 }
1640                                         
1641                                                 if (AccDirFilename.Right(4) != wxT(".vcf") && 
1642                                                 AccDirFilename.Right(6) != wxT(".vcard")){
1643                                         
1644                                                         ContinueProcess = AccDir.GetNext(&AccDirFilename);
1645                                                         continue;
1646                                         
1647                                                 }
1648                                 
1649                                                 // Look in the ETagDB for the file.
1650                                         
1651                                                 bool ETagExists = ETagDBPtr->CheckETagExists(AccDirFilename);
1652                                         
1653                                                 if (ETagExists == FALSE){
1654                                         
1655                                                         // Add the vCard to the list to be added.
1656                                                 
1657                                                         vCardAdd.Add(AccDirFilename, 1);
1658                                         
1659                                                 }
1660                                         
1661                                                 ContinueProcess = AccDir.GetNext(&AccDirFilename);
1662                                 
1663                                         }
1664                                 
1665                                         // Process the vCards to add/update to the server.
1666                                 
1667                                         for (int vi = 0; vi < vCardAdd.GetCount(); vi++){
1669                                                 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1670                                                 ETag = ETagDBPtr->GetETag(vCardAdd[vi]);
1671                                                 ETagOriginal = ETagDBPtr->GetETagOriginal(vCardAdd[vi]);
1672                                                 
1673                                                 ContactFilename = vCardAdd[vi];
1674                                                 FullFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1676                                                 ContactFilename.Trim();
1677                         
1678                                                 if (ETag == ETagOriginal && ETagDBPtr->ETagExists(vCardAdd[vi])){
1679                         
1680                                                         // Compare the ETag with the Server ETag.
1681                                                 
1682                                                         ConnHandle.SetServerFilename(vCardAdd[vi]);
1683                                                         ConnHandle.GetServerETagValueThread();
1684                                                         ETagServer = ConnHandle.ETagValueResult();
1685                                 
1686                                                         if (ETagOriginal != ETagServer){
1687                                 
1688                                                                 // Server ETag is different from original ETag.
1689                                                                 // This is a conflict which the user will now
1690                                                                 // need to resolve.
1691                                         
1692                                                                 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
1693                                         
1694                                                                 vCard34Conv vCard34Obj;
1695                                                 
1696                                                                 wxString ServerContactData;
1697                                                                 vCard ClientData;
1698                                                                 vCard ConvertedV4Data;
1699                                         
1700                                                                 // Load the client data from the filename given.
1701                                         
1702                                                                 ConnHandle.GetServerContactData();
1703                                                                 ServerContactData = ConnHandle.GetPageData();
1704                                                 
1705                                                                 // Process v3 version into v4 version.
1706                                                 
1707                                                                 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1708                                         
1709                                                                 vCardConflictObj vCardProcData;
1710                                         
1711                                                                 vCardProcData.vCardLocalData = &ClientData;
1712                                                                 vCardProcData.vCardServerData = &ConvertedV4Data;
1713                                                                 ClientData.LoadFile(FullFilename);
1715                                                                 //ContactConflictEvent event(ContactConflictCmdEnv);
1716                                                                 //event.SetData(ContactFilename, Moo1, Moo2);
1717                                         
1718                                                                 //wxPostEvent(frmMainPtrGet, event);
1719                                         
1720                                                                 // Setup Conflict Resolution Dialog.
1721                                         
1722                                                                 // Fetch Data from Server and convert.
1723                                         
1724                                                                 bool *PauseMode = new bool;
1725                                                                 int ConflictResult;
1726                                                                 QRNotif qrn;
1728                                                                 *PauseMode = TRUE;                                              
1729                                                                 qrn.QResponse = &ConflictResult;
1730                                                                 qrn.PausePtr = PauseMode;
1731                                                 
1732                                                                 vCardProcData.QRNotifData = &qrn;
1733                                         
1734                                                                 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1735                                                                 event.SetClientData(&vCardProcData);
1736                                                                 wxPostEvent(frmMainPtrGet, event);
1737                                                 
1738                                                                 /*timespec n1, n2;
1739                                                 
1740                                                                 n1.tv_sec = 0;
1741                                                                 n1.tv_nsec = 250000000L;*/
1742                                                 
1743                                                                 while (*PauseMode == TRUE){
1744                                                                         //nanosleep(&n1, &n2);
1745                                                                         SleepFor(250000000);
1746                                                                 }
1747                                         
1748                                                                 delete PauseMode;
1749                                                                 PauseMode = NULL;
1750                                         
1751                                                                 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
1752                                         
1753                                                                 if (ConflictResult == 0){
1754                                         
1755                                                                         // Decide Later.
1756                                         
1757                                                                         iter->second = 4;
1758                                                                         continue;
1759                                         
1760                                                                 } else if (ConflictResult == 1){
1761                                         
1762                                                                         // Decided to use client version.
1763                                         
1764                                                                         ConnHandle.ProcessData();
1765                                                 
1766                                                                         iter->second = 4;
1767                                         
1768                                                                 } else if (ConflictResult == 2){
1769                                         
1770                                                                         // Decided to use server version.
1771                                                 
1772                                                                         // Download server version.
1773                                                                 
1774                                                                         ConvertedV4Data.WriteFile(CreateFilenamePath(AccountDirFinal, vCardAdd[vi]));
1775                                                 
1776                                                                         iter->second = 4;
1777                                         
1778                                                                 }
1779                                 
1780                                                         } else {
1781                                 
1782                                                                 // Setup the filename for the contact being added.
1783                                                         
1784                                                                 wxString wxSFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1785                                                                 wxString wxSCardData;
1786                                                                 wxString TaskData;
1787                                                                 //wxString TaskURL;
1788                                                         
1789                                                                 // Load the data from the file.
1790                                                         
1791                                                                 wxFFile wxFCard;
1792                                                                 wxFCard.Open(wxSFilename, wxT("r"));
1793                                 
1794                                                                 if (wxFCard.IsOpened()){
1795                                 
1796                                                                         wxFCard.ReadAll(&wxSCardData, wxConvAuto());
1797                                                                         wxFCard.Close();
1798                                 
1799                                                                 }
1800                                                         
1801                                                                 // Convert the data to v3.
1802                                                         
1803                                                                 vCard34Conv vCard34Obj;
1804                                                         
1805                                                                 vCard34Obj.ConvertToV3(wxSFilename, &TaskData);
1806                                                         
1807                                                                 // Setup the URL address.
1808                                                         
1809                                                                 //TaskURL = StringTaskDetailIter->second + wxT("/") + vCardAdd[vi];
1811                                                                 // Upload the data to the server.
1812                                         
1813                                                                 ConnHandle.SetUploadMode(TRUE);
1814                                                                 ConnHandle.SetupData(wxT("PUT"), vCardAdd[vi], TaskData);
1815                                                                 ConnHandle.ProcessData();
1816                                                         
1817                                                                 // Get the Server ETag and put it in the ETag database.
1818                                                         
1819                                                                 ConnHandle.SetServerFilename(vCardAdd[vi]);
1820                                                                 ConnHandle.GetServerETagValueThread();
1821                                                                 ETagServer = ConnHandle.ETagValueResult();
1822                                 
1823                                                                 ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer);
1824                                 
1825                                                         }
1826                         
1827                                                 } else {
1828                         
1829                                                         if (ETagOriginal != ETagServer){
1830                                 
1831                                                                 // Server ETag is different from original ETag.
1832                                                                 // This is a conflict which the user will now
1833                                                                 // need to resolve.
1834                                         
1835                                                                 frmMain *frmMainPtrGet = (frmMain *)frmMainPtr;
1836                                         
1837                                                                 //ContactConflictEvent event(ContactConflictCmdEnv);
1838                                                                 //event.SetData(ContactFilename, Moo1, Moo2);
1839                                         
1840                                                                 vCard34Conv vCard34Obj;
1841                                                 
1842                                                                 wxString ServerContactData;
1843                                                                 vCard ClientData;
1844                                                                 vCard ConvertedV4Data;
1845                                         
1846                                                                 // Load the client data from the filename given.
1847                                         
1848                                                                 ConnHandle.GetServerContactData();
1849                                                                 ServerContactData = ConnHandle.GetPageData();
1850                                                                 ClientData.LoadFile(FullFilename);
1851                                                 
1852                                                                 // Process v3 version into v4 version.
1853                                                 
1854                                                                 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1855                                         
1856                                                                 vCardConflictObj vCardProcData;
1857                                         
1858                                                                 vCardProcData.vCardLocalData = &ClientData;
1859                                                                 vCardProcData.vCardServerData = &ConvertedV4Data;
1860                                         
1861                                                                 bool *PauseMode = new bool;
1862                                                                 int ConflictResult;
1863                                                                 QRNotif qrn;
1865                                                                 *PauseMode = TRUE;                                              
1866                                                                 qrn.QResponse = &ConflictResult;
1867                                                                 qrn.PausePtr = PauseMode;
1868                                                 
1869                                                                 vCardProcData.QRNotifData = &qrn;
1870                                         
1871                                                                 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1872                                                                 event.SetClientData(&vCardProcData);
1873                                                                 wxPostEvent(frmMainPtrGet, event);
1874                                         
1875                                                                 /*timespec n1, n2;
1876                                                 
1877                                                                 n1.tv_sec = 0;
1878                                                                 n1.tv_nsec = 250000000L;*/
1879                                         
1880                                                                 while (*PauseMode == TRUE){
1881                                                                         //nanosleep(&n1, &n2);
1882                                                                         SleepFor(250000000);
1883                                                                 }
1884                                         
1885                                                                 delete PauseMode;
1886                                                                 PauseMode = NULL;
1887                                         
1888                                                                 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
1889                                         
1890                                                                 if (ConflictResult == 0){
1891                                         
1892                                                                         // Decide Later.
1893                                         
1894                                                                         iter->second = 4;
1895                                                                         continue;
1896                                         
1897                                                                 } else if (ConflictResult == 1){
1898                                         
1899                                                                         // Decided to use client version.
1900                                                                 
1901                                                                         ConnHandle.ProcessData();
1902                                                                         //ETagServer = CardDAVIter->second.GetServerETagValueThread();
1903                                                                         //ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
1904                                                 
1905                                                                         iter->second = 4;
1906                                         
1907                                                                 } else if (ConflictResult == 2){
1908                                         
1909                                                                         // Decided to use server version.
1910                                                 
1911                                                                         // Write server version to file.
1912                                                                 
1913                                                                         ConvertedV4Data.WriteFile(CreateFilenamePath(AccountDirFinal, vCardAdd[vi]));
1914                                                 
1915                                                                         iter->second = 4;
1916                                         
1917                                                                 }
1918                                 
1919                                                         } else {
1920                                 
1921                                                                 // Setup the filename for the contact being added.
1922                                                         
1923                                                                 wxString wxSFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
1924                                                                 wxString wxSCardData;
1925                                                                 wxString TaskData;
1926                                                                 //wxString TaskURL;
1927                                                         
1928                                                                 // Load the data from the file.
1929                                                         
1930                                                                 wxFFile wxFCard;
1931                                                                 wxFCard.Open(wxSFilename, wxT("r"));
1932                                 
1933                                                                 if (wxFCard.IsOpened()){
1934                                 
1935                                                                         wxFCard.ReadAll(&wxSCardData, wxConvAuto());
1936                                                                         wxFCard.Close();
1937                                 
1938                                                                 }
1939                                                         
1940                                                                 // Convert the data to v3.
1941                                                         
1942                                                                 vCard34Conv vCard34Obj;
1943                                                         
1944                                                                 vCard34Obj.ConvertToV3(wxSFilename, &TaskData);
1945                                                         
1946                                                                 // Setup the URL address.
1947                                                         
1948                                                                 //TaskURL = StringTaskDetailIter->second + wxT("/") + vCardAdd[vi];
1950                                                                 // Upload the data to the server.
1951                                         
1952                                                                 ConnHandle.SetUploadMode(TRUE);
1953                                                                 ConnHandle.SetupData(wxT("PUT"), vCardAdd[vi], TaskData);
1954                                                                 ConnHandle.ProcessData();
1955                                                         
1956                                                                 // Get the Server ETag and put it in the ETag database.
1957                                                         
1958                                                                 ConnHandle.SetServerFilename(vCardAdd[vi]);
1959                                                                 ConnHandle.GetServerETagValueThread();
1960                                                                 ETagServer = ConnHandle.ETagValueResult();
1961                                 
1962                                 
1963                                                                 ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer);
1964                                 
1965                                                         }
1966                                         
1967                                                 }
1969                                         }                       
1970                                 
1971                                         // Process the vCards to delete locally.
1972                                 
1973                                         for (int vi = 0; vi < vCardDelete.GetCount(); vi++){
1975                                                 if (!wxRemoveFile(CreateFilenamePath(AccountDirFinal, vCardDelete[vi]))){
1977                                                 } else {
1978                                         
1979                                                         ETagDBPtr->RemoveETag(vCardDelete[vi]);
1980                                         
1981                                                 }
1983                                         }
1984                                 
1985                                         // Process the vCards to delete from the server.
1986                                 
1987                                         std::map<wxString,wxString> *ETagFilenameMap = ETagDBPtr->GetFilenamePointer();
1988                                         std::list<wxString> DeleteList;
1989                                 
1990                                         for (std::map<wxString,wxString>::iterator deliter = ETagFilenameMap->begin();
1991                                                 deliter != ETagFilenameMap->end(); deliter++){
1992                                 
1993                                                 // Look through the ETagDB and find contacts which are marked as DELETED.
1994                                         
1995                                                 if (deliter->second == wxT("DELETED")){
1997                                                         ConnHandle.SetUploadMode(FALSE);
1998                                                         ConnHandle.SetupData(wxT("DELETE"), deliter->first, wxT(""));
1999                                                         ConnHandle.ProcessDataThread();
2000                                         
2001                                                         // Delete the ETag as the file has now been deleted.
2002                                         
2003                                                         DeleteList.push_back(deliter->first);
2004                                         
2005                                                 }
2006                                 
2007                                         }
2008                                         
2009                                         for (std::list<wxString>::iterator removeetagiter = DeleteList.begin();
2010                                              removeetagiter != DeleteList.end(); removeetagiter++){
2011                                         
2012                                                 ETagDBPtr->RemoveETag(*removeetagiter);
2013                                                 
2014                                         }
2015                                 
2016                                         // Write out the update server sync token.
2018                                         wxString ServerSyncToken = ServerContactList.SyncToken;
2019                                 
2020                                         ServerSyncToken.Trim();
2021                                 
2022                                         if (!ServerSyncToken.IsEmpty()){
2023                                 
2024                                                 wxFFile SyncWrite;
2025                                                 SyncWrite.Open(AccountSyncTokenFilename, wxT("w"));
2026                                 
2027                                                 if (SyncWrite.IsOpened()){
2028                                 
2029                                                         SyncWrite.Write(ServerSyncToken, wxConvAuto());
2030                                                         SyncWrite.Close();
2031                                 
2032                                                 }
2033                                 
2034                                         }
2035                                 
2036                                         // Check for another sync token. If there is another 
2037                                         // sync token then repeat this. If token matches then stop processing.
2038                                 
2039                                         if (SyncTokenLoad == ServerSyncToken){
2040                                         
2041                                                 KeepUpdating = FALSE;
2042                                         
2043                                         }
2044                                         
2045                                 }
2046                                 
2047                                 // Mark as completed.
2048                         
2049                                 wxString AccountNameFinal;
2050                                 AccountNameFinal = PrefData.accounts.GetAccountDirectory(AccountID);
2051                                 AccountNameFinal.Append(wxT(".carddav"));
2052                                 
2053                                 wxCommandEvent reloadevent(RELOADCONTACTLIST);
2054                                 reloadevent.SetString(AccountNameFinal);
2055                                 wxPostEvent(this->GetParent(), reloadevent);
2056                                 
2057                                 iter->second = 4;
2058                                 continue;
2059                         
2060                         } else {
2061                         
2062                                 // Update the data to the server.
2063                                         
2064                                 ConnHandle.ProcessData();
2065                                 iter->second = 4;
2066                                 continue;
2067                         
2068                         }
2070                         /*timespec n1, n2;
2071                                                 
2072                         n1.tv_sec = 0;
2073                         n1.tv_nsec = 250000000L;*/
2075                         while (iter->second == 1){
2077                                 SleepFor(250000000);
2078                                 //nanosleep(&n1, &n2);
2079         
2080                         }
2081                         
2082                         if ((iter->second == 4 && TypeIter->second == 0) || 
2083                         (iter->second == 8 && TypeIter->second == 0)){
2085                                 AccountDir = StringAccountIter->second;
2086                                 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
2087                                 
2088                                 ConnHandle.GetServerETagValueThread();
2089                                 ETagServer = ConnHandle.ETagValueResult();
2090                                 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
2091                         
2092                         }
2093                         
2094                         if ((iter->second == 4 && TypeIter->second == 1) || 
2095                         (iter->second == 8 && TypeIter->second == 1)){
2096                         
2097                                 AccountDir = StringAccountIter->second;
2098                                 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);                 
2100                                 ConnHandle.GetServerETagValueThread();
2101                                 ETagServer = ConnHandle.ETagValueResult();
2102                                 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
2103                         
2104                         }
2105                         
2106                         break;
2107                         
2108                 }
2110         }
2111         
2112         if (TasksFoundProc == FALSE){
2113         
2114                 TasksActive = FALSE;
2115                 ProcessTasksData = FALSE;
2116         
2117         } else {
2119                 wxCommandEvent eventp(ACTMGR_STARTTIMER);
2120                 wxPostEvent(this, eventp);
2122                 //AnimationTimer.StartAnimation();
2123                 //ActListProcTimer.Start();
2124         
2125         }
2126         
2127         wxCommandEvent event(ACTMGR_STARTPROCESSTIMER);
2128         wxPostEvent(this, event);
2130         //ActProcessTimer.Start();
2134 void frmActivityMgr::ProcessTasks()
2136         
2137         std::thread ProcessThread(&frmActivityMgr::ProcessTasksThread, this);
2138         ProcessThread.detach();
2142 void frmActivityMgr::SetupPointers(wxETagProcessTimer *ETagTmrPtrInc, void *frmMainPtrInc)
2145         ETagTmrPtr = ETagTmrPtrInc;
2146         
2147         frmMainPtr = frmMainPtrInc;
2151 void frmActivityMgr::ResumeProcessing(wxCommandEvent &event){
2153         QRNotif *qrn = (QRNotif *)event.GetClientData(); 
2154         
2155         int *QRes = qrn->QResponse;
2157         *qrn->PausePtr = FALSE;
2159         *QRes = event.GetInt();
2160         
2163 void frmActivityMgr::ToggleConnectionStatus( wxCommandEvent &event ){
2165         wxCommandEvent connevent(CONNSTAT_UPDATE);
2166         
2167         if (ApplicationSleepMode == FALSE){
2168         
2169                 connevent.SetInt(1);
2170                 ApplicationSleepMode = TRUE;
2171                 mnuSleepMode->Check(true);
2172         
2173         } else {
2174         
2175                 connevent.SetInt(0);
2176                 ApplicationSleepMode = FALSE;
2177                 mnuSleepMode->Check(false);
2178                 
2179                 wxCommandEvent event(ACTMGR_STARTTIMER);
2180                 wxPostEvent(this, event);
2182                 wxCommandEvent eventp(ACTMGR_STARTPROCESSTIMER);
2183                 wxPostEvent(this, eventp);
2184         
2185         }
2187         wxPostEvent(GetParent(), connevent);
2191 void frmActivityMgr::SleepMode( wxCommandEvent &event ){
2192         
2193         wxCommandEvent connevent(ACTMGR_TOGGLECONN);
2194         
2195         wxPostEvent(this, connevent);
2196         
2199 void frmActivityMgr::WriteServerCertificate(wxString AccountName, SSLCertCollection SSLCertInc){
2201         wxString ServerCertFinal;
2203         // Get the Cert section of the certificate and write it to the file.
2205         ServerCertFinal = GetAccountDir(AccountName, TRUE);
2207         wxFile CertFile;
2208         
2209         std::map<int, SSLCertData>::iterator SSLCDIter = SSLCertInc.SSLCollection.find(0);
2210         std::multimap<wxString,wxString>::iterator SSLDataIter = SSLCDIter->second.CertData.find(wxT("Cert"));
2211         
2212         CertFile.Open(ServerCertFinal, wxFile::write);  
2213         
2214         CertFile.Write(SSLDataIter->second, wxConvUTF8);
2215         CertFile.Close();
2219 void frmActivityMgr::StartTimer(wxCommandEvent& event){
2221         ActListProcTimer.Start(1000, FALSE);
2225 void frmActivityMgr::StopTimer(wxCommandEvent& event){
2227         ActListProcTimer.Stop();
2231 void frmActivityMgr::StartProcessTimer(wxCommandEvent& event){
2233         ActProcessTimer.Start(1000, FALSE);
2237 void frmActivityMgr::StopProcessTimer(wxCommandEvent& event){
2239         ActProcessTimer.Stop();
2243 void frmActivityMgr::StartAnimationTimer(wxCommandEvent& event){
2244         
2245         AnimationTimer.StartAnimation();
2246         
2249 void frmActivityMgr::UpdateStatusLabel(wxCommandEvent& event){
2251         ActivityMgrLabelUpdate *actmgrudata = (ActivityMgrLabelUpdate*)event.GetClientData();
2252         
2253         if (actmgrudata != NULL){
2254         
2255                 lstActivity->SetItem(actmgrudata->ItemIndex, 2, actmgrudata->ItemLabel);
2256         
2257                 /*if (!actmgrudata->ItemDes.IsEmpty()){
2258                 lstActivity->SetItem(actmgrudata->ItemIndex, 0, actmgrudata->ItemDes);
2259                 }*/
2260         
2261                 delete actmgrudata;
2262                 actmgrudata = NULL;
2263         
2264         }
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