1 // frmActivityMgr.cpp - Activity Manager form.
3 // (c) 2012-2015 Xestia Software Development.
5 // This file is part of Xestia Address Book.
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.
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.
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>
23 #include <wx/tokenzr.h>
25 #include <wx/filefn.h>
28 #include <curl/curl.h>
30 #include "../bitmaps.h"
32 #include "../common/preferences.h"
33 #include "../frmConflictResolution.h"
34 #include "../frmInvalidSSLCertificate.h"
35 #include "../frmMain.h"
36 #include "../common/events.h"
37 #include "../common/filename.h"
38 #include "../vcard/vcard34conv.h"
39 #include "../vcard/vcard.h"
41 DEFINE_EVENT_TYPE(ACTMGR_RESUMEPROC);
42 DEFINE_EVENT_TYPE(ACTMGR_TOGGLECONN);
43 DEFINE_EVENT_TYPE(ACTMGR_STARTTIMER);
44 DEFINE_EVENT_TYPE(ACTMGR_STOPTIMER);
45 DEFINE_EVENT_TYPE(ACTMGR_STARTPROCESSTIMER);
46 DEFINE_EVENT_TYPE(ACTMGR_STOPPROCESSTIMER);
47 DEFINE_EVENT_TYPE(ACTMGR_UPDATESTATUSLABEL);
48 DEFINE_EVENT_TYPE(ACTMGR_STARTANIMATIONTIMER);
50 BEGIN_EVENT_TABLE(frmActivityMgr, wxWindow)
51 EVT_COMMAND(wxID_ANY, ACTMGR_RESUMEPROC, frmActivityMgr::ResumeProcessing)
52 EVT_COMMAND(wxID_ANY, ACTMGR_TOGGLECONN, frmActivityMgr::ToggleConnectionStatus)
53 EVT_COMMAND(wxID_ANY, ACTMGR_STARTTIMER, frmActivityMgr::StartTimer)
54 EVT_COMMAND(wxID_ANY, ACTMGR_STOPTIMER, frmActivityMgr::StopTimer)
55 EVT_COMMAND(wxID_ANY, ACTMGR_STARTPROCESSTIMER, frmActivityMgr::StartProcessTimer)
56 EVT_COMMAND(wxID_ANY, ACTMGR_STOPPROCESSTIMER, frmActivityMgr::StopProcessTimer)
57 EVT_COMMAND(wxID_ANY, ACTMGR_UPDATESTATUSLABEL, frmActivityMgr::UpdateStatusLabel)
58 EVT_COMMAND(wxID_ANY, ACTMGR_STARTANIMATIONTIMER, frmActivityMgr::StartAnimationTimer)
61 frmActivityMgr::frmActivityMgr( wxWindow* parent )
63 frmActivityMgrADT( parent )
66 wxMemoryInputStream istream(icons_activitywindow_png, sizeof(icons_activitywindow_png));
67 wxImage icons_activitywindow_pngi(istream, wxBITMAP_TYPE_PNG);
68 wxBitmap activityiconbmp(icons_activitywindow_pngi, -1);
70 activityicon.CopyFromBitmap(activityiconbmp);
71 this->SetIcon(activityicon);
73 wxMemoryInputStream istream2(misc_activitysleep_png, sizeof(misc_activitysleep_png));
74 wxImage misc_activitysleep_pngi(istream2, wxBITMAP_TYPE_PNG);
75 wxBitmap sleepiconbmp(misc_activitysleep_pngi, -1);
76 SleepBitmap = sleepiconbmp;
77 bmpActivity->SetBitmap(SleepBitmap);
78 ActProcessTimer.SetupPointers(this);
79 lblDetails->SetLabel(_("No activity."));
81 ActListProcTimer.SetupPointers(&ActivityList, &ActivityListIndex, &ActivityListTaskDetail,
82 &TasksActive, lstActivity, lblDetails, GauProgress, this, &AnimationTimer,
83 &ActProcessTimer, &ActivityListFinDate, &ActivityListConn);
85 AnimationTimer.SetBitmap(bmpActivity);
86 AnimationTimer.SetSleepBitmap(&SleepBitmap);
87 AnimationTimer.SetupPointer(this->GetParent());
89 wxListItem ColumnData;
91 ColumnData.SetText(_("Activity"));
92 ColumnData.SetWidth(175);
93 lstActivity->InsertColumn(0, ColumnData);
95 wxListItem ColumnData2;
97 ColumnData2.SetText(_("Account"));
98 ColumnData2.SetWidth(100);
99 lstActivity->InsertColumn(1, ColumnData2);
101 wxListItem ColumnData3;
102 ColumnData3.SetId(2);
103 ColumnData3.SetText(_("Status"));
104 ColumnData3.SetWidth(100);
105 lstActivity->InsertColumn(2, ColumnData3);
107 //AnimationTimer.StartAnimation();
109 // Create recovery database if it doesn't exist.
111 wxString RecoveryFilename = GetRecoveryDB();
115 if (wxFile::Exists(RecoveryFilename) == FALSE){
117 // Create the recovery database.
119 RecoveryDB.Open(RecoveryFilename.c_str(), wxFile::write);
121 RecoveryDB.Write(wxT("BEGIN:XAB-RECOVERYDB\r\n"), wxConvUTF8);
122 RecoveryDB.Write(wxT("VERSION:1.0\r\n"), wxConvUTF8);
123 RecoveryDB.Write(wxT("COMMENT:Please do not alter or delete this file. DATA LOSS IS POSSIBLE!\r\n"), wxConvUTF8);
124 RecoveryDB.Write(wxT("END:XAB-RECOVERYDB\r\n"), wxConvUTF8);
131 #if wxABI_VERSION < 20900
132 RecoveryDBF.Open(RecoveryFilename.c_str(), wxT("r"));
134 RecoveryDBF.Open(RecoveryFilename, wxT("r"));
137 // Load the recovery database for tasks not done.
139 if (RecoveryDBF.IsOpened() == TRUE){
141 wxString wxSRecoveryDB;
142 wxString RecoveryLine;
144 // Check if we are using wxWidgets version 2.8 or less and
145 // execute the required command accordingly.
147 RecoveryDBF.ReadAll(&wxSRecoveryDB, wxConvAuto());
151 std::map<int, wxString> RecoveryFileLines;
152 std::map<int, wxString>::iterator striter;
154 wxStringTokenizer wSTRecoveryDBLines(wxSRecoveryDB, wxT("\r\n"));
156 int RecoveryLineSeek = 0;
158 while (wSTRecoveryDBLines.HasMoreTokens() == TRUE){
160 RecoveryLine = wSTRecoveryDBLines.GetNextToken();
161 RecoveryFileLines.insert(std::make_pair(RecoveryLineSeek, RecoveryLine));
170 //TestTimer.Start(50, FALSE);
173 void frmActivityMgr::OpenWindow()
178 void frmActivityMgr::CloseWindow( wxCommandEvent& event )
184 void frmActivityMgr::CloseWindow( wxCloseEvent& event )
190 void frmActivityMgr::ProcessTasksThread()
193 if (ProcessTasksData == FALSE){
199 if (ApplicationSleepMode == TRUE){
205 std::map<int,int>::iterator TypeIter;
206 std::map<int,wxString>::iterator StringIter;
207 std::map<int,wxString>::iterator StringDataIter;
208 std::map<int,wxString>::iterator StringURLIter;
209 std::map<int,wxString>::iterator StringDetailIter;
210 std::map<int,wxString>::iterator StringAccountIter;
211 std::map<int,wxString>::iterator StringFilenameIter;
212 std::map<int,wxString>::iterator StringFullFilenameIter;
213 std::map<int,wxString>::iterator StringTaskDetailIter;
214 std::map<int,wxString>::iterator StringETagIter;
215 std::map<int,wxString>::iterator StringETagOrigIter;
216 std::map<int,CardDAV*>::iterator CardDAVIter;
217 std::map<int,ConnectionObject*>::iterator ConnObjectIter;
218 std::map<int,ActivityMgrAccountSettings>::iterator AccountSettingsIter;
219 std::map<int,long>::iterator LongIter;
220 bool TasksFoundProc = FALSE;
223 for (std::map<int,int>::iterator iter = ActivityList.begin();
224 iter != ActivityList.end(); ++iter){
226 // Check for any queued tasks and start one.
228 if (iter->second > 4){
232 wxCommandEvent StartAnimationEvent(ACTMGR_STARTANIMATIONTIMER);
234 wxPostEvent(this, StartAnimationEvent);
236 // Start the animation timer if it hasn't started.
238 CardDAVIter = ActivityListConn.find(iter->first);
239 ConnObjectIter = ActivityListConnObject.find(iter->first);
240 TypeIter = ActivityListType.find(iter->first);
241 StringETagIter = ActivityListETag.find(iter->first);
242 StringETagOrigIter = ActivityListETagOriginal.find(iter->first);
243 StringAccountIter = ActivityListAccount.find(iter->first);
244 StringFilenameIter = ActivityListFilename.find(iter->first);
245 StringFullFilenameIter = ActivityListFullFilename.find(iter->first);
246 AccountSettingsIter = ActivityListAccSettings.find(iter->first);
248 // Setup the CardDAV object.
252 ConnHandle.SetupConnection(AccountSettingsIter->second.Address,
253 AccountSettingsIter->second.Port,
254 AccountSettingsIter->second.Username,
255 AccountSettingsIter->second.Password,
256 AccountSettingsIter->second.SSL,
257 AccountSettingsIter->second.Prefix,
258 AccountSettingsIter->second.Dir);
259 ConnHandle.SetupVariables(&ActivityList, iter->first);
260 ConnHandle.SetupResultBools(&BlankBool, &BlankBool);
267 // 5 = Failed (UI Updated).
268 // 6 = Stopped (UI Updated).
269 // 7 = (Reserved) (UI Updated).
270 // 8 = Completed. (UI Updated).
272 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
273 XABPreferences PrefData(GetUserPrefDir());
275 if (iter->second == 0){
277 //CardDAVIter->second.
279 // Wait for process to finish.
282 TasksFoundProc = TRUE;
284 wxString ETagOriginal;
287 wxString ContactFilename;
288 wxString FullFilename;
290 bool EditMode = FALSE;
294 // Compare the ETags and work out if a conflict has occured.
296 if (TypeIter->second == 0){
300 StringDataIter = ActivityListData.find(iter->first);
301 StringURLIter = ActivityListURL.find(iter->first);
303 AccountDir = StringAccountIter->second;
304 ContactFilename = StringFilenameIter->second;
305 wxString AccountNameFriendly;
309 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
311 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
313 AccountDirCheck.Trim();
314 AccountDirCheck.Append(wxT(".carddav"));
316 if (AccountDirCheck == StringAccountIter->second){
318 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
325 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
327 ETag = StringETagIter->second;
328 ETagOriginal = StringETagOrigIter->second;
329 AccountDir = StringAccountIter->second;
330 ContactFilename = StringFilenameIter->second;
331 FullFilename = StringFullFilenameIter->second;
332 EditMode = ActivityListEditMode.find(iter->first)->second;
334 bool KeepUpdating = true;
336 while(KeepUpdating == true){
338 COConnectResult ConnectResponse = ConnObjectIter->second->Connect(false);
340 bool ExitLoop = false;
342 while (ExitLoop == false){
344 if (ConnObjectIter->second->SSLVerify() == COSSL_UNABLETOVERIFY){
346 frmMainPtrGet->PauseAllTimers();
348 #if defined(__APPLE__)
349 #elif defined(__WIN32__)
352 bool UsingSSLBypass = false;
355 // Connect again and fetch SSL certificate information.
357 ConnObjectIter->second->BypassSSLVerification(true);
359 COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false);
361 ConnObjectIter->second->BypassSSLVerification(false);
363 SSLInvalidCertNotifObjString SSLICNProcData;
365 SSLCertCollectionString certcol = ConnObjectIter->second->BuildSSLCollection();
367 bool *PauseMode = new bool;
371 qrn.QResponse = &SSLResult;
372 qrn.PausePtr = PauseMode;
374 SSLICNProcData.CertCollection = certcol;
375 SSLICNProcData.QRNotifData = &qrn;
376 SSLICNProcData.AccountName = AccountNameFriendly;
378 wxCommandEvent event(INVALIDSSLCERTSTRING);
379 event.SetClientData(&SSLICNProcData);
380 wxPostEvent(frmMainPtrGet, event);
382 while (*PauseMode == TRUE){
383 //nanosleep(&n1, &n2);
387 // Process the response from the user.
391 // Accept the Certificate.
393 UsingSSLBypass = true;
394 ConnObjectIter->second->BypassSSLVerification(true);
396 COConnectResult TestConnectionResult = ConnObjectIter->second->Connect(true);
397 WriteServerCertificate(AccountDir, certcol);
399 ConnObjectIter->second->BypassSSLVerification(false);
401 } else if (SSLResult == 2){
403 // Reject the certificate, abort the task and mark as failed.
412 frmMainPtrGet->ResumeAllTimers();
415 } else if (ConnectResponse == COCONNECT_AUTHFAIL){
417 ConnectResponse = ConnObjectIter->second->Connect(true);
419 if (ConnectResponse == COCONNECT_OK){
432 } else if (ConnectResponse == COCONNECT_OK){
434 ConnectResponse = ConnObjectIter->second->Connect(true);
449 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
453 #if defined(__APPLE__)
455 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
457 #elif defined(__WIN32__)
459 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
463 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
467 COServerResponse AddContactResponse = ConnObjectIter->second->AddContact(StringURLIter->second.ToStdString(),
468 StringDataIter->second.ToStdString());
470 if (AddContactResponse.RequestResult != COREQUEST_OK){
475 /*while (ExitLoop == FALSE){
477 // Verify that we have a trusted SSL connection first.
479 int ErrorCode = ConnHandle.SSLVerifyTest();
481 if (ErrorCode != CURLE_OK){
483 if (ErrorCode == CURLE_SSL_CACERT ||
484 ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
485 ErrorCode == CURLE_SSL_CONNECT_ERROR){
487 // Invalid SSL certificate so bring up a dialog to the user
488 // explaining what has happened and the options available.
490 // Stop all the timers.
492 frmMainPtrGet->PauseAllTimers();
496 #if defined(__APPLE__)
498 // Bring up the trust panel and display the SSL certificate dialog.
500 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
502 // Update the SSL account with the trust object.
504 if (SSLResult != NSOKButton){
506 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
512 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
517 #elif defined(__WIN32__)
519 BOOL ModifiedCertificateData;
520 CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle());
522 if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){
523 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
526 if (ModifiedCertificateData == FALSE){
528 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateContextPointer());
534 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
540 // Setup the data to be sent in the wxPostEvent command.
542 SSLInvalidCertNotifObj SSLICNProcData;
544 SSLCertCollection certcol = ConnHandle.GetSSLVerifyResults();
546 bool *PauseMode = new bool;
550 qrn.QResponse = &SSLResult;
551 qrn.PausePtr = PauseMode;
553 SSLICNProcData.CertCollection = certcol;
554 SSLICNProcData.QRNotifData = &qrn;
555 SSLICNProcData.AccountName = AccountNameFriendly;
557 wxCommandEvent event(INVALIDSSLCERT);
558 event.SetClientData(&SSLICNProcData);
559 wxPostEvent(frmMainPtrGet, event);
561 while (*PauseMode == TRUE){
562 //nanosleep(&n1, &n2);
566 // Process the response from the user.
570 // Accept the certificate. Write the certificate into the account
571 // directory (as server.crt) - will overwrite old certificate.
573 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
574 WriteServerCertificate(AccountDir, ConnHandle.GetCertificateData());
576 } else if (SSLResult == 2){
578 // Reject the certificate, abort the task and mark as failed.
580 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateData());
588 // Resume all the timers.
590 frmMainPtrGet->ResumeAllTimers();
608 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
612 #if defined(__APPLE__)
614 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
616 #elif defined(__WIN32__)
618 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
622 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateData());
626 ConnHandle.SetUploadMode(TRUE);
627 ConnHandle.SetupData(wxT("PUT"), StringURLIter->second, StringDataIter->second);
628 ConnHandle.SetEditMode(EditMode);
629 ConnHandle.ProcessData();
631 int ErrorCode = ConnHandle.GetResultCode();
633 if (ErrorCode != CURLE_OK){
640 // Add contact to the ETag DB.
642 ConnHandle.GetServerETagValueThread();
643 ETagServer = ConnHandle.ETagValueResult();*/
645 // TODO: Get the entity tag for the new contact.
647 COServerResponse ETagGetResponse = ConnObjectIter->second->GetServerEntityTagValue(StringURLIter->second.ToStdString());
649 if (ETagGetResponse.RequestResult != COREQUEST_OK){
654 ETagDBPtr->AddETag(ContactFilename, ETagGetResponse.EntityTag, ETagGetResponse.EntityTag);
661 } else if (TypeIter->second == 1){
665 StringDataIter = ActivityListData.find(iter->first);
666 StringURLIter = ActivityListURL.find(iter->first);
668 AccountDir = StringAccountIter->second;
669 ContactFilename = StringFilenameIter->second;
670 wxString AccountNameFriendly;
674 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
676 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
678 AccountDirCheck.Trim();
679 AccountDirCheck.Append(wxT(".carddav"));
681 if (AccountDirCheck == StringAccountIter->second){
683 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
690 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
692 ETag = StringETagIter->second;
693 ETagOriginal = StringETagOrigIter->second;
694 AccountDir = StringAccountIter->second;
695 ContactFilename = StringFilenameIter->second;
696 FullFilename = StringFullFilenameIter->second;
697 EditMode = ActivityListEditMode.find(iter->first)->second;
699 bool KeepUpdating = true;
701 while(KeepUpdating == true){
703 COConnectResult ConnectResponse = ConnObjectIter->second->Connect(false);
705 bool ExitLoop = false;
707 while(ExitLoop == false){
709 if (ConnObjectIter->second->SSLVerify() == COSSL_UNABLETOVERIFY){
711 frmMainPtrGet->PauseAllTimers();
713 #if defined(__APPLE__)
714 #elif defined(__WIN32__)
717 bool UsingSSLBypass = false;
720 // Connect again and fetch SSL certificate information.
722 ConnObjectIter->second->BypassSSLVerification(true);
724 COConnectResult ConnectionSSLResult = ConnObjectIter->second->Connect(false);
726 ConnObjectIter->second->BypassSSLVerification(false);
728 SSLInvalidCertNotifObjString SSLICNProcData;
730 SSLCertCollectionString certcol = ConnObjectIter->second->BuildSSLCollection();
732 bool *PauseMode = new bool;
736 qrn.QResponse = &SSLResult;
737 qrn.PausePtr = PauseMode;
739 SSLICNProcData.CertCollection = certcol;
740 SSLICNProcData.QRNotifData = &qrn;
741 SSLICNProcData.AccountName = AccountNameFriendly;
743 wxCommandEvent event(INVALIDSSLCERTSTRING);
744 event.SetClientData(&SSLICNProcData);
745 wxPostEvent(frmMainPtrGet, event);
747 while (*PauseMode == TRUE){
748 //nanosleep(&n1, &n2);
752 // Process the response from the user.
756 // Accept the Certificate.
758 UsingSSLBypass = true;
759 ConnObjectIter->second->BypassSSLVerification(true);
761 COConnectResult TestConnectionResult = ConnObjectIter->second->Connect(true);
762 WriteServerCertificate(AccountDir, certcol);
764 ConnObjectIter->second->BypassSSLVerification(false);
766 } else if (SSLResult == 2){
768 // Reject the certificate, abort the task and mark as failed.
777 frmMainPtrGet->ResumeAllTimers();
780 } else if (ConnectResponse == COCONNECT_AUTHFAIL){
782 ConnectResponse = ConnObjectIter->second->Connect(true);
784 if (ConnectResponse == COCONNECT_OK){
797 } else if (ConnectResponse == COCONNECT_OK){
799 ConnectResponse = ConnObjectIter->second->Connect(true);
814 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
818 COServerResponse ETagGetResponse = ConnObjectIter->second->GetServerEntityTagValue(StringURLIter->second.ToStdString());
820 if (ETagGetResponse.RequestResult != COREQUEST_OK){
825 ETagServer = ETagGetResponse.EntityTag;
827 // Compare the ETag with the Server ETag.
829 std::cout << ETagOriginal << std::endl;
830 std::cout << ETagServer << std::endl;
832 if (ETagOriginal != ETagServer){
834 // Server ETag is different from original ETag.
835 // This is a conflict which the user will now
838 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
840 vCard34Conv vCard34Obj;
842 std::string ServerContactData;
843 wxString wxStringServerContactData;
845 vCard ConvertedV4Data;
847 // Load the client data from the filename given.
849 //ConnHandle.GetServerContactData();
850 //ServerContactData = ConnHandle.GetPageData();
852 COServerResponse GetContactResponse = ConnObjectIter->second->GetContact(StringURLIter->second.ToStdString(),
855 if (GetContactResponse.RequestResult != COREQUEST_OK){
860 wxStringServerContactData = wxString::FromUTF8((const char*)ServerContactData.c_str());
862 // Process v3 version into v4 version.
864 vCard34Obj.ConvertToV4(&wxStringServerContactData, &ConvertedV4Data);
866 vCardConflictObj vCardProcData;
868 vCardProcData.vCardLocalData = &ClientData;
869 vCardProcData.vCardServerData = &ConvertedV4Data;
870 ClientData.LoadFile(FullFilename);
872 // Setup Conflict Resolution Dialog.
874 // Fetch Data from Server and convert.
876 bool *PauseMode = new bool;
881 qrn.QResponse = &ConflictResult;
882 qrn.PausePtr = PauseMode;
884 vCardProcData.QRNotifData = &qrn;
886 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
887 event.SetClientData(&vCardProcData);
888 wxPostEvent(frmMainPtrGet, event);
890 while (*PauseMode == TRUE){
897 if (ConflictResult == 0){
904 } else if (ConflictResult == 1){
906 // Decided to use client version.
908 } else if (ConflictResult == 2){
910 // Decided to use server version.
912 // Download server version.
914 ConvertedV4Data.WriteFile(FullFilename);
920 // Upload the data to the server.
922 COServerResponse EditContactResponse = ConnObjectIter->second->EditContact(StringURLIter->second.ToStdString(),
923 StringDataIter->second.ToStdString());
925 if (EditContactResponse.RequestResult != COREQUEST_OK){
932 /*while (ExitLoop == FALSE){
934 int ErrorCode = ConnHandle.SSLVerifyTest();
936 if (ErrorCode != CURLE_OK){
938 if (ErrorCode == CURLE_SSL_CACERT ||
939 ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
940 ErrorCode == CURLE_SSL_CONNECT_ERROR){
942 // Invalid SSL certificate so bring up a dialog to the user
943 // explaining what has happened and the options available.
945 // Stop all the timers.
947 frmMainPtrGet->PauseAllTimers();
951 #if defined(__APPLE__)
953 // Bring up the trust panel and display the SSL certificate dialog.
955 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
957 // Update the SSL account with the trust object.
959 if (SSLResult != NSOKButton){
961 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
967 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
971 #elif defined(__WIN32__)
973 BOOL ModifiedCertificateData;
974 CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle());
976 if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){
977 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
980 if (ModifiedCertificateData == FALSE){
982 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateContextPointer());
988 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
994 // Setup the data to be sent in the wxPostEvent command.
996 SSLInvalidCertNotifObj SSLICNProcData;
998 SSLCertCollection certcol = ConnHandle.GetSSLVerifyResults();
1000 bool *PauseMode = new bool;
1004 qrn.QResponse = &SSLResult;
1005 qrn.PausePtr = PauseMode;
1007 SSLICNProcData.CertCollection = certcol;
1008 SSLICNProcData.QRNotifData = &qrn;
1009 SSLICNProcData.AccountName = AccountNameFriendly;
1011 wxCommandEvent event(INVALIDSSLCERT);
1012 event.SetClientData(&SSLICNProcData);
1013 wxPostEvent(frmMainPtrGet, event);
1015 while (*PauseMode == TRUE){
1016 //nanosleep(&n1, &n2);
1017 SleepFor(250000000);
1020 // Process the response from the user.
1022 if (SSLResult == 1){
1024 // Accept the certificate. Write the certificate into the account
1025 // directory (as server.crt) - will overwrite old certificate.
1027 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
1028 WriteServerCertificate(AccountDir, ConnHandle.GetSSLVerifyResults());
1030 } else if (SSLResult == 2){
1032 // Reject the certificate, abort the task and mark as failed.
1034 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetSSLVerifyResults());
1042 // Resume all the timers.
1044 frmMainPtrGet->ResumeAllTimers();
1062 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
1066 #if defined(__APPLE__)
1068 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1070 #elif defined(__WIN32__)
1072 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
1076 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
1080 ConnHandle.SetUploadMode(TRUE);
1081 ConnHandle.SetupData(wxT("PUT"), StringURLIter->second, StringDataIter->second);
1082 ConnHandle.SetEditMode(EditMode);
1083 ConnHandle.GetServerETagValueThread();
1084 ETagServer = ConnHandle.ETagValueResult();
1086 int ErrorCode = ConnHandle.GetResultCode();
1088 if (ErrorCode != CURLE_OK){
1093 // Compare the ETag with the Server ETag.
1095 if (ETagOriginal != ETagServer){
1097 // Server ETag is different from original ETag.
1098 // This is a conflict which the user will now
1104 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
1106 vCard34Conv vCard34Obj;
1108 wxString ServerContactData;
1110 vCard ConvertedV4Data;
1112 // Load the client data from the filename given.
1114 ConnHandle.GetServerContactData();
1115 ServerContactData = ConnHandle.GetPageData();
1117 // Process v3 version into v4 version.
1119 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1121 vCardConflictObj vCardProcData;
1123 vCardProcData.vCardLocalData = &ClientData;
1124 vCardProcData.vCardServerData = &ConvertedV4Data;
1125 ClientData.LoadFile(FullFilename);
1127 //ContactConflictEvent event(ContactConflictCmdEnv);
1128 //event.SetData(ContactFilename, Moo1, Moo2);
1130 //wxPostEvent(frmMainPtrGet, event);
1132 // Setup Conflict Resolution Dialog.
1134 // Fetch Data from Server and convert.
1136 bool *PauseMode = new bool;
1141 qrn.QResponse = &ConflictResult;
1142 qrn.PausePtr = PauseMode;
1144 vCardProcData.QRNotifData = &qrn;
1146 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1147 event.SetClientData(&vCardProcData);
1148 wxPostEvent(frmMainPtrGet, event);
1150 while (*PauseMode == TRUE){
1151 //nanosleep(&n1, &n2);
1152 SleepFor(250000000);
1158 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
1160 if (ConflictResult == 0){
1167 } else if (ConflictResult == 1){
1169 // Decided to use client version.
1171 //ConnHandle.ProcessData();
1173 } else if (ConflictResult == 2){
1175 // Decided to use server version.
1177 // Download server version.
1179 ConvertedV4Data.WriteFile(FullFilename);
1185 // Update the data to the server.
1187 ConnHandle.ProcessData();
1191 // Update the ETag DB.
1193 //ConnHandle.GetServerETagValueThread();
1194 //ETagServer = ConnHandle.ETagValueResult();
1196 ETagGetResponse = ConnObjectIter->second->GetServerEntityTagValue(StringURLIter->second.ToStdString());
1198 if (ETagGetResponse.RequestResult != COREQUEST_OK){
1203 std::cout << "Etag Update!" << std::endl;
1204 std::cout << ETagGetResponse.EntityTag << std::endl;
1206 ETagDBPtr->UpdateETag(ContactFilename, ETagGetResponse.EntityTag, ETagGetResponse.EntityTag);
1213 } else if (TypeIter->second == 2) {
1215 // Delete the contact from the server and update the ETag DB.
1217 AccountDir = StringAccountIter->second;
1218 ContactFilename = StringFilenameIter->second;
1219 wxString AccountNameFriendly;
1223 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
1225 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
1227 AccountDirCheck.Trim();
1228 AccountDirCheck.Append(wxT(".carddav"));
1230 if (AccountDirCheck == StringAccountIter->second){
1232 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
1239 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1241 bool KeepUpdating = TRUE;
1243 while(KeepUpdating == TRUE){
1245 bool ExitLoop = FALSE;
1247 while (ExitLoop == FALSE){
1249 int ErrorCode = ConnHandle.SSLVerifyTest();
1251 if (ErrorCode != CURLE_OK){
1253 if (ErrorCode == CURLE_SSL_CACERT ||
1254 ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
1255 ErrorCode == CURLE_SSL_CONNECT_ERROR){
1257 // Invalid SSL certificate so bring up a dialog to the user
1258 // explaining what has happened and the options available.
1260 // Stop all the timers.
1262 frmMainPtrGet->PauseAllTimers();
1266 #if defined(__APPLE__)
1268 // Bring up the trust panel and display the SSL certificate dialog.
1270 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
1272 // Update the SSL account with the trust object.
1274 if (SSLResult != NSOKButton){
1276 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
1282 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1286 #elif defined(__WIN32__)
1288 BOOL ModifiedCertificateData;
1289 CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle());
1291 if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){
1292 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
1295 if (ModifiedCertificateData == FALSE){
1297 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateContextPointer());
1303 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
1309 // Setup the data to be sent in the wxPostEvent command.
1311 SSLInvalidCertNotifObj SSLICNProcData;
1313 SSLCertCollection certcol = ConnHandle.GetSSLVerifyResults();
1315 bool *PauseMode = new bool;
1319 qrn.QResponse = &SSLResult;
1320 qrn.PausePtr = PauseMode;
1322 SSLICNProcData.CertCollection = certcol;
1323 SSLICNProcData.QRNotifData = &qrn;
1324 SSLICNProcData.AccountName = AccountNameFriendly;
1326 wxCommandEvent event(INVALIDSSLCERT);
1327 event.SetClientData(&SSLICNProcData);
1328 wxPostEvent(frmMainPtrGet, event);
1332 // Fall asleep until we get an response.
1335 n1.tv_nsec = 250000000L;*/
1337 while (*PauseMode == TRUE){
1338 //nanosleep(&n1, &n2);
1339 SleepFor(250000000);
1342 // Process the response from the user.
1344 if (SSLResult == 1){
1346 // Accept the certificate. Write the certificate into the account
1347 // directory (as server.crt) - will overwrite old certificate.
1349 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
1350 WriteServerCertificate(AccountDir, ConnHandle.GetSSLVerifyResults());
1352 } else if (SSLResult == 2){
1354 // Reject the certificate, abort the task and mark as failed.
1356 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetSSLVerifyResults());
1364 // Resume all the timers.
1366 frmMainPtrGet->ResumeAllTimers();
1384 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
1388 #if defined(__APPLE__)
1390 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1392 #elif defined(__WIN32__)
1394 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
1398 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
1402 ConnHandle.SetUploadMode(FALSE);
1403 ConnHandle.SetupData(wxT("DELETE"), ContactFilename, wxT(""));
1404 ConnHandle.ProcessData();
1406 SSLCertCollection certcol = ConnHandle.GetCertificateData();
1408 // Check if any errors have occured whilst getting the data.
1410 int ErrorCode = ConnHandle.GetResultCode();
1412 if (ErrorCode != CURLE_OK){
1417 ETagDBPtr->RemoveETag(ContactFilename);
1420 CardDAVIter->second = NULL;
1425 } else if (TypeIter->second == 3) {
1427 wxString AccountNameFriendly;
1431 for (int i = 0; i < PrefData.accounts.GetCount(); i++){
1433 wxString AccountDirCheck = PrefData.accounts.GetAccountDirectory(i);
1435 AccountDirCheck.Trim();
1436 AccountDirCheck.Append(wxT(".carddav"));
1438 if (AccountDirCheck == StringAccountIter->second){
1440 AccountNameFriendly = PrefData.accounts.GetAccountName(i);
1447 bool KeepUpdating = TRUE;
1449 while (KeepUpdating == TRUE){
1451 StringTaskDetailIter = ActivityListTaskDetail.find(iter->first);
1453 AccountDir = StringAccountIter->second;
1455 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1457 wxArrayString vCardAdd;
1458 wxArrayString vCardDelete;
1459 wxArrayString vCardList;
1460 wxArrayString vCardUpdateLocal;
1461 wxArrayString vCardUpdateRemote;
1462 wxArrayString vCardUpdateLog;
1463 std::map<wxString,wxString> vCardETag;
1464 ContactListData ServerContactList;
1466 std::map<wxString,vCardDownloadDataFileClass> vCardDownloadData;
1467 //wxArrayString vCardDownload;
1468 //std::map<wxString,wxString> vCardDownloadData;
1470 // Get the list of vCard files locally.
1472 wxString AccountDirFinal;
1473 wxString AccountSyncTokenFilename;
1474 wxString SyncTokenLoad;
1476 #if defined(__HAIKU__)
1478 //preffilename = wxT("noo");
1480 #elif defined(__WIN32__)
1482 AccountDirFinal = GetAccountDir(AccountDir, FALSE);
1483 AccountSyncTokenFilename = AccountDirFinal;
1484 AccountSyncTokenFilename.Append(wxT("synctoken"));
1488 AccountDirFinal = GetAccountDir(AccountDir, FALSE);
1489 AccountSyncTokenFilename = AccountDirFinal;
1490 AccountSyncTokenFilename.Append(wxT("synctoken"));
1494 // Suppress Error Messages.
1496 wxLogNull PleaseDoNotDisturb;
1499 SyncLoad.Open(AccountSyncTokenFilename, wxT("r"));
1501 if (SyncLoad.IsOpened()){
1503 SyncLoad.ReadAll(&SyncTokenLoad, wxMBConvUTF8());
1508 // Get a list of vCard files from the server.
1510 // Get the list of vCard files from the ETagDB.
1512 std::map<wxString,ETagData> ETagDBData = ETagDBPtr->GetETagData();
1514 bool ExitLoop = FALSE;
1516 std::map<wxString,FileSyncData> *SCListData = NULL;
1518 while (ExitLoop == FALSE){
1520 // Check if any errors have occured whilst getting the data.
1522 int ErrorCode = ConnHandle.SSLVerifyTest();
1524 if (ErrorCode != CURLE_OK){
1526 if (ErrorCode == CURLE_SSL_CACERT ||
1527 ErrorCode == CURLE_PEER_FAILED_VERIFICATION ||
1528 ErrorCode == CURLE_SSL_CONNECT_ERROR){
1530 // Invalid SSL certificate so bring up a dialog to the user
1531 // explaining what has happened and the options available.
1533 // Stop all the timers.
1535 frmMainPtrGet->PauseAllTimers();
1539 #if defined(__APPLE__)
1541 // Bring up the trust panel and display the SSL certificate dialog.
1543 SSLResult = DisplayTrustPanel(ConnHandle.GetTrustObject(), AccountNameFriendly);
1545 // Update the SSL account with the trust object.
1547 if (SSLResult != NSOKButton){
1549 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetTrustObject());
1555 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1559 #elif defined(__WIN32__)
1561 BOOL ModifiedCertificateData;
1562 CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(&ConnHandle, (HWND)frmMainPtrGet->GetHandle());
1564 if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){
1565 wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
1568 if (ModifiedCertificateData == FALSE){
1570 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetCertificateContextPointer());
1576 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
1581 // Setup the data to be sent in the wxPostEvent command.
1583 SSLInvalidCertNotifObj SSLICNProcData;
1585 SSLCertCollection certcol = ConnHandle.GetSSLVerifyResults();
1587 bool *PauseMode = new bool;
1591 qrn.QResponse = &SSLResult;
1592 qrn.PausePtr = PauseMode;
1594 SSLICNProcData.CertCollection = certcol;
1595 SSLICNProcData.QRNotifData = &qrn;
1596 SSLICNProcData.AccountName = AccountNameFriendly;
1598 wxCommandEvent event(INVALIDSSLCERT);
1599 event.SetClientData(&SSLICNProcData);
1600 wxPostEvent(frmMainPtrGet, event);
1604 // Fall asleep until we get an response.
1607 n1.tv_nsec = 250000000L;*/
1609 while (*PauseMode == TRUE){
1610 //nanosleep(&n1, &n2);
1611 SleepFor(250000000);
1614 // Process the response from the user.
1616 if (SSLResult == 1){
1618 // Accept the certificate. Write the certificate into the account
1619 // directory (as server.crt) - will overwrite old certificate.
1621 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
1622 WriteServerCertificate(AccountDir, ConnHandle.GetSSLVerifyResults());
1624 } else if (SSLResult == 2){
1626 // Reject the certificate, abort the task and mark as failed.
1628 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 1, ConnHandle.GetSSLVerifyResults());
1636 // Resume all the timers.
1638 frmMainPtrGet->ResumeAllTimers();
1656 if (iter->second == 2 || iter->second == 3 || iter->second == 4){
1660 #if defined(__APPLE__)
1662 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetTrustObject());
1664 #elif defined(__WIN32__)
1666 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetCertificateContextPointer());
1670 frmMainPtrGet->UpdateSSLAccountStatus(AccountID, 0, ConnHandle.GetSSLVerifyResults());
1674 // Look in directory and see which vCards to add and delete
1677 // vCard exists but not in ETagDB - Add (and upload).
1678 // vCard missing but in ETagDB - Delete (from server).
1680 // Start by looking for vCards that are not in the ETagDB.
1682 wxDir AccDir(AccountDirFinal);
1683 wxString AccDirFilename;
1685 bool ContinueProcess = AccDir.GetFirst(&AccDirFilename, wxEmptyString, wxDIR_DEFAULT);
1687 ServerContactList = ConnHandle.GetContactList(SyncTokenLoad.ToUTF8());
1689 int ErrorCode = ConnHandle.GetResultCode();
1691 if (ErrorCode != CURLE_OK){
1698 SSLCertCollection certcol = ConnHandle.GetCertificateData();
1700 // Create a pointer for the std::map<wxString,FileSyncData>.
1702 SCListData = &ServerContactList.ListData;
1704 // Process the server data.
1706 if (SCListData != NULL){
1708 for (std::map<wxString, FileSyncData>::iterator fsiter = SCListData->begin();
1709 fsiter != SCListData->end(); fsiter++){
1711 // Check the mode of the file before adding.
1713 // Get the HTTP status of the file from the list.
1715 FileSyncData fsd = fsiter->second;
1717 if (fsd.DataFlag == 1){
1719 // Added or modified contact.
1721 //vCardAdd.Add(fsiter->first, 1);
1723 vCardDownloadDataFileClass vCardNewData;
1724 vCardNewData.DataType = 0;
1725 vCardDownloadData.insert(std::make_pair(fsiter->first, vCardNewData));
1727 //} else if (fsd.DataFlag == 1){
1729 // Contact has been modified on the server.
1731 // vCardUpdateLocal.Add(fsiter->first, 1);
1734 else if (fsd.DataFlag == 2){
1736 // Contact has been deleted.
1738 vCardDelete.Add(fsiter->first, 1);
1746 // Look for vCards that are missing but in the ETagDB.
1748 for (std::map<wxString,ETagData>::iterator etagiter = ETagDBData.begin();
1749 etagiter != ETagDBData.end(); etagiter++){
1751 // Check if the vCard exists.
1753 if (!wxFileExists(AccountDirFinal + etagiter->first)){
1755 // vCard doesn't exist so mark for deleting.
1757 vCardDelete.Add(etagiter->first, 1);
1763 // Compare Server with the ETag DB. Work out which
1764 // needs to updated remotely and which needs to be
1767 for (std::map<wxString,FileSyncData>::iterator srviter = SCListData->begin();
1768 srviter != SCListData->end(); srviter++){
1770 if (ETagDBData.find(srviter->first) == ETagDBData.end()){
1774 std::map<wxString,ETagData>::iterator lociter = ETagDBData.find(srviter->first);
1776 ETagData etd = lociter->second;
1777 FileSyncData fsd = srviter->second;
1779 wxString ETagSrv = fsd.ETagData;
1781 // Check if the local ETag value has 'DELETED' set and skip
1782 // checking this file if it does.
1784 if (etd.ETagValue == "DELETED"){
1790 // Compare local ETag with original local ETag.
1791 // If different, update to server is required.
1793 if (etd.ETagValue != etd.ETagOrigValue){
1795 // Check if local original ETag is different from server ETag.
1796 // If it is then throw up a conflict resolution dialog.
1798 if (etd.ETagOrigValue != ETagSrv){
1800 vCard34Conv vCard34Obj;
1802 wxString ServerContactData;
1803 wxString FullFilename;
1805 vCard ConvertedV4Data;
1807 // Conflict. Bring up conflict resolution dialog.
1809 // Get the server contact data for comparison.
1811 ConnHandle.SetServerFilename(srviter->first);
1812 ConnHandle.GetServerContactData();
1813 ServerContactData = ConnHandle.GetPageData();
1815 FullFilename = CreateFilenamePath(AccountDirFinal, srviter->first);
1817 // Convert it to v4.
1819 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
1821 vCardConflictObj vCardProcData;
1823 vCardProcData.vCardLocalData = &ClientData;
1824 vCardProcData.vCardServerData = &ConvertedV4Data;
1826 // Load the client data from the filename given.
1828 ClientData.LoadFile(FullFilename);
1832 bool *PauseMode = new bool;
1835 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
1838 qrn.QResponse = &ConflictResult;
1839 qrn.PausePtr = PauseMode;
1841 vCardProcData.QRNotifData = &qrn;
1843 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
1844 event.SetClientData(&vCardProcData);
1845 wxPostEvent(frmMainPtrGet, event);
1850 n1.tv_nsec = 250000000L;*/
1852 while (*PauseMode == TRUE){
1853 //nanosleep(&n1, &n2);
1854 SleepFor(250000000);
1860 // If replacing local version, store copy for now.
1861 // Otherwise upload to server.
1863 if (ConflictResult == 0){
1869 } else if (ConflictResult == 1){
1871 // Decided to use client version.
1873 vCardUpdateLocal.Remove(srviter->first);
1874 vCardUpdateRemote.Add(srviter->first, 1);
1876 } else if (ConflictResult == 2){
1878 // Decided to use server version.
1879 // Store the converted downloaded copy for
1880 // processing later.
1882 //vCardUpdateLocal.Add(srviter->first, 1);
1884 vCardDownloadDataFileClass vCardNewData;
1885 vCardNewData.DataType = 1;
1886 vCardNewData.FileData = ConvertedV4Data.WriteString();
1888 ConvertedV4Data.WriteFile(FullFilename);
1890 vCardDownloadData.insert(std::make_pair(srviter->first, vCardNewData));
1898 // Send vCard to the server.
1900 vCardUpdateRemote.Add(srviter->first, 1);
1906 // Check if local ETag is different from server ETag.
1907 // If different, obtain the vCard from the server.
1909 if (etd.ETagOrigValue != ETagSrv){
1911 vCardUpdateLocal.Add(srviter->first, 1);
1919 // Process the vCards that need to be downloaded and added/overwritten.
1921 wxString vCardFilenameFinal;
1922 wxString vCardOutputData;
1923 wxString vCardInputData;
1924 wxString ETagFileData;
1927 for (std::map<wxString,vCardDownloadDataFileClass>::iterator additer = vCardDownloadData.begin();
1928 additer != vCardDownloadData.end(); additer++){
1930 vCardFilenameFinal.Clear();
1931 vCardInputData.Clear();
1932 vCardOutputData.Clear();
1933 ETagFileData.Clear();
1935 vCardFilenameFinal = CreateFilenamePath(AccountDirFinal, additer->first);
1937 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
1939 if (additer->second.DataType == 0){
1941 vCard ConvertedV4Data;
1943 // Grab the file from the server and write the contact out.
1945 vCard34Conv vCard34Obj;
1947 ConnHandle.SetServerFilename(additer->first);
1948 ConnHandle.GetServerContactData();
1949 vCardInputData = ConnHandle.GetPageData();
1951 vCard34Obj.ConvertToV4(&vCardInputData, &ConvertedV4Data);
1953 ConvertedV4Data.WriteFile(vCardFilenameFinal);
1955 // Update the ETagDB.
1957 //vCardFile.Open(vCardFilenameFinal, wxT("w"));
1959 //if (vCardFile.IsOpened()){
1961 // vCardFile.Write(vCardOutputData, wxConvAuto());
1962 // vCardFile.Close();
1966 // Get the server ETag.
1968 wxString ServerETag;
1969 ConnHandle.GetServerETagValueThread();
1970 ServerETag = ConnHandle.ETagValueResult();
1972 // Add to the ETag Database.
1974 ETagDBPtr->AddETag(additer->first, ServerETag, ServerETag);
1976 } else if (additer->second.DataType == 1){
1978 // Write out the contact to the account directory.
1980 vCardFilenameFinal = CreateFilenamePath(AccountDirFinal, additer->first);
1981 vCardOutputData = additer->second.FileData;
1983 vCardFile.Open(vCardFilenameFinal, wxT("w"));
1985 if (vCardFile.IsOpened()){
1987 vCardFile.Write(vCardOutputData, wxConvAuto());
1992 // Update the ETagDB.
1994 wxString ServerETag;
1995 ConnHandle.GetServerETagValueThread();
1996 ServerETag = ConnHandle.ETagValueResult();
1998 // Add to the ETag Database.
2000 ETagDBPtr->AddETag(additer->first, ServerETag, ServerETag);
2005 // Look for vCard files which aren't in the ETagDB.
2007 while(ContinueProcess){
2009 // Check and make sure that the filename ends in .vcf/.vcard
2010 // Skip any file that beings with a dot.
2012 if (AccDirFilename.Left(1) == wxT(".")){
2014 ContinueProcess = AccDir.GetNext(&AccDirFilename);
2019 if (AccDirFilename.Right(4) != wxT(".vcf") &&
2020 AccDirFilename.Right(6) != wxT(".vcard")){
2022 ContinueProcess = AccDir.GetNext(&AccDirFilename);
2027 // Look in the ETagDB for the file.
2029 bool ETagExists = ETagDBPtr->CheckETagExists(AccDirFilename);
2031 if (ETagExists == FALSE){
2033 // Add the vCard to the list to be added.
2035 vCardAdd.Add(AccDirFilename, 1);
2039 ContinueProcess = AccDir.GetNext(&AccDirFilename);
2043 // Process the vCards to add/update to the server.
2045 for (int vi = 0; vi < vCardAdd.GetCount(); vi++){
2047 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
2048 ETag = ETagDBPtr->GetETag(vCardAdd[vi]);
2049 ETagOriginal = ETagDBPtr->GetETagOriginal(vCardAdd[vi]);
2051 ContactFilename = vCardAdd[vi];
2052 FullFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
2054 ContactFilename.Trim();
2056 if (ETag == ETagOriginal && ETagDBPtr->ETagExists(vCardAdd[vi])){
2058 // Compare the ETag with the Server ETag.
2060 ConnHandle.SetServerFilename(vCardAdd[vi]);
2061 ConnHandle.GetServerETagValueThread();
2062 ETagServer = ConnHandle.ETagValueResult();
2064 if (ETagOriginal != ETagServer){
2066 // Server ETag is different from original ETag.
2067 // This is a conflict which the user will now
2070 frmMain *frmMainPtrGet = static_cast<frmMain*>(frmMainPtr);
2072 vCard34Conv vCard34Obj;
2074 wxString ServerContactData;
2076 vCard ConvertedV4Data;
2078 // Load the client data from the filename given.
2080 ConnHandle.GetServerContactData();
2081 ServerContactData = ConnHandle.GetPageData();
2083 // Process v3 version into v4 version.
2085 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
2087 vCardConflictObj vCardProcData;
2089 vCardProcData.vCardLocalData = &ClientData;
2090 vCardProcData.vCardServerData = &ConvertedV4Data;
2091 ClientData.LoadFile(FullFilename);
2093 //ContactConflictEvent event(ContactConflictCmdEnv);
2094 //event.SetData(ContactFilename, Moo1, Moo2);
2096 //wxPostEvent(frmMainPtrGet, event);
2098 // Setup Conflict Resolution Dialog.
2100 // Fetch Data from Server and convert.
2102 bool *PauseMode = new bool;
2107 qrn.QResponse = &ConflictResult;
2108 qrn.PausePtr = PauseMode;
2110 vCardProcData.QRNotifData = &qrn;
2112 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
2113 event.SetClientData(&vCardProcData);
2114 wxPostEvent(frmMainPtrGet, event);
2119 n1.tv_nsec = 250000000L;*/
2121 while (*PauseMode == TRUE){
2122 //nanosleep(&n1, &n2);
2123 SleepFor(250000000);
2129 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
2131 if (ConflictResult == 0){
2138 } else if (ConflictResult == 1){
2140 // Decided to use client version.
2142 ConnHandle.ProcessData();
2146 } else if (ConflictResult == 2){
2148 // Decided to use server version.
2150 // Download server version.
2152 ConvertedV4Data.WriteFile(CreateFilenamePath(AccountDirFinal, vCardAdd[vi]));
2160 // Setup the filename for the contact being added.
2162 wxString wxSFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
2163 wxString wxSCardData;
2167 // Load the data from the file.
2170 wxFCard.Open(wxSFilename, wxT("r"));
2172 if (wxFCard.IsOpened()){
2174 wxFCard.ReadAll(&wxSCardData, wxConvAuto());
2179 // Convert the data to v3.
2181 vCard34Conv vCard34Obj;
2183 vCard34Obj.ConvertToV3(wxSFilename, &TaskData);
2185 // Setup the URL address.
2187 //TaskURL = StringTaskDetailIter->second + wxT("/") + vCardAdd[vi];
2189 // Upload the data to the server.
2191 ConnHandle.SetUploadMode(TRUE);
2192 ConnHandle.SetupData(wxT("PUT"), vCardAdd[vi], TaskData);
2193 ConnHandle.ProcessData();
2195 // Get the Server ETag and put it in the ETag database.
2197 ConnHandle.SetServerFilename(vCardAdd[vi]);
2198 ConnHandle.GetServerETagValueThread();
2199 ETagServer = ConnHandle.ETagValueResult();
2201 ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer);
2207 if (ETagOriginal != ETagServer){
2209 // Server ETag is different from original ETag.
2210 // This is a conflict which the user will now
2213 frmMain *frmMainPtrGet = (frmMain *)frmMainPtr;
2215 //ContactConflictEvent event(ContactConflictCmdEnv);
2216 //event.SetData(ContactFilename, Moo1, Moo2);
2218 vCard34Conv vCard34Obj;
2220 wxString ServerContactData;
2222 vCard ConvertedV4Data;
2224 // Load the client data from the filename given.
2226 ConnHandle.GetServerContactData();
2227 ServerContactData = ConnHandle.GetPageData();
2228 ClientData.LoadFile(FullFilename);
2230 // Process v3 version into v4 version.
2232 vCard34Obj.ConvertToV4(&ServerContactData, &ConvertedV4Data);
2234 vCardConflictObj vCardProcData;
2236 vCardProcData.vCardLocalData = &ClientData;
2237 vCardProcData.vCardServerData = &ConvertedV4Data;
2239 bool *PauseMode = new bool;
2244 qrn.QResponse = &ConflictResult;
2245 qrn.PausePtr = PauseMode;
2247 vCardProcData.QRNotifData = &qrn;
2249 wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED);
2250 event.SetClientData(&vCardProcData);
2251 wxPostEvent(frmMainPtrGet, event);
2256 n1.tv_nsec = 250000000L;*/
2258 while (*PauseMode == TRUE){
2259 //nanosleep(&n1, &n2);
2260 SleepFor(250000000);
2266 //intResult = frmMainPtrGet->ShowConflictDialog(&Moo1, &Moo2);
2268 if (ConflictResult == 0){
2275 } else if (ConflictResult == 1){
2277 // Decided to use client version.
2279 ConnHandle.ProcessData();
2280 //ETagServer = CardDAVIter->second.GetServerETagValueThread();
2281 //ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
2285 } else if (ConflictResult == 2){
2287 // Decided to use server version.
2289 // Write server version to file.
2291 ConvertedV4Data.WriteFile(CreateFilenamePath(AccountDirFinal, vCardAdd[vi]));
2299 // Setup the filename for the contact being added.
2301 wxString wxSFilename = CreateFilenamePath(AccountDirFinal, vCardAdd[vi]);
2302 wxString wxSCardData;
2306 // Load the data from the file.
2309 wxFCard.Open(wxSFilename, wxT("r"));
2311 if (wxFCard.IsOpened()){
2313 wxFCard.ReadAll(&wxSCardData, wxConvAuto());
2318 // Convert the data to v3.
2320 vCard34Conv vCard34Obj;
2322 vCard34Obj.ConvertToV3(wxSFilename, &TaskData);
2324 // Setup the URL address.
2326 //TaskURL = StringTaskDetailIter->second + wxT("/") + vCardAdd[vi];
2328 // Upload the data to the server.
2330 ConnHandle.SetUploadMode(TRUE);
2331 ConnHandle.SetupData(wxT("PUT"), vCardAdd[vi], TaskData);
2332 ConnHandle.ProcessData();
2334 // Get the Server ETag and put it in the ETag database.
2336 ConnHandle.SetServerFilename(vCardAdd[vi]);
2337 ConnHandle.GetServerETagValueThread();
2338 ETagServer = ConnHandle.ETagValueResult();
2341 ETagDBPtr->AddETag(vCardAdd[vi], ETagServer, ETagServer);
2349 // Process the vCards to delete locally.
2351 for (int vi = 0; vi < vCardDelete.GetCount(); vi++){
2353 if (!wxRemoveFile(CreateFilenamePath(AccountDirFinal, vCardDelete[vi]))){
2357 ETagDBPtr->RemoveETag(vCardDelete[vi]);
2363 // Process the vCards to delete from the server.
2365 std::map<wxString,wxString> *ETagFilenameMap = ETagDBPtr->GetFilenamePointer();
2366 std::list<wxString> DeleteList;
2368 for (std::map<wxString,wxString>::iterator deliter = ETagFilenameMap->begin();
2369 deliter != ETagFilenameMap->end(); deliter++){
2371 // Look through the ETagDB and find contacts which are marked as DELETED.
2373 if (deliter->second == wxT("DELETED")){
2375 ConnHandle.SetUploadMode(FALSE);
2376 ConnHandle.SetupData(wxT("DELETE"), deliter->first, wxT(""));
2377 ConnHandle.ProcessDataThread();
2379 // Delete the ETag as the file has now been deleted.
2381 DeleteList.push_back(deliter->first);
2387 for (std::list<wxString>::iterator removeetagiter = DeleteList.begin();
2388 removeetagiter != DeleteList.end(); removeetagiter++){
2390 ETagDBPtr->RemoveETag(*removeetagiter);
2394 // Write out the update server sync token.
2396 wxString ServerSyncToken = ServerContactList.SyncToken;
2398 ServerSyncToken.Trim();
2400 if (!ServerSyncToken.IsEmpty()){
2403 SyncWrite.Open(AccountSyncTokenFilename, wxT("w"));
2405 if (SyncWrite.IsOpened()){
2407 SyncWrite.Write(ServerSyncToken, wxConvAuto());
2414 // Check for another sync token. If there is another
2415 // sync token then repeat this. If token matches then stop processing.
2417 if (SyncTokenLoad == ServerSyncToken){
2419 KeepUpdating = FALSE;
2425 // Mark as completed.
2427 wxString AccountNameFinal;
2428 AccountNameFinal = PrefData.accounts.GetAccountDirectory(AccountID);
2429 AccountNameFinal.Append(wxT(".carddav"));
2431 wxCommandEvent reloadevent(RELOADCONTACTLIST);
2432 reloadevent.SetString(AccountNameFinal);
2433 wxPostEvent(this->GetParent(), reloadevent);
2440 // Update the data to the server.
2442 ConnHandle.ProcessData();
2451 n1.tv_nsec = 250000000L;*/
2453 while (iter->second == 1){
2455 SleepFor(125000000);
2456 //nanosleep(&n1, &n2);
2460 /*if ((iter->second == 4 && TypeIter->second == 0) ||
2461 (iter->second == 8 && TypeIter->second == 0)){
2463 AccountDir = StringAccountIter->second;
2464 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
2466 ConnHandle.GetServerETagValueThread();
2467 ETagServer = ConnHandle.ETagValueResult();
2468 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
2472 if ((iter->second == 4 && TypeIter->second == 1) ||
2473 (iter->second == 8 && TypeIter->second == 1)){
2475 AccountDir = StringAccountIter->second;
2476 ETagDB *ETagDBPtr = ETagTmrPtr->GetPointer(AccountDir);
2478 ConnHandle.GetServerETagValueThread();
2479 ETagServer = ConnHandle.ETagValueResult();
2480 ETagDBPtr->UpdateETag(ContactFilename, ETagServer, ETagServer);
2490 if (TasksFoundProc == FALSE){
2492 TasksActive = FALSE;
2493 ProcessTasksData = FALSE;
2497 wxCommandEvent eventp(ACTMGR_STARTTIMER);
2498 wxPostEvent(this, eventp);
2500 //AnimationTimer.StartAnimation();
2501 //ActListProcTimer.Start();
2505 wxCommandEvent event(ACTMGR_STARTPROCESSTIMER);
2506 wxPostEvent(this, event);
2508 //ActProcessTimer.Start();
2512 void frmActivityMgr::ProcessTasks()
2515 std::thread ProcessThread(&frmActivityMgr::ProcessTasksThread, this);
2516 ProcessThread.detach();
2520 void frmActivityMgr::SetupPointers(wxETagProcessTimer *ETagTmrPtrInc, void *frmMainPtrInc)
2523 ETagTmrPtr = ETagTmrPtrInc;
2525 frmMainPtr = frmMainPtrInc;
2529 void frmActivityMgr::ResumeProcessing(wxCommandEvent &event){
2531 QRNotif *qrn = (QRNotif *)event.GetClientData();
2533 int *QRes = qrn->QResponse;
2535 *qrn->PausePtr = FALSE;
2537 *QRes = event.GetInt();
2541 void frmActivityMgr::ToggleConnectionStatus( wxCommandEvent &event ){
2543 wxCommandEvent connevent(CONNSTAT_UPDATE);
2545 if (ApplicationSleepMode == FALSE){
2547 connevent.SetInt(1);
2548 ApplicationSleepMode = TRUE;
2549 mnuSleepMode->Check(true);
2553 connevent.SetInt(0);
2554 ApplicationSleepMode = FALSE;
2555 mnuSleepMode->Check(false);
2557 wxCommandEvent event(ACTMGR_STARTTIMER);
2558 wxPostEvent(this, event);
2560 wxCommandEvent eventp(ACTMGR_STARTPROCESSTIMER);
2561 wxPostEvent(this, eventp);
2565 wxPostEvent(GetParent(), connevent);
2569 void frmActivityMgr::SleepMode( wxCommandEvent &event ){
2571 wxCommandEvent connevent(ACTMGR_TOGGLECONN);
2573 wxPostEvent(this, connevent);
2577 void frmActivityMgr::WriteServerCertificate(wxString AccountName, SSLCertCollection SSLCertInc){
2579 wxString ServerCertFinal;
2581 // Get the Cert section of the certificate and write it to the file.
2583 ServerCertFinal = GetAccountDir(AccountName, TRUE);
2587 std::map<int, SSLCertData>::iterator SSLCDIter = SSLCertInc.SSLCollection.find(0);
2588 std::multimap<wxString,wxString>::iterator SSLDataIter = SSLCDIter->second.CertData.find(wxT("Cert"));
2590 CertFile.Open(ServerCertFinal, wxFile::write);
2592 CertFile.Write(SSLDataIter->second, wxConvUTF8);
2597 void frmActivityMgr::WriteServerCertificate(wxString AccountName, SSLCertCollectionString SSLCertInc){
2599 wxString ServerCertFinal;
2601 // Get the Cert section of the certificate and write it to the file.
2603 ServerCertFinal = GetAccountDir(AccountName, TRUE);
2607 std::map<int, SSLCertDataString>::iterator SSLCDIter = SSLCertInc.SSLCollection.find(0);
2608 std::multimap<string,string>::iterator SSLDataIter = SSLCDIter->second.CertData.find("Cert");
2610 CertFile.Open(ServerCertFinal, wxFile::write);
2612 CertFile.Write(SSLDataIter->second, wxConvUTF8);
2617 void frmActivityMgr::StartTimer(wxCommandEvent& event){
2619 ActListProcTimer.Start(1000, FALSE);
2623 void frmActivityMgr::StopTimer(wxCommandEvent& event){
2625 ActListProcTimer.Stop();
2629 void frmActivityMgr::StartProcessTimer(wxCommandEvent& event){
2631 ActProcessTimer.Start(1000, FALSE);
2635 void frmActivityMgr::StopProcessTimer(wxCommandEvent& event){
2637 ActProcessTimer.Stop();
2641 void frmActivityMgr::StartAnimationTimer(wxCommandEvent& event){
2643 AnimationTimer.StartAnimation();
2647 void frmActivityMgr::UpdateStatusLabel(wxCommandEvent& event){
2649 ActivityMgrLabelUpdate *actmgrudata = (ActivityMgrLabelUpdate*)event.GetClientData();
2651 if (actmgrudata != NULL){
2653 lstActivity->SetItem(actmgrudata->ItemIndex, 2, actmgrudata->ItemLabel);
2655 /*if (!actmgrudata->ItemDes.IsEmpty()){
2656 lstActivity->SetItem(actmgrudata->ItemIndex, 0, actmgrudata->ItemDes);