// frmSearch-process.cpp - Search process subroutines.
//
// (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 "../common/preferences.h"
#include "../common/dirs.h"
#include "../vcard/vcard.h"
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);
wxString vcardfilenamewxs;
wxStringTokenizer vcardfileline;
wxString lwxs;
wxString setname, setvalue;
wxString vCardFilename;
wxString vCardFilenameFull;
if (wxDirExists(AccountDir)){
wxDir vcardaccdir(AccountDir);
bool ProcFiles = vcardaccdir.GetFirst(&vCardFilename, wxEmptyString, wxDIR_FILES);
while(ProcFiles){
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);
vcardfilenamewxs = vCardFilenameFull;
// 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);
}