#include #include "PoomContactsReader.h" #include "PoomContact.h" #define BUF_SIZE 11 #define MAX_DATE_DOUBLE_4000 767011.083333 CPoomContactsReader::CPoomContactsReader(IFolder* pIFolder) : IPoomFolderReader(pIFolder) { _items = IPoomFolderReader::getItemCollection(); } CPoomContactsReader::~CPoomContactsReader(void) { if (_items) _items->Release(); } int CPoomContactsReader::Count() { int uCount = 0; _items->get_Count(&uCount); return uCount; } HRESULT CPoomContactsReader::Get(int i, CPoomSerializer *pPoomSerializer, LPBYTE *pBuf, UINT *puBufLen) { HRESULT hr = E_FAIL; if (_items == NULL || pBuf == NULL || puBufLen == NULL) { DBG_TRACE(L"Debug - PoomContactsReader.cpp - Get(...) err 1 \n", 5, FALSE); return hr; } IContact* pElementContact = NULL; hr = _items->Item(i, (IDispatch **) &pElementContact); if (hr != S_OK) { DBG_TRACE(L"Debug - PoomContactsReader.cpp - Get(...) err 2 \n", 5, FALSE); return hr; } CPoomContact *contact = new(std::nothrow) CPoomContact(); if (contact == NULL) { DBG_TRACE(L"Debug - PoomContactsReader.cpp - Get(...) err 3 \n", 5, FALSE); pElementContact->Release(); return hr; } HeaderStruct *header = contact->Header(); hr = pElementContact->get_Oid(&header->lOid); if (hr == S_OK) { Parse(pElementContact, contact); *pBuf = pPoomSerializer->Serialize(contact, (LPDWORD) puBufLen); } else { DBG_TRACE(L"Debug - PoomContactsReader.cpp - Get(...) err 4 \n", 5, FALSE); } if (contact) delete contact; if (pElementContact) pElementContact->Release(); return hr; } HRESULT CPoomContactsReader::GetOne(IPOutlookApp *pIPoomApp, LONG lOid, CPoomSerializer *pPoomSerializer, LPBYTE *pBuf, UINT *puBufLen) { HRESULT hr = E_FAIL; if (pIPoomApp == NULL || pBuf == NULL || puBufLen == NULL) return hr; IContact *pElementContact = NULL; IItem *pItem = NULL; hr = pIPoomApp->GetItemFromOid(lOid, (IDispatch **) &pElementContact); if (hr != S_OK) { DBG_TRACE(L"Debug - PoomContactsReader.cpp - GetOne(...) err 1 \n", 5, FALSE); return hr; } if (SUCCEEDED(pElementContact->QueryInterface(IID_IItem, (void**)&pItem))) { INT iType = 0; BOOL bSIM = FALSE; if (SUCCEEDED(pItem->get_DefaultItemType(&iType))) { if (iType == 103) // se abbiamo il tipo olSimContactItem (103) lo ignoriamo bSIM = TRUE; } pItem->Release(); pItem = NULL; if (bSIM == TRUE) { pElementContact->Release(); return E_FAIL; } } CPoomContact* contact = new(std::nothrow) CPoomContact(); if (contact == NULL) { DBG_TRACE(L"Debug - PoomContactsReader.cpp - GetOne(...) err 2 \n", 5, FALSE); pElementContact->Release(); return E_FAIL; } HeaderStruct* header = contact->Header(); header->lOid = lOid; Parse(pElementContact, contact); *pBuf = pPoomSerializer->Serialize(contact, (LPDWORD) puBufLen); if (contact) delete contact; if (pElementContact) pElementContact->Release(); return S_OK; } void CPoomContactsReader::Parse(IContact *iContact, CPoomContact *contact) { DATE date; SYSTEMTIME st; ZeroMemory(&date, sizeof(DATE)); ZeroMemory(&st, sizeof(SYSTEMTIME)); ContactMapType* contactMap = contact->Map(); BSTR bstrTemp; #define GET_ENTRY(func, e_type, pMap) \ do { \ if(SUCCEEDED(func(&bstrTemp))){ \ if(SysStringLen(bstrTemp) > 0){ \ LPWSTR lpwString = new WCHAR[SysStringLen(bstrTemp) + 1]; \ StringCchCopy(lpwString, SysStringLen(bstrTemp) + 1,(LPWSTR) bstrTemp); \ (*pMap)[e_type] = lpwString; \ } \ } \ SysFreeString(bstrTemp); \ } while (0) GET_ENTRY(iContact->get_FirstName, FirstName, contactMap); GET_ENTRY(iContact->get_LastName, LastName, contactMap); GET_ENTRY(iContact->get_CompanyName, CompanyName, contactMap); GET_ENTRY(iContact->get_BusinessFaxNumber, BusinessFaxNumber, contactMap); GET_ENTRY(iContact->get_Department, Department, contactMap); GET_ENTRY(iContact->get_Email1Address, Email1Address, contactMap); GET_ENTRY(iContact->get_MobileTelephoneNumber, MobileTelephoneNumber, contactMap); GET_ENTRY(iContact->get_OfficeLocation, OfficeLocation, contactMap); GET_ENTRY(iContact->get_PagerNumber, PagerNumber, contactMap); GET_ENTRY(iContact->get_BusinessTelephoneNumber, BusinessTelephoneNumber, contactMap); GET_ENTRY(iContact->get_JobTitle, JobTitle, contactMap); GET_ENTRY(iContact->get_HomeTelephoneNumber, HomeTelephoneNumber, contactMap); GET_ENTRY(iContact->get_Email2Address, Email2Address, contactMap); GET_ENTRY(iContact->get_Spouse, Spouse, contactMap); GET_ENTRY(iContact->get_Email3Address, Email3Address, contactMap); GET_ENTRY(iContact->get_Home2TelephoneNumber, Home2TelephoneNumber, contactMap); GET_ENTRY(iContact->get_HomeFaxNumber, HomeFaxNumber, contactMap); GET_ENTRY(iContact->get_CarTelephoneNumber, CarTelephoneNumber, contactMap); GET_ENTRY(iContact->get_AssistantName, AssistantName, contactMap); GET_ENTRY(iContact->get_AssistantTelephoneNumber, AssistantTelephoneNumber, contactMap); GET_ENTRY(iContact->get_Children, Children, contactMap); GET_ENTRY(iContact->get_Categories, Categories, contactMap); GET_ENTRY(iContact->get_WebPage, WebPage, contactMap); GET_ENTRY(iContact->get_Business2TelephoneNumber, Business2TelephoneNumber, contactMap); GET_ENTRY(iContact->get_RadioTelephoneNumber, RadioTelephoneNumber, contactMap); GET_ENTRY(iContact->get_FileAs, FileAs, contactMap); GET_ENTRY(iContact->get_YomiCompanyName, YomiCompanyName, contactMap); GET_ENTRY(iContact->get_YomiFirstName, YomiFirstName, contactMap); GET_ENTRY(iContact->get_YomiLastName, YomiLastName, contactMap); GET_ENTRY(iContact->get_Title, Title, contactMap); GET_ENTRY(iContact->get_MiddleName, MiddleName, contactMap); GET_ENTRY(iContact->get_Suffix, Suffix, contactMap); GET_ENTRY(iContact->get_HomeAddressStreet, HomeAddressStreet, contactMap); GET_ENTRY(iContact->get_HomeAddressCity, HomeAddressCity, contactMap); GET_ENTRY(iContact->get_HomeAddressState, HomeAddressState, contactMap); GET_ENTRY(iContact->get_HomeAddressPostalCode, HomeAddressPostalCode, contactMap); GET_ENTRY(iContact->get_HomeAddressCountry, HomeAddressCountry, contactMap); GET_ENTRY(iContact->get_OtherAddressStreet, OtherAddressStreet, contactMap); GET_ENTRY(iContact->get_OtherAddressCity, OtherAddressCity, contactMap); GET_ENTRY(iContact->get_OtherAddressPostalCode, OtherAddressPostalCode, contactMap); GET_ENTRY(iContact->get_OtherAddressCountry, OtherAddressCountry, contactMap); GET_ENTRY(iContact->get_BusinessAddressStreet, BusinessAddressStreet, contactMap); GET_ENTRY(iContact->get_BusinessAddressCity, BusinessAddressCity, contactMap); GET_ENTRY(iContact->get_BusinessAddressState, BusinessAddressState, contactMap); GET_ENTRY(iContact->get_BusinessAddressPostalCode, BusinessAddressPostalCode, contactMap); GET_ENTRY(iContact->get_BusinessAddressCountry, BusinessAddressCountry, contactMap); GET_ENTRY(iContact->get_CompanyName, Body, contactMap); GET_ENTRY(iContact->get_CompanyName, CompanyName, contactMap); GET_ENTRY(iContact->get_OtherAddressState, OtherAddressState, contactMap); GET_ENTRY(iContact->get_Body, Body, contactMap); if(SUCCEEDED(iContact->get_Birthday(&date))) { if(date != DATE_NONE && date < MAX_DATE_DOUBLE_4000){ WCHAR *tmp1 = new WCHAR[BUF_SIZE]; VariantTimeToSystemTime(date, &st); _snwprintf(tmp1, BUF_SIZE, L"%d/%d/%d", st.wDay, st.wMonth, st.wYear); (*contactMap)[Birthday] = tmp1; } } if(SUCCEEDED(iContact->get_Anniversary(&date))) { if(date != DATE_NONE && date < MAX_DATE_DOUBLE_4000){ WCHAR *tmp2 = new WCHAR[BUF_SIZE]; VariantTimeToSystemTime(date, &st); _snwprintf(tmp2, BUF_SIZE, L"%d/%d/%d", st.wDay, st.wMonth, st.wYear); (*contactMap)[Anniversary] = tmp2; } } } .