Home | News | Projects | Releases
Bugs | RFE | Repositories | Help
Capitalise Bitmaps and Tools directories
[xestiaab/.git] / source / frmMain.cpp
index fc9ba07..f07a5ca 100644 (file)
@@ -16,6 +16,7 @@
 // You should have received a copy of the GNU General Public License along
 // with Xestia Address Book. If not, see <http://www.gnu.org/licenses/>
 
+#include <cstdlib>
 #include <iostream>
 #include <algorithm>
 #include <vector>
 #include "frmSSLCertificate.h"
 #include "frmUpdate.h"
 #include "import/frmImportResults.h"
-#include "bitmaps.h"
+#include "Bitmaps.h"
 
 #include "common/preferences.h"
 #include "common/getcontactinfo.h"
 #include "common/events.h"
 #include "common/dirs.h"
 #include "vcard/vcard.h"
-#include "carddav/carddav.h"
 #include "contacteditor/frmContactEditor.h"
 #include "import/import.h"
 #include "export/export.h"
@@ -66,7 +66,6 @@
 // Define the event types.
 
 DEFINE_EVENT_TYPE(CE_UPDATECONTACTLIST);
-DEFINE_EVENT_TYPE(CE_UPDATEACCOUNTLIST);
 DEFINE_EVENT_TYPE(SE_UPDATECONTACTNOTIF);
 DEFINE_EVENT_TYPE(CE_OPENCONTACT);
 DEFINE_EVENT_TYPE(CE_OPENCONTACTLIST);
@@ -85,18 +84,21 @@ DEFINE_EVENT_TYPE(WINDOW_EDIT);
 DEFINE_EVENT_TYPE(WINDOW_CLOSE);
 DEFINE_EVENT_TYPE(CONNSTAT_UPDATE);
 DEFINE_EVENT_TYPE(INVALIDSSLCERT);
+DEFINE_EVENT_TYPE(INVALIDSSLCERTSTRING);
 DEFINE_EVENT_TYPE(GETSELECTEDLIST);
 DEFINE_EVENT_TYPE(SYNCACCOUNT);
 DEFINE_EVENT_TYPE(IMPORT_RESULTSSHOW);
 DEFINE_EVENT_TYPE(RELOADCONTACTLIST);
 DEFINE_EVENT_TYPE(REFRESHADDRESSBOOK);
+#if defined(__APPLE__)
+DEFINE_EVENT_TYPE(INVALIDSSLTRUST);
+#endif
 
 // Setup the event table using the event types.
 
 BEGIN_EVENT_TABLE(frmMain, wxFrame)
 EVT_COMMAND(wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, frmMain::ConflictResolution)
 EVT_COMMAND(wxID_ANY, CE_UPDATECONTACTLIST, frmMain::UpdateContactList)
-EVT_COMMAND(wxID_ANY, CE_UPDATEACCOUNTLIST, frmMain::UpdateAccountList)
 EVT_COMMAND(wxID_ANY, SE_UPDATECONTACTNOTIF, frmMain::UpdateSearchContactLists)
 EVT_COMMAND(wxID_ANY, CE_OPENCONTACT, frmMain::OpenContactInfo)
 EVT_COMMAND(wxID_ANY, CE_OPENCONTACTLIST, frmMain::OpenContactInfoList)
@@ -114,11 +116,15 @@ EVT_COMMAND(wxID_ANY, WINDOW_EDIT, frmMain::WindowEdit)
 EVT_COMMAND(wxID_ANY, WINDOW_CLOSE, frmMain::WindowDelete)
 EVT_COMMAND(wxID_ANY, CONNSTAT_UPDATE, frmMain::UpdateConnectionStatus)
 EVT_COMMAND(wxID_ANY, INVALIDSSLCERT, frmMain::InvalidSSLCertificate)
+EVT_COMMAND(wxID_ANY, INVALIDSSLCERTSTRING, frmMain::InvalidSSLCertificateString)
 EVT_COMMAND(wxID_ANY, GETSELECTEDLIST, frmMain::GetSelectedList)
 EVT_COMMAND(wxID_ANY, SYNCACCOUNT, frmMain::SyncAccount)
 EVT_COMMAND(wxID_ANY, IMPORT_RESULTSSHOW, frmMain::ShowImportResults)
 EVT_COMMAND(wxID_ANY, RELOADCONTACTLIST, frmMain::ReloadContactList)
 EVT_COMMAND(wxID_ANY, REFRESHADDRESSBOOK, frmMain::RefreshAddressBook)
+#if defined(__APPLE__)
+EVT_COMMAND(wxID_ANY, INVALIDSSLTRUST, frmMain::DisplayTrustPanel)
+#endif
 END_EVENT_TABLE()
 
 frmMain::frmMain( wxWindow* parent )
@@ -132,6 +138,7 @@ frmMainADT( parent )
        wxMemoryInputStream bstream(icons_acclocal_png, sizeof(icons_acclocal_png));
        wxMemoryInputStream cstream(icons_accgroup_png, sizeof(icons_accgroup_png));
        wxMemoryInputStream dstream(icons_accnone_png, sizeof(icons_accnone_png));
+       wxMemoryInputStream estream(icons_accunsupported_png, sizeof(icons_accunsupported_png));
     
        wxImage icons_accinet_png(astream, wxBITMAP_TYPE_PNG);
        wxBitmap AccInet(icons_accinet_png, -1);
@@ -147,16 +154,22 @@ frmMainADT( parent )
        wxBitmap AccGrp(icons_accgroup_png, -1);
        wxIcon wxIAccGrp;
        wxIAccGrp.CopyFromBitmap(AccGrp);
-    
+
        wxImage icons_accnone_png(dstream, wxBITMAP_TYPE_PNG);
        wxBitmap AccNone(icons_accnone_png, -1);
        wxIcon wxIAccNone;
        wxIAccNone.CopyFromBitmap(AccNone);
+       
+       wxImage icons_accunsupported_png(estream, wxBITMAP_TYPE_PNG);
+       wxBitmap AccUnsupported(icons_accunsupported_png, -1);
+       wxIcon wxIAccUnsupported;
+       wxIAccUnsupported.CopyFromBitmap(AccUnsupported);
     
        AccountID = AccImgList->Add(wxIAccNIcon);
        AccountNetID = AccImgList->Add(wxIAccInet);
        AccountGrpID = AccImgList->Add(wxIAccGrp);
        AccountNoneID = AccImgList->Add(wxIAccNone);
+       AccountUnsupportedID = AccImgList->Add(wxIAccUnsupported);
     
        bmpIcon->SetIcon(AccImgList->GetIcon(AccountNoneID));
     
@@ -176,7 +189,40 @@ frmMainADT( parent )
     
        wxImage icons_nossl_png(nosslstream, wxBITMAP_TYPE_PNG);
        imgNoSSL = new wxBitmap(icons_nossl_png, -1);
-    
+       // Toolbar icons.
+
+       wxMemoryInputStream addaddressbook(toolbar_addaddressbook_png, sizeof(toolbar_addaddressbook_png));
+       wxMemoryInputStream preferences(toolbar_preferences_png, sizeof(toolbar_preferences_png));
+       wxMemoryInputStream searchcontacts(toolbar_searchcontacts_png, sizeof(toolbar_searchcontacts_png));
+       wxMemoryInputStream addcontact(toolbar_addcontact_png, sizeof(toolbar_addcontact_png));
+       wxMemoryInputStream editcontact(toolbar_editcontact_png, sizeof(toolbar_editcontact_png));
+       wxMemoryInputStream deletecontact(toolbar_deletecontact_png, sizeof(toolbar_deletecontact_png));
+
+       wxImage toolbar_addaddressbook_png(addaddressbook, wxBITMAP_TYPE_PNG);
+       imgAddAddressBook = new wxBitmap (toolbar_addaddressbook_png, -1);
+       tblMain->SetToolNormalBitmap(tbtNewAccount->GetId(), *imgAddAddressBook);
+
+       wxImage toolbar_preferences_png(preferences, wxBITMAP_TYPE_PNG);
+       imgPreferences = new wxBitmap (toolbar_preferences_png, -1);
+       tblMain->SetToolNormalBitmap(tbtPreferences->GetId(), *imgPreferences);
+
+       wxImage toolbar_searchcontacts_png(searchcontacts, wxBITMAP_TYPE_PNG);
+       imgSearchContacts = new wxBitmap (toolbar_searchcontacts_png, -1);
+       tblMain->SetToolNormalBitmap(tbtSearch->GetId(), *imgSearchContacts);
+
+       wxImage toolbar_addcontact_png(addcontact, wxBITMAP_TYPE_PNG);
+       imgAddContact = new wxBitmap (toolbar_addcontact_png, -1);
+       tblMain->SetToolNormalBitmap(tbtAddContact->GetId(), *imgAddContact);
+       
+       wxImage toolbar_editcontact_png(editcontact, wxBITMAP_TYPE_PNG);
+       imgEditContact = new wxBitmap (toolbar_editcontact_png, -1);
+       tblMain->SetToolNormalBitmap(tbtEditContact->GetId(), *imgEditContact);
+       
+       wxImage toolbar_deletecontact_png(deletecontact, wxBITMAP_TYPE_PNG);
+       imgDeleteContact = new wxBitmap (toolbar_deletecontact_png, -1);
+       tblMain->SetToolNormalBitmap(tbtDeleteContact->GetId(), *imgDeleteContact);
+
        // Activity Icon.
     
        wxMemoryInputStream act1(icons_act1_png, sizeof(icons_act1_png));
@@ -343,17 +389,11 @@ void frmMain::QuitApp()
 {
 
        // Function to run when quitting.
-    
-       //Go through the windows and close each one (be it search
-       //or contact editor). Abort if user wants to cancel.
-    
-       // Close the contact editor windows.
-    
-       // Close the contact windows.
-    
-       // Close the search windows.
-    
+       
        // Write out the ETag databases.
+       
+       ETagProcTimer.Stop();
+       ETagProcTimer.Notify();
     
        // Save Preferences: Save the window position if that option is enabled.
     
@@ -367,6 +407,10 @@ void frmMain::QuitApp()
     
        SetFilename.Append(wxT("settings"));
     
+#elif defined(__APPLE__)
+        
+        TerminateHelpBrowserProcess();
+        
 #else
     
        // *nix OSes
@@ -389,7 +433,7 @@ void frmMain::QuitApp()
     
        if (SaveWindowPos == TRUE){
         
-               wxRect frmMainPos = this->GetRect();
+               wxRect frmMainPos = GetRect();
         
                cfgfile->Write(wxT("WindowPositionX"), frmMainPos.GetX());
                cfgfile->Write(wxT("WindowPositionY"), frmMainPos.GetY());
@@ -401,7 +445,7 @@ void frmMain::QuitApp()
        delete cfgfile;
        cfgfile = NULL;
     
-       //Everything closed... exit.
+       // Everything closed... exit.
     
        std::exit(0);
     
@@ -436,6 +480,13 @@ void frmMain::ShowAboutWindow( wxCommandEvent& event )
 void frmMain::OpenPreferences( wxCommandEvent& event)
 {
 
+       // Close all windows first.
+       
+       if (CloseAllWindows() == false)
+       {
+               return;
+       }
+
        // Open the preferences window.
     
        ReloadAccounts = FALSE;
@@ -451,7 +502,7 @@ void frmMain::OpenPreferences( wxCommandEvent& event)
                // Reload the accounts as a change has been made within
                // the application and clear the current contact information.
         
-               this->LoadPreferences();
+               this->LoadPreferences(true);
                this->ResetContactInfo();
        
        }
@@ -476,8 +527,8 @@ void frmMain::OpenNewABDialog( wxCommandEvent& event)
                // Reload the accounts as a change has been made within
                // the application.
         
-               this->LoadPreferences();
-           
+               this->LoadPreferences(true);
+
        }
     
 }
@@ -535,6 +586,10 @@ void frmMain::LoadContactList( wxTreeEvent& event )
                                        imgSSLStatus->SetBitmap(*imgOffline);
                                        SSLToolTip->SetTip(wxT("SSL status is not applicable for this account"));
                                        AccountTypeFinal.Append(wxT("local"));
+                               } else {
+                                       imgSSLStatus->SetBitmap(*imgOffline);
+                                       SSLToolTip->SetTip(wxT("SSL status is not applicable for this account"));                                       
+                                       AccountTypeFinal.Append(AccountType.Lower());
                                }
                 
                                AccountIndex = i;
@@ -565,6 +620,8 @@ void frmMain::LoadContactList( wxTreeEvent& event )
                        } else if (AccountType == wxT("Local")){
                                SSLToolTip->SetTip(wxT("SSL status is not applicable for this account"));
                                AccountTypeFinal.Append(wxT("local"));
+                       } else {
+                               AccountTypeFinal.Append(AccountType.Lower());
                        }
             
                        AccountIndex = i;
@@ -608,7 +665,7 @@ void frmMain::LoadContactList( wxTreeEvent& event )
        long ContactSeekPoint = 0;
     
        wxDir vcardaccdir(AccountDirFinal);
-    
+
        // Get the wxTreeItemId and image icon and compare it to the list.
     
        if (ActiveItemIcon == AccountGrpID){
@@ -645,7 +702,7 @@ void frmMain::LoadContactList( wxTreeEvent& event )
             
                        if (vCardFilename.Right(4) == wxT(".vcf") ||
                                vCardFilename.Right(4) == wxT(".VCF") ||
-                               vCardFlename.Right(5) == wxT(".vcard") ||
+                               vCardFilename.Right(5) == wxT(".vcard") ||
                                vCardFilename.Right(5) == wxT(".VCARD")){
                 
                                vCard Person;
@@ -685,8 +742,6 @@ void frmMain::LoadContactList( wxTreeEvent& event )
                         
                                                // Split the name into sections.
                         
-                                               vCardDataString = Person.Get(wxT("N"));
-                        
                                                vCardName NameData = Person.GetName();
                         
                                                vCardDataString = NameData.Forename + wxT(" ") + NameData.Surname;
@@ -1056,7 +1111,7 @@ void frmMain::ShowContactInfo( wxListEvent& event )
     
        OldSessionID = SessionID;
        SessionID = wxString::Format(wxT("%i"), rand() % 32768);
-       LoadContactData(&Person, htmContactData, SessionID, OldSessionID, &MemoryFileList);
+       LoadContactData(&Person, htmContactData, SessionID, OldSessionID, &MemoryFileList, ContactBackgroundColour);
        ActiveFilename = ContactsFileIndex[ContactSeekNum];
     
 }
@@ -1074,6 +1129,17 @@ void frmMain::ShowContactEditorNew( wxCommandEvent& event )
                return;
         
        }
+       
+       // Check if the account type is a valid account type, otherwise
+       // display an error message.
+       
+       if (ActiveAccountType != "CardDAV" && ActiveAccountType != "carddav" &&
+               ActiveAccountType != "Local" && ActiveAccountType != "local"){
+               
+               wxMessageBox(_("Cannot add a new contact as the account type is unsupported."), _("Unsupported account type"), wxICON_ERROR);
+               return;
+                       
+       }
     
        // Add Pointer to SetupPointers for the ETagDB.
     
@@ -1124,7 +1190,7 @@ void frmMain::ShowContactEditorEdit( wxCommandEvent& event )
                return;
         
        }
-    
+       
        wxMemoryInputStream istream(bigimgs_contactpersonicon48_png, sizeof(bigimgs_contactpersonicon48_png));
        wxImage bigimgs_contactpersonicon48i(istream, wxBITMAP_TYPE_PNG);
        wxBitmap contacticonbmp(bigimgs_contactpersonicon48i, -1);
@@ -1169,6 +1235,13 @@ void frmMain::ShowContactEditorEdit( wxCommandEvent& event )
     
        ContactEditor->SetupPointers(frameActMgr, &ETagProcTimer, this);
        ContactEditor->SetupHeaders();
+
+       if (ActiveAccountType != "CardDAV" && ActiveAccountType != "carddav" &&
+               ActiveAccountType != "Local" && ActiveAccountType != "local"){
+                       
+               ContactEditor->SetupAccountData(true);
+                       
+       }
     
        // Check if pointer is NULL (not from the search forms) or not.
     
@@ -1212,7 +1285,7 @@ void frmMain::RefreshAddressBook( wxCommandEvent& event ){
     
        if (!ActiveAccount.IsEmpty()){
    
-               if (ActiveAccountType != wxT("Local")){
+               if (ActiveAccountType == wxT("CardDAV") || ActiveAccountType == wxT("carddav")){
         
                        // Account type is not local.
        
@@ -1222,7 +1295,7 @@ void frmMain::RefreshAddressBook( wxCommandEvent& event ){
         
                } else {
        
-                       wxMessageBox(_("The refresh address book command is not supported with this type of account."), wxT("Not supported for this type of account"));
+                       wxMessageBox(_("The refresh address book command is not supported with this type of account."), wxT("Not supported"), wxICON_ERROR);
        
                }
        
@@ -1284,6 +1357,7 @@ void frmMain::OpenContactInfoList( wxListEvent& event )
        wxPostEvent(this, addevent);
     
        Contact->SetupPointers(&MemoryFileList);
+       Contact->SetBackgroundColour(ContactBackgroundColour.GetAsString(wxC2S_CSS_SYNTAX));
        Contact->SetupContactData(&Person);
     
        Contact->SetIcon(contacticon);
@@ -1341,6 +1415,7 @@ void frmMain::OpenContactInfo( wxCommandEvent& event )
        wxPostEvent(this, addevent);
     
        Contact->SetupPointers(&MemoryFileList);
+       Contact->SetBackgroundColour(ContactBackgroundColour.GetAsString(wxC2S_CSS_SYNTAX));
        Contact->SetupContactData(&Person);
     
        Contact->SetIcon(contacticon);
@@ -1354,11 +1429,11 @@ void frmMain::LoadPreferences( wxActivateEvent& event)
 
        // Load the preferences.
 
-       this->LoadPreferences();
+       this->LoadPreferences(true);
        
 }
 
-void frmMain::LoadPreferences(){
+void frmMain::LoadPreferences(bool skipWindowSizeReload){
     
        // Load the preferences.
     
@@ -1366,17 +1441,35 @@ void frmMain::LoadPreferences(){
     
        XABPreferences preferences(preffilename);
     
+       // Clear the active account/filename information and account list.
+
+       ActiveAccount = "";
+       ActiveAccountType = "";
+       ActiveFilename = "";
+       lstContacts->DeleteAllItems();
+
        // Setup the main window position (if needed).
     
        bool SaveWindowPos = preferences.GetBoolData(wxT("SaveWindowPosition"));
        bool HideLocalABs = preferences.GetBoolData(wxT("HideLocalAddressBooks"));
+       bool UseBackgroundContactColour = preferences.GetBoolData(wxT("UseBackgroundContactColour"));
     
-       if (SaveWindowPos == TRUE){
+       if (SaveWindowPos == true && skipWindowSizeReload == false){
         
                this->SetSize(preferences.GetMainWindowData());
         
        }
     
+       if (UseBackgroundContactColour == true){
+               
+               ContactBackgroundColour = preferences.GetBackgroundContactColourData();
+               
+        } else {
+                
+                ContactBackgroundColour = wxTransparentColour;
+                
+        }
+       
        treAccounts->DeleteAllItems();
     
        wxTreeItemId RootNode = treAccounts->AddRoot(wxT("Root Item"), AccountNoneID);
@@ -1393,9 +1486,22 @@ void frmMain::LoadPreferences(){
                AccTmrPtr = NULL;
         
        }
+
+#if defined(__WIN32__)
+
+       for (std::map<int, PCCERT_CONTEXT>::iterator CertificateIter = AccountCertificateData.begin();
+               CertificateIter != AccountCertificateData.end(); CertificateIter++){
+
+               CertFreeCertificateContext(CertificateIter->second);
+
+       }
+
+       AccountCertificateData.clear();
+
+#endif
     
        AccountSyncTimers.clear();
-    
+        
        wxString AccDir;
        wxString AccDirFull;
        wxString AccDirFullSfx;
@@ -1408,11 +1514,15 @@ void frmMain::LoadPreferences(){
        wxTreeItemId AccountTreeId;
        wxTreeItemId GroupTreeId;
        int intGroupID = 0;
+        
+        // Relaod the accounts for the ETagProcTimer.
+        
+        ETagProcTimer.ReloadAccounts();
     
        for (int i = 0; i < preferences.accounts.GetCount(); i++){
-        
+               
                if ((preferences.accounts.GetAccountType(i) == wxT("Local") ||
-                       preferences.accounts.GetAccountType(i) == wxT("local")) && HideLocalABs == TRUE){
+                       preferences.accounts.GetAccountType(i) == wxT("local")) && HideLocalABs == true){
             
                        continue;
             
@@ -1435,7 +1545,7 @@ void frmMain::LoadPreferences(){
                AccName = preferences.accounts.GetAccountName(i);
                AccName.Trim();
                AccountAccDirList.insert(std::make_pair(i, AccDirFull));
-        
+               
                if (preferences.accounts.GetAccountType(i) == wxT("CardDAV") ||
                        preferences.accounts.GetAccountType(i) == wxT("carddav")){
             
@@ -1459,10 +1569,15 @@ void frmMain::LoadPreferences(){
             
                        AccountTreeId = treAccounts->AppendItem(RootNode, preferences.accounts.GetAccountName(i), AccountNetID, -1);
             
-               } else {
+               } else if (preferences.accounts.GetAccountType(i) == wxT("Local") ||
+                       preferences.accounts.GetAccountType(i) == wxT("local")) {
             
                        AccountTreeId = treAccounts->AppendItem(RootNode, preferences.accounts.GetAccountName(i), AccountID, -1);
             
+               } else {
+
+                       AccountTreeId = treAccounts->AppendItem(RootNode, preferences.accounts.GetAccountName(i), AccountUnsupportedID, -1);
+                       
                }
         
                // Go through the account directory and find contact files with
@@ -1475,7 +1590,7 @@ void frmMain::LoadPreferences(){
                wxString vCardFilename;
                wxString vCardDataString;
                wxString vCardFilenameFull;
-
+               
                bool ProcFiles = vcardaccdir.GetFirst(&vCardFilename, wxEmptyString, wxDIR_FILES);
         
                while(ProcFiles){
@@ -1547,7 +1662,7 @@ void frmMain::ConflictResolution(wxCommandEvent& event){
        vCardConflictObj *vCardConfObj = (vCardConflictObj*)event.GetClientData();
        vCard *ClientDataPtr = vCardConfObj->vCardLocalData;
        vCard *ServerDataPtr = vCardConfObj->vCardServerData;
-       frameCR->LoadData(ClientDataPtr, ServerDataPtr, &MemoryFileList);
+       frameCR->LoadData(ClientDataPtr, ServerDataPtr, &MemoryFileList, ContactBackgroundColour.GetAsString(wxC2S_CSS_SYNTAX));
        frameCR->ShowModal();
     
        int FinalConflictResult = frameCR->GetResult();
@@ -1603,19 +1718,40 @@ void frmMain::UpdateContactList(wxCommandEvent& event){
                     
                                        // First Name, Last Name.
                     
-                                       lstContacts->SetItem(longSelected, 0, ucd->ContactNameArray.Forename + wxT(" ") + ucd->ContactNameArray.Surname);
+                                       if (ucd->ContactNameArray.Forename == wxT("") && ucd->ContactNameArray.Surname == wxT(""))
+                                       {
+                                               lstContacts->SetItem(longSelected, 0, ucd->ContactName);
+                                       }
+                                       else
+                                       {
+                                               lstContacts->SetItem(longSelected, 0, ucd->ContactNameArray.Forename + wxT(" ") + ucd->ContactNameArray.Surname);
+                                       }
                     
                                } else if (SortMode == 2){
                     
                                        // Last Name, First Name.
-                    
-                                       lstContacts->SetItem(longSelected, 0, ucd->ContactNameArray.Surname + wxT(", ") + ucd->ContactNameArray.Forename);
+
+                                       if (ucd->ContactNameArray.Forename == wxT("") && ucd->ContactNameArray.Surname == wxT(""))
+                                       {
+                                               lstContacts->SetItem(longSelected, 0, wxT(", ") + ucd->ContactName);
+                                       }
+                                       else
+                                       {
+                                               lstContacts->SetItem(longSelected, 0, ucd->ContactNameArray.Surname + wxT(", ") + ucd->ContactNameArray.Forename);
+                                       }
                     
                                } else if (SortMode == 3){
                     
                                        // Nickname.
                     
-                                       lstContacts->SetItem(longSelected, 0, ucd->ContactNickname);
+                                       if (ucd->ContactNickname == wxT(""))
+                                       {
+                                               lstContacts->SetItem(longSelected, 0, _("(no nickname)"));
+                                       }
+                                       else
+                                       {
+                                               lstContacts->SetItem(longSelected, 0, ucd->ContactNickname);
+                                       }
                     
                                } else if (SortMode == 4){
                     
@@ -1657,6 +1793,7 @@ void frmMain::UpdateContactList(wxCommandEvent& event){
             
                        vCard UpdatedPerson;
                        UpdatedPerson.LoadFile(ucd->ContactFilename);
+                       frmContactPtr->SetBackgroundColour(ContactBackgroundColour.GetAsString(wxC2S_CSS_SYNTAX));
                        frmContactPtr->SetupContactData(&UpdatedPerson);
             
                }
@@ -1681,12 +1818,6 @@ void frmMain::UpdateContactList(wxCommandEvent& event){
     
 }
 
-void frmMain::UpdateAccountList(wxCommandEvent& event){
-    
-       // Update the account list (currently unimplemented).
-    
-}
-
 void frmMain::SetupPointers(void *ActMgrPtrInc){
     
        // Setup the pointers for the main window.
@@ -1730,7 +1861,7 @@ void frmMain::SetupForm(){
        ciicon_png.LoadFile(ciextstream, wxBITMAP_TYPE_PNG);
        wxMemoryFSHandler::AddFile(wxT("ciext.png"), ciicon_png, wxBITMAP_TYPE_PNG);
     
-       LoadPreferences();
+       LoadPreferences(false);
     
 }
 
@@ -1855,8 +1986,8 @@ void frmMain::RevealContact(wxCommandEvent& event){
                
                if (uc->ContactAccount == AccountAccDirList[i]){
             
-               treAccounts->SelectItem(nextChild, TRUE);
-               AccCtrl->SetText(treAccounts->GetItemText(nextChild));
+                       treAccounts->SelectItem(nextChild, TRUE);
+                       AccCtrl->SetText(treAccounts->GetItemText(nextChild));
             
                }
         
@@ -1904,7 +2035,7 @@ void frmMain::RevealContact(wxCommandEvent& event){
 void frmMain::DeleteContact(wxCommandEvent& event){
     
        // Delete a contact from the main window.
-    
+       
        // Check if a contact is selected.
     
        long intSelected = -1;
@@ -1918,6 +2049,17 @@ void frmMain::DeleteContact(wxCommandEvent& event){
        if (intSelected == -1){
                return;
        }
+       
+       // Check if the account type is a valid account type, otherwise
+       // display an error message.
+       
+       if (ActiveAccountType != "CardDAV" && ActiveAccountType != "carddav" &&
+               ActiveAccountType != "Local" && ActiveAccountType != "local"){
+               
+               wxMessageBox(_("Cannot delete contact as the account type is unsupported."), _("Unsupported account type"), wxICON_ERROR);
+               return;
+                       
+       }
     
        frmActivityMgr *frameActMgr = static_cast<frmActivityMgr*>(ActMgrPtr);
     
@@ -2033,13 +2175,14 @@ void frmMain::DeleteContact(wxCommandEvent& event){
                        if (nextChild == selectedChild){
                        
                                wxSDataURL = prefaccounts.GetAccountDirPrefix(i) + wxT("/") + wxSplitFilename;
+                               break;
 
                        }
             
                }
         
                // Add task to the activity monitor to delete the contact.
-        
+               
                frameActMgr->AddTask(2, wxSContactName, ActiveAccount, wxSDataURL, wxSplitFilename, ContactsFileIndex[intContactSeekNum], wxT(""));
         
        }
@@ -2480,8 +2623,108 @@ void frmMain::ShowSSLCertificates( wxCommandEvent &event ){
        wxString AccTypeLower;
        wxString AccType;
        bool AccountSSL;
-       std::map<int, SSLCertCollection>::iterator SSLColIter;
     
+#if defined(__APPLE__)
+
+       std::map<int, SecTrustRef>::iterator SSLTrustIter;
+        
+        for (int i = 0; i < prefaccounts.GetCount(); i++){
+                
+                SeekAccount.Append(prefaccounts.GetAccountDirectory(i));
+                AccType.Append(prefaccounts.GetAccountType(i));
+                AccountSSL = prefaccounts.GetAccountSSL(i);
+                AccTypeLower = AccType.MakeLower();
+                SeekAccount.Append(wxT("."));
+                SeekAccount.Append(AccTypeLower);
+                
+                if (SeekAccount == ActiveAccount){
+                        
+                        if (AccTypeLower == wxT("local")){
+                                
+                                return;
+                                
+                        }
+                        
+                        if (AccountSSL == false){
+                                
+                                return;
+                                
+                        }
+                        
+                        SSLTrustIter = AccountTrustData.find(i);
+                        
+                        // Setup and display the form.
+                        
+                        DisplayCertificate(SSLTrustIter->second);
+                        
+                }
+                
+                SeekAccount.Clear();
+                AccTypeLower.Clear();
+                AccType.clear();
+                
+        }
+   
+#elif defined(__WIN32__)
+
+       std::map<int, PCCERT_CONTEXT>::iterator SSLCertificateIter;
+
+       for (int i = 0; i < prefaccounts.GetCount(); i++){
+
+               SeekAccount.Append(prefaccounts.GetAccountDirectory(i));
+               AccType.Append(prefaccounts.GetAccountType(i));
+               AccountSSL = prefaccounts.GetAccountSSL(i);
+               AccTypeLower = AccType.MakeLower();
+               SeekAccount.Append(wxT("."));
+               SeekAccount.Append(AccTypeLower);
+
+               if (SeekAccount == ActiveAccount){
+
+                       if (AccTypeLower == wxT("local")){
+
+                               return;
+
+                       }
+
+                       if (AccountSSL == false){
+
+                               return;
+
+                       }
+
+                       SSLCertificateIter = AccountCertificateData.find(i);
+
+                       // Setup and display the form.
+
+                       if (SSLCertificateIter->second->pCertInfo == NULL){
+
+                               wxMessageBox("No certificate information is available due to invalid connection details, connection being in progress or invalid certificate data received.");
+
+                       } else {
+
+                               BOOL ModifiedCertificateData;
+                               CRYPTUI_VIEWCERTIFICATE_STRUCTW CertificateData = BuildCertificateData(SSLCertificateIter->second, (HWND)this->GetHandle());
+
+                               if (!CryptUIDlgViewCertificate(&CertificateData, &ModifiedCertificateData)){
+                                       wxMessageBox(_("An error occured while trying to open the certificate dialog."), _("Error opening Certificate Information dialog"));
+                               }
+
+                       }
+
+                       //DisplayCertificate(SSLTrustIter->second);
+
+               }
+
+               SeekAccount.Clear();
+               AccTypeLower.Clear();
+               AccType.clear();
+
+       }
+
+#else
+    
+       std::map<int, SSLCertCollectionString>::iterator SSLColIter;
+        
        for (int i = 0; i < prefaccounts.GetCount(); i++){
         
                SeekAccount.Append(prefaccounts.GetAccountDirectory(i));
@@ -2507,11 +2750,11 @@ void frmMain::ShowSSLCertificates( wxCommandEvent &event ){
             
                        SSLColIter = AccountSSLData.find(i);
             
-                       SSLCertCollection SSLCertInfo = SSLColIter->second;
-            
+                       SSLCertCollectionString SSLCertInfo = SSLColIter->second;
+                       
                        frmSSLCertificate *frameSSLCert = new frmSSLCertificate ( this );
                        frameSSLCert->StartCertFrom(0);
-                       frameSSLCert->SetupCerts(SSLCertInfo);
+                       frameSSLCert->SetupCertsString(SSLCertInfo);
                        frameSSLCert->ShowModal();
             
                        delete frameSSLCert;
@@ -2524,6 +2767,8 @@ void frmMain::ShowSSLCertificates( wxCommandEvent &event ){
                AccType.clear();
         
        }
+
+#endif
     
 }
 
@@ -2553,68 +2798,38 @@ void frmMain::UpdateConnectionStatus( wxCommandEvent &event ){
     
 }
 
-void frmMain::SetupSSLStatus( int AccountID ){
-    
-       // Check if account ID given is
-       // the active account and if not, do nothing.
-    
-       wxString AccType;
-       wxString AccTypeLower;
+void frmMain::InvalidSSLCertificate( wxCommandEvent &event ){
     
-       AccType = prefaccounts.GetAccountType(AccountID);
-       AccTypeLower = AccType.MakeLower();
+       // Display the form for showing an invalid SSL certificate.
     
-       wxString AccountIDName = prefaccounts.GetAccountDirectory(AccountID) + wxT(".") +
-               AccTypeLower;
+       frmInvalidSSLCertificate *frameISC = new frmInvalidSSLCertificate ( this );
+       SSLInvalidCertNotifObj *SSLICNObj = (SSLInvalidCertNotifObj*)event.GetClientData();
+       SSLCertCollection SSLCCData = SSLICNObj->CertCollection;
+       wxString AccountName = SSLICNObj->AccountName;
+       frameISC->LoadData(SSLCCData, AccountName);
+       frameISC->ShowModal();
     
-       if (AccountIDName != ActiveAccount){
-        
-               return;
-        
-       }
+       int FinalConflictResult = frameISC->GetResult();
     
-       // Check if the account has SSL enabled.
+       wxCommandEvent event2(ACTMGR_RESUMEPROC);
+       event2.SetClientData(SSLICNObj->QRNotifData);
+       event2.SetInt(FinalConflictResult);
     
-       bool SSLInUse = prefaccounts.GetAccountSSL(AccountID);
+       delete frameISC;
+       frameISC = NULL;
     
-       if (SSLInUse == FALSE){
-        
-               SSLToolTip->SetTip(wxT("SSL is not enabled for this account"));
-               imgSSLStatus->SetBitmap(*imgNoSSL);
-        
-       } else {
-        
-               // Get the SSL Collection Data.
-        
-               std::map<int,int>::iterator SSLResultIter = AccountSSLResult.find(AccountID);
-        
-               if (SSLResultIter->second == 1){
-            
-                       imgSSLStatus->SetBitmap(*imgSSLWarning);
-                       SSLToolTip->SetTip(wxT("Invalid certificate(s) received for '") + 
-                               prefaccounts.GetAccountName(AccountID) +
-                       wxT("' (Connection denied by user)\n\nDouble click for more information."));
-            
-               } else if (SSLResultIter->second == 0){
-            
-                       imgSSLStatus->SetBitmap(*imgSSL);
-                       SSLToolTip->SetTip(wxT("Account '") + 
-                               prefaccounts.GetAccountName(AccountID) +
-                       wxT("' secured using SSL\n\nDouble click for more information."));
-            
-               }
+       frmActivityMgr *frameActMgr = static_cast<frmActivityMgr*>(ActMgrPtr);  
+       wxPostEvent(frameActMgr, event2);
         
-       }
-    
 }
 
-void frmMain::InvalidSSLCertificate( wxCommandEvent &event ){
+void frmMain::InvalidSSLCertificateString( wxCommandEvent &event ){
     
        // Display the form for showing an invalid SSL certificate.
     
        frmInvalidSSLCertificate *frameISC = new frmInvalidSSLCertificate ( this );
-       SSLInvalidCertNotifObj *SSLICNObj = (SSLInvalidCertNotifObj*)event.GetClientData();
-       SSLCertCollection SSLCCData = SSLICNObj->CertCollection;
+       SSLInvalidCertNotifObjString *SSLICNObj = (SSLInvalidCertNotifObjString*)event.GetClientData();
+       SSLCertCollectionString SSLCCData = SSLICNObj->CertCollection;
        wxString AccountName = SSLICNObj->AccountName;
        frameISC->LoadData(SSLCCData, AccountName);
        frameISC->ShowModal();
@@ -2630,6 +2845,7 @@ void frmMain::InvalidSSLCertificate( wxCommandEvent &event ){
     
        frmActivityMgr *frameActMgr = static_cast<frmActivityMgr*>(ActMgrPtr);  
        wxPostEvent(frameActMgr, event2);
+        
 }
 
 void frmMain::PauseAllTimers(){
@@ -2658,7 +2874,33 @@ void frmMain::ResumeAllTimers(){
     
 }
 
-void frmMain::UpdateSSLAccountStatus(int AccountID, int SSLStatus, SSLCertCollection SSLCertInc){
+#if defined(__APPLE__)
+
+#elif defined(__WIN32__)
+
+void frmMain::UpdateSSLAccountStatus(int AccountID, int SSLStatus, PCCERT_CONTEXT CertificateContext){
+
+       // Delete existing data.
+
+       std::map<int, PCCERT_CONTEXT>::iterator CertificateIter = AccountCertificateData.find(AccountID);
+
+       if (CertificateIter != AccountCertificateData.end()){
+               CertFreeCertificateContext(CertificateIter->second);
+       }
+
+       AccountCertificateData.erase(AccountID);
+       AccountSSLResult.erase(AccountID);
+
+       // Insert new data.
+
+       AccountCertificateData.insert(std::make_pair(AccountID, CertificateContext));
+       AccountSSLResult.insert(std::make_pair(AccountID, SSLStatus));
+
+}
+
+#else
+
+void frmMain::UpdateSSLAccountStatus(int AccountID, int SSLStatus, SSLCertCollectionString SSLCertInc){
     
        // Delete existing data.
     
@@ -2672,6 +2914,84 @@ void frmMain::UpdateSSLAccountStatus(int AccountID, int SSLStatus, SSLCertCollec
     
 }
 
+#endif
+
+void frmMain::SetupSSLStatus( int AccountID ){
+        
+        // Check if account ID given is
+        // the active account and if not, do nothing.
+        
+        wxString AccType;
+        wxString AccTypeLower;
+        
+        AccType = prefaccounts.GetAccountType(AccountID);
+        AccTypeLower = AccType.MakeLower();
+        
+        wxString AccountIDName = prefaccounts.GetAccountDirectory(AccountID) + wxT(".") +
+        AccTypeLower;
+        
+        if (AccountIDName != ActiveAccount){
+                
+                return;
+                
+        }
+        
+       // Check the account type is a supported account type.
+       
+       if (AccType != "CardDAV" && AccType != "carddav" &&
+               AccType != "Local" && AccType != "local"){
+       
+                SSLToolTip->SetTip(wxT("SSL is not enabled for this account"));
+                imgSSLStatus->SetBitmap(*imgNoSSL);
+               return;
+                       
+       }
+       
+        // Check if the account has SSL enabled.
+        
+        bool SSLInUse = prefaccounts.GetAccountSSL(AccountID);
+        
+        if (SSLInUse == FALSE){
+                
+                SSLToolTip->SetTip(wxT("SSL is not enabled for this account"));
+                imgSSLStatus->SetBitmap(*imgNoSSL);
+                
+        } else {
+                
+                // Get the SSL Collection Data.
+                
+                std::map<int,int>::iterator SSLResultIter = AccountSSLResult.find(AccountID);
+                
+               // Check if a result value has been set.
+
+               if (SSLResultIter == AccountSSLResult.end()){
+
+                       imgSSLStatus->SetBitmap(*imgSSLWarning);
+                       SSLToolTip->SetTip(wxT("Unable to determine SSL information for the '") + prefaccounts.GetAccountName(AccountID) + wxT("' account."));
+                       return;
+
+               }
+
+                if (SSLResultIter->second == 1){
+                        
+                        imgSSLStatus->SetBitmap(*imgSSLWarning);
+                        SSLToolTip->SetTip(wxT("Invalid certificate(s) received for '") +
+                                           prefaccounts.GetAccountName(AccountID) +
+                                           wxT("' (Connection denied by user)\n\nDouble click for more information."));
+                        
+                } else if (SSLResultIter->second == 0){
+                        
+                        imgSSLStatus->SetBitmap(*imgSSL);
+                        SSLToolTip->SetTip(wxT("Account '") +
+                                           prefaccounts.GetAccountName(AccountID) +
+                                           wxT("' secured using SSL\n\nDouble click for more information."));
+                        
+                }
+                
+        }
+        
+}
+
 void frmMain::CheckUpdates( wxCommandEvent& event ){
     
        // Check for updates to Xestia Address Book.
@@ -2806,43 +3126,70 @@ void frmMain::ShowHelp( wxCommandEvent& event ){
     
        // Based on the operating system, work out where 
        // the documentation should be.
-    
-//#ifdef __APPLE__
+       
     
 #if defined(__HAIKU__)
-    
-#elif defined(__WIN32__)
-    
-    
-    
+
+#elif defined(__WIN32__)    
+
+#elif defined(__APPLE__)
+        DisplayHelpBrowser();
+        return;
 #else
     
-       if (wxFileExists("/usr/share/doc/xestiaab/index.html")){
-        
-               wxLaunchDefaultBrowser(wxT("file:///usr/share/doc/xestiaab/index.html"));
+       // Get the LANG environment variable
+       
+       char *languageEnvironmentVariableChar = getenv("LANG");
+       std::string languageEnvironmentVariable(languageEnvironmentVariableChar);
+       
+       int executeResult = 0;
+       
+       wxString documentPath = wxString::Format("/usr/local/share/doc/xestiaab/%s.fodt", 
+               wxString(languageEnvironmentVariable).BeforeFirst('.', nullptr));
+       std::string commandToExecute = "odthelpbrowser -d " + documentPath.ToStdString();
+       
+       if (wxFileExists(documentPath))
+               executeResult = system(commandToExecute.c_str());
+       
+       if (executeResult == 0)
                return;
         
 #if XSDAB_RELEASE == 0
+       documentPath = wxString::Format("/usr/share/doc/xestiaab/%s.fodt", 
+               wxString(languageEnvironmentVariable).BeforeFirst('.', nullptr));       
+       commandToExecute = "odthelpbrowser -d " + documentPath.ToStdString();
+       
+       if (wxFileExists(documentPath))
+               executeResult = system(commandToExecute.c_str());
         
-       } else if (wxFileExists("/usr/local/share/doc/xestiaab/index.html")){
-        
-               wxLaunchDefaultBrowser(wxT("file:///usr/local/share/doc/xestiaab/index.html"));
+       if (executeResult == 0)
                return;
-        
 #endif 
-        
+    
+       // Attempt to launch using the "default" language.
+       
+       if (wxFileExists("/usr/share/doc/xestiaab/en_GB.fodt") && executeResult > 0)
+       {
+               commandToExecute = "odthelpbrowser -d " + documentPath.ToStdString();
+               executeResult = system(commandToExecute.c_str());
+       }
+       else if (wxFileExists("/usr/local/share/doc/xestiaab/en_GB.fodt") && executeResult > 0)
+       {
+               commandToExecute = "odthelpbrowser -d " + documentPath.ToStdString();
+               executeResult = system(commandToExecute.c_str());
        }
     
-#endif
+       if (executeResult == 0)
+               return;
     
+#endif
+
 #if XSDAB_RELEASE == 0
-    
        wxMessageBox(_("The help documentation is not available.\n\nYou can view the documentation that came with your source package."), _("Help documentation missing!"));
-    
+       return;
 #else
-    
-       wxMessageBox(_("The help documentation is not available in the usual locations on the system. Please visit http://documentation.xestia.co.uk/xestiaab/ for documentation"), _("Help documentation missing!"));
-    
+       wxMessageBox(_("The help documentation is not available in the usual locations on the system. Please visit https://xestia.co.uk/addressbook for documentation"), _("Help documentation missing!"));
+       return;
 #endif
     
 }
@@ -2886,7 +3233,10 @@ void frmMain::ShowContactMenu( wxMouseEvent& event ){
 
        bool EnableRefresh = FALSE;
 
-       if (!ActiveAccount.IsEmpty()){
+       if (!ActiveAccount.IsEmpty() && (ActiveAccountType == "CardDAV" ||
+                ActiveAccountType == "carddav" ||
+                ActiveAccountType == "Local" ||
+                ActiveAccountType == "local")){
 
                EnableRefresh = TRUE;
        
@@ -2906,4 +3256,29 @@ void frmMain::ResetContactInfo(){
        htmContactData->SetPage(EmptyPage);
        AccCtrl->SetValue("");
        
-}
\ No newline at end of file
+}
+
+bool frmMain::CloseAllWindows()
+{
+       // Attempt to close all windows.
+       
+       if (WindowListPointersMenu.size() == 0)
+       {
+               return true;
+       }
+       
+       if (wxMessageBox(_("Before preforming the action, all windows that are open will need to close. Do you wish to continue?"), _("Close All Windowss"), wxYES_NO) == wxYES)
+       {
+               for(std::map<int, void*>::iterator windowIter = WindowListPointers.begin();
+                       windowIter != WindowListPointers.end(); windowIter++)
+               {
+                       wxWindow *windowPointer = static_cast<wxWindow*>(windowIter->second);
+                       windowPointer->Close();
+               }
+               return true;
+       }
+       else
+       {
+               return false;
+       }
+}
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