📄 bookengine.cpp
字号:
#include "BookEngine.h"
#include <eikenv.h>
#include <e32def.h>
#include <charconv.h>
#include <utf.h>
CBookEngine* CBookEngine::NewL()
{
CBookEngine* self = CBookEngine::NewLC();
CleanupStack::Pop(self);
return self;
}
CBookEngine* CBookEngine::NewLC()
{
CBookEngine* self = new(ELeave) CBookEngine;
CleanupStack::PushL(self);
self->ConstructL();
return self;
}
CBookEngine::~CBookEngine()
{
MEMORY_FREE(m_pContacts);
MEMORY_FREE(m_pPbkContactEngine);
}
void CBookEngine::ConstructL()
{
m_pPbkContactEngine = CPbkContactEngine::NewL();
}
void CBookEngine::GetMobileNumberByName(const TDesC& aName, TDes& aMobile)
{
TInt i;
m_pContacts = CContactDatabase::OpenL();
const CContactIdArray* contactIDArray = m_pContacts->SortedItemsL();
TInt nCount (contactIDArray->Count());
for(i=0; i<nCount; i++)
{
TBuf<64> sFullName;
CContactTextField* textField = NULL;
CContactItem* cntItem = m_pContacts->ReadContactLC((*contactIDArray)[i]);
CContactItemFieldSet& cntFieldSet = cntItem->CardFields();
TInt nTmpIndex = cntFieldSet.Find(KUidContactFieldFamilyName);
if(nTmpIndex != -1)
{
textField = cntFieldSet[nTmpIndex].TextStorage();
sFullName.Copy(textField->Text());
}
nTmpIndex = cntFieldSet.Find(KUidContactFieldGivenName);
if(nTmpIndex != -1)
{
textField = cntFieldSet[nTmpIndex].TextStorage();
sFullName.Append(textField->Text());
}
CleanupStack::PopAndDestroy(cntItem);
if( sFullName.Compare(aName) == 0 )
{
CPbkContactItem* pbkItem = m_pPbkContactEngine->ReadContactLC((*contactIDArray)[i]) ;
TPbkContactItemField* fld = pbkItem->FindField(EPbkFieldIdPhoneNumberGeneral);
if(fld)
{
aMobile.Copy(fld->Text());
}
CleanupStack::PopAndDestroy(pbkItem);
break;
}
}
MEMORY_FREE(m_pContacts);
}
void CBookEngine::DeleteUserFromBook(TInt aItemID)
{
m_pContacts = CContactDatabase::OpenL();
m_pPbkContactEngine->DeleteContactL(aItemID);
MEMORY_FREE(m_pContacts);
}
void CBookEngine::UpdatePhoneBook(TInt aFlag, RPointerArray<CBookInfo>& aBookInfo)
{
m_pContacts = CContactDatabase::OpenL();
//unicode--->utf8:
CCnvCharacterSetConverter* converter = CCnvCharacterSetConverter::NewLC();
converter->PrepareToConvertToOrFromL(KCharacterSetIdentifierUtf8, CEikonEnv::Static()->FsSession());
if (aFlag == 0)//读入从手机
{
TBuf<KMaxName> sTmpBuf;
TInt nTmpIndex = 0;
CBookInfo* pBookInfo = NULL;
// 按联系人名字首字母排序 START
// writen by Miserce 2008-7-13
m_pContacts->SetDbViewContactType(KUidContactItem);
CArrayFixFlat <CContactDatabase::TSortPref>* aSortOrder =new(ELeave) CArrayFixFlat<CContactDatabase::TSortPref>(1);
CContactDatabase::TSortPref check;
check.iFieldType=KUidContactFieldFamilyName;
CContactDatabase::TSortPref::EAsc;
CContactDatabase::TSortPref check1;
check1.iFieldType=KUidContactFieldGivenName;
CContactDatabase::TSortPref::EAsc;
aSortOrder->AppendL(check);
aSortOrder->AppendL(check1);
m_pContacts->SortL(aSortOrder);
// 按联系人名字首字母排序 END
// 先读取手机的contacts
// 改为SortedItemsL,即使只写电话簿中的一项,也能读取出来
const CContactIdArray* contactIDArray = m_pContacts->SortedItemsL();
for (TInt i=0; i< contactIDArray->Count(); i++)
{
sTmpBuf.Zero();
nTmpIndex = 0;
pBookInfo = CBookInfo::NewL();
CContactItem* cntItem = m_pContacts->ReadContactLC((*contactIDArray)[i]);
CPbkContactItem* pbkItem = m_pPbkContactEngine->ReadContactLC((*contactIDArray)[i]) ;
CContactItemFieldSet& cntFieldSet = cntItem->CardFields();
TPbkContactItemField* fld = NULL;
pBookInfo->SetItemId((*contactIDArray)[i]);
//last name
nTmpIndex = cntFieldSet.Find(KUidContactFieldFamilyName);
if (nTmpIndex != -1)
{
CContactTextField* textField = cntFieldSet[nTmpIndex].TextStorage();
pBookInfo->SetLastName(textField->Text());
}
//first name
nTmpIndex = cntFieldSet.Find(KUidContactFieldGivenName);
if (nTmpIndex != -1)
{
CContactTextField* textField = cntFieldSet[nTmpIndex].TextStorage();
pBookInfo->SetFirstName(textField->Text());
}
//固定电话
fld = pbkItem->FindField(EPbkFieldIdPhoneNumberGeneral);
sTmpBuf.Zero();
if (fld)
{
fld->GetTextL(sTmpBuf);
pBookInfo->SetTelephone(sTmpBuf);
}
//Email
fld = pbkItem->FindField(EPbkFieldIdEmailAddress);
sTmpBuf.Zero();
if (fld)
{
fld->GetTextL(sTmpBuf);
pBookInfo->SetEmail(sTmpBuf);
}
//地址
fld = pbkItem->FindField(EPbkFieldIdFaxNumber);
sTmpBuf.Zero();
if (fld)
{
fld->GetTextL(sTmpBuf);
pBookInfo->SetAddress(sTmpBuf);
}
//公司名称
fld = pbkItem->FindField(EPbkFieldIdCompanyName);
sTmpBuf.Zero();
if (fld)
{
fld->GetTextL(sTmpBuf);
pBookInfo->SetCompany(sTmpBuf);
}
aBookInfo.Append(pBookInfo);
CleanupStack::PopAndDestroy(pbkItem); //pbkItem
CleanupStack::PopAndDestroy(cntItem); //cntItem
}
}
else if (aFlag == 1)//更新列表
{//判断出哪些是新增加的,哪些是修改过的,分别处理:
for(TInt i=0;i<aBookInfo.Count();i++)
{
if(aBookInfo[i]->GetItemId()!=-1)
{
DeleteUserFromBook(aBookInfo[i]->GetItemId());
aBookInfo[i]->SetItemId(-1);
}
}
for (i=0; i< aBookInfo.Count(); i++)
{
CBookInfo* pBookInfo = static_cast<CBookInfo*>(aBookInfo[i]);
CPbkContactItem* contactItem;
if(pBookInfo->GetItemId() == -1)
{//若itemid == -1, 则新增
contactItem = m_pPbkContactEngine->CreateEmptyContactL();
CleanupStack::PushL(contactItem);
}
else
{
//更新:
CContactItem* cntItem = m_pContacts->ReadContactLC(pBookInfo->GetItemId());
//TInt nErr=0;
//TRAP(nErr, ());
if (cntItem == NULL)
{
CleanupStack::PopAndDestroy();
continue;
}
else
{
CleanupStack::PopAndDestroy();
contactItem = m_pPbkContactEngine->OpenContactL(pBookInfo->GetItemId()) ;
CleanupStack::PushL(contactItem);
}
}
// find the phonenumber field of the contact, and add aCallInfo's telephone number
TPbkContactItemField* fld = contactItem->FindField(EPbkFieldIdLastName);
if(fld)
{
fld->TextStorage()->SetTextL(pBookInfo->GetLastName()->Des());
}
else if(pBookInfo->GetLastName()->Length()!=0)
{
CPbkFieldInfo* pFieldInfo = m_pPbkContactEngine->FieldsInfo().Find(EPbkFieldIdLastName);
CleanupStack::PushL(pFieldInfo);
fld = contactItem ->AddOrReturnUnusedFieldL(*pFieldInfo);
fld->TextStorage()->SetTextL(*(pBookInfo->GetLastName()));
CleanupStack::PopAndDestroy(pFieldInfo);
}
fld = contactItem->FindField(EPbkFieldIdFirstName);
if(fld)
{
fld->TextStorage()->SetTextL(pBookInfo->GetFirstName()->Des());
}
else if(pBookInfo->GetFirstName()->Length()!=0)
{
CPbkFieldInfo* pFieldInfo = m_pPbkContactEngine->FieldsInfo().Find(EPbkFieldIdFirstName);
CleanupStack::PushL(pFieldInfo);
fld = contactItem ->AddOrReturnUnusedFieldL(*pFieldInfo);
fld->TextStorage()->SetTextL(*(pBookInfo->GetFirstName()));
CleanupStack::PopAndDestroy(pFieldInfo);
}
fld = contactItem->FindField(EPbkFieldIdPhoneNumberGeneral);
if(fld)
{
fld->TextStorage()->SetTextL(*(pBookInfo->GetTelephone()));
}
else if(pBookInfo->GetTelephone()->Length()!=0)
{
CPbkFieldInfo* pFieldInfo = m_pPbkContactEngine->FieldsInfo().Find(EPbkFieldIdPhoneNumberGeneral);
CleanupStack::PushL(pFieldInfo);
fld = contactItem ->AddOrReturnUnusedFieldL(*pFieldInfo);
fld->TextStorage()->SetTextL(*(pBookInfo->GetTelephone()));
CleanupStack::PopAndDestroy(pFieldInfo);
}
fld = contactItem->FindField(EPbkFieldIdEmailAddress);
if(fld)
{
fld->TextStorage()->SetTextL(*(pBookInfo->GetEmail()));
}
else if(pBookInfo->GetEmail()->Length()!=0)
{
CPbkFieldInfo* pFieldInfo = m_pPbkContactEngine->FieldsInfo().Find(EPbkFieldIdEmailAddress);
CleanupStack::PushL(pFieldInfo);
fld = contactItem ->AddOrReturnUnusedFieldL(*pFieldInfo);
fld->TextStorage()->SetTextL(*(pBookInfo->GetEmail()));
CleanupStack::PopAndDestroy(pFieldInfo);
}
fld = contactItem->FindField(EPbkFieldIdFaxNumber);
if(fld)
{
fld->TextStorage()->SetTextL(*(pBookInfo->GetAddress()));
}
else if(pBookInfo->GetAddress()->Length()!=0)
{
CPbkFieldInfo* pFieldInfo = m_pPbkContactEngine->FieldsInfo().Find(EPbkFieldIdFaxNumber);
CleanupStack::PushL(pFieldInfo);
fld = contactItem ->AddOrReturnUnusedFieldL(*pFieldInfo);
fld->TextStorage()->SetTextL(*(pBookInfo->GetAddress()));
CleanupStack::PopAndDestroy(pFieldInfo);
}
fld = contactItem->FindField(EPbkFieldIdCompanyName);
if(fld)
{
fld->TextStorage()->SetTextL(*(pBookInfo->GetCompany()));
}
else if(pBookInfo->GetCompany()->Length()!=0)
{
CPbkFieldInfo* pFieldInfo = m_pPbkContactEngine->FieldsInfo().Find(EPbkFieldIdCompanyName);
CleanupStack::PushL(pFieldInfo);
fld = contactItem ->AddOrReturnUnusedFieldL(*pFieldInfo);
fld->TextStorage()->SetTextL(*(pBookInfo->GetCompany()));
CleanupStack::PopAndDestroy(pFieldInfo);
}
if(pBookInfo->GetItemId()== -1)
{
TContactItemId contactId = m_pPbkContactEngine->AddNewContactL(*contactItem);
pBookInfo->SetItemId(contactId);
}
else
{
TInt err=0;
TRAP(err, m_pPbkContactEngine->CommitContactL(*contactItem, EFalse));
}
CleanupStack::PopAndDestroy(contactItem); //contactItem
}
}
CleanupStack::PopAndDestroy(converter);
MEMORY_FREE(m_pContacts);
}
//from MPbkContactDbObserver
void CBookEngine::HandleDatabaseEventL (TContactDbObserverEvent aEvent)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -