📄 phonebkexengine.cpp
字号:
/*
* ============================================================================
* 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 + -