diff -r 2bb96f4ecad8 -r 8e7494275d3a omads/omadsextensions/dsutils/contactsdatastoreextension/src/nsmlcontactsdatastoreextension_p.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omads/omadsextensions/dsutils/contactsdatastoreextension/src/nsmlcontactsdatastoreextension_p.cpp Tue Aug 31 15:05:37 2010 +0300 @@ -0,0 +1,415 @@ +/* +* Copyright (c) 2005 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: Private implementation file for extended contacts adapter +* +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "nsmlcontactsdatastoreextension_p.h" +#include "nsmldebug.h" + + +#ifndef __WINS__ +// This lowers the unnecessary compiler warning (armv5) to remark. +// "Warning: #174-D: expression has no effect..." is caused by +// DBG_ARGS8 macro in no-debug builds. +#pragma diag_remark 174 +#endif + + +/*! + \class CNsmlContactsDataStoreExtensionPrivate + \brief The CNsmlContactsDataStoreExtensionPrivate class provides interface + to access the qtmobility Contacts APIs' + + \sa CNsmlContactsDataStoreExtensionPrivate + */ + + +/*! + * Constructor + */ +CNsmlContactsDataStoreExtensionPrivate::CNsmlContactsDataStoreExtensionPrivate(const TDesC &manager ) +{ + _DBG_FILE("CNsmlContactsDataStoreExtensionPrivate::CNsmlContactsDataStoreExtensionPrivate: BEGIN"); + + // Get the QString manager + mManagerName = QString::fromUtf16(manager.Ptr(),manager.Length()); + + DBG_ARGS(_S("CNsmlContactsDataStoreExtensionPrivate::Manager: %S"), &manager ); + + mWriter = new QVersitWriter; + mReader = new QVersitReader; + mExporter = new QVersitContactExporter; + mImporter = new QVersitContactImporter; + + // Instantiate the Contact Manager + mContactManager = NULL; + QStringList availableManagers = QContactManager::availableManagers(); + + DBG_ARGS(_S("CNsmlContactsDataStoreExtensionPrivate::Manager Count: %d"), availableManagers.count()); + + foreach (const QString manager, availableManagers) + { + if( mManagerName == manager ) + { + _DBG_FILE("CNsmlContactsDataStoreExtensionPrivate::Got a Match"); + mContactManager = QContactManager::fromUri(QContactManager::buildUri(manager, QMap())); + } + } + if( mContactManager == NULL ) + { + _DBG_FILE("CNsmlContactsDataStoreExtensionPrivate::Did Not Find a Match"); + mContactManager = new QContactManager( mManagerName ); + } + + _DBG_FILE("CNsmlContactsDataStoreExtensionPrivate::CNsmlContactsDataStoreExtensionPrivate: END"); +} + +/*! + * Destructor + */ +CNsmlContactsDataStoreExtensionPrivate::~CNsmlContactsDataStoreExtensionPrivate() +{ + _DBG_FILE("CNsmlContactsDataStoreExtensionPrivate::~CNsmlContactsDataStoreExtensionPrivate: BEGIN"); + + + if( mContactManager ) + { + delete mContactManager; + mContactManager = NULL; + } + + if( mWriter ) + { + delete mWriter; + mWriter = NULL; + } + if( mReader ) + { + delete mReader; + mReader = NULL; + } + if( mExporter ) + { + delete mExporter; + mExporter = NULL; + } + if( mImporter ) + { + delete mImporter; + mImporter = NULL; + } + + _DBG_FILE("CNsmlContactsDataStoreExtensionPrivate::~CNsmlContactsDataStoreExtensionPrivate: END"); +} + +/*! + * Fetch contact + */ +TInt CNsmlContactsDataStoreExtensionPrivate::ExportContactsL( const TUid &uid, CBufBase &contactbufbase ) +{ + DBG_ARGS(_S("CNsmlContactsDataStoreExtensionPrivate::ExportContactsL: BEGIN: UID: %d"), uid); + + TInt error(KErrNone); + QList contacts; + QBuffer contactsbuf; + contactsbuf.open(QBuffer::ReadWrite); + mWriter->setDevice( &contactsbuf ); + QContact contact = mContactManager->contact( uid.iUid ); + error = mContactManager->error(); + if( error != QContactManager::NoError ) + { + DBG_ARGS(_S("CNsmlContactsDataStoreExtensionPrivate::ExportContactsL:Error %d"), error ); + return error; + } + contacts.append( contact ); + + if( mExporter->exportContacts( contacts, QVersitDocument::VCard21Type ) ) + { + QList documents = mExporter->documents(); + mWriter->startWriting( documents ); + bool status = mWriter->waitForFinished(); + DBG_ARGS(_S("CNsmlContactsDataStoreExtensionPrivate::ExportContactsL:status %d"), status); + HBufC8* buf = XQConversions::qStringToS60Desc8( contactsbuf.data() ); + contactbufbase.InsertL( contactbufbase.Size(), *buf ); + delete buf; + } + else + { + error = KErrGeneral; + DBG_ARGS(_S("CNsmlContactsDataStoreExtensionPrivate::ExportContactsL:Error in exporting %d"), error ); + } + + TPtr8 ptrbuf(contactbufbase.Ptr(0)); + DBG_DUMP( (void*)ptrbuf.Ptr(), ptrbuf.Length(), + _S8("CNsmlContactsDataStoreExtensionPrivate::ExportContactsL: From DB:")); + + _DBG_FILE("CNsmlContactsDataStoreExtensionPrivate::ExportContactsL: END"); + + return error; +} + +/*! + * Store contact + */ +CArrayFixFlat* CNsmlContactsDataStoreExtensionPrivate::ImportContactsL( const TDesC8 &contactbufbase ) +{ + _DBG_FILE("CNsmlContactsDataStoreExtensionPrivate::ImportContactsL: BEGIN"); + + DBG_DUMP((void*)contactbufbase.Ptr(), contactbufbase.Length(), + _S8("CNsmlContactsDataStoreExtensionPrivate::ImportContactsL: To DB :")); + + TBool ret( ETrue ); + CArrayFixFlat* contactItems = new(ELeave) CArrayFixFlat(4); + QBuffer contactsbuf; + contactsbuf.open(QBuffer::ReadWrite); + QByteArray bytearray((char*)contactbufbase.Ptr()); + + contactsbuf.write(bytearray); + contactsbuf.seek(0); + + mReader->setDevice(&contactsbuf); + if (mReader->startReading() && mReader->waitForFinished()) + { + DBG_ARGS(_S("CNsmlContactsDataStoreExtensionPrivate::Buffer Count: %d"), mReader->results().count() ); + + QList contacts; + if ( mImporter->importDocuments( mReader->results() ) ) + { + contacts = mImporter->contacts(); + QMap errorMap; + ret = mContactManager->saveContacts( &contacts, &errorMap ); + DBG_ARGS(_S("CNsmlContactsDataStoreExtensionPrivate::Import Status: %d"), ret ); + } + if( ret ) + { + foreach (QContact contact, contacts ) + { + TUint contactid = contact.id().localId(); + + DBG_ARGS(_S("CNsmlContactsDataStoreExtensionPrivate::Contact ID: %d"), contactid ); + + contactItems->AppendL( TUid::Uid( contactid ) ); + } + } + + if( contactItems->Count() <= 0 ) + { + delete contactItems; + contactItems = NULL; + } + } + + _DBG_FILE("CNsmlContactsDataStoreExtensionPrivate::ImportContactsL: END"); + + return contactItems; +} + +/*! + * Reads a Contact Details + */ +TInt CNsmlContactsDataStoreExtensionPrivate::ReadContactL( const TUid &uid, CNsmlContactItem *contactitem ) + { + DBG_ARGS(_S("CNsmlContactsDataStoreExtensionPrivate::ReadContactL: BEGIN ID: %d"), uid); + + TInt error(KErrNone); + + QContact contact = mContactManager->contact( uid.iUid ); + error = mContactManager->error(); + if( error != QContactManager::NoError ) + { + DBG_ARGS(_S("CNsmlContactsDataStoreExtensionPrivate::ReadContactL:Error %d"), error ); + return error; + } + + // Fetch the contact details + QContactTimestamp timestamp = contact.detail( QContactTimestamp::DefinitionName ); + // Created Time + DBG_ARGS(_S("CNsmlContactsDataStoreExtensionPrivate::created: %d"), timestamp.created().toTime_t () ); + + // Last Modified Time + DBG_ARGS(_S("CNsmlContactsDataStoreExtensionPrivate::modified: %d"), timestamp.lastModified().toTime_t () ); + contactitem->iLastModified = qTimeToS60TTime( timestamp.lastModified() ); + + // Contact Type + QContactType contacttype = contact.detail( QContactType::DefinitionName ); + contacttype.type(); + + // GUID + QContactGuid contactguid = contact.detail( QContactGuid::DefinitionName ); + contactitem->iGuid = XQConversions::qStringToS60Desc8( contactguid.guid() ); + + // UID + DBG_ARGS(_S("CNsmlContactsDataStoreExtensionPrivate::ReadContactL:LUID %d"), contact.localId() ); + contactitem->iUid = TUid::Uid(contact.localId()); + + // SyncTarget + QContactSyncTarget contactsynctarget = contact.detail( QContactSyncTarget::DefinitionName ); + contactsynctarget.syncTarget(); + + _DBG_FILE("CNsmlContactsDataStoreExtensionPrivate::ReadContactL: END"); + + return error; + } + +/*! + * Delete a contact + */ +TBool CNsmlContactsDataStoreExtensionPrivate::DeleteContactL( const TUid &uid ) + { + _DBG_FILE("CNsmlContactsDataStoreExtensionPrivate::DeleteContactL: BEGIN"); + + TBool ret = mContactManager->removeContact( uid.iUid ); + + DBG_ARGS(_S("CNsmlContactsDataStoreExtensionPrivate::DeleteContactL: END %d"), ret ); + + return ret; + } + +/*! + * Delete array of contacts + */ +TBool CNsmlContactsDataStoreExtensionPrivate::DeleteContactsL( CArrayFixFlat *arrDelete ) + { + _DBG_FILE("CNsmlContactsDataStoreExtensionPrivate::DeleteContactsL: BEGIN"); + + QList contacts; + for( TInt count = 0; count < arrDelete->Count(); count++ ) + { + contacts.append( arrDelete->At( count ).iUid ); + } + + QMap errorMap; + TBool ret = mContactManager->removeContacts( contacts, &errorMap ); + + _DBG_FILE("CNsmlContactsDataStoreExtensionPrivate::DeleteContactsL: END"); + + return ret; + } + +/*! + * Delete all contacts except selfcontact + */ +TBool CNsmlContactsDataStoreExtensionPrivate::DeleteAllContactsL() + { + _DBG_FILE("CNsmlContactsDataStoreExtensionPrivate::DeleteAllContactsL: BEGIN"); + + QContactLocalId selfcontactid = mContactManager->selfContactId(); + QList contactIds = mContactManager->contactIds(); + int index = contactIds.indexOf( selfcontactid ); + contactIds.removeAt( index ); + + QMap errorMap; + TBool ret = mContactManager->removeContacts( contactIds, &errorMap ); + + _DBG_FILE("CNsmlContactsDataStoreExtensionPrivate::DeleteAllContactsL: END"); + + return ret; + } + +/*! + * List the available managers + */ +void CNsmlContactsDataStoreExtensionPrivate::ListStoresL( CDesCArray *cntstores ) + { + _DBG_FILE("CNsmlContactsDataStoreExtensionPrivate::ListStoresL: BEGIN"); + + QStringList availableManagers = QContactManager::availableManagers(); + foreach (const QString manager, availableManagers) + { + HBufC* buf = XQConversions::qStringToS60Desc( manager ); + cntstores->AppendL( buf->Des() ); + delete buf; + } + + _DBG_FILE("CNsmlContactsDataStoreExtensionPrivate::ListStoresL: END"); + } + + +/*! + * Fetch Manager URI + */ +TInt64 CNsmlContactsDataStoreExtensionPrivate::MachineIdL() + { + _DBG_FILE("CNsmlContactsDataStoreExtensionPrivate::MachineIdL: BEGIN"); + + HBufC* buf = XQConversions::qStringToS60Desc( mContactManager->managerUri() ); + TInt64 machineid = DefaultHash::Des16( buf->Des() ); + delete buf; + + DBG_ARGS(_S("CNsmlContactsDataStoreExtensionPrivate::MachineIdL: %ld"), machineid ); + + return machineid; + } + +/*! + * List all contacts + */ +void CNsmlContactsDataStoreExtensionPrivate::ListContactsL( CArrayFixFlat *contactuidlist ) + { + _DBG_FILE("CNsmlContactsDataStoreExtensionPrivate::ListContactsL: BEGIN"); + + QList contactIds = mContactManager->contactIds(); + + foreach (QContactLocalId id, contactIds ) + { + DBG_ARGS(_S("CNsmlContactsDataStoreExtensionPrivate::ListContactsL: %d"), id ); + contactuidlist->AppendL( TUid::Uid(id) ); + } + _DBG_FILE("CNsmlContactsDataStoreExtensionPrivate::ListContactsL: END"); + } + +/*! + * Convert QTime to S60 TTime + */ +TTime CNsmlContactsDataStoreExtensionPrivate::qTimeToS60TTime(const QDateTime &datetime) + { + _DBG_FILE("CNsmlContactsDataStoreExtensionPrivate::qTimeToS60TTime: BEGIN"); + + //Symbian month & day are zero based, so -1 from Qt's + TDateTime dt(datetime.date().year(), + TMonth(datetime.date().month() - 1), + datetime.date().day() - 1, + datetime.time().hour(), + datetime.time().minute(), + datetime.time().second(), + datetime.time().msec() * 1000); + + _DBG_FILE("CNsmlContactsDataStoreExtensionPrivate::qTimeToS60TTime: END"); + return TTime(dt); + } + +// End of File