contactbuilder.cpp

来自「funambol window mobile客户端源代码」· C++ 代码 · 共 1,190 行 · 第 1/3 页

CPP
1,190
字号
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<HomeTelephoneNumber>") + element_s + TEXT("</HomeTelephoneNumber>");
    SysFreeString(element);

    pContact->get_Email2Address(&element);

    element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<Email2Address>") + element_s + TEXT("</Email2Address>");
    SysFreeString(element);

    pContact->get_Spouse(&element);

    element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<Spouse>") + element_s + TEXT("</Spouse>");
    SysFreeString(element);

    pContact->get_Email3Address(&element);

    element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<Email3Address>") + element_s + TEXT("</Email3Address>");
    SysFreeString(element);

    pContact->get_Home2TelephoneNumber(&element);

    element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<Home2TelephoneNumber>") + element_s + TEXT("</Home2TelephoneNumber>");
    SysFreeString(element);

    pContact->get_HomeFaxNumber(&element);

    element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<HomeFaxNumber>") + element_s + TEXT("</HomeFaxNumber>");
    SysFreeString(element);

    pContact->get_CarTelephoneNumber(&element);

    element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<CarTelephoneNumber>") + element_s + TEXT("</CarTelephoneNumber>");
    SysFreeString(element);

    pContact->get_AssistantName(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<AssistantName>") + element_s + TEXT("</AssistantName>");
    SysFreeString(element);

    pContact->get_AssistantTelephoneNumber(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<AssistantTelephoneNumber>") + element_s + TEXT("</AssistantTelephoneNumber>");
    SysFreeString(element);

    pContact->get_Children(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<Children>") + element_s + TEXT("</Children>");
    SysFreeString(element);

    pContact->get_Categories(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<Categories>") + element_s + TEXT("</Categories>");
    SysFreeString(element);

    pContact->get_WebPage(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<WebPage>") + element_s + TEXT("</WebPage>");
    SysFreeString(element);

    pContact->get_Business2TelephoneNumber(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<Business2TelephoneNumber>") + element_s + TEXT("</Business2TelephoneNumber>");
    SysFreeString(element);

    pContact->get_RadioTelephoneNumber(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<RadioTelephoneNumber>") + element_s + TEXT("</RadioTelephoneNumber>");
    SysFreeString(element);

    pContact->get_FileAs(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<FileAs>") + element_s + TEXT("</FileAs>");
    SysFreeString(element);

    pContact->get_YomiCompanyName(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<YomiCompanyName>") + element_s + TEXT("</YomiCompanyName>");
    SysFreeString(element);

    pContact->get_YomiFirstName(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<YomiFirstName>") + element_s + TEXT("</YomiFirstName>");
    SysFreeString(element);

    pContact->get_YomiLastName(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<YomiLastName>") + element_s + TEXT("</YomiLastName>");
    SysFreeString(element);

    pContact->get_Title(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<Title>") + element_s + TEXT("</Title>");
    SysFreeString(element);

    pContact->get_MiddleName(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<MiddleName>") + element_s + TEXT("</MiddleName>");
    SysFreeString(element);

    pContact->get_Suffix(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<Suffix>") + element_s + TEXT("</Suffix>");
    SysFreeString(element);

    pContact->get_HomeAddressStreet(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<HomeAddressStreet>") + element_s + TEXT("</HomeAddressStreet>");
    SysFreeString(element);

    pContact->get_HomeAddressCity(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<HomeAddressCity>") + element_s + TEXT("</HomeAddressCity>");
    SysFreeString(element);

    pContact->get_HomeAddressState(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<HomeAddressState>") + element_s + TEXT("</HomeAddressState>");
    SysFreeString(element);

    pContact->get_HomeAddressPostalCode(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<HomeAddressPostalCode>") + element_s + TEXT("</HomeAddressPostalCode>");
    SysFreeString(element);

    pContact->get_HomeAddressCountry(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<HomeAddressCountry>") + element_s + TEXT("</HomeAddressCountry>");
    SysFreeString(element);

    pContact->get_OtherAddressStreet(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<OtherAddressStreet>") + element_s + TEXT("</OtherAddressStreet>");
    SysFreeString(element);

    pContact->get_OtherAddressCity(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<OtherAddressCity>") + element_s + TEXT("</OtherAddressCity>");
    SysFreeString(element);

    pContact->get_OtherAddressPostalCode(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<OtherAddressPostalCode>") + element_s + TEXT("</OtherAddressPostalCode>");
    SysFreeString(element);

    pContact->get_OtherAddressCountry(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<OtherAddressCountry>") + element_s + TEXT("</OtherAddressCountry>");
    SysFreeString(element);

    pContact->get_OtherAddressState(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<OtherAddressState>") + element_s + TEXT("</OtherAddressState>");
    SysFreeString(element);

    pContact->get_BusinessAddressStreet(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<BusinessAddressStreet>") + element_s + TEXT("</BusinessAddressStreet>");
    SysFreeString(element);

    pContact->get_BusinessAddressCity(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<BusinessAddressCity>") + element_s + TEXT("</BusinessAddressCity>");
    SysFreeString(element);

    pContact->get_BusinessAddressState(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<BusinessAddressState>") + element_s + TEXT("</BusinessAddressState>");
    SysFreeString(element);

    pContact->get_BusinessAddressPostalCode(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<BusinessAddressPostalCode>") + element_s + TEXT("</BusinessAddressPostalCode>");
    SysFreeString(element);

    pContact->get_BusinessAddressCountry(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<BusinessAddressCountry>") + element_s + TEXT("</BusinessAddressCountry>");
    SysFreeString(element);

    pContact->get_Body(&element); element_s.clear();
    element_s = wstring(element); encodeSpecialChar(element_s);
    contactStringItem  += TEXT("<Body>") + element_s + TEXT("</Body>");
    SysFreeString(element);

    pContact->get_Birthday(&date);

    wsprintf(tempDate, TEXT(""));

    double toCompare = MAX_DATE_DOUBLE;

    if (date != toCompare) { // MAX_DATE_DOUBLE is set to 949999.00000, the nonsense value when in ppc date is not set...
        doubleToSystemTimeBirthday(tempDate, date);
        //doubleToSystemTimeHourZero(tempDate, date, TRUE);
        // doubleToSystemTime(tempDate, date);
    }
    //contactStringItem +=  TEXT("<Birthday>") + tempDate + TEXT("</Birthday>");
    contactStringItem +=  TEXT("<Birthday>");  contactStringItem += tempDate; contactStringItem += TEXT("</Birthday>");

    pContact->get_Anniversary(&date);
    wsprintf(tempDate, TEXT(""));
    if (date != toCompare) {
        doubleToSystemTimeBirthday(tempDate, date);
        // doubleToSystemTimeHourZero(tempDate, date, TRUE);
        // doubleToSystemTime(tempDate, date);
    }
    //contactStringItem +=  TEXT("<Anniversary>") + tempDate + TEXT("</Anniversary>");

    contactStringItem +=  TEXT("<Anniversary>"); contactStringItem += tempDate; contactStringItem += TEXT("</Anniversary>");

    contactStringItem +=  TEXT("</contact>");

}



/*
* The method calculate the CRC hash value for the contact item.
* It create the XML structure and calculate the crc value.
* Use to compare for understand the modified value!
*
* @param pContact : the contact object that contain every value
*/

long calculateContactHash (IContact* pContact) {

    wstring p;

    populateContactStringItem(p, pContact);
    long l = stringCrc32(p.data());

    p.clear();
    return l;

}






int writeToTempFile(FILE* f, char *ptr, int numBytes) {

   int numWritten = fwrite(ptr, sizeof(char), numBytes, f);
   return numWritten;

}



/*
* Use the WinContact object provided by the C++ API.
* This is only for Windows Mobile 5 devices. It uses windows
* api that are a low level.
*/

WinItem* contactToWinContact(IItem *pContact, bool isSif) {

    HRESULT hr                = E_FAIL;
    CEPROPVAL *prgPropvalPoom = NULL;
    ULONG cbBuffer            = 0;
    HANDLE hHeap              = GetProcessHeap();
    wstring value, imagew = L"";

    WinContact* winC          = NULL;
    if (isSif) { winC = new WinContactSIF(); } 
    else       { winC = new WinContact();    }

    cbBuffer = 0;
    hr = pContact->GetProps(PIMPR_props, CEDB_ALLOWREALLOC, NUM_COLS, &prgPropvalPoom, &cbBuffer, hHeap);

    if(FAILED(hr) || NULL == prgPropvalPoom || 0 == cbBuffer) {
        goto Exit;
    }

    for (int i = 0; i < NUM_COLS; i++) {

        if (i == ePIMPR_BIRTHDAY || i == ePIMPR_ANNIVERSARY) {
            value = getDatePropertyFromMapi(&prgPropvalPoom[i], false, true);
        }
        else if (i == ePIMPR_PICTURE) {
            // currently it is set empty because if there is an image it will be
            // set later with a value
            value = L"";
        }
        else {
            value = getStringPropertyFromMapi(&prgPropvalPoom[i]);
        }
        winC->setProperty(contactFields[i], value);
    }

    // to get the picture of the contact
    imagew = getPicturePropertyFromMapi(pContact, *winC);
    winC->setProperty(PICTURE, imagew);

    hr = S_OK;

Exit:
    // Free memory.
    HeapFree(hHeap, 0, prgPropvalPoom);
    return (WinItem*)winC;

}




HRESULT winContactToContact(WinContact& winC, IItem *pContact) {

    //Handle the picture separately
    wstring picture;
    if (winC.getProperty(PICTURE, picture)) {
        winC.removeElement(PICTURE);
    }
    HRESULT hr                = E_FAIL;
    int numberOfProperty      = winC.getPropertyMapSize();
    int incNumProp            = 0;
    CEPROPVAL *prgPropvalPoom = new CEPROPVAL[numberOfProperty];

    FILETIME date;
    bool exists = false;
    int i = 0;
    for (i = 0; i < NUM_COLS; i++) {
        exists = false;
        wstring& value = winC.getPropertyRef(contactFields[i], &exists);

        if (exists) {
            prgPropvalPoom[incNumProp].wFlags   = 0;
            prgPropvalPoom[incNumProp].wLenData = 0;

            if (i == ePIMPR_BIRTHDAY || i == ePIMPR_ANNIVERSARY) {
                prgPropvalPoom[incNumProp].propid = PIMPR_props[i];
                date = getDatePropertyFromString(value, true);
                prgPropvalPoom[incNumProp].val.filetime = date;
            }
            else if (i == ePIMPR_PICTURE) {
                // Picture is handled later. BTW it should not be here because it is removed
                // before
                incNumProp--;
            }
            else if (i == ePIMPR_BODY_TEXT) {
                convertNewlines(value);
                prgPropvalPoom[incNumProp].propid = PIMPR_props[i];
                prgPropvalPoom[incNumProp].val.lpwstr = (wchar_t*)value.c_str();
            }
            else {
                prgPropvalPoom[incNumProp].propid = PIMPR_props[i];
                prgPropvalPoom[incNumProp].val.lpwstr = (wchar_t*)value.c_str();
            }
            incNumProp++;
        }
    }

    LOG.debug("Setting %d properties into IItem...", incNumProp);
    hr = pContact->SetProps(0, incNumProp, prgPropvalPoom);
    if (FAILED(hr)) {
        LOG.error("Error setting contact properties. Please check if incoming item is correct.");
        goto finally;
    }
    hr = pContact->Save();
    if (FAILED(hr)) {
        LOG.error("Error saving contact.");
        goto finally;
    }

    //
    // Insert the image if exists
    //
    IStream* pStream = NULL;
    ULONG cbWritten = 0;
    if (picture != L"") {
        const wstring charsToRemove = L" \r\n";     // remove spaces, '\r' and '\n'
        size_t len = 0;
        int idx;
        while( (idx=picture.find_first_of(charsToRemove)) >= 0 ) {
            picture.replace( idx, 1, L"" );
        }

        char* valueA = toMultibyte(picture.c_str());
        int rc = b64_decode(valueA, valueA);
        if(rc > 0) {
            hr = pContact->OpenProperty(PIMPR_PICTURE, GENERIC_READ|GENERIC_WRITE, &pStream);
            hr = pStream->Write(valueA, rc, &cbWritten);
            pStream->Commit(STGC_DEFAULT);
            pStream->Release();
        }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?