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