--- /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 <s32strm.h>
+#include <s32mem.h>
+#include <e32base.h>
+#include <badesca.h>
+#include <utf.h>
+#include <e32hashtab.h>
+#include <qcontactmanager.h>
+#include <qcontact.h>
+#include <qcontactname.h>
+#include <qcontactphonenumber.h>
+#include <qcontactsynctarget.h>
+#include <qcontacttimestamp.h>
+#include <qcontactguid.h>
+#include <qcontacttype.h>
+#include <qversitwriter.h>
+#include <qversitreader.h>
+#include <qversitcontactexporter.h>
+#include <qversitcontactimporter.h>
+#include <xqconversions.h>
+#include <QBuffer>
+#include <QMap>
+#include <nsmlcontactsdatastoreextension.h>
+#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<QString, QString>()));
+ }
+ }
+ 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<QContact> 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<QVersitDocument> 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<TUid>* 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<TUid>* contactItems = new(ELeave) CArrayFixFlat<TUid>(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<QContact> contacts;
+ if ( mImporter->importDocuments( mReader->results() ) )
+ {
+ contacts = mImporter->contacts();
+ QMap<int, QContactManager::Error> 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<TUid> *arrDelete )
+ {
+ _DBG_FILE("CNsmlContactsDataStoreExtensionPrivate::DeleteContactsL: BEGIN");
+
+ QList<QContactLocalId> contacts;
+ for( TInt count = 0; count < arrDelete->Count(); count++ )
+ {
+ contacts.append( arrDelete->At( count ).iUid );
+ }
+
+ QMap<int, QContactManager::Error> 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<QContactLocalId> contactIds = mContactManager->contactIds();
+ int index = contactIds.indexOf( selfcontactid );
+ contactIds.removeAt( index );
+
+ QMap<int, QContactManager::Error> 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<TUid> *contactuidlist )
+ {
+ _DBG_FILE("CNsmlContactsDataStoreExtensionPrivate::ListContactsL: BEGIN");
+
+ QList<QContactLocalId> 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