Categories: Symbian OS | Symbian C++ | How To | Code Examples | PIM
This page was last modified 15:32, 27 October 2007.
How to manage contact database while encryption
From Forum Nokia Wiki
Contents |
Purpose
While encrypting/decrypting contact database the common problem is that the static function 'CContactDatabase::DeleteDefaultFileL()' always returns error code -14 (ErrInUse).
Encrypt/Decrypt contact database is explained here: Encrypt-Decrypt Contact Database
The procedure to be followed while encrypting and decrypting contacts database:
1. Create a database of your own (MycontactDB) and copy all contacts from the default database (DefcontactDB) to MycontactDB. 2. Encrypt your database MycontactDB. 3. Delete all contacts from DefcontactDB (as we have a backup of all contacts in encrypted form in MycontactDB) instead of deleting default contact database using CContactDatabase::DeleteDefaultFileL(). 4. Decrypt MycontactDB when required. 5. Copy all contacts from the MycontactDB to DefcontactDB.
Example code
The following code creates a database MycontactDB and copies all contacts from the default database (DefcontactDB) to MycontactDB:
// Copy all contacts from default contacts DB to My Db (creates own DB) void CopyFromDefault() { // open default contact database CContactDatabase* DefcontactDB= CContactDatabase::OpenL(); CleanupStack::PushL(DefcontactDB); // create own database CContactDatabase* MycontactDB = CContactDatabase::ReplaceL(KFileName); CleanupStack::PushL(MycontactDB); //create iterator for DefcontactDB TContactIter contact_iterator(*DefcontactDB); TContactItemId contact_id; //go through contacts while there any info while( ( contact_id = contact_iterator.NextL() ) != KNullContactId) { // Read contact from default database CContactItem* contact_item = DefcontactDB->ReadContactL(contact_id); CleanupStack::PushL(contact_item); // Add it to own database MycontactDB->AddNewContactL(*contact_item); CleanupStack::PopAndDestroy(contact_item); } CleanupStack::PopAndDestroy(2); }
The following code encrypt your database MycontactDB:
// Encrypt contacts in my database void EncryptAll() { CContactDatabase *MycontactDB = CContactDatabase::OpenL(KFileName); CleanupStack::PushL(MycontactDB); TContactIter iter(*MycontactDB); // Use Heap based descriptor for large/unknown size of contact items. TBuf16<128> aValue; const CContactIdArray* contactArray = MycontactDB->SortedItemsL(); TInt cnt=contactArray->Count(); for(TInt i=0;i<cnt;i++) { CContactItem* contactItem=NULL; contactItem= MycontactDB->OpenContactL((*contactArray)[i]); CleanupStack::PushL(contactItem); CContactItemFieldSet& fieldSet= contactItem->CardFields(); TInt fieldCount=fieldSet.Count(); // This will give number // of contact fields. for(TInt index=0; index < fieldCount; index++) { CContactItemField& field = fieldSet[index]; const CContentType& type = field.ContentType(); if(!(type.ContainsFieldType(KUidContactFieldBirthday))) { TPtrC name = contactItem->CardFields()[index].TextStorage()->Text(); aValue.Copy(name); Encrypt(aValue); // Call real encyption here contactItem->CardFields()[index].TextStorage()->SetTextL(aValue); } } //Inner for loop ends here MycontactDB->CommitContactL(*contactItem); CleanupStack::PopAndDestroy(contactItem); } //Outer for loop ends here CleanupStack::PopAndDestroy(MycontactDB); }
// Actual encrption - can be changed into a complex one void Encrypt(TDes& aValue) { for(TInt iCount=0; iCount< aValue.Length();iCount++) { aValue[iCount]+=3; } }
The following code deletes all contacts from Default contact Database:
// Deletes all contacts from default contacts DB as we have // back up in encrypted form void DelAllCnts() { // open default contact database CContactDatabase* DefcontactDB= CContactDatabase::OpenL(); CleanupStack::PushL(DefcontactDB); // An array to hold all conatct items IDs CContactIdArray* cntArray = CContactIdArray::NewL(); CleanupStack::PushL(cntArray); //create iterator for DefcontactDB TContactIter contact_iterator(*DefcontactDB); TContactItemId contact_id; //go through contacts while there any info while( ( contact_id = contact_iterator.NextL() ) != KNullContactId) { cntArray->AddL(contact_id); } // deletes all contacts DefcontactDB->DeleteContactsL(*cntArray); CleanupStack::PopAndDestroy(2); }
The following code decrypts MycontactDB:
// Decrypt all contacts in my database void DecryptAll() { CContactDatabase *MycontactDB = CContactDatabase::OpenL(KFileName); CleanupStack::PushL(MycontactDB); TContactIter iter(*MycontactDB); TBuf16<70> aValue; const CContactIdArray* contactArray = MycontactDB->SortedItemsL(); TInt cnt=contactArray->Count(); for(TInt i=0;i<cnt;i++) { CContactItem* contactItem=NULL; contactItem= MycontactDB->OpenContactL((*contactArray)[i]); CleanupStack::PushL(contactItem); CContactItemFieldSet& fieldSet= contactItem->CardFields(); TInt fieldCount=fieldSet.Count(); // This will give number // of contact fields. for(TInt index=0; index < fieldCount; index++) { CContactItemField& field = fieldSet[index]; const CContentType& type = field.ContentType(); if(!(type.ContainsFieldType(KUidContactFieldBirthday))) { TPtrC name = contactItem->CardFields()[index].TextStorage()->Text(); aValue.Copy(name); Decrypt(aValue); contactItem->CardFields()[index].TextStorage()->SetTextL(aValue); } } //Inner for loop ends here MycontactDB->CommitContactL(*contactItem); CleanupStack::PopAndDestroy(contactItem); } //Outer for loop ends here CleanupStack::PopAndDestroy(MycontactDB); } // Actual decrption void Decrypt(TDes& aValue) { for(TInt iCount=0; iCount< aValue.Length();iCount++) { aValue[iCount]-=3; } }
The following code copies back all the contacts from the MycontactDB to Default contact database and deletes MycontactDB:
// Copy all contacts back to default contacts DB from My Db void CopyBackToDefault() { // open default contact database CContactDatabase* DefcontactDB= CContactDatabase::OpenL(); CleanupStack::PushL(DefcontactDB); // open My contact database CContactDatabase* MycontactDB = CContactDatabase::OpenL(KFileName); CleanupStack::PushL(MycontactDB); //create iterator for MycontactDB TContactIter contact_iterator(*MycontactDB); TContactItemId contact_id; //go through contacts while there any info while( ( contact_id = contact_iterator.NextL() ) != KNullContactId) { // Read contact from own database CContactItem* contact_item = MycontactDB->ReadContactL(contact_id); CleanupStack::PushL(contact_item); // Add it to default database DefcontactDB->AddNewContactL(*contact_item); CleanupStack::PopAndDestroy(contact_item); } CleanupStack::PopAndDestroy(2); // delete own database file - no more needed CContactDatabase::DeleteDatabaseL(KFileName); }
Example application
Internal Link
| Related Discussions | ||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| encryption | eklvn | Symbian Networking & Messaging | 0 | 2003-02-19 17:45 |
| How to retrieve the mobile number or home number or work number | Rameshwari | Mobile Java General | 1 | 2006-08-19 00:17 |
| Replace PhoneNumber using given digit | symprogrammer | General Symbian C++ | 8 | 2007-05-29 07:56 |
| concept of PIM | rak_eshz | Mobile Java General | 23 | 2007-01-22 13:12 |
| contact group | rapolurakesh | General Symbian C++ | 13 | 2007-11-01 13:33 |
