--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/remotemgmt_plat/syncml_ds_customization_api/tsrc/synchconfigvalidator/customdatasynchconfigvalidatorengine_p.cpp Tue Aug 31 16:04:06 2010 +0300
@@ -0,0 +1,463 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+// CLASS HEADER
+#include "customdatasynchconfigvalidatorengine_p.h"
+
+// INTERNAL INCLUDES
+#include "customdatasynchconfigvalidatorenginewrapper.h"
+#include "customdatasynchdeviceinfo.h"
+
+// EXTERNAL INCLUDES
+#include <etel3rdparty.h>
+#include <sysutil.h>
+#include <centralrepository.h>
+#include <ecom/ecom.h>
+#include <e32def.h>
+#include <utf.h>
+#include <nsmloperatordatacrkeys.h>
+#include <nsmloperatorerrorcrkeys.h>
+#include <syncmlclientds.h>
+
+#include <d32dbms.h>
+#include <f32file.h>
+
+const TUid KCRUidDatasyncKeys = { 0x2000CF7E };
+const TUint32 KDataSynchCustomProfileKey = 0x0;
+const QString SERVERID_DB_COLUMN_NAME = "ServerId";
+const QString PROFILEID_DB_COLUMN_NAME = "Id";
+
+// Utility clean up function
+void CleanupEComArray(TAny* aArray);
+
+// ----------------------------------------------------------------------------
+CustomDataSynchConfigValidatorEngine::CustomDataSynchConfigValidatorEngine(
+ CustomDataSynchConfigValidatorEngineWrapper *parent) :
+ q(parent)
+{
+}
+
+// ----------------------------------------------------------------------------
+CustomDataSynchConfigValidatorEngine::~CustomDataSynchConfigValidatorEngine()
+{
+}
+
+// ----------------------------------------------------------------------------
+bool CustomDataSynchConfigValidatorEngine::dataSynchCenrepExists()
+{
+ int initError = KErrGeneral;
+ TRAP(initError,
+ CRepository* dataSynchCenrep = CRepository::NewL(KCRUidDatasyncKeys);
+ delete dataSynchCenrep;
+ )
+ return (initError == KErrNone ? true : false);
+}
+
+// ----------------------------------------------------------------------------
+bool CustomDataSynchConfigValidatorEngine::operatordataSynchCenrepExists()
+{
+ int initError = KErrGeneral;
+ TRAP(initError,
+ CRepository* operatordataSynchCenrep = CRepository::NewL(KCRUidOperatorDatasyncInternalKeys);
+ delete operatordataSynchCenrep;
+ )
+ return (initError == KErrNone ? true : false);
+}
+
+// ----------------------------------------------------------------------------
+bool CustomDataSynchConfigValidatorEngine::operatordataSynchErrorCenrepExists()
+{
+ int initError = KErrGeneral;
+ TRAP(initError,
+ CRepository* operatordataSynchErrorCenrep = CRepository::NewL(KCRUidOperatorDatasyncErrorKeys);
+ delete operatordataSynchErrorCenrep;
+ )
+ return (initError == KErrNone ? true : false);
+}
+
+// ----------------------------------------------------------------------------
+bool CustomDataSynchConfigValidatorEngine::customSynchProfilesAllowed()
+{
+ int initError = KErrGeneral;//CRepository::Get or CRepository::NewL
+ int customProfileKeyValue = 0;//value 1 means allowed
+ TRAP(initError,
+ CRepository* dataSynchCenrep = CRepository::NewL(KCRUidDatasyncKeys);
+ initError = dataSynchCenrep->Get(KDataSynchCustomProfileKey,customProfileKeyValue);
+ delete dataSynchCenrep;
+ )
+ return (initError == KErrNone && customProfileKeyValue == 1 ? true : false);
+}
+
+// ----------------------------------------------------------------------------
+bool CustomDataSynchConfigValidatorEngine::configuredContactsAdapterExists(
+ QString & errorMsg)
+{
+ int initError = KErrGeneral;//CRepository::Get or CRepository::NewL
+ int pluginloadError = KErrGeneral;
+
+ TUid adapterUid = {0x101F6DDD};//platformcontactadapter Uid
+
+ TRAP(initError,
+ CRepository* operatordataSynchCenrep = CRepository::NewL(KCRUidOperatorDatasyncInternalKeys);
+ int adapterUidInt = 0;
+ int errorCode = operatordataSynchCenrep->Get(KNsmlOpDsOperatorAdapterUid,adapterUidInt);
+ delete operatordataSynchCenrep;
+ if( adapterUidInt > 0 )
+ {//if greater than 0 custom contact adapter is 'likely' to be used
+ adapterUid = TUid::Uid(adapterUidInt);
+ }
+ )
+ TRAP(pluginloadError,
+ TAny* any = REComSession::CreateImplementationL(adapterUid, _FOFF(CustomDataSynchConfigValidatorEngine, iEComDtorKey));
+ REComSession::DestroyedImplementation(iEComDtorKey);
+ )
+ bool success = (initError == KErrNone && pluginloadError == KErrNone) ? true : false;
+ if(!success)
+ {
+ errorMsg = "Problems loading adapter UID: 0x";
+ errorMsg = errorMsg+QString::number(adapterUid.iUid,16).toUpper();
+ }
+
+ return success;
+}
+
+// ----------------------------------------------------------------------------
+bool CustomDataSynchConfigValidatorEngine::configuredCustomSynchProfileExists(QString & errorMsg)
+{
+ int cenrepError = KErrGeneral;//CRepository::Get or CRepository::NewL
+ bool serverIdmatchFound = false;
+ bool dbOk = false;
+
+ QString cenrepServerIdString;
+ QString profileServerId;
+
+ TRAP(cenrepError,
+ CRepository* operatordataSynchCenrep = CRepository::NewL(KCRUidOperatorDatasyncInternalKeys);
+ TBuf8<50> cenrepServerIdBuf;
+ cenrepError = operatordataSynchCenrep->Get(KNsmlOpDsOperatorSyncServerId,cenrepServerIdBuf);
+ delete operatordataSynchCenrep;
+ HBufC* cenrepServerIdHBufC;
+ cenrepServerIdHBufC = CnvUtfConverter::ConvertToUnicodeFromUtf8L(cenrepServerIdBuf);
+ cenrepServerIdString = QString::fromUtf16(cenrepServerIdHBufC->Ptr(), cenrepServerIdHBufC->Length());
+ delete cenrepServerIdHBufC;
+ )
+ dbOk = getStringValueFromSyncProfileSettingsDb(profileServerId,SERVERID_DB_COLUMN_NAME);
+ serverIdmatchFound = cenrepServerIdString.compare(profileServerId)==0 ? true : false;
+
+ bool success = (cenrepError == KErrNone && dbOk) ? serverIdmatchFound : false;
+ if(!success){
+ errorMsg = "Problems with Cenrep defined ServerId:["+cenrepServerIdString+"]";
+ }
+ return success;
+}
+
+// ----------------------------------------------------------------------------
+bool CustomDataSynchConfigValidatorEngine::contactAdapterCenrepValueToProfileMatches(QString & errorMsg)
+{
+ int cenrepError = KErrGeneral;//CRepository::Get or CRepository::NewL
+
+ TUid cenrepAdapterUid = { 0x101F6DDD };//platformcontactadapter Uid
+ int adapterUidInt = 0;
+ TRAP(cenrepError,
+ CRepository* operatordataSynchCenrep = CRepository::NewL(KCRUidOperatorDatasyncInternalKeys);
+ cenrepError = operatordataSynchCenrep->Get(KNsmlOpDsOperatorAdapterUid,adapterUidInt);
+ delete operatordataSynchCenrep;
+ )
+ if( adapterUidInt > 0 )
+ {//if greater than 0 custom contact adapter is 'likely' to be used
+ cenrepAdapterUid = TUid::Uid(adapterUidInt);
+ }
+ return adapterCenrepValueToProfileMatches(errorMsg, cenrepAdapterUid);
+}
+
+// ----------------------------------------------------------------------------
+bool CustomDataSynchConfigValidatorEngine::myprofileAdapterCenrepValueToProfileMatches(QString & errorMsg)
+{
+ int cenrepError = KErrGeneral;//CRepository::Get or CRepository::NewL
+ TUid cenrepAdapterUid = { 0x0 };
+ int adapterUidInt = 0;
+ TRAP(cenrepError,
+ CRepository* operatordataSynchCenrep = CRepository::NewL(KCRUidOperatorDatasyncInternalKeys);
+ cenrepError = operatordataSynchCenrep->Get(KNsmlOpDsProfileAdapterUid,adapterUidInt);
+ delete operatordataSynchCenrep;
+ )
+ if( adapterUidInt > 0 )
+ {//if greater than 0 custom contact adapter is 'likely' to be used
+ cenrepAdapterUid = TUid::Uid(adapterUidInt);
+ }
+ return adapterCenrepValueToProfileMatches(errorMsg, cenrepAdapterUid);
+}
+
+// ----------------------------------------------------------------------------
+bool CustomDataSynchConfigValidatorEngine::devInfoExtensionPluginAvailable()
+{
+ TUid devInfoExtensionPluginUid = { 0x2002DC7C };
+ int err = KErrGeneral;
+ bool pluginExists = false;
+ RImplInfoPtrArray implInfoArray;
+ TCleanupItem cleanup( CleanupEComArray, &implInfoArray );
+ TRAP(err,
+ CleanupStack::PushL( cleanup );
+ REComSession::ListImplementationsL(
+ devInfoExtensionPluginUid, implInfoArray );
+ if( err == KErrNone && implInfoArray.Count() > 0 )
+ {
+ pluginExists = true;
+ }
+
+ CleanupStack::PopAndDestroy(); // implInfoArray
+ )
+ return pluginExists;
+}
+
+//
+// Helper functions
+//
+//
+// ----------------------------------------------------------------------------
+bool CustomDataSynchConfigValidatorEngine::adapterCenrepValueToProfileMatches(QString & errorMsg, TUid adapterUid)
+{
+ int profileOpenError = KErrGeneral;
+ bool adapterMatchFound = false;
+
+ int dbProfileId = operatorProfileIdFromProfilesDB();
+ if(dbProfileId<0)
+ {//No profile Id or cenrep server Id could not found
+ errorMsg = "Test cannot proceed. No profile id was acquired or cenrepServerId was not configured.";
+ return false;//RSyncMLDataSyncProfile.OpenL panics
+ }
+ //Get Contact Adapter UID from synch profile
+ TRAP(profileOpenError,
+ RSyncMLSession syncMLSession;
+ RArray<TSmlProfileId> profiles;
+ syncMLSession.OpenL();
+ CleanupClosePushL(syncMLSession);
+ // Get the list of available profiles into an array
+ syncMLSession.ListProfilesL(profiles, ESmlDataSync);
+ QString dataProviderString = NULL;
+ QString serverDataSourceName;
+
+ for(int i=0; i < profiles.Count(); i++)
+ {
+ RSyncMLDataSyncProfile profile;
+ profile.OpenL(syncMLSession,profiles[i],ESmlOpenRead);
+ if (!profileOpenError) {//-42 PermissionDenied -> Capabilities problem
+ CleanupClosePushL(profile);
+ RArray<TSmlTaskId> profileTasks;
+ CleanupClosePushL(profileTasks);
+ profile.ListTasksL(profileTasks);
+ for (int j = 0; j < profileTasks.Count(); j++) {
+ RSyncMLTask task;
+ task.OpenL(profile, profileTasks[j]);
+ CleanupClosePushL(task);
+ if(task.Profile() == dbProfileId)
+ {
+ int taskProviderInt = task.DataProvider();
+ int cenrepProviderInt = adapterUid.iUid;
+ if(task.DataProvider()==adapterUid.iUid)
+ {
+ serverDataSourceName = QString((QChar*) task.ServerDataSource().Ptr(),
+ task.ServerDataSource().Length());
+ adapterMatchFound = true;
+ }
+ }
+ CleanupStack::PopAndDestroy(&task);
+ }
+ CleanupStack::PopAndDestroy(&profileTasks);
+ CleanupStack::PopAndDestroy(&profile);
+ }
+ }
+ if(profileOpenError==KErrNone)
+ {
+ profiles.Close();
+ }
+ CleanupStack::PopAndDestroy(&syncMLSession);
+ )
+ bool success = (profileOpenError == KErrNone) ? adapterMatchFound : false;
+ if(!success)
+ {
+ errorMsg = "No match found.";
+ errorMsg = errorMsg + "\n\n [dbProfileId]=("+QString::number(dbProfileId)+")";
+ errorMsg = errorMsg + "\n [cenrepAdapterUid]=\n("+"0x"+QString::number(adapterUid.iUid,16).toUpper()+")";
+ errorMsg = errorMsg + "\n\n [profileOpenError]=("+QString::number(profileOpenError)+")";
+ }
+ return success;
+}
+
+// ----------------------------------------------------------------------------
+bool CustomDataSynchConfigValidatorEngine::getStringValueFromSyncProfileSettingsDb(QString& value,QString columnName,QString whereTypeConditionForSql)
+{
+ //profileDbOpenError can be caused by RFs,RDbs,RDbNamedDatabase,RDbTable or RDbView startup sequences
+ int profileDbOpenError = KErrGeneral;
+ bool resultsFromDbWithQuery = false;
+
+ TPtrC columnNamePtr (static_cast<const TUint16*>(columnName.utf16()), columnName.length());
+
+ QString syncSettingsDbName = "\\private\\100012a5\\DBS_101F99FB_nsmldssettings.db";
+ QString syncSettingsDbTableProfiles = "Profiles";
+ TPtrC syncSettingsDbNamePtr (static_cast<const TUint16*>(syncSettingsDbName.utf16()), syncSettingsDbName.length());
+ TPtrC syncSettingsDbTableProfilesPtr (static_cast<const TUint16*>(syncSettingsDbTableProfiles.utf16()), syncSettingsDbTableProfiles.length());
+
+ //Query & where condition handling
+ QString sqlGetProfileQuery = "SELECT * FROM Profiles";
+ if(whereTypeConditionForSql.length()>0)
+ {
+ sqlGetProfileQuery = sqlGetProfileQuery+" WHERE "+whereTypeConditionForSql;
+ }
+ TPtrC sqlQueryPtr (static_cast<const TUint16*>(sqlGetProfileQuery.utf16()), sqlGetProfileQuery.length());
+
+ //DB INIT
+ RDbNamedDatabase database;
+ RFs fsSession;
+ RDbs rdbSession;
+ RDbTable dbTableProfiles;
+ CDbColSet* dbColSet;
+ RDbView dbView;
+ TRAP(profileDbOpenError,
+ //DB CONNECT
+ profileDbOpenError = fsSession.Connect();
+ CleanupClosePushL(fsSession);
+ profileDbOpenError = rdbSession.Connect();
+ CleanupClosePushL(rdbSession);
+ int i = 0;
+ profileDbOpenError = KErrGeneral;//else DBMS 2 panic is rised in dbTableProfiles.Open
+ while (i < 10 && profileDbOpenError != KErrNone)
+ {//100ms synchronous waits max. 1sec
+ profileDbOpenError = database.Open(fsSession,syncSettingsDbNamePtr);
+ User::After(100000);
+ i++;
+ }
+ CleanupClosePushL(database);
+ profileDbOpenError = dbTableProfiles.Open( database, syncSettingsDbTableProfilesPtr );
+ CleanupClosePushL(dbTableProfiles);
+
+ //DB QUERY
+ profileDbOpenError = dbView.Prepare( database, TDbQuery( sqlQueryPtr ), dbView.EReadOnly );
+ CleanupClosePushL(dbView);
+ dbColSet = dbTableProfiles.ColSetL();
+ CleanupStack::PushL(dbColSet);
+
+ while(profileDbOpenError!=KErrArgument&&dbView.NextL())
+ {//if results and no db error
+ resultsFromDbWithQuery = true;
+ dbView.GetL();
+ if(columnName.compare(PROFILEID_DB_COLUMN_NAME)==0)
+ {//Uint
+ TUint valueFromDb = dbView.ColUint( dbColSet->ColNo( columnNamePtr ));
+ value.setNum(valueFromDb);
+ }
+ else if(columnName.compare(SERVERID_DB_COLUMN_NAME)==0)
+ {//String types
+ QString valueFromDb ((QChar*)dbView.ColDes( dbColSet->ColNo( columnNamePtr )).Ptr(),
+ dbView.ColDes(dbColSet->ColNo( columnNamePtr )).Length());
+ value=valueFromDb;
+ }
+ }
+ //DB CLOSE
+ CleanupStack::PopAndDestroy(dbColSet);
+ CleanupStack::PopAndDestroy(5,&fsSession);
+ )
+
+ return profileDbOpenError == KErrNone ? resultsFromDbWithQuery : false;
+}
+
+// ----------------------------------------------------------------------------
+int CustomDataSynchConfigValidatorEngine::operatorProfileIdFromProfilesDB()
+{
+ int profileId = -1;//Return this value if problems during fetch
+ int cenrepError = KErrGeneral; //CRepository::Get or CRepository::NewL
+ bool dbOk = false;
+
+ //Find right Synch profile based on trusted cenrep configured Server Id
+ QString profileIdString;
+ QString cenrepServerIdString;
+
+ TRAP(cenrepError,
+ CRepository* operatordataSynchCenrep = CRepository::NewL(KCRUidOperatorDatasyncInternalKeys);
+ TBuf8<50> cenrepServerIdBuf;
+ cenrepError = operatordataSynchCenrep->Get(KNsmlOpDsOperatorSyncServerId,cenrepServerIdBuf);
+ delete operatordataSynchCenrep;
+ HBufC* cenrepServerIdHBufC;
+ cenrepServerIdHBufC = CnvUtfConverter::ConvertToUnicodeFromUtf8L(cenrepServerIdBuf);
+ cenrepServerIdString = QString::fromUtf16(cenrepServerIdHBufC->Ptr(), cenrepServerIdHBufC->Length());
+ delete cenrepServerIdHBufC;
+ )
+ if(cenrepServerIdString.compare("")==0)
+ {//protect against DBMS panic 2
+ return profileId;//-1
+ }
+ QString whereCondition = SERVERID_DB_COLUMN_NAME+"='"+cenrepServerIdString+"'";
+ dbOk = getStringValueFromSyncProfileSettingsDb(profileIdString,PROFILEID_DB_COLUMN_NAME,whereCondition);
+ if(dbOk)
+ {
+ profileId = profileIdString.toInt();
+ }
+ return profileId;//error handling needs to be done in calling code
+}
+
+// ----------------------------------------------------------------------------
+QString CustomDataSynchConfigValidatorEngine::imei() const
+{
+ QScopedPointer<CDeviceInfo> deviceInfo(CDeviceInfo::NewL());
+ TBuf<CTelephony::KPhoneSerialNumberSize> imei(deviceInfo->imei());
+ return QString::fromUtf16(imei.Ptr(), imei.Length());
+}
+
+// ----------------------------------------------------------------------------
+QString CustomDataSynchConfigValidatorEngine::model() const
+{
+ QScopedPointer<CDeviceInfo> deviceInfo(CDeviceInfo::NewL());
+ TBuf<CTelephony::KPhoneModelIdSize> model(deviceInfo->model());
+ return QString::fromUtf16(model.Ptr(), model.Length());
+}
+
+// ----------------------------------------------------------------------------
+QString CustomDataSynchConfigValidatorEngine::manufacturer() const
+{
+ QScopedPointer<CDeviceInfo> deviceInfo(CDeviceInfo::NewL());
+ TBuf<CTelephony::KPhoneModelIdSize> manufacturer(deviceInfo->manufacturer());
+ return QString::fromUtf16(manufacturer.Ptr(), manufacturer.Length());
+}
+
+// ----------------------------------------------------------------------------
+QString CustomDataSynchConfigValidatorEngine::imsi() const
+{
+ QScopedPointer<CDeviceInfo> deviceInfo(CDeviceInfo::NewL());
+ TBuf<CTelephony::KIMSISize> imsi(deviceInfo->imsi());
+ return QString::fromUtf16(imsi.Ptr(), imsi.Length());
+}
+
+// ----------------------------------------------------------------------------
+QString CustomDataSynchConfigValidatorEngine::softwareVersion() const
+{
+ QString version;
+ TBuf<KSysUtilVersionTextLength> versionBuf;
+ if (SysUtil::GetSWVersion(versionBuf) == KErrNone) {
+ version = QString::fromUtf16(versionBuf.Ptr(), versionBuf.Length());
+ }
+ return version;
+}
+
+// ----------------------------------------------------------------------------
+// CleanupEComArray function is used for cleanup support of locally declared arrays
+void CleanupEComArray(TAny* aArray)
+{
+ (static_cast<RImplInfoPtrArray*> (aArray))->ResetAndDestroy();
+ (static_cast<RImplInfoPtrArray*> (aArray))->Close();
+}
+
+// End of file