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