// frmSearch.cpp - Search form. // // (c) 2012-2015 Xestia Software Development. // // This file is part of Xestia Address Book. // // Xestia Address Book is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by the // Free Software Foundation, version 3 of the license. // // Xestia Address Book is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License along // with Xestia Address Book. If not, see #include "frmSearch.h" #include "frmMain.h" #include "frmContact.h" #include "search/XABSearchPanel.h" #include "search/frmSearchAccounts.h" #include "common/preferences.h" #include "common/dirs.h" #include "vcard/vcard.h" #include #include /*#include #include #include */ #include #include DEFINE_EVENT_TYPE(SE_ADDSEARCHSETTING); DEFINE_EVENT_TYPE(SE_REMOVESEARCHSETTING); DEFINE_EVENT_TYPE(SE_RELOADACCOUNTS); DEFINE_EVENT_TYPE(SE_ADDRESULT); DEFINE_EVENT_TYPE(SE_SBUPDATE); DEFINE_EVENT_TYPE(SE_SEARCHFINISHED); DEFINE_EVENT_TYPE(SE_UPDATERESULT); DEFINE_EVENT_TYPE(SE_DELETERESULT); DEFINE_EVENT_TYPE(SE_OPENCONTACT); DEFINE_EVENT_TYPE(SE_EDITCONTACT); DEFINE_EVENT_TYPE(SE_REVEALCONTACT); BEGIN_EVENT_TABLE(frmSearch, wxFrame) EVT_COMMAND(wxID_ANY, SE_ADDSEARCHSETTING, frmSearch::AddSearchSetting) EVT_COMMAND(wxID_ANY, SE_REMOVESEARCHSETTING, frmSearch::RemoveSearchSetting) EVT_COMMAND(wxID_ANY, SE_RELOADACCOUNTS, frmSearch::ReloadAccountList) EVT_COMMAND(wxID_ANY, SE_ADDRESULT, frmSearch::AddResult) EVT_COMMAND(wxID_ANY, SE_SBUPDATE, frmSearch::SearchBarUpdate) EVT_COMMAND(wxID_ANY, SE_SEARCHFINISHED, frmSearch::SearchFinished) EVT_COMMAND(wxID_ANY, SE_UPDATERESULT, frmSearch::UpdateResult) EVT_COMMAND(wxID_ANY, SE_DELETERESULT, frmSearch::DeleteResult) EVT_COMMAND(wxID_ANY, SE_OPENCONTACT, frmSearch::OpenContact) EVT_COMMAND(wxID_ANY, SE_EDITCONTACT, frmSearch::EditContact) EVT_COMMAND(wxID_ANY, SE_REVEALCONTACT, frmSearch::RevealContact) END_EVENT_TABLE() //namespace boostfs = boost::filesystem; frmSearch::frmSearch( wxWindow* parent ) : frmSearchADT( parent ) { XABSearchPanel *InitPanel = new XABSearchPanel( tabSearch ); InitPanel->EnableButtons(TRUE, FALSE); InitPanel->SetupPointers(this); InitPanel->SetupInteger(ScrollGen); szrSearch->Add(InitPanel, 1, wxEXPAND, 0); szrSearch->Fit(tabSearch); SearchFrames.insert(std::make_pair(ScrollGen, InitPanel)); ScrollGen++; // Get the list of accounts and mark them as true. wxString preffilename = GetUserPrefDir(); XABPreferences preferences(preffilename); wxString AccDir; wxString AccDirFull; wxString AccDirFullSfx; for (int i = 0; i < preferences.accounts.GetCount(); i++){ AccDir = preferences.accounts.GetAccountDirectory(i); AccDirFull = preferences.accounts.GetAccountDirectory(i); AccDirFull.Trim(); AccDirFull.Append(wxT(".")); AccDirFullSfx.Append(preferences.accounts.GetAccountType(i)); AccDirFullSfx.LowerCase(); AccDirFullSfx.Trim(); AccDirFull.Append(AccDirFullSfx); SearchAccountsPaths.insert(std::make_pair(AccDir, AccDirFull)); SearchAccounts.insert(std::make_pair(AccDir, TRUE)); SearchAccountsNames.insert(std::make_pair(AccDir, preferences.accounts.GetAccountName(i))); AccDirFull.clear(); AccDirFullSfx.clear(); AccDir.clear(); } // Setup the columns. wxListItem item; item.SetId(0); item.SetText(_("Name")); item.SetWidth(228); lstResults->InsertColumn(0, item); item.SetId(1); item.SetText(_("Nickname")); item.SetWidth(128); lstResults->InsertColumn(1, item); item.SetId(2); item.SetText(_("Account")); item.SetWidth(128); lstResults->InsertColumn(2, item); } void frmSearch::SelectAccounts( wxCommandEvent& event ) { // Create the form and display as modal. frmSearchAccounts *frameSAccount = new frmSearchAccounts ( this ); frameSAccount->LoadSearchAccounts(&SearchAccounts, &SearchAccountsNames); frameSAccount->ShowModal(); delete frameSAccount; frameSAccount = NULL; } void frmSearch::SearchContactsThread(){ // Go through each account and find contacts based on the // matched settings. std::map::iterator SAiter; std::map::iterator SAPiter; int intResultFound = 0; for (std::map::iterator SALiter = SearchAccountsNames.begin(); SALiter != SearchAccountsNames.end(); SALiter++){ // Double check that we are searching in this account. // If not, skip to the next one. SAiter = SearchAccounts.find(SALiter->first); SAPiter = SearchAccountsPaths.find(SAiter->first); if (SAiter->second == FALSE){ // Not looking in this account. Go to next account. continue; } wxCommandEvent sbupdate (SE_SBUPDATE); wxString *SBData = new wxString; *SBData = _("Searching ") + SALiter->second + _("..."); sbupdate.SetClientData(SBData); wxPostEvent(this, sbupdate); if (StopMode == FALSE){ wxCommandEvent sbstop (SE_SBUPDATE); wxString *SBStopStr = new wxString; *SBStopStr = _("Search stopped."); sbstop.SetClientData(SBStopStr); wxPostEvent(this, sbstop); return; } // Get the list of contact files and process each // one of them. wxString AccountDir = GetAccountDir(SAPiter->second, FALSE); //boostfs::path vcarddir(AccountDir.c_str()); //boostfs::directory_iterator dir_end; //boostfs::path vcardfilename; wxString vcardfilenamewxs; wxStringTokenizer vcardfileline; //std::string l; wxString lwxs; wxString setname, setvalue; long ContactIndex = 1; long ContactSeekPoint = 0; wxString vCardFilename; wxString vCardFilenameFull; //if (boostfs::exists(vcarddir)){ if (wxDirExists(AccountDir)){ wxDir vcardaccdir(AccountDir); bool ProcFiles = vcardaccdir.GetFirst(&vCardFilename, wxEmptyString, wxDIR_FILES); while(ProcFiles){ //for (boostfs::directory_iterator vcarddir_iter(vcarddir); // vcarddir_iter != dir_end ; ++vcarddir_iter){ if (StopMode == FALSE){ wxCommandEvent sbstop(SE_SBUPDATE); wxString *SBStopStr = new wxString; *SBStopStr = _("Search stopped."); sbstop.SetClientData(SBStopStr); wxPostEvent(this, sbstop); return; } if (vCardFilename.Right(4) == wxT(".vcf") || vCardFilename.Right(4) == wxT(".VCF") || vCardFilename.Right(5) == wxT(".vcard") || vCardFilename.Right(5) == wxT(".VCARD")){ vCard Person; vCardFilenameFull.Append(AccountDir); vCardFilenameFull.Append(vCardFilename); Person.LoadFile(vCardFilenameFull); /*if (boostfs::path(vcarddir_iter->path()).extension() == ".vcf" || boostfs::path(vcarddir_iter->path()).extension() == ".VCF" || boostfs::path(vcarddir_iter->path()).extension() == ".vcard" || boostfs::path(vcarddir_iter->path()).extension() == ".VCARD"){*/ vcardfilenamewxs = vCardFilenameFull; /*vCard Person; std::fstream vcardfile; vcardfilename = boostfs::path(vcarddir_iter->path()).filename(); vcardfilenamewxs.Append(AccountDir); vcardfilenamewxs.Append(wxString::FromUTF8(vcardfilename.c_str())); // Open the vCard file up and get the setting names and values from the // file. vcardfile.open(vcardfilenamewxs.mb_str(), std::ios::in); while(getline(vcardfile, l)){ lwxs.Clear(); setname.Clear(); setvalue.Clear(); lwxs.Append(wxString::FromUTF8(l.c_str())); vcardfileline.SetString(lwxs, wxT(":")); setname = vcardfileline.GetNextToken(); setvalue = vcardfileline.GetString(); Person.Add(setname, setvalue, TRUE); } vcardfile.close();*/ // Check if file has version 4.0, first name (FN) // begin and end vCard portions. // Don't search unless these conditions have been met. if (Person.MeetBaseSpecification()){ // Go through each of the search settings and check // if they match with contact details. // If it matches then add to the search results. int SelOpt = 0; bool chkOpt = FALSE; wxString StrOpt; int StrOptLen = 0; ArrayvCardOutData ArrayData; ArrayvCardOutData NicknameArrayData; vCardName NameArray = Person.GetName(); wxString ContactFinalNickname; NicknameArrayData = Person.GetByPartial(wxT("NICKNAME")); if (NicknameArrayData.PropCount != 0){ ContactFinalNickname = NicknameArrayData.PropValues[0]; } for (std::map::iterator siter = SearchFrames.begin(); siter != SearchFrames.end(); siter++){ // Get the settings from the form. XABSearchPanel *XABSPPtr = static_cast(siter->second); // Get Selected Option and Setting. SelOpt = XABSPPtr->GetSelectionOption(); if (SelOpt < 12){ StrOpt = XABSPPtr->GetStringSetting(); StrOptLen = StrOpt.Len(); if (SelOpt == 0 || SelOpt == 4 || SelOpt == 8){ // Matching string that beings with... // Double check the std::map inserts for each section. if (SelOpt == 0){ // Get the forename from the first N. if (NameArray.Forename.Mid(0, StrOptLen) == StrOpt){ if (CheckDuplicate(vcardfilenamewxs, SAPiter->second, &SearchResultAccount, &SearchResultFilename) == TRUE){ SelOpt = 0; chkOpt = FALSE; StrOpt.Clear(); StrOptLen = 0; ArrayData.PropData.Clear(); ArrayData.PropValues.Clear(); ArrayData.PropCount = 0; continue; } SRNotif *sradd = new SRNotif; sradd->ContactName = NameArray; sradd->ContactNickname = ContactFinalNickname; sradd->ContactAccount = SAPiter->second; sradd->ContactAccountName = SALiter->second; sradd->ContactFullFilename = vcardfilenamewxs; sradd->SearchResultID = intResultFound; SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount)); SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename)); intResultFound++; wxCommandEvent sraddenv(SE_ADDRESULT); sraddenv.SetClientData(sradd); wxPostEvent(this, sraddenv); } } else if (SelOpt == 4){ if (NameArray.Surname.Mid(0, StrOptLen) == StrOpt){ if (CheckDuplicate(vcardfilenamewxs, SAPiter->second, &SearchResultAccount, &SearchResultFilename) == TRUE){ SelOpt = 0; chkOpt = FALSE; StrOpt.Clear(); StrOptLen = 0; ArrayData.PropData.Clear(); ArrayData.PropValues.Clear(); ArrayData.PropCount = 0; continue; } SRNotif *sradd = new SRNotif; sradd->ContactName = NameArray; sradd->ContactNickname = ContactFinalNickname; sradd->ContactAccount = SAPiter->second; sradd->ContactAccountName = SALiter->second; sradd->ContactFullFilename = vcardfilenamewxs; sradd->SearchResultID = intResultFound; SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount)); SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename)); intResultFound++; wxCommandEvent sraddenv(SE_ADDRESULT); sraddenv.SetClientData(sradd); wxPostEvent(this, sraddenv); } } else if (SelOpt == 8){ wxString NicknameData; for (int i = 0; i < NicknameArrayData.PropCount; i++){ NicknameData = NicknameArrayData.PropValues[i]; if (NicknameData.Mid(0, StrOptLen) == StrOpt){ if (CheckDuplicate(vcardfilenamewxs, SAPiter->second, &SearchResultAccount, &SearchResultFilename) == TRUE){ SelOpt = 0; chkOpt = FALSE; StrOpt.Clear(); StrOptLen = 0; ArrayData.PropData.Clear(); ArrayData.PropValues.Clear(); ArrayData.PropCount = 0; continue; } SRNotif *sradd = new SRNotif; sradd->ContactName = NameArray; sradd->ContactNickname = ContactFinalNickname; sradd->ContactAccount = SAPiter->second; sradd->ContactAccountName = SALiter->second; sradd->ContactFullFilename = vcardfilenamewxs; sradd->SearchResultID = intResultFound; SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount)); SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename)); intResultFound++; wxCommandEvent sraddenv(SE_ADDRESULT); sraddenv.SetClientData(sradd); wxPostEvent(this, sraddenv); break; } } } } else if (SelOpt == 1 || SelOpt == 5 || SelOpt == 9){ // Matching string that ends with... if (SelOpt == 1){ // Check the forename. if (NameArray.Forename.Right(StrOptLen) == StrOpt){ if (CheckDuplicate(vcardfilenamewxs, SAPiter->second, &SearchResultAccount, &SearchResultFilename) == TRUE){ SelOpt = 0; chkOpt = FALSE; StrOpt.Clear(); StrOptLen = 0; ArrayData.PropData.Clear(); ArrayData.PropValues.Clear(); ArrayData.PropCount = 0; continue; } SRNotif *sradd = new SRNotif; sradd->ContactName = NameArray; sradd->ContactNickname = ContactFinalNickname; sradd->ContactAccount = SAPiter->second; sradd->ContactAccountName = SALiter->second; sradd->ContactFullFilename = vcardfilenamewxs; sradd->SearchResultID = intResultFound; SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount)); SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename)); intResultFound++; wxCommandEvent sraddenv(SE_ADDRESULT); sraddenv.SetClientData(sradd); wxPostEvent(this, sraddenv); } } else if (SelOpt == 5){ if (NameArray.Surname.Right(StrOptLen) == StrOpt){ if (CheckDuplicate(vcardfilenamewxs, SAPiter->second, &SearchResultAccount, &SearchResultFilename) == TRUE){ SelOpt = 0; chkOpt = FALSE; StrOpt.Clear(); StrOptLen = 0; ArrayData.PropData.Clear(); ArrayData.PropValues.Clear(); ArrayData.PropCount = 0; continue; } SRNotif *sradd = new SRNotif; sradd->ContactName = NameArray; sradd->ContactNickname = ContactFinalNickname; sradd->ContactAccount = SAPiter->second; sradd->ContactAccountName = SALiter->second; sradd->ContactFullFilename = vcardfilenamewxs; sradd->SearchResultID = intResultFound; SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount)); SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename)); intResultFound++; wxCommandEvent sraddenv(SE_ADDRESULT); sraddenv.SetClientData(sradd); wxPostEvent(this, sraddenv); } } else if (SelOpt == 9){ wxString NicknameData; for (int i = 0; i < NicknameArrayData.PropCount; i++){ NicknameData = NicknameArrayData.PropValues[i]; NicknameData.Trim(); if (NicknameData.Right(StrOptLen) == StrOpt){ if (CheckDuplicate(vcardfilenamewxs, SAPiter->second, &SearchResultAccount, &SearchResultFilename) == TRUE){ SelOpt = 0; chkOpt = FALSE; StrOpt.Clear(); StrOptLen = 0; ArrayData.PropData.Clear(); ArrayData.PropValues.Clear(); ArrayData.PropCount = 0; continue; } SRNotif *sradd = new SRNotif; sradd->ContactName = NameArray; sradd->ContactNickname = ContactFinalNickname; sradd->ContactAccount = SAPiter->second; sradd->ContactAccountName = SALiter->second; sradd->ContactFullFilename = vcardfilenamewxs; sradd->SearchResultID = intResultFound; SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount)); SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename)); intResultFound++; wxCommandEvent sraddenv(SE_ADDRESULT); sraddenv.SetClientData(sradd); wxPostEvent(this, sraddenv); break; } } } } else if (SelOpt == 2 || SelOpt == 6 || SelOpt == 10){ // Matching string that contains... if (SelOpt == 2){ if (NameArray.Forename.Find(StrOpt) != wxNOT_FOUND){ if (CheckDuplicate(vcardfilenamewxs, SAPiter->second, &SearchResultAccount, &SearchResultFilename) == TRUE){ SelOpt = 0; chkOpt = FALSE; StrOpt.Clear(); StrOptLen = 0; ArrayData.PropData.Clear(); ArrayData.PropValues.Clear(); ArrayData.PropCount = 0; continue; } SRNotif *sradd = new SRNotif; sradd->ContactName = NameArray; sradd->ContactNickname = ContactFinalNickname; sradd->ContactAccount = SAPiter->second; sradd->ContactAccountName = SALiter->second; sradd->ContactFullFilename = vcardfilenamewxs; sradd->SearchResultID = intResultFound; SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount)); SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename)); intResultFound++; wxCommandEvent sraddenv(SE_ADDRESULT); sraddenv.SetClientData(sradd); wxPostEvent(this, sraddenv); } } else if (SelOpt == 6){ if (NameArray.Surname.Find(StrOpt) != wxNOT_FOUND){ if (CheckDuplicate(vcardfilenamewxs, SAPiter->second, &SearchResultAccount, &SearchResultFilename) == TRUE){ SelOpt = 0; chkOpt = FALSE; StrOpt.Clear(); StrOptLen = 0; ArrayData.PropData.Clear(); ArrayData.PropValues.Clear(); ArrayData.PropCount = 0; continue; } SRNotif *sradd = new SRNotif; sradd->ContactName = NameArray; sradd->ContactNickname = ContactFinalNickname; sradd->ContactAccount = SAPiter->second; sradd->ContactAccountName = SALiter->second; sradd->ContactFullFilename = vcardfilenamewxs; sradd->SearchResultID = intResultFound; SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount)); SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename)); intResultFound++; wxCommandEvent sraddenv(SE_ADDRESULT); sraddenv.SetClientData(sradd); wxPostEvent(this, sraddenv); } } else if (SelOpt == 10){ wxString NicknameData; for (int i = 0; i < NicknameArrayData.PropCount; i++){ NicknameData = NicknameArrayData.PropValues[i]; NicknameData.Trim(); if (NicknameData.Find(StrOpt) != wxNOT_FOUND){ if (CheckDuplicate(vcardfilenamewxs, SAPiter->second, &SearchResultAccount, &SearchResultFilename) == TRUE){ SelOpt = 0; chkOpt = FALSE; StrOpt.Clear(); StrOptLen = 0; ArrayData.PropData.Clear(); ArrayData.PropValues.Clear(); ArrayData.PropCount = 0; continue; } SRNotif *sradd = new SRNotif; sradd->ContactName = NameArray; sradd->ContactNickname = ContactFinalNickname; sradd->ContactAccount = SAPiter->second; sradd->ContactAccountName = SALiter->second; sradd->ContactFullFilename = vcardfilenamewxs; sradd->SearchResultID = intResultFound; SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount)); SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename)); intResultFound++; wxCommandEvent sraddenv(SE_ADDRESULT); sraddenv.SetClientData(sradd); wxPostEvent(this, sraddenv); break; } } } } else if (SelOpt == 3 || SelOpt == 7 || SelOpt == 11){ // Matching String that doesn't contain... if (SelOpt == 3){ // Process the nickname data. if (NameArray.Forename.Find(StrOpt) == wxNOT_FOUND){ if (CheckDuplicate(vcardfilenamewxs, SAPiter->second, &SearchResultAccount, &SearchResultFilename) == TRUE){ SelOpt = 0; chkOpt = FALSE; StrOpt.Clear(); StrOptLen = 0; ArrayData.PropData.Clear(); ArrayData.PropValues.Clear(); ArrayData.PropCount = 0; continue; } SRNotif *sradd = new SRNotif; sradd->ContactName = NameArray; sradd->ContactNickname = ContactFinalNickname; sradd->ContactAccount = SAPiter->second; sradd->ContactAccountName = SALiter->second; sradd->ContactFullFilename = vcardfilenamewxs; sradd->SearchResultID = intResultFound; SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount)); SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename)); intResultFound++; wxCommandEvent sraddenv(SE_ADDRESULT); sraddenv.SetClientData(sradd); wxPostEvent(this, sraddenv); } } else if (SelOpt == 7){ if (!NameArray.Surname.Find(StrOpt) == wxNOT_FOUND){ if (CheckDuplicate(vcardfilenamewxs, SAPiter->second, &SearchResultAccount, &SearchResultFilename) == TRUE){ SelOpt = 0; chkOpt = FALSE; StrOpt.Clear(); StrOptLen = 0; ArrayData.PropData.Clear(); ArrayData.PropValues.Clear(); ArrayData.PropCount = 0; continue; } SRNotif *sradd = new SRNotif; sradd->ContactName = NameArray; sradd->ContactNickname = ContactFinalNickname; sradd->ContactAccount = SAPiter->second; sradd->ContactAccountName = SALiter->second; sradd->ContactFullFilename = vcardfilenamewxs; sradd->SearchResultID = intResultFound; SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount)); SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename)); intResultFound++; wxCommandEvent sraddenv(SE_ADDRESULT); sraddenv.SetClientData(sradd); wxPostEvent(this, sraddenv); } } else if (SelOpt == 11){ wxString NicknameData; for (int i = 0; i < NicknameArrayData.PropCount; i++){ NicknameData = NicknameArrayData.PropValues[i]; NicknameData.Trim(); if (NicknameData.Find(StrOpt) == wxNOT_FOUND){ if (CheckDuplicate(vcardfilenamewxs, SAPiter->second, &SearchResultAccount, &SearchResultFilename) == TRUE){ SelOpt = 0; chkOpt = FALSE; StrOpt.Clear(); StrOptLen = 0; ArrayData.PropData.Clear(); ArrayData.PropValues.Clear(); ArrayData.PropCount = 0; continue; } SRNotif *sradd = new SRNotif; sradd->ContactName = NameArray; sradd->ContactNickname = ContactFinalNickname; sradd->ContactAccount = SAPiter->second; sradd->ContactAccountName = SALiter->second; sradd->ContactFullFilename = vcardfilenamewxs; sradd->SearchResultID = intResultFound; SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount)); SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename)); intResultFound++; wxCommandEvent sraddenv(SE_ADDRESULT); sraddenv.SetClientData(sradd); wxPostEvent(this, sraddenv); break; } } } } } else { chkOpt = XABSPPtr->GetCheckboxSetting(); if (SelOpt == 12){ // Search should check if it has a photo or not. ArrayData = Person.GetByPartial(wxT("PHOTO")); if ((ArrayData.PropCount >= 1 && chkOpt == TRUE) || (ArrayData.PropCount == 0 && chkOpt == FALSE)){ if (CheckDuplicate(vcardfilenamewxs, SAPiter->second, &SearchResultAccount, &SearchResultFilename) == TRUE){ SelOpt = 0; chkOpt = FALSE; StrOpt.Clear(); StrOptLen = 0; ArrayData.PropData.Clear(); ArrayData.PropValues.Clear(); ArrayData.PropCount = 0; continue; } SRNotif *sradd = new SRNotif; sradd->ContactName = NameArray; sradd->ContactNickname = ContactFinalNickname; sradd->ContactAccount = SAPiter->second; sradd->ContactAccountName = SALiter->second; sradd->ContactFullFilename = vcardfilenamewxs; sradd->SearchResultID = intResultFound; SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount)); SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename)); intResultFound++; wxCommandEvent sraddenv(SE_ADDRESULT); sraddenv.SetClientData(sradd); wxPostEvent(this, sraddenv); } } else if (SelOpt == 13){ // Search should check if it has a logo or not. ArrayData = Person.GetByPartial(wxT("LOGO")); if ((ArrayData.PropCount >= 1 && chkOpt == TRUE) || (ArrayData.PropCount == 0 && chkOpt == FALSE)){ if (CheckDuplicate(vcardfilenamewxs, SAPiter->second, &SearchResultAccount, &SearchResultFilename) == TRUE){ SelOpt = 0; chkOpt = FALSE; StrOpt.Clear(); StrOptLen = 0; ArrayData.PropData.Clear(); ArrayData.PropValues.Clear(); ArrayData.PropCount = 0; continue; } SRNotif *sradd = new SRNotif; sradd->ContactName = NameArray; sradd->ContactNickname = ContactFinalNickname; sradd->ContactAccount = SAPiter->second; sradd->ContactAccountName = SALiter->second; sradd->ContactFullFilename = vcardfilenamewxs; sradd->SearchResultID = intResultFound; SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount)); SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename)); intResultFound++; wxCommandEvent sraddenv(SE_ADDRESULT); sraddenv.SetClientData(sradd); wxPostEvent(this, sraddenv); } } else if (SelOpt == 14){ // Search should check if it has sound or not. ArrayData = Person.GetByPartial(wxT("SOUND")); if ((ArrayData.PropCount >= 1 && chkOpt == TRUE) || (ArrayData.PropCount == 0 && chkOpt == FALSE)){ if (CheckDuplicate(vcardfilenamewxs, SAPiter->second, &SearchResultAccount, &SearchResultFilename) == TRUE){ SelOpt = 0; chkOpt = FALSE; StrOpt.Clear(); StrOptLen = 0; ArrayData.PropData.Clear(); ArrayData.PropValues.Clear(); ArrayData.PropCount = 0; continue; } SRNotif *sradd = new SRNotif; sradd->ContactName = NameArray; sradd->ContactNickname = ContactFinalNickname; sradd->ContactAccount = SAPiter->second; sradd->ContactAccountName = SALiter->second; sradd->ContactFullFilename = vcardfilenamewxs; sradd->SearchResultID = intResultFound; SearchResultAccount.insert(std::make_pair(sradd->SearchResultID, sradd->ContactAccount)); SearchResultFilename.insert(std::make_pair(sradd->SearchResultID, sradd->ContactFullFilename)); intResultFound++; wxCommandEvent sraddenv(SE_ADDRESULT); sraddenv.SetClientData(sradd); wxPostEvent(this, sraddenv); } } } SelOpt = 0; chkOpt = FALSE; StrOpt.Clear(); StrOptLen = 0; ArrayData.PropData.Clear(); ArrayData.PropValues.Clear(); ArrayData.PropCount = 0; } } else { } } vCardFilename.Clear(); vCardFilenameFull.Clear(); ProcFiles = vcardaccdir.GetNext(&vCardFilename); } } else { } } // Finished searching... clear up. wxCommandEvent sbfinstr (SE_SBUPDATE); wxString *SBFinish = new wxString; if (intResultFound == 0){ *SBFinish = _("No contacts found."); } else if (intResultFound == 1){ *SBFinish = _("1 contact found."); } else { *SBFinish = wxString::Format(wxT("%i"), intResultFound) + _(" contacts found."); } sbfinstr.SetClientData(SBFinish); wxPostEvent(this, sbfinstr); wxCommandEvent sbfinish (SE_SEARCHFINISHED); wxPostEvent(this, sbfinish); } void frmSearch::SearchContacts( wxCommandEvent& event ) { // Change the button to stop. if (StopMode == FALSE){ // Clear the list of search results. lstResults->DeleteAllItems(); SearchResultAccount.clear(); SearchResultFilename.clear(); // Button clicked on as 'Search'. DisableAllSearchSettings(TRUE); StopMode = TRUE; btnSearch->SetLabel(_("Stop")); // Spawn a thread so that searching can proceed // without blocking the GUI (and allow the // search to stop when needed). std::thread SearchThread(&frmSearch::SearchContactsThread, this); SearchThread.detach(); } else { // Button clicked on as 'Stop'. StopMode = FALSE; btnSearch->SetLabel(_("Search")); DisableAllSearchSettings(FALSE); } } void frmSearch::ResetContacts( wxCommandEvent& event ) { // Clear all the search settings. for (std::map::iterator iter = SearchFrames.begin(); iter != SearchFrames.end(); ++iter){ XABSearchPanel *XABSPPtr; XABSPPtr = static_cast(iter->second); szrSearch->Detach(XABSPPtr); // Remove the frame from the memory and the list. delete XABSPPtr; XABSPPtr = NULL; SearchFrames.erase(iter->first); } // Clear the list of search results. lstResults->DeleteAllItems(); // Clear the account settings. for (std::map::iterator iter = SearchAccounts.begin(); iter != SearchAccounts.end(); iter++){ iter->second = TRUE; } // Add a search settings with the default things. ScrollGen = 0; XABSearchPanel *NewPanel = new XABSearchPanel( tabSearch ); NewPanel->EnableButtons(TRUE, FALSE); NewPanel->SetupPointers(this); NewPanel->SetupInteger(ScrollGen); szrSearch->Add(NewPanel, 1, wxEXPAND, 0); szrSearch->Fit(tabSearch); SearchFrames.insert(std::make_pair(ScrollGen, NewPanel)); ScrollGen++; } void frmSearch::AddSearchSetting( wxCommandEvent& event ) { // Add a search setting frame to the list. XABSearchPanel *NewPanel = new XABSearchPanel( tabSearch ); NewPanel->EnableButtons(TRUE, TRUE); NewPanel->SetupPointers(this); NewPanel->SetupInteger(ScrollGen); szrSearch->Add(NewPanel, 1, wxEXPAND|wxGROW, 5); //szrSearch->Fit(tabSearch); szrSearch->FitInside(tabSearch); szrSearch->Layout(); szrSearch->RecalcSizes(); tabSearch->Layout(); SearchFrames.insert(std::make_pair(ScrollGen, NewPanel)); ScrollGen++; // Check if number of search settings is 15 (or over). // If it is, disable the option of adding extra settings // for all frames until one is removed. XABSearchPanel *XABSPPtr; if (SearchFrames.size() >= 15){ for (std::map::iterator iter = SearchFrames.begin(); iter != SearchFrames.end(); ++iter){ XABSPPtr = static_cast(iter->second); XABSPPtr->EnableButtons(FALSE, TRUE); } } else if (SearchFrames.size() >= 2){ for (std::map::iterator iter = SearchFrames.begin(); iter != SearchFrames.end(); ++iter){ XABSPPtr = static_cast(iter->second); XABSPPtr->EnableButtons(TRUE, TRUE); } } //tabSearch->SetScrollbar(wxVERTICAL, 32768, 25, 32768, false); tabSearch->Update(); //tabSearch->ScrollToLine(tabSearch->GetLineCount()); } void frmSearch::RemoveSearchSetting( wxCommandEvent& event ) { // Get the integer from the event. std::map::iterator iter; iter = SearchFrames.find(event.GetInt()); // Remove a search setting frame from the list. XABSearchPanel *XABSPPtr; XABSPPtr = static_cast(iter->second); szrSearch->Detach(XABSPPtr); // Remove the frame from the memory and the list. SearchFrames.erase(event.GetInt()); delete XABSPPtr; XABSPPtr = NULL; //szrSearch->Fit(tabSearch); if (SearchFrames.size() < 15 && SearchFrames.size() > 1){ for (std::map::iterator iter = SearchFrames.begin(); iter != SearchFrames.end(); ++iter){ XABSPPtr = static_cast(iter->second); XABSPPtr->EnableButtons(TRUE, TRUE); } } else if (SearchFrames.size() == 1){ for (std::map::iterator iter = SearchFrames.begin(); iter != SearchFrames.end(); ++iter){ XABSPPtr = static_cast(iter->second); XABSPPtr->EnableButtons(TRUE, FALSE); } } szrSearch->FitInside(tabSearch); szrSearch->Layout(); szrSearch->RecalcSizes(); tabSearch->Layout(); } void frmSearch::ReloadAccountList( wxCommandEvent& event ){ // Currently unimplemented. } void frmSearch::AddResult( wxCommandEvent& event ){ SRNotif *srnotif = (SRNotif*)event.GetClientData(); // Process Data and add to the list of results. wxListItem item; // Setup the contact name. wxString ContactNameFinal; if (!srnotif->ContactName.Title.IsEmpty()){ ContactNameFinal.append(srnotif->ContactName.Title); ContactNameFinal.Trim(); ContactNameFinal.append(wxT(" ")); } if (!srnotif->ContactName.Forename.IsEmpty()){ ContactNameFinal.append(srnotif->ContactName.Forename); ContactNameFinal.Trim(); ContactNameFinal.append(wxT(" ")); } if (!srnotif->ContactName.Surname.IsEmpty()){ ContactNameFinal.append(srnotif->ContactName.Surname); ContactNameFinal.Trim(); ContactNameFinal.append(wxT(" ")); } if (!srnotif->ContactName.Suffix.IsEmpty()){ ContactNameFinal.append(srnotif->ContactName.Suffix); ContactNameFinal.Trim(); } item.SetId(0); item.SetText(ContactNameFinal); item.SetData(srnotif->SearchResultID); long ListCtrlIndex = lstResults->InsertItem(item); //SearchResultAccount.insert(std::make_pair(srnotif->SearchResultID, srnotif->ContactAccount)); //SearchResultFilename.insert(std::make_pair(srnotif->SearchResultID, srnotif->ContactFullFilename)); srnotif->ContactNickname.Trim(); lstResults->SetItem(ListCtrlIndex, 1, srnotif->ContactNickname); lstResults->SetItem(ListCtrlIndex, 2, srnotif->ContactAccountName); delete srnotif; srnotif = NULL; } void frmSearch::SearchBarUpdate( wxCommandEvent& event ){ wxString *SBData = (wxString*)event.GetClientData(); stbBottom->SetStatusText(*SBData, 0); delete SBData; SBData = NULL; } void frmSearch::SearchFinished( wxCommandEvent& event ){ StopMode = FALSE; btnSearch->SetLabel(_("Search")); DisableAllSearchSettings(FALSE); } void frmSearch::DisableAllSearchSettings(bool Enable){ for (std::map::iterator siter = SearchFrames.begin(); siter != SearchFrames.end(); siter++){ XABSearchPanel *XABSPPtr = static_cast(siter->second); if (Enable == FALSE){ wxCommandEvent enboxes(XABSP_ENABLECONTROLS); wxPostEvent(XABSPPtr, enboxes); } else if (Enable == TRUE){ wxCommandEvent disboxes(XABSP_DISABLECONTROLS); wxPostEvent(XABSPPtr, disboxes); } } } void frmSearch::OpenContact( wxCommandEvent& event ){ // Check if a contact has been selected. long intSelected = -1; int intSelectedData = 0; long intContactSeekNum = -1; intSelected = lstResults->GetNextItem(intSelected, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); if (intSelected == -1){ return; } intContactSeekNum = lstResults->GetItemData(intSelected); if (SearchMode == TRUE){ wxMessageBox(SearchResultFilename[intContactSeekNum]); vCard Person; Person.LoadFile(SearchResultFilename[intContactSeekNum]); wxMemoryInputStream istream(bigimgs_contactpersonicon48_png, sizeof(bigimgs_contactpersonicon48_png)); wxImage bigimgs_contactpersonicon48i(istream, wxBITMAP_TYPE_PNG); wxBitmap contacticonbmp(bigimgs_contactpersonicon48i, -1); wxIcon contacticon; contacticon.CopyFromBitmap(contacticonbmp); frmContact *Contact = new frmContact( this ); Contact->SetupPointers(&SearchModeMemoryFSPtr); Contact->SetupContactData(&Person); Contact->SetIcon(contacticon); Contact->Show(true); } else { UCNotif *uc = new UCNotif; uc->ContactAccount = SearchResultAccount[intContactSeekNum]; uc->ContactFilename = SearchResultFilename[intContactSeekNum]; wxCommandEvent oc(CE_OPENCONTACT); oc.SetClientData(uc); wxPostEvent(this->GetParent(), oc); } } void frmSearch::EditContact( wxCommandEvent& event ){ // Check if a contact has been selected. long intSelected = -1; int intSelectedData = 0; long intContactSeekNum = -1; intSelected = lstResults->GetNextItem(intSelected, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); if (intSelected == -1){ return; } intContactSeekNum = lstResults->GetItemData(intSelected); UCNotif *uc = new UCNotif; uc->ContactAccount = SearchResultAccount[intContactSeekNum]; uc->ContactFilename = SearchResultFilename[intContactSeekNum]; wxCommandEvent ec(CE_EDITCONTACT); ec.SetClientData(uc); ec.SetInt(1); wxPostEvent(this->GetParent(), ec); } void frmSearch::RevealContact( wxCommandEvent& event ){ // Check if a contact has been selected. long intSelected = -1; int intSelectedData = 0; long intContactSeekNum = -1; intSelected = lstResults->GetNextItem(intSelected, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); if (intSelected == -1){ return; } intContactSeekNum = lstResults->GetItemData(intSelected); UCNotif *uc = new UCNotif; uc->ContactAccount = SearchResultAccount[intContactSeekNum]; uc->ContactFilename = SearchResultFilename[intContactSeekNum]; wxCommandEvent rc(CE_REVEALCONTACT); rc.SetClientData(uc); rc.SetInt(1); wxPostEvent(this->GetParent(), rc); } void frmSearch::CloseWindow( wxCloseEvent& event ){ // Hide the window so users don't panic // whilst clearing up. this->Hide(); // Clear up. for (std::map::iterator iter = SearchFrames.begin(); iter != SearchFrames.end(); ++iter){ XABSearchPanel *XABSPPtr; XABSPPtr = static_cast(iter->second); szrSearch->Detach(XABSPPtr); // Remove the frame from the memory and the list. delete XABSPPtr; XABSPPtr = NULL; } SearchFrames.clear(); // Close window. WindowData *WData = new WindowData; WData->DataType = 2; WData->WindowPointer = this; WData->WindowID = SearchUID; wxCommandEvent delevent(WINDOW_CLOSE); delevent.SetClientData(WData); wxPostEvent(GetParent(), delevent); wxCommandEvent rs(CE_REMOVESEARCH); wxPostEvent(this, rs); WData = NULL; this->Destroy(); } void frmSearch::CloseWindow( wxCommandEvent& event ){ this->Close(); } void frmSearch::UpdateResult( wxCommandEvent& event ){ UCNotif *uc = (UCNotif*)event.GetClientData(); long longSelected = -1; int intSelectedData = 0; for (;;){ longSelected = lstResults->GetNextItem(longSelected, wxLIST_NEXT_ALL, wxLIST_STATE_DONTCARE); if (longSelected == -1){ break; } // Get the filename/ID information. intSelectedData = lstResults->GetItemData(longSelected); if (uc->ContactFilename == SearchResultFilename[intSelectedData]){ // Process the contact name wxString ContactNameFinal; if (!uc->ContactNameArray.Title.IsEmpty()){ ContactNameFinal.append(uc->ContactNameArray.Title); ContactNameFinal.Trim(); ContactNameFinal.append(wxT(" ")); } if (!uc->ContactNameArray.Forename.IsEmpty()){ ContactNameFinal.append(uc->ContactNameArray.Forename); ContactNameFinal.Trim(); ContactNameFinal.append(wxT(" ")); } if (!uc->ContactNameArray.Surname.IsEmpty()){ ContactNameFinal.append(uc->ContactNameArray.Surname); ContactNameFinal.Trim(); ContactNameFinal.append(wxT(" ")); } if (!uc->ContactNameArray.Suffix.IsEmpty()){ ContactNameFinal.append(uc->ContactNameArray.Suffix); ContactNameFinal.Trim(); } lstResults->SetItem(longSelected, 0, ContactNameFinal); lstResults->SetItem(longSelected, 1, uc->ContactNickname); } } delete uc; uc = NULL; } bool frmSearch::CheckDuplicate(wxString Filename, wxString Account, std::map *SRAcc, std::map *SRFN){ std::map::iterator fniter; // Check comparison code. for (std::map::iterator aciter = SRAcc->begin(); aciter != SRAcc->end(); aciter++){ fniter = SRFN->find(aciter->first); if (Filename == fniter->second && Account == aciter->second){ return TRUE; } } return FALSE; } void frmSearch::DeleteResult(wxCommandEvent &event){ UCNotif *uc = (UCNotif*)event.GetClientData(); long longSelected = -1; int intSelectedData = 0; for (;;){ longSelected = lstResults->GetNextItem(longSelected, wxLIST_NEXT_ALL, wxLIST_STATE_DONTCARE); if (longSelected == -1){ break; } // Get the filename/ID information. intSelectedData = lstResults->GetItemData(longSelected); if (uc->ContactFilename == SearchResultFilename[intSelectedData]){ // Delete the result from the search list and // update the total search results. // Remove DeleteResultEvent and find out where the uc // data is still being used as it crashes on delete. lstResults->DeleteItem(longSelected); // Update the number of search results. wxCommandEvent sbu(SE_SBUPDATE); wxString *SBUpdate = new wxString; // Get the number of results. int intResultFound = lstResults->GetItemCount(); // Prepare the status bar message. if (intResultFound == 0){ *SBUpdate = _("No contacts found."); } else if (intResultFound == 1){ *SBUpdate = _("1 contact found."); } else { *SBUpdate = wxString::Format(wxT("%i"), intResultFound) + _(" contacts found."); } sbu.SetClientData(SBUpdate); wxPostEvent(this, sbu); break; } } delete uc; uc = NULL; } void frmSearch::SetUID(int UID){ SearchUID = UID; } void frmSearch::SetSearchMode(bool SearchModeIn){ SearchMode = SearchModeIn; if (SearchMode == TRUE){ mnuContactEdit->Enable(FALSE); mnuContactReveal->Enable(FALSE); wxFileSystem::AddHandler(new wxMemoryFSHandler); wxImage ciicon_png; wxMemoryInputStream ciptostream(icons_cipto_png, sizeof(icons_cipto_png)); ciicon_png.LoadFile(ciptostream, wxBITMAP_TYPE_PNG); wxMemoryFSHandler::AddFile(wxT("cipto.png"), ciicon_png, wxBITMAP_TYPE_PNG); wxMemoryInputStream cilogstream(icons_cilog_png, sizeof(icons_cilog_png)); ciicon_png.LoadFile(cilogstream, wxBITMAP_TYPE_PNG); wxMemoryFSHandler::AddFile(wxT("cilog.png"), ciicon_png, wxBITMAP_TYPE_PNG); wxMemoryInputStream cisndstream(icons_cisnd_png, sizeof(icons_cisnd_png)); ciicon_png.LoadFile(cisndstream, wxBITMAP_TYPE_PNG); wxMemoryFSHandler::AddFile(wxT("cisnd.png"), ciicon_png, wxBITMAP_TYPE_PNG); wxMemoryInputStream cikeystream(icons_cikey_png, sizeof(icons_cikey_png)); ciicon_png.LoadFile(cikeystream, wxBITMAP_TYPE_PNG); wxMemoryFSHandler::AddFile(wxT("cikey.png"), ciicon_png, wxBITMAP_TYPE_PNG); wxMemoryInputStream civenstream(icons_civen_png, sizeof(icons_civen_png)); ciicon_png.LoadFile(civenstream, wxBITMAP_TYPE_PNG); wxMemoryFSHandler::AddFile(wxT("civen.png"), ciicon_png, wxBITMAP_TYPE_PNG); wxMemoryInputStream ciextstream(icons_ciext_png, sizeof(icons_ciext_png)); ciicon_png.LoadFile(ciextstream, wxBITMAP_TYPE_PNG); wxMemoryFSHandler::AddFile(wxT("ciext.png"), ciicon_png, wxBITMAP_TYPE_PNG); } else { mnuContactEdit->Enable(TRUE); mnuContactReveal->Enable(TRUE); } } void frmSearch::ShowContactMenu( wxMouseEvent& event ){ ContactMenu->SetupPointers(this, lstResults); PopupMenu(ContactMenu->MenuPointer(), wxDefaultPosition); }