/* * Copyright (C) 2011-2018 MicroSIP (http://www.microsip.org) * * This program 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; either version 2 of the License, or * (at your option) any later version. * * This program 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 this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "Contacts.h" #include "microsip.h" #include "settings.h" #include #include #include "mainDlg.h" #include "utf.h" #include "langpack.h" #include "CSVFile.h" Contacts::Contacts(CWnd* pParent /*=NULL*/) : CBaseDialog(Contacts::IDD, pParent) { Create (IDD, pParent); } Contacts::~Contacts(void) { } BOOL Contacts::OnInitDialog() { CBaseDialog::OnInitDialog(); AutoMove(IDC_CONTACTS,0,0,100,100); AutoMove(IDC_SEARCH_PICTURE,0,100,0,0); AutoMove(IDC_FILER_VALUE,0,100,100,0); TranslateDialog(this->m_hWnd); addDlg = new AddDlg(this); imageList = new CImageList(); imageList->Create(16,16,ILC_COLOR32,3,3); imageList->SetBkColor(RGB(255, 255, 255)); imageList->Add(theApp.LoadIcon(IDI_UNKNOWN)); imageList->Add(theApp.LoadIcon(IDI_OFFLINE)); imageList->Add(theApp.LoadIcon(IDI_AWAY)); imageList->Add(theApp.LoadIcon(IDI_ONLINE)); imageList->Add(theApp.LoadIcon(IDI_ON_THE_PHONE)); imageList->Add(theApp.LoadIcon(IDI_BLANK)); imageList->Add(theApp.LoadIcon(IDI_BUSY)); imageList->Add(theApp.LoadIcon(IDI_DEFAULT)); CListCtrl *list= (CListCtrl*)GetDlgItem(IDC_CONTACTS); list->SetImageList(imageList,LVSIL_SMALL); CRect rect; list->GetClientRect(rect); int defaultWidth = rect.Width() - GetSystemMetrics(SM_CXVSCROLL); list->InsertColumn(0, Translate(_T("Name")), LVCFMT_LEFT, accountSettings.contactsWidth0 > 0 ? accountSettings.contactsWidth0 : defaultWidth/2); list->InsertColumn(1, Translate(_T("Info")), LVCFMT_LEFT, accountSettings.contactsWidth1 > 0 ? accountSettings.contactsWidth1 : defaultWidth/2); list->SetExtendedStyle( list->GetExtendedStyle() | LVS_EX_FULLROWSELECT ); ContactsLoad(); return TRUE; } void Contacts::OnCreated() { m_SortItemsExListCtrl.SetSortColumn(0,true); } void Contacts::PostNcDestroy() { CBaseDialog::PostNcDestroy(); if (pj_ready) { PresenceUnsubsribe(); } mainDlg->pageContacts=NULL; delete imageList; delete this; } void Contacts::DoDataExchange(CDataExchange* pDX) { CBaseDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_CONTACTS, m_SortItemsExListCtrl); } BEGIN_MESSAGE_MAP(Contacts, CBaseDialog) ON_NOTIFY(HDN_ENDTRACK, 0, OnEndtrack) ON_BN_CLICKED(IDOK, OnBnClickedOk) ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel) ON_EN_CHANGE(IDC_FILER_VALUE, OnFilterValueChange) ON_COMMAND(ID_CALL_PICKUP,OnMenuCallPickup) ON_COMMAND(ID_CALL,OnMenuCall) ON_COMMAND(ID_CHAT,OnMenuChat) ON_COMMAND(ID_ADD,OnMenuAdd) ON_COMMAND(ID_EDIT,OnMenuEdit) ON_COMMAND(ID_COPY,OnMenuCopy) ON_COMMAND(ID_DELETE,OnMenuDelete) ON_COMMAND(ID_IMPORT_GOOGLE,OnMenuImportGoogle) ON_MESSAGE(WM_CONTEXTMENU,OnContextMenu) ON_NOTIFY(NM_DBLCLK, IDC_CONTACTS, &Contacts::OnNMDblclkContacts) #ifdef _GLOBAL_VIDEO ON_COMMAND(ID_VIDEOCALL,OnMenuCallVideo) #endif END_MESSAGE_MAP() BOOL Contacts::PreTranslateMessage(MSG* pMsg) { BOOL catched = FALSE; if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE) { CEdit* edit = (CEdit*)GetDlgItem(IDC_FILER_VALUE); if (edit == GetFocus()) { catched = TRUE; if (isFiltered()) { filterReset(); } } } if (!catched) { return CBaseDialog::PreTranslateMessage(pMsg); } else { return TRUE; } } void Contacts::OnEndtrack(NMHDR* pNMHDR, LRESULT* pResult) { HD_NOTIFY *phdn = (HD_NOTIFY *)pNMHDR; int width = phdn->pitem->cxy; switch (phdn->iItem) { case 0: accountSettings.contactsWidth0 = width; break; } mainDlg->AccountSettingsPendingSave(); *pResult = 0; } void Contacts::OnBnClickedOk() { CListCtrl *list= (CListCtrl*)GetDlgItem(IDC_CONTACTS); POSITION pos = list->GetFirstSelectedItemPosition(); if (pos) { DefaultItemAction(list->GetNextSelectedItem(pos)); } } void Contacts::DefaultItemAction(int i) { CListCtrl *list= (CListCtrl*)GetDlgItem(IDC_CONTACTS); Contact *pContact = (Contact *) list->GetItemData(i); if (pContact->ringing) { OnMenuCallPickup(); } else { MessageDlgOpen(accountSettings.singleMode); } } void Contacts::OnBnClickedCancel() { mainDlg->ShowWindow(SW_HIDE); } void Contacts::OnFilterValueChange() { ContactsClear(); ContactsLoad(); } bool Contacts::isFiltered(Contact *pContact) { CEdit* edit = (CEdit*)GetDlgItem(IDC_FILER_VALUE); CString str; edit->GetWindowText(str); if (!str.IsEmpty()) { if (!pContact ) { return true; } str.MakeLower(); CString name = pContact->name; CString number = pContact->number; name.MakeLower(); number.MakeLower(); if (name.Find(str) ==-1 && number.Find(str) ==-1) { return true; } } return false; } void Contacts::filterReset() { CEdit* edit = (CEdit*)GetDlgItem(IDC_FILER_VALUE); edit->SetWindowText(_T("")); } LRESULT Contacts::OnContextMenu(WPARAM wParam,LPARAM lParam) { int x = GET_X_LPARAM(lParam); int y = GET_Y_LPARAM(lParam); POINT pt = { x, y }; RECT rc; CListCtrl *list= (CListCtrl*)GetDlgItem(IDC_CONTACTS); POSITION pos = list->GetFirstSelectedItemPosition(); int selectedItem = -1; if (pos) { selectedItem = list->GetNextSelectedItem(pos); } if (x!=-1 || y!=-1) { ScreenToClient(&pt); GetClientRect(&rc); if (!PtInRect(&rc, pt)) { x = y = -1; } } else { if (selectedItem != -1) { list->GetItemPosition(selectedItem,&pt); list->ClientToScreen(&pt); x = 40+pt.x; y = 8+pt.y; } else { ::ClientToScreen((HWND)wParam, &pt); x = 10+pt.x; y = 10+pt.y; } } if (x!=-1 || y!=-1) { CMenu menu; menu.LoadMenu(IDR_MENU_CONTACT); CMenu* tracker = menu.GetSubMenu(0); TranslateMenu(tracker->m_hMenu); if ( selectedItem != -1 ) { Contact *pContact = (Contact *) list->GetItemData(selectedItem); if (pContact->ringing) { tracker->InsertMenu(ID_CALL,0,ID_CALL_PICKUP,Translate(_T("Call Pickup"))); } tracker->EnableMenuItem(ID_CALL, FALSE); #ifdef _GLOBAL_VIDEO tracker->EnableMenuItem(ID_VIDEOCALL, FALSE); #endif tracker->EnableMenuItem(ID_CHAT, FALSE); tracker->EnableMenuItem(ID_EDIT, FALSE); tracker->EnableMenuItem(ID_COPY, FALSE); tracker->EnableMenuItem(ID_DELETE, FALSE); } else { tracker->EnableMenuItem(ID_CALL, TRUE); #ifdef _GLOBAL_VIDEO tracker->EnableMenuItem(ID_VIDEOCALL, TRUE); #endif tracker->EnableMenuItem(ID_CHAT, TRUE); tracker->EnableMenuItem(ID_EDIT, TRUE); tracker->EnableMenuItem(ID_COPY, TRUE); tracker->EnableMenuItem(ID_DELETE, TRUE); } tracker->AppendMenu(0, MF_SEPARATOR); CMenu importMenu; importMenu.CreatePopupMenu(); importMenu.AppendMenu(MF_STRING, ID_IMPORT_GOOGLE, Translate(_T("Google CSV"))); tracker->AppendMenu(MF_POPUP, (UINT_PTR)importMenu.m_hMenu, Translate(_T("Import"))); tracker->TrackPopupMenu( 0, x, y, this ); return TRUE; } return DefWindowProc(WM_CONTEXTMENU,wParam,lParam); } void Contacts::MessageDlgOpen(BOOL isCall, BOOL hasVideo) { if (accountSettings.singleMode && call_get_count_noincoming() && isCall) { mainDlg->GotoTab(0); return; } CListCtrl *list= (CListCtrl*)GetDlgItem(IDC_CONTACTS); POSITION pos = list->GetFirstSelectedItemPosition(); if (pos) { int i = list->GetNextSelectedItem(pos); Contact *pContact = (Contact *) list->GetItemData(i); if (isCall) { mainDlg->MakeCall(pContact->number, hasVideo); } else { mainDlg->MessagesOpen(pContact->number); } } } void Contacts::OnNMDblclkContacts(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR); if (pNMItemActivate->iItem!=-1) { DefaultItemAction(pNMItemActivate->iItem); } *pResult = 0; } void Contacts::OnMenuCallPickup() { CListCtrl *list= (CListCtrl*)GetDlgItem(IDC_CONTACTS); POSITION pos = list->GetFirstSelectedItemPosition(); if (pos) { int i = list->GetNextSelectedItem(pos); Contact *pContact = (Contact *) list->GetItemData(i); mainDlg->messagesDlg->CallMake(_T(_GLOBAL_CALL_PICKUP)+pContact->number); } } void Contacts::OnMenuCall() { MessageDlgOpen(TRUE); } #ifdef _GLOBAL_VIDEO void Contacts::OnMenuCallVideo() { MessageDlgOpen(TRUE, TRUE); } #endif void Contacts::OnMenuChat() { MessageDlgOpen(); } void Contacts::OnMenuAdd() { if (!addDlg->IsWindowVisible()) { addDlg->ShowWindow(SW_SHOW); } else { addDlg->SetForegroundWindow(); } addDlg->listIndex = -1; addDlg->GetDlgItem(IDC_EDIT_NUMBER)->SetWindowText(_T("")); addDlg->GetDlgItem(IDC_EDIT_NAME)->SetWindowText(_T("")); ((CButton *)addDlg->GetDlgItem(IDC_PRESENCE))->SetCheck(0); addDlg->GetDlgItem(IDC_EDIT_NAME)->SetFocus(); } void Contacts::OnMenuEdit() { OnMenuAdd(); CListCtrl *list= (CListCtrl*)GetDlgItem(IDC_CONTACTS); POSITION pos = list->GetFirstSelectedItemPosition(); int i = list->GetNextSelectedItem(pos); addDlg->listIndex = i; Contact *pContact = (Contact *) list->GetItemData(i); addDlg->GetDlgItem(IDC_EDIT_NUMBER)->SetWindowText(pContact->number); addDlg->GetDlgItem(IDC_EDIT_NAME)->SetWindowText(pContact->name); ((CButton *)addDlg->GetDlgItem(IDC_PRESENCE))->SetCheck(pContact->presence); } void Contacts::OnMenuCopy() { CListCtrl *list= (CListCtrl*)GetDlgItem(IDC_CONTACTS); POSITION pos = list->GetFirstSelectedItemPosition(); if (pos) { int i = list->GetNextSelectedItem(pos); Contact *pContact = (Contact *) list->GetItemData(i); mainDlg->CopyStringToClipboard(pContact->number); } } void Contacts::OnMenuDelete() { CList contacts; CListCtrl *list= (CListCtrl*)GetDlgItem(IDC_CONTACTS); POSITION pos = list->GetFirstSelectedItemPosition(); while (pos) { Contact *pContact = (Contact *) list->GetItemData(list->GetNextSelectedItem(pos)); contacts.AddTail(pContact->number); } if (isFiltered()) { filterReset(); } int count = list->GetItemCount(); for (int i=0;iGetItemData(i); if (contacts.Find(pContact->number)) { ContactDelete(i); count--; i--; } } ContactsSave(); } void Contacts::OnMenuImportGoogle() { CFileDialog dlgFile(TRUE, _T("cvs"), 0, OFN_HIDEREADONLY, _T("CSV Files (*.csv)|*.csv|"),this); if (dlgFile.DoModal() == IDOK) { bool changed = false; if (isFiltered()) { filterReset(); } CCSVFile CSVFile; CSVFile.SetCodePage(CP_UTF8); if (CSVFile.Open(dlgFile.GetPathName(), CCSVFile::modeRead | CFile::typeText | CFile::shareDenyWrite)) { CStringArray arr; int nameIndex = -1, numberIndex = -1; while (CSVFile.ReadData(arr)) { if (nameIndex == -1) { for (int i = 0; i < arr.GetCount(); i++) { CString s = arr.GetAt(i); if (nameIndex == -1 && arr.GetAt(i).CompareNoCase(_T("Name")) == 0) { nameIndex = i; } if (numberIndex == -1 && arr.GetAt(i).CompareNoCase(_T("Phone 1 - Value")) == 0) { numberIndex = i; } } if (nameIndex == -1 || numberIndex == -1) { AfxMessageBox(_T("Unknown format")); break; } } else if (arr.GetCount() > numberIndex && arr.GetCount() > nameIndex) { CString number = arr.GetAt(numberIndex); CString name = arr.GetAt(nameIndex); if (!number.IsEmpty() && ContactAdd(number, name, 0, 0, FALSE, TRUE) && !changed) { changed = true; } } } CSVFile.Close(); } if (changed) { ContactsSave(); } } } void Contacts::ContactDelete(int i) { int deleted = 0; CListCtrl *list= (CListCtrl*)GetDlgItem(IDC_CONTACTS); Contact *pContact = (Contact *) list->GetItemData(i); PresenceUnsubsribeOne(pContact); list->DeleteItem(i); delete pContact; } bool Contacts::ContactAdd(CString number, CString name, char presence, char directory, BOOL save, BOOL fromDirectory) { if (save) { if (isFiltered()) { filterReset(); } } CListCtrl *list= (CListCtrl*)GetDlgItem(IDC_CONTACTS); if (fromDirectory || save) { int count = list->GetItemCount(); for (int i=0;iGetItemData(i); CString contactData; if (pContact->number == number) { pContact->candidate = FALSE; bool changed = false; if (!name.IsEmpty() && name!=pContact->name) { list->SetItemText(i,0,name); pContact->name=name; changed = true; } if (presence!=-1 && presence!=pContact->presence) { pContact->presence=presence; if (presence>0) { PresenceSubsribeOne(pContact); } changed = true; } if (!fromDirectory && directory!=-1 && directory!=pContact->directory) { pContact->directory=directory; changed = true; } if (save && changed) { ContactsSave(); } return changed; } } } if (name.IsEmpty()) { name = number; } Contact *pContact; bool found = false; if (pj_ready && isSubscribed) { pjsua_buddy_id ids[PJSUA_MAX_BUDDIES]; unsigned count = PJSUA_MAX_BUDDIES; pjsua_enum_buddies(ids,&count); for (unsigned i=0;inumber == number) { found = true; break; } } } if (!found) { pContact = new Contact(); pContact->image = 7; } pContact->number = number; pContact->name = name; pContact->presence = presence>0; pContact->directory = directory>0; int i = list->InsertItem(LVIF_TEXT|LVIF_PARAM|LVIF_IMAGE,0,name,0,0,pContact->image,(LPARAM)pContact); //list->SetItemText(i,1,number); if (save) { ContactsSave(); } if (save || fromDirectory) { PresenceSubsribeOne(pContact); } return true; } void Contacts::ContactsSave() { if (isFiltered()) { filterReset(); } CXMLFile xmlFile; CXMLElement* xmlRoot = new CXMLElement(); xmlRoot->Create(_T("XML:ROOT"), XET_TAG); CXMLElement* xmlContacts = new CXMLElement(); xmlContacts->Create(_T("contacts"), XET_TAG); xmlRoot->AppendChild(xmlContacts); CListCtrl *list= (CListCtrl*)GetDlgItem(IDC_CONTACTS); int count = list->GetItemCount(); CXMLElement* xmlContact; CXMLElement* xmlAttr; for (int i=0;iGetItemData(i); xmlContact = new CXMLElement(); xmlContact->Create(_T("contact"), XET_TAG); xmlAttr = new CXMLElement(); xmlAttr->Create(_T("number"), XET_ATTRIBUTE); xmlAttr->SetValue(AnsiToUnicode(Utf8EncodeUcs2(XMLEntityEncode(pContact->number))).GetBuffer()); xmlContact->AppendChild(xmlAttr); xmlAttr = new CXMLElement(); xmlAttr->Create(_T("name"), XET_ATTRIBUTE); xmlAttr->SetValue(AnsiToUnicode(Utf8EncodeUcs2(XMLEntityEncode(pContact->name))).GetBuffer()); xmlContact->AppendChild(xmlAttr); xmlAttr = new CXMLElement(); xmlAttr->Create(_T("presence"), XET_ATTRIBUTE); xmlAttr->SetValue(pContact->presence?_T("1"):_T("0")); xmlContact->AppendChild(xmlAttr); xmlAttr = new CXMLElement(); xmlAttr->Create(_T("directory"), XET_ATTRIBUTE); xmlAttr->SetValue(pContact->directory?_T("1"):_T("0")); xmlContact->AppendChild(xmlAttr); xmlContacts->AppendChild(xmlContact); } xmlFile.SetRoot(xmlRoot); CString filename = accountSettings.pathRoaming; filename.Append(_T("Contacts.xml")); xmlFile.SaveToFile(filename.GetBuffer()); } void Contacts::ContactsClear() { CListCtrl *list= (CListCtrl*)GetDlgItem(IDC_CONTACTS); list->DeleteAllItems(); } void Contacts::ContactsLoad() { CXMLFile xmlFile; CString filename = accountSettings.pathRoaming; filename.Append(_T("Contacts.xml")); if (xmlFile.LoadFromFile(filename.GetBuffer())) { CXMLElement *xmlRoot = xmlFile.GetRoot(); CXMLElement *xmlContacts = xmlRoot->GetFirstChild(); while (xmlContacts) { if (xmlContacts->GetElementType() == XET_TAG) { CXMLElement *xmlContact = xmlContacts->GetFirstChild(); while (xmlContact) { if (xmlContact->GetElementType() == XET_TAG) { CXMLElement *xmlAttr = xmlContact->GetFirstChild(); CString number; CString name; BOOL presence = FALSE; BOOL directory = FALSE; CString rab; while (xmlAttr) { if (xmlAttr->GetElementType() == XET_ATTRIBUTE) { CString attrName = xmlAttr->GetElementName(); if (attrName == _T("number")) { number = XMLEntityDecode(Utf8DecodeUni(UnicodeToAnsi(xmlAttr->GetValue()))); } else if (attrName == _T("name")) { name = XMLEntityDecode(Utf8DecodeUni(UnicodeToAnsi(xmlAttr->GetValue()))); } else if (attrName == _T("presence")) { rab = xmlAttr->GetValue(); presence = rab==_T("1"); } else if (attrName == _T("directory")) { rab = xmlAttr->GetValue(); directory = rab==_T("1"); } } xmlAttr = xmlContact->GetNextChild(); } if (!number.IsEmpty()) { Contact contact; contact.name = name; contact.number = number; if (!isFiltered(&contact)) { ContactAdd(number, name, presence, directory, FALSE); } } } xmlContact = xmlContacts->GetNextChild(); } } xmlContacts = xmlRoot->GetNextChild(); } } else { CString key; CString val; LPTSTR ptr = val.GetBuffer(255); int i=0; while (TRUE) { key.Format(_T("%d"),i); if (GetPrivateProfileString(_T("Contacts"), key, NULL, ptr, 256, accountSettings.iniFile)) { CString number; CString name; BOOL presence; BOOL directory; ContactDecode(ptr, number, name, presence, directory); ContactAdd(number, name, presence, directory, FALSE); } else { break; } i++; } WritePrivateProfileSection(_T("Contacts"), NULL, accountSettings.iniFile); ContactsSave(); } m_SortItemsExListCtrl.SortColumn(m_SortItemsExListCtrl.GetSortColumn(),m_SortItemsExListCtrl.IsAscending()); } void Contacts::ContactDecode(CString str, CString &number, CString &name, BOOL &presence, BOOL &fromDirectory) { CString rab; int begin; int end; begin = 0; end = str.Find(';', begin); if (end != -1) { number=str.Mid(begin, end-begin); begin = end + 1; end = str.Find(';', begin); if (end != -1) { name=str.Mid(begin, end-begin); begin = end + 1; end = str.Find(';', begin); if (end != -1) { rab=str.Mid(begin, end-begin); presence = rab == _T("1"); begin = end + 1; end = str.Find(';', begin); if (end != -1) { rab=str.Mid(begin, end-begin); fromDirectory = rab == _T("1"); } else { rab=str.Mid(begin); fromDirectory = rab == _T("1"); } } else { rab=str.Mid(begin); presence = rab == _T("1"); fromDirectory = FALSE; } } else { name = str.Mid(begin); presence = FALSE; fromDirectory = FALSE; } } else { number=str; name = number; presence = FALSE; fromDirectory = FALSE; } } CString Contacts::GetNameByNumber(CString number) { if (isFiltered()) { filterReset(); } CString name; CListCtrl *list= (CListCtrl*)GetDlgItem(IDC_CONTACTS); CString sipURI = GetSIPURI(number); int n = list->GetItemCount(); for (int i=0; iGetItemData(i); if (GetSIPURI(pContact->number) == sipURI) { name = pContact->name; break; } } return name; } void Contacts::PresenceSubsribeOne(Contact *pContact) { if (isSubscribed && pContact->presence) { pjsua_buddy_id p_buddy_id; pjsua_buddy_config buddy_cfg; pjsua_buddy_config_default(&buddy_cfg); buddy_cfg.subscribe=PJ_TRUE; buddy_cfg.uri = StrToPjStr(GetSIPURI(pContact->number)); buddy_cfg.user_data = (void *)pContact; pj_status_t status = pjsua_buddy_add(&buddy_cfg, &p_buddy_id); if (status != PJ_SUCCESS) { AfxMessageBox(_T("Presence Subscription error: ")+GetErrorMessage(status)); } } } void Contacts::PresenceUnsubsribeOne(Contact *pContact) { if (isSubscribed) { pjsua_buddy_id ids[PJSUA_MAX_BUDDIES]; unsigned count = PJSUA_MAX_BUDDIES; pjsua_enum_buddies(ids,&count); for (unsigned i=0;iGetItemCount(); for (int i=0; iGetItemData(i); PresenceSubsribeOne(pContact); } } } void Contacts::PresenceUnsubsribe() { pjsua_buddy_id ids[PJSUA_MAX_BUDDIES]; unsigned count = PJSUA_MAX_BUDDIES; pjsua_enum_buddies(ids,&count); for (unsigned i=0;im_hWnd)) { CListCtrl *list= (CListCtrl *)GetDlgItem(IDC_CONTACTS); int n = list->GetItemCount(); for (int i=0; iSetItem(i, 0, LVIF_IMAGE, 0, 7, 0, 0, 0); } } isSubscribed=FALSE; } void Contacts::SetCanditates() { if (isFiltered()) { filterReset(); } CListCtrl *list= (CListCtrl*)GetDlgItem(IDC_CONTACTS); int count = list->GetItemCount(); for (int i=0;iGetItemData(i); if (pContact->directory) { pContact->candidate = TRUE; } } } int Contacts::DeleteCanditates() { if (isFiltered()) { filterReset(); } CListCtrl *list= (CListCtrl*)GetDlgItem(IDC_CONTACTS); int count = list->GetItemCount(); int deleted = 0; for (int i=0;iGetItemData(i); if (pContact->candidate) { ContactDelete(i); count--; i--; deleted++; } } return deleted; }