creator/src/creator_phonebook.cpp
branchRCL_3
changeset 22 fad26422216a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creator/src/creator_phonebook.cpp	Wed Sep 01 12:30:35 2010 +0100
@@ -0,0 +1,514 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+
+#include "creator_phonebook.h" 
+#include "creator_traces.h"
+
+#include <CPbkContactIter.h>
+
+//----------------------------------------------------------------------------
+
+CPhonebookParameters::CPhonebookParameters()
+    {
+    LOGSTRING("Creator: CPhonebookParameters::CPhonebookParameters");
+
+    iContactFirstName = HBufC::New(KPhonebookFieldLength);
+    iContactLastName = HBufC::New(KPhonebookFieldLength);
+    iContactCompanyName = HBufC::New(KPhonebookFieldLength);
+    iContactJobTitle = HBufC::New(KPhonebookFieldLength);
+    iContactPostalAddress = HBufC::New(KPhonebookFieldLength);
+    iWvUserId = HBufC::New(KPhonebookFieldLength);
+    iRingingtone = HBufC::New(KPhonebookFieldLength);
+    iThumbnailImage = HBufC::New(KPhonebookFieldLength);
+    iContactPhoneNumberGeneral = HBufC::New(KPhonebookFieldLength);
+    iContactURL = HBufC::New(KPhonebookFieldLength);
+    iContactEmailAddress = HBufC::New(KPhonebookFieldLength);
+    iGroupName = HBufC::New(KPhonebookFieldLength);
+    }
+
+CPhonebookParameters::~CPhonebookParameters()
+    {
+    LOGSTRING("Creator: CPhonebookParameters::~CPhonebookParameters");
+
+    delete iGroupName;
+    delete iContactEmailAddress;
+    delete iContactURL;
+    delete iContactPhoneNumberGeneral;
+    delete iThumbnailImage;
+    delete iRingingtone;
+    delete iWvUserId;
+    delete iContactPostalAddress;
+    delete iContactJobTitle;
+    delete iContactCompanyName;
+    delete iContactLastName;
+    delete iContactFirstName;
+    }
+void CPhonebookParameters::ParseL (CCommandParser* parser, TParseParams /*aCase = 0*/)
+	{
+	parser->StrParserL (iContactFirstName, '|');
+	parser->StrParserL (iContactLastName, '|');
+	parser->StrParserL (iContactCompanyName, '|');
+	parser->StrParserL (iContactJobTitle, '|');
+	parser->StrParserL (iContactPostalAddress, '|');
+	parser->StrParserL (iContactPhoneNumberGeneral, '|');
+	parser->StrParserL (iContactURL, '|');
+	parser->StrParserL (iContactEmailAddress, '|');
+	parser->StrParserL (iWvUserId, '|');
+	parser->StrParserL (iRingingtone, '|');
+	parser->StrParserL (iThumbnailImage, ';');
+	}
+//----------------------------------------------------------------------------
+
+CCreatorPhonebook* CCreatorPhonebook::NewL(CCreatorEngine* aEngine)
+    {
+    CCreatorPhonebook* self = CCreatorPhonebook::NewLC(aEngine);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CCreatorPhonebook* CCreatorPhonebook::NewLC(CCreatorEngine* aEngine)
+    {
+    CCreatorPhonebook* self = new (ELeave) CCreatorPhonebook;
+    CleanupStack::PushL(self);
+    self->ConstructL(aEngine);
+    return self;
+    }
+
+CCreatorPhonebook::CCreatorPhonebook()
+    {
+    }
+
+void CCreatorPhonebook::ConstructL(CCreatorEngine* aEngine)
+    {
+    LOGSTRING("Creator: CCreatorPhonebook::ConstructL");
+
+    iEngine = aEngine;  
+    iContactDBEngine = CPbkContactEngine::NewL();
+    iOpCounter = 0;
+    SetDefaultParameters();
+    }
+
+CCreatorPhonebook::~CCreatorPhonebook()
+    {
+    LOGSTRING("Creator: CCreatorPhonebook::~CCreatorPhonebook");
+
+    if ( iEngine && iContactIds.Count() )
+        {
+        TRAP_IGNORE( iEngine->WriteEntryIdsToStoreL( iContactIds, KUidDictionaryUidContacts ) );
+        }
+    iContactIds.Reset();
+    iContactIds.Close();
+
+    if ( iEngine && iGroupIds.Count() )
+        {
+        TRAP_IGNORE( iEngine->WriteEntryIdsToStoreL( iGroupIds, KUidDictionaryUidContactGroups ) );
+        }
+    iGroupIds.Reset();
+    iGroupIds.Close();
+       
+    iEntriesToDelete.Reset();
+    iEntriesToDelete.Close();
+    
+    CompactPbkDatabase( ETrue );
+
+    delete iContactDBEngine;
+
+    if (iParameters)
+        delete iParameters;
+    }
+
+//----------------------------------------------------------------------------
+TInt CCreatorPhonebook::CreateContactEntryL(CCreatorModuleBaseParameters *aParameters)
+    {
+    LOGSTRING("Creator: CCreatorPhonebook::CreateContactEntryL");
+    
+    delete iParameters;
+    iParameters = 0;
+    
+    CPhonebookParameters* parameters = (CPhonebookParameters*) aParameters;
+    
+    // random data needed if no predefined data available
+    if (!parameters)
+        {
+        iParameters = new(ELeave) CPhonebookParameters;
+        
+        iParameters->iNumberOfPhoneNumberFields = iNumberOfPhoneNumberFields;
+        iParameters->iNumberOfURLFields = iNumberOfURLFields;
+        iParameters->iNumberOfEmailAddressFields = iNumberOfEmailAddressFields;        
+        
+        iParameters->iNumberOfPhoneNumberFields = iNumberOfPhoneNumberFields;
+        iParameters->iNumberOfURLFields = iNumberOfURLFields;
+        iParameters->iNumberOfEmailAddressFields = iNumberOfEmailAddressFields;
+        
+        iParameters->iContactFirstName->Des() = iEngine->RandomString(CCreatorEngine::EFirstName);
+        iParameters->iContactLastName->Des() = iEngine->RandomString(CCreatorEngine::ESurname);
+        iParameters->iContactCompanyName->Des() = iEngine->RandomString(CCreatorEngine::ECompany);
+        iParameters->iContactJobTitle->Des() = iEngine->RandomString(CCreatorEngine::EJobTitle);
+        iParameters->iContactPostalAddress->Des() = iEngine->RandomString(CCreatorEngine::EAddress);
+        
+        iParameters->iWvUserId->Des().Copy(_L("wv:"));
+        iParameters->iWvUserId->Des().Append(iParameters->iContactFirstName->Des());
+
+        // TO-DO.....
+        //iParameters->iRingingtone->Des() = KNullDesC;
+        //iParameters->iThumbnailImage->Des() = KNullDesC;
+
+        iParameters->iContactPhoneNumberGeneral->Des() = iEngine->RandomString(CCreatorEngine::EPhoneNumber);
+  
+        iParameters->iContactURL->Des().Copy( _L("http://www.") );
+        iParameters->iContactURL->Des().Append( iParameters->iContactCompanyName->Des() );
+        iParameters->iContactURL->Des().Append( _L(".com/") );
+
+        iParameters->iContactEmailAddress->Des().Copy( iParameters->iContactFirstName->Des() );
+        iParameters->iContactEmailAddress->Des().Append( _L("@") );
+        iParameters->iContactEmailAddress->Des().Append( iParameters->iContactCompanyName->Des() );
+        iParameters->iContactEmailAddress->Des().Append( _L(".com") );
+
+        }
+    else
+        {
+        iParameters = parameters;
+        }
+
+    TInt err = KErrNone;
+
+    // create a new contact item based on the default template
+	CPbkContactItem* newContact = iContactDBEngine->CreateEmptyContactL();
+	CleanupStack::PushL(newContact);
+
+    AddFieldToContactItemL (*newContact, EPbkFieldIdFirstName, iParameters->iContactFirstName->Des());
+    AddFieldToContactItemL (*newContact, EPbkFieldIdLastName, iParameters->iContactLastName->Des());
+    AddFieldToContactItemL (*newContact, EPbkFieldIdCompanyName, iParameters->iContactCompanyName->Des());
+    AddFieldToContactItemL (*newContact, EPbkFieldIdJobTitle, iParameters->iContactJobTitle->Des());
+    AddFieldToContactItemL (*newContact, EPbkFieldIdPostalAddress, iParameters->iContactPostalAddress->Des());
+    
+    AddFieldToContactItemL (*newContact, EPbkFieldIdWVID, iParameters->iWvUserId->Des());
+    AddFieldToContactItemL (*newContact, EPbkFieldIdPersonalRingingToneIndication, iParameters->iRingingtone->Des());
+    AddFieldToContactItemL (*newContact, EPbkFieldIdThumbnailImage, iParameters->iThumbnailImage->Des());
+
+    for (TInt i=0; i<iParameters->iNumberOfPhoneNumberFields; i++)
+        {
+        if (i%6 == 0)
+            AddFieldToContactItemL (*newContact, EPbkFieldIdPhoneNumberGeneral, iParameters->iContactPhoneNumberGeneral->Des());
+        else if (i%6 == 1)
+            AddFieldToContactItemL (*newContact, EPbkFieldIdPhoneNumberMobile, iParameters->iContactPhoneNumberGeneral->Des());
+        else if (i%6 == 2)
+            AddFieldToContactItemL (*newContact, EPbkFieldIdFaxNumber, iParameters->iContactPhoneNumberGeneral->Des());
+        else if (i%6 == 3)
+            AddFieldToContactItemL (*newContact, EPbkFieldIdPagerNumber, iParameters->iContactPhoneNumberGeneral->Des());
+        else if (i%6 == 4)
+            AddFieldToContactItemL (*newContact, EPbkFieldIdPhoneNumberHome, iParameters->iContactPhoneNumberGeneral->Des());
+        else 
+            AddFieldToContactItemL (*newContact, EPbkFieldIdPhoneNumberWork, iParameters->iContactPhoneNumberGeneral->Des());
+        }
+
+    for (TInt j=0; j<iParameters->iNumberOfURLFields; j++)
+        AddFieldToContactItemL (*newContact, EPbkFieldIdURL, iParameters->iContactURL->Des());
+
+    for (TInt k=0; k<iParameters->iNumberOfEmailAddressFields; k++)
+        AddFieldToContactItemL (*newContact, EPbkFieldIdEmailAddress, iParameters->iContactEmailAddress->Des());
+
+
+    // add the contact item to the database
+	iContactDBEngine->AddNewContactL(*newContact);
+
+    // id has been generated, store it for being able to delete
+    // entries created only with Creator
+	iContactIds.Append( newContact->Id() );
+
+	CleanupStack::PopAndDestroy(); // newContact
+
+    CompactPbkDatabase();
+
+    return err;
+    }
+
+//----------------------------------------------------------------------------
+
+TInt CCreatorPhonebook::CreateGroupEntryL(CCreatorModuleBaseParameters *aParameters) 
+    { 
+    LOGSTRING("Creator: CCreatorPhonebook::CreateGroupEntryL"); 
+
+    // clear any existing parameter definations 
+    if (iParameters) 
+        { 
+        delete iParameters; 
+        iParameters = NULL; 
+        } 
+        
+    // random data needed if no predefined data available 
+    if (!aParameters) 
+        { 
+        iParameters = new(ELeave) CPhonebookParameters; 
+        
+        iParameters->iContactsInGroup = iContactsInGroup; 
+
+        iParameters->iGroupName->Des().Copy( iEngine->RandomString(CCreatorEngine::EGroupName) ); 
+        iParameters->iGroupName->Des().Append( _L(" #") ); 
+        iParameters->iGroupName->Des().AppendNum( iEngine->RandomNumber(1000, 9999) ); 
+        } 
+    else 
+        { 
+        // otherwise replace the parameters object 
+        iParameters = (CPhonebookParameters*) aParameters; 
+        } 
+
+    TInt err(KErrNone); 
+
+    // create contact iterator 
+    CPbkContactIter* contactIter = iContactDBEngine->CreateContactIteratorLC(); 
+    
+    // create contact id array 
+    CContactIdArray* contactIdArray = CContactIdArray::NewLC();  
+
+    // get all contacts    
+    TBool getFirstContact(ETrue); 
+    TContactItemId contactId; 
+    
+    for (;;) 
+        { 
+        if (getFirstContact) 
+            { 
+            // get first contact 
+            contactId = contactIter->FirstL(); 
+            getFirstContact = EFalse; 
+            } 
+        else 
+            { 
+            // get next contact 
+            contactId = contactIter->NextL(); 
+            } 
+        
+        // check if valid contact id received 
+        if (contactId == KNullContactId) 
+            { 
+            // no more contacts, so break 
+            break; 
+            } 
+        else 
+            { 
+            // append to array 
+            contactIdArray->AddL(contactId); 
+            }    
+        } 
+
+    // create a new contact group 
+    CContactGroup* newGroup = iContactDBEngine->CreateContactGroupL( iParameters->iGroupName->Des() ); 
+    CleanupStack::PushL(newGroup); 
+
+    // define amounts of contacts to be added to the group 
+    TInt amountOfContactsToBeAdded; 
+    if (iParameters->iContactsInGroup == KCreateRandomAmountOfGroups) 
+        amountOfContactsToBeAdded = iEngine->RandomNumber(30); 
+    else     
+        amountOfContactsToBeAdded = iParameters->iContactsInGroup; 
+    
+    
+    // a simple way to randomise order of contacts in the array 
+    if (iEngine->RandomNumber(1, 2) == 1) 
+        contactIdArray->ReverseOrder(); 
+    
+    // assign contacts from the array to the group if any contacts available        
+    if (contactIdArray->Count() > 0) 
+        { 
+        // get random start number which defines from which position to start adding contacts 
+        TInt arrayPosCounter = iEngine->RandomNumber(contactIdArray->Count()-1); 
+        TInt addedContacsCounter(0); 
+    
+        for (TInt y=0; y<amountOfContactsToBeAdded; y++) 
+            { 
+            // add contact to group 
+            iContactDBEngine->AddContactToGroupL((*contactIdArray)[arrayPosCounter], newGroup->Id()); 
+            addedContacsCounter++; 
+            arrayPosCounter++; 
+            
+            // no need to add more contacts than actually available 
+            if (addedContacsCounter >= contactIdArray->Count()) 
+                break; 
+
+            // if limit reached, start from the beginning 
+            if (arrayPosCounter >= contactIdArray->Count()) 
+                arrayPosCounter = 0; 
+            } 
+        }
+    
+    // id has been generated, store it for being able to delete
+    // entries created only with Creator
+    iGroupIds.Append( newGroup->Id() );
+    
+    CleanupStack::PopAndDestroy(3); // newGroup, contactIdArray, contactIter 
+
+    CompactPbkDatabase(); 
+
+    return err; 
+    } 
+
+
+//----------------------------------------------------------------------------
+
+TInt CCreatorPhonebook::CreateSubscribedContactEntryL(CCreatorModuleBaseParameters* /*aParameters*/)
+    {
+    LOGSTRING("Creator: CCreatorPhonebook::CreateSubscribedContactEntryL");
+
+    return KErrNotSupported;
+    }
+
+//----------------------------------------------------------------------------
+
+void CCreatorPhonebook::AddFieldToContactItemL(CPbkContactItem& aItem, TPbkFieldId aFieldId, const TDesC& aFieldText)
+	{
+    //LOGSTRING("Creator: CCreatorPhonebook::AddFieldToContactItemL");
+
+    CPbkFieldInfo* fieldInfo = iContactDBEngine->FieldsInfo().Find( aFieldId );
+    if( fieldInfo ) // field was found
+        {
+        // add the field and value to contact
+        TPbkContactItemField* itemField = aItem.AddOrReturnUnusedFieldL( *fieldInfo );
+
+        if( itemField && aFieldText.Length() > 0 ) // add text also
+            {
+            if( itemField->ItemField().StorageType() == KStorageTypeText )
+                {
+		        CContactTextField* textField = itemField->ItemField().TextStorage();
+                
+                // clip the text if it doesn't fit to the field
+	            textField->SetTextL( aFieldText.Left( fieldInfo->MaxLength() ) );
+	    	    }
+    		}
+        }
+    }
+
+//----------------------------------------------------------------------------
+
+void CCreatorPhonebook::CompactPbkDatabase(TBool aCompressImmediately)
+    {
+    LOGSTRING("Creator: CCreatorPhonebook::CompactPbkDatabase");
+
+    iOpCounter++;
+
+    // compress the database immediately or after each 100th operation
+    if (aCompressImmediately || iOpCounter%100 == 0)
+        {
+        CContactDatabase& db = iContactDBEngine->Database();
+
+        if (db.CompressRequired())
+            {
+            LOGSTRING("Creator: CCreatorPhonebook::CompactPbkDatabase - Compacting...");
+            TRAP_IGNORE( db.CompactL() );
+            }
+        }
+    }
+//----------------------------------------------------------------------------
+void CCreatorPhonebook::DeleteAllL()
+    {
+    LOGSTRING("Creator: CCreatorPhonebook::DeleteAllL");
+    DeleteAllItemsL( KUidDictionaryUidContacts );
+    iContactIds.Reset();
+    }
+
+//----------------------------------------------------------------------------
+void CCreatorPhonebook::DeleteAllCreatedByCreatorL()
+    {
+    LOGSTRING("Creator: CCreatorPhonebook::DeleteAllCreatedByCreatorL");
+    DeleteItemsCreatedWithCreatorL( KUidDictionaryUidContacts );
+    iContactIds.Reset();
+    }
+
+//----------------------------------------------------------------------------
+void CCreatorPhonebook::DeleteAllGroupsL()
+    {
+    LOGSTRING("Creator: CCreatorPhonebook::DeleteAllGroupsL");
+    DeleteAllItemsL( KUidDictionaryUidContactGroups );
+    iGroupIds.Reset();
+    }
+
+//----------------------------------------------------------------------------
+void CCreatorPhonebook::DeleteAllGroupsCreatedByCreatorL()
+    {
+    LOGSTRING("Creator: CCreatorPhonebook::DeleteAllGroupsCreatedByCreatorL");
+    DeleteItemsCreatedWithCreatorL( KUidDictionaryUidContactGroups );
+    iGroupIds.Reset();
+    }
+
+//----------------------------------------------------------------------------
+void CCreatorPhonebook::DeleteAllItemsL( TUid aStoreUid )
+    {
+    LOGSTRING("Creator: CCreatorPhonebook::DeleteItemsL");
+    __ASSERT_ALWAYS( aStoreUid == KUidDictionaryUidContacts || 
+                     aStoreUid == KUidDictionaryUidContactGroups,
+                     User::Panic( _L("CCreatorPb"), KErrArgument ) );
+    
+    CContactIdArray* allContacts = iContactDBEngine->FindLC( _L("") );
+    
+    CPbkContactItem* item;
+    TInt i(0);
+    // remove that type of item ids from the array
+    // that we don't want to delete
+    while( allContacts && i < allContacts->Count() )
+        {
+        item = iContactDBEngine->ReadContactL( (*allContacts)[i] );
+        if ( ( aStoreUid == KUidDictionaryUidContactGroups ) == 
+             ( item->Type() != KUidContactGroup ) )
+            {
+            allContacts->Remove( i );
+            }
+        else
+            {
+            i++;
+            }
+        delete item;
+        item = NULL;
+        }
+    iContactDBEngine->DeleteContactsL( *allContacts );
+    CleanupStack::PopAndDestroy( allContacts );
+
+    // contacts deleted, remove the store
+    CDictionaryFileStore* store = iEngine->FileStoreLC();
+    if ( store )
+        {
+        store->Remove( aStoreUid );
+        store->CommitL();        
+        }
+    CleanupStack::PopAndDestroy( store );
+    }
+
+//----------------------------------------------------------------------------
+void CCreatorPhonebook::DeleteItemsCreatedWithCreatorL( TUid aStoreUid )
+    {
+    LOGSTRING("Creator: CCreatorPhonebook::DeleteItemsCreatedWithCreatorL");
+    __ASSERT_ALWAYS( aStoreUid == KUidDictionaryUidContacts || 
+                     aStoreUid == KUidDictionaryUidContactGroups,
+                     User::Panic( _L("CCreatorPb"), KErrArgument ) );
+    
+    iEntriesToDelete.Reset();
+    
+    // fetch ids of entries created by Creator
+    iEngine->ReadEntryIdsFromStoreL( iEntriesToDelete, aStoreUid );
+    
+    // delete entries
+    for ( TInt i = 0; i < iEntriesToDelete.Count(); i++ )
+        {
+        TRAP_IGNORE( iContactDBEngine->DeleteContactL( iEntriesToDelete[i] ) );
+        }
+    
+    iEntriesToDelete.Reset();
+    
+    // all entries deleted, remove the Logs related registry
+    iEngine->RemoveStoreL( aStoreUid );
+    }