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

📄 phonebkexengine.cpp

📁 基于Symbian OS
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*
* ============================================================================
*  Name     : CPhoneBkExEngine from PhoneBkExEngine.h
*  Part of  : PhoneBkEx
*  Created  : 13/06/2003  
*  Implementation notes:
*  Version  :
*  Copyright: Forum Nokia
* ============================================================================*/

#include "PhoneBkExEngine.h"

#include <CPbkContactEngine.h>		// CPbkContactEngine
#include <f32file.h>
#include <eikenv.h>
#include <aknglobalnote.h> 
#include <aknnotewrappers.h>
#include <CPbkMultipleEntryFetchDlg.h>
#include <stringloader.h> 
#include <cpbkcontactitem.h> 
#include <bcardeng.h>  
#include <cpbkcontactiter.h> 
#include <cpbkcontactchangenotifier.h> 
#include <rpbkviewresourcefile.h> 
#include <cpbkphonenumberselect.h> 
#include <cpbkcontacteditordlg.h> 
#include <cpbkidlefinder.h> 
#include <PhoneBkEx.rsg>

const TInt KMaxJobLength = 15;
const TInt KNameLength = 20;


/**
* C++ constructor
*/
CPhoneBkExEngine::CPhoneBkExEngine()
	{
	}

/**
* Symbian OS 2 phase constructor.
*/
CPhoneBkExEngine* CPhoneBkExEngine::NewL()
	{
	CPhoneBkExEngine* self = CPhoneBkExEngine::NewLC();
	CleanupStack::Pop(self);
	return self;
	}

/**
* Symbian OS 2 phase constructor.
*/
CPhoneBkExEngine* CPhoneBkExEngine::NewLC()
	{
	CPhoneBkExEngine* self = new (ELeave) CPhoneBkExEngine();
	CleanupStack::PushL(self);
	self->ConstructL();
	return self;
	}



/** 
* Destructor. Frees up memory for the class.
*/
CPhoneBkExEngine::~CPhoneBkExEngine()
	{
	DeleteTestData();

	delete iAsyncFind;
	delete iFieldInfoArray;
	delete iNotifier;
	delete iPbkContactEngine;
    delete iContactsAddedArray;
    delete iContactGroupsAddedArray;
	delete iFileDirText;

	}

/**
* Symbian OS 2nd phase constructor.  
*/ 
void CPhoneBkExEngine::ConstructL()
	{
	//Create a new Phonebook engine object and connects to the default contact database
	iPbkContactEngine = CPbkContactEngine::NewL();
	
	// register ourselves as an observer
	iNotifier = iPbkContactEngine->CreateContactChangeNotifierL(this); 

    iContactsAddedArray = CContactIdArray::NewL();
    iContactGroupsAddedArray = CContactIdArray::NewL();

	iFieldInfoArray = new (ELeave) CPbkFieldIdArray;
	iFieldInfoArray->AppendL((TPbkFieldId)EPbkFieldIdJobTitle);
	iFieldInfoArray->AppendL((TPbkFieldId)EPbkFieldIdFirstName);
	iFileDirText = StringLoader::LoadL(R_VCARDFILE_TEXT);

    AddTestDataL();

	}



TContactItemId CPhoneBkExEngine::CreateContactGroupL(const TDesC& aGroupLabel) const
	{

	CContactGroup* newGroup = iPbkContactEngine->CreateContactGroupL(aGroupLabel);
	TContactItemId id = newGroup->Id();
	delete newGroup;

	return id;
	}


void CPhoneBkExEngine::AddContactToGroupL(TContactItemId aContactId, TContactItemId aGroupId) const
	{
	iPbkContactEngine->AddContactToGroupL(aContactId, aGroupId);

	}

void CPhoneBkExEngine::RetrieveContactDetailsL(TDes& aName, TDes& aJobName, TContactItemId aContactId) const
	{

	// open contact for reading
	CPbkContactItem* contact = iPbkContactEngine->ReadContactLC(aContactId,iFieldInfoArray);
	TPbkContactItemField* jobField = contact->FindField(EPbkFieldIdJobTitle);

	jobField->GetTextL(aJobName);


	TPbkContactItemField* nameField = contact->FindField(EPbkFieldIdFirstName);
	nameField->GetTextL(aName);

	CleanupStack::PopAndDestroy(contact);


	}

TInt CPhoneBkExEngine::ModifyJobDescriptionsL(const TDesC& aOldJob, const TDesC& aNewJob) const
	{
	TInt contactsModified = 0;

	CPbkContactIter* iterator = CPbkContactIter::NewL(*iPbkContactEngine);
	CleanupStack::PushL(iterator);

	TContactItemId id = iterator->FirstL();
	if (id == KNullContactId)
		{
		contactsModified = 0;
		}
	else
		{
		while (id != KNullContactId)
			{
			if (ModifyJobDescriptionL(aOldJob, aNewJob, id))
				contactsModified++;
			id = iterator->NextL();

			}
		}

	CleanupStack::PopAndDestroy(iterator);
	return contactsModified;

	}

TBool CPhoneBkExEngine::ModifyJobDescriptionL(const TDesC& aOldJob, const TDesC& aNewJob, TContactItemId aContactId) const
	{
	TBool modified = EFalse;

	CPbkContactItem* contact = iPbkContactEngine->OpenContactLCX(aContactId);

	TPbkContactItemField* jobField = contact->FindField(EPbkFieldIdJobTitle);
	TBuf<KMaxJobLength> storedJob;
	jobField->GetTextL(storedJob);

	if(aOldJob.Compare(storedJob) == 0)
		{	
		jobField->TextStorage()->SetTextL(aNewJob);

		iPbkContactEngine->CommitContactL(*contact);
		modified = ETrue;
		}
	else
		iPbkContactEngine->CloseContactL(aContactId);

	CleanupStack::PopAndDestroy(2);
	return modified;
	
	}


void CPhoneBkExEngine::CreateContactGroupAndAddContactsL(TDesC& aJobType)
    {
    CContactIdArray* contactsWithJob = FindContactsWithJobTypeL(aJobType);
    CleanupStack::PushL(contactsWithJob);

    TInt noOfContactsFound = contactsWithJob->Count();

    if(noOfContactsFound == 0)
        {
		HBufC* noteText = StringLoader::LoadLC(R_NOCONTACTSFOUND_TEXT);
		CAknGlobalNote* globalNote = CAknGlobalNote::NewLC();
	    globalNote->ShowNoteL(EAknGlobalInformationNote, *noteText);
	    CleanupStack::PopAndDestroy(2);
        }
    else
        {
        TContactItemId id = CreateContactGroupL(aJobType);
        iContactGroupsAddedArray->AddL(id);
            {
            for(TInt i=0; i<noOfContactsFound; i++)
                AddContactToGroupL((*contactsWithJob)[i], id);
            }

        }

    CleanupStack::PopAndDestroy();
    }


CContactIdArray* CPhoneBkExEngine::FindContactsWithJobTypeL(const TDesC& aJobType) const
	{
	CContactIdArray* jobContacts = iPbkContactEngine->FindLC(aJobType, iFieldInfoArray);
	
	if(jobContacts->Count() > 0)
		{
		CleanupStack::Pop(jobContacts);

		}
	else
		{
		// should cycle through here to check all contacts match job type
		
		CleanupStack::Pop(jobContacts);
		}
	
	return jobContacts;
	}


void CPhoneBkExEngine::FindContactsWithJobTypeAsyncL(const TDesC& aJobType) 
	{
	iAsyncFind = iPbkContactEngine->FindAsyncL(aJobType, iFieldInfoArray, this);
	}


void CPhoneBkExEngine::IdleFindCallback()
	{
	if(iAsyncFind->IsComplete())
		{
		if(iAsyncFind->Error() == KErrNone)
			{
			CContactIdArray* jobContacts = iAsyncFind->TakeContactIds();

			TInt count = jobContacts->Count();
			if(count >0)
				{
				TBuf<KNameLength> contactName;
				TBuf<KNameLength> jobName;

				TContactItemId firstId = (*jobContacts)[0];
				TRAPD(err, RetrieveContactDetailsL(contactName, jobName, firstId));
				if(err)
					{
					CAknWarningNote* dlg = new(ELeave)CAknWarningNote();
					TBuf<64> aErrorMessage;
					CEikonEnv::Static()->ReadResource(aErrorMessage, R_MY_WARNINGNOTE_TEXT);
					dlg->ExecuteLD(aErrorMessage); 	
					}
				else
					{
					// Show Name of Contact
					CAknGlobalNote* globalNote = CAknGlobalNote::NewLC();
					globalNote->ShowNoteL(EAknGlobalInformationNote, contactName);
					CleanupStack::PopAndDestroy();
					}
				}
			delete jobContacts;
			}

		delete iAsyncFind;
		iAsyncFind = NULL;
		}
	else
		{
		CContactIdArray* jobContacts = iAsyncFind->TakeContactIds();
		TInt count = jobContacts->Count();
		// the count could be used to inform users of progress by an observer mechanism
		}

	}

void CPhoneBkExEngine::HandleDatabaseEventL(TContactDbObserverEvent aEvent)
	{
	if(aEvent.iType == EContactDbObserverEventContactAdded)
		{
		// debug message
		HBufC* noteText = StringLoader::LoadLC(R_CONTACTADDED_TEXT);
		(CEikonEnv::Static())->InfoMsg(*noteText);
		CleanupStack::PopAndDestroy();
		}
		
	}
void CPhoneBkExEngine::ExportAsVCardL(const TDesC& aVCardStream, TContactItemId aContactId)
	{
	RFile outfile;
	outfile.Replace(CCoeEnv::Static()->FsSession(),aVCardStream,EFileWrite);
	RFileWriteStream writeStream(outfile);

⌨️ 快捷键说明

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