⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bookengine.cpp

📁 个人手机助理套件:包含1、记事本(备忘录)、名片夹、名片夹的上传下载(异地备份)、短消息模块
💻 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 + -