remotemgmt_plat/syncml_ds_customization_api/tsrc/synchconfigvalidator/customdatasynchconfigvalidatorengine_p.cpp
branchRCL_3
changeset 25 b183ec05bd8c
--- /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