--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/ds/settings/src/NSmlDSSettings.cpp Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,884 @@
+/*
+* Copyright (c) 2004 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: DS-settings
+*
+*/
+
+
+#include <NSmlDSProfileRes.rsg>
+
+#include <nsmlconstants.h>
+#include <nsmldsconstants.h>
+#include "nsmldssettings.h"
+#include "NSmlDSResourceProfile.h"
+#include "barsc.h"
+#include "bautils.h"
+#include "nsmlroam.h"
+//XML profiles
+#include "RXMLReader.h"
+#include "NSmlProfileContentHandler.h"
+#include <centralrepository.h> //CRepository
+
+_LIT(Kinfile,"z:\\Private\\101F99FB\\VariantData.xml");
+
+
+//=============================================
+//
+// CNSmlDSSettings
+//
+//=============================================
+
+//=============================================
+// CNSmlDSSettings::NewL()
+// Creates a new instance of CNSmlDSSettings object.
+//=============================================
+
+EXPORT_C CNSmlDSSettings* CNSmlDSSettings::NewL()
+ {
+ CNSmlDSSettings* self = CNSmlDSSettings::NewLC();
+ CleanupStack::Pop();
+ return self;
+ }
+
+//=============================================
+// CNSmlDSSettings::NewLC()
+// Creates a new instance of CNSmlDSSettings object.
+// Pushes and leaves new instance into CleanupStack.
+// Opens/creates settings database.
+//=============================================
+
+EXPORT_C CNSmlDSSettings* CNSmlDSSettings::NewLC()
+ {
+
+ CNSmlDSSettings* self = new( ELeave ) CNSmlDSSettings;
+ CleanupStack::PushL( self );
+ self->ConstructL();
+
+ User::LeaveIfError( self->iFsSession.Connect() );
+ User::LeaveIfError( self->iRdbSession.Connect() );
+
+ TParse name;
+
+#ifdef SYMBIAN_SECURE_DBMS
+ name.Set( KNSmlSettingsDbName(), NULL, NULL );
+#else
+ name.Set( KNSmlSettingsDbName(), KNSmlDatabasesNonSecurePath, NULL );
+#endif
+
+ TInt err = self->iDatabase.Open( self->iRdbSession,
+ name.FullName(),
+ KNSmlDBMSSecureSOSServerID );
+
+ if ( err == KErrNotFound )
+ {
+ self->CreateDatabaseL( name.FullName() );
+ self->iDatabase.Open( self->iRdbSession,
+ name.FullName(),
+ KNSmlDBMSSecureSOSServerID );
+ User::LeaveIfError( self->iTableProfiles.Open( self->iDatabase, KNSmlTableProfiles ) );
+ self->iColSet = self->iTableProfiles.ColSetL();
+ }
+ else
+ {
+ if ( (err == KErrEof) || (err == KErrCorrupt) ||
+ (err == KErrArgument) || (err == KErrNotSupported) )
+ {
+ self->iRdbSession.DeleteDatabase( name.FullName(),
+ KNSmlSOSServerPolicyUID );
+ }
+ User::LeaveIfError( err );
+ User::LeaveIfError( self->iTableProfiles.Open( self->iDatabase, KNSmlTableProfiles ) );
+ self->iColSet = self->iTableProfiles.ColSetL();
+ }
+ return self;
+ }
+
+//=============================================
+// CNSmlDSSettings::ConstructL()
+// 2nd phase constructor
+//=============================================
+void CNSmlDSSettings::ConstructL()
+ {
+ iResourceProfileArray = new (ELeave) CArrayPtrFlat<CNSmlDSProfile> (5);
+ }
+
+
+//=============================================
+// CNSmlDSSettings::~CNSmlDSSettings()
+// Destructor.
+//=============================================
+
+CNSmlDSSettings::~CNSmlDSSettings()
+ {
+ if(iResourceProfileArray)
+ {
+ iResourceProfileArray->ResetAndDestroy();
+ }
+ delete iResourceProfileArray;
+
+ iView.Close();
+ delete iColSet;
+ iTableProfiles.Close();
+ iDatabase.Close();
+ iFsSession.Close();
+ iRdbSession.Close();
+ }
+
+//=============================================
+// CNSmlDSSettings::CreateDatabaseL()
+// Creates settings database.
+//=============================================
+
+void CNSmlDSSettings::CreateDatabaseL(const TDesC& aFullName)
+ {
+ // 50 is the extra length neede for integer lengths
+ HBufC* createProfileTable = HBufC::NewLC( KDSCreateProfilesTable().Length() + 50);
+ TPtr profileTablePtr = createProfileTable->Des();
+
+ profileTablePtr.Format(KDSCreateProfilesTable,KNSmlMaxProfileNameLength,KNSmlMaxUsernameLength,KNSmlMaxPasswordLength,KNSmlMaxURLLength,KNSmlMaxServerIdLength,KNSmlMaxHttpAuthUsernameLength,KNSmlMaxHttpAuthPasswordLength, KNSmlDSVisibilityArraySize );
+
+ // 25 is the extra length neede for integer lengths
+ HBufC* createAdaptersTable = HBufC::NewLC( KDSCreateAdaptersTable().Length() + 25);
+ TPtr adaptersTablePtr = createAdaptersTable->Des();
+ adaptersTablePtr.Format(KDSCreateAdaptersTable,KNSmlMaxAdapterDisplayNameLength,KNSmlMaxRemoteNameLength, KNSmlMaxLocalNameLength );
+
+ User::LeaveIfError( iDatabase.Create( this->iRdbSession, aFullName, KNSmlDBMSSecureSOSServerID ) );
+
+ iDatabase.Begin();
+
+ iDatabase.Execute( *createProfileTable );
+ iDatabase.Execute( *createAdaptersTable );
+
+ CDbColSet* colSet = CDbColSet::NewLC();
+ colSet->AddL(TDbCol(KNSmlVersionColumnMajor(), EDbColUint16));
+ colSet->AddL(TDbCol(KNSmlVersionColumnMinor(), EDbColUint16));
+ User::LeaveIfError(iDatabase.CreateTable(KNSmlTableVersion(), *colSet));
+ CleanupStack::PopAndDestroy( ); //colset
+
+ RDbTable table;
+ User::LeaveIfError(table.Open(iDatabase, KNSmlTableVersion()));
+ CleanupClosePushL(table);
+ colSet = table.ColSetL();
+ CleanupStack::PushL(colSet);
+ table.InsertL();
+ table.SetColL(colSet->ColNo(KNSmlVersionColumnMajor), KNSmlSettingsCurrentVersionMajor);
+ table.SetColL(colSet->ColNo(KNSmlVersionColumnMinor), KNSmlSettingsCurrentVersionMinor);
+ table.PutL();
+
+ iDatabase.Commit();
+
+ CreateHiddenProfilesL();
+
+ TInt keyVal;
+ TRAPD (err ,ReadRepositoryL(KNsmlDsCustomProfiles, keyVal));
+ if (err == KErrNone && keyVal)
+ {
+ TBool aRestore = EFalse;
+ CreateXMLProfilesL(aRestore);
+ }
+ iDatabase.Close();
+ CleanupStack::PopAndDestroy( 4 ); // createAdaptersTable, createProfileTable, colSet, table
+ }
+
+//=============================================
+// CNSmlDSSettings::CreateHiddenProfilesL()
+// Create new profiles reading data from
+// resource file
+//=============================================
+
+void CNSmlDSSettings::CreateHiddenProfilesL()
+ {
+ TFileName fileName;
+ Dll::FileName( fileName );
+ TParse parse;
+
+ parse.Set( KNSmlDSProfilesRsc, &fileName, NULL );
+ fileName = parse.FullName();
+
+ RResourceFile resourceFile;
+ BaflUtils::NearestLanguageFile( iFsSession, fileName );
+
+ TRAPD(leavecode,resourceFile.OpenL( iFsSession,fileName));
+ if(leavecode != 0)
+ {
+ return;
+ }
+ CleanupClosePushL(resourceFile);
+
+ HBufC8* profileRes = resourceFile.AllocReadLC( NSML_DS_PROFILES );
+ TResourceReader reader;
+ reader.SetBuffer( profileRes );
+
+ CNSmlDSResourceProfiles* profileResReader = CNSmlDSResourceProfiles::NewLC( reader, this );
+ profileResReader->SaveProfilesL(iResourceProfileArray);
+ CleanupStack::PopAndDestroy(3); // profileResReader, profileRes, resourceFile
+ }
+
+
+//===============================================
+// CNSmlDSSettings::CreateXMLProfiles()
+//
+//
+//===============================================
+void CNSmlDSSettings::CreateXMLProfilesL(TBool aRestore)
+ {
+
+ TBool status = TRUE;
+ TInt error = KErrNone;
+
+ //file server
+ RFs wSession;
+ error = wSession.Connect();
+ if (error != KErrNone)
+ {
+ return;
+ }
+
+ RXMLReader DSProfileParser;
+ DSProfileParser.CreateL();
+ CArrayPtrFlat<CNSmlDSProfile>* customProfileArray = new (ELeave) CArrayPtrFlat<CNSmlDSProfile> (5);
+ CleanupStack::PushL(customProfileArray);
+
+ CNSmlProfileContentHandler* cb = CNSmlProfileContentHandler::NewL(this ,customProfileArray);
+ CleanupStack::PushL(cb);
+
+ DSProfileParser.SetContentHandler(cb);
+
+ DSProfileParser.SetFeature(EXMLValidation, ETrue);
+ DSProfileParser.SetFeature(EXMLValidation, EFalse);
+ DSProfileParser.GetFeature(EXMLBinary, status);
+ DSProfileParser.GetFeature(EXMLValidation, status);
+
+ status = TRUE;
+
+ RFile wFile;
+ TInt err =wFile.Open(wSession, Kinfile, EFileRead | EFileShareReadersOnly);
+ if (err != KErrNone)
+ {
+ CleanupStack::PopAndDestroy(2);
+ return;
+ }
+
+ CleanupClosePushL(wFile);
+ //parse file
+ TRAP(error, DSProfileParser.ParseL(wFile));
+ if (error != KErrNone)
+ {
+ CleanupStack::PopAndDestroy(3);
+ return;
+ }
+ TInt index;
+ TBuf<150> buf;
+
+ if(aRestore)
+ {
+ //handling back up-restore for custom profiles
+ CNSmlDSProfileList* profList = new (ELeave) CArrayPtrFlat<CNSmlDSProfileListItem>(1);
+ CleanupStack::PushL(profList);
+ GetAllProfileListL( profList );
+ for( TInt i = 0 ; i < profList->Count() ; i++ )
+ {
+ TInt id = profList->At(i)->IntValue( EDSProfileId );
+ CNSmlDSProfile* prof = ProfileL(id);
+ CleanupStack::PushL( prof );
+ buf = prof->StrValue(EDSProfileServerId);
+
+ if (buf.Compare(KEmpty) != 0)
+ {
+ for (index = 0; index < customProfileArray->Count(); index++ )
+ {
+ if (buf.Compare(customProfileArray->At(index)->StrValue(EDSProfileServerId)) == 0)
+ {
+ DeleteProfileL(id);
+ }
+ }
+ }
+
+ else
+ {
+ buf = prof->StrValue(EDSProfileServerURL);
+ for (index = 0; index < customProfileArray->Count(); index++ )
+ {
+ if (buf.Compare(customProfileArray->At(index)->StrValue(EDSProfileServerURL)) == 0)
+ {
+ DeleteProfileL(id);
+ }
+ }
+ }
+ CleanupStack::PopAndDestroy(); // prof
+ }
+
+ profList->ResetAndDestroy();
+ CleanupStack::PopAndDestroy();
+ }
+
+ //save profiles
+ TBool defaultprofilefound = EFalse;
+ //Set the ProfileID to default
+ WriteRepositoryL( KCRUidDSDefaultProfileInternalKeys, KNsmlDsDefaultProfile, -1 );
+ for ( index = 0; index < customProfileArray->Count(); index++ )
+ {
+ if (CheckXMLProfileSettings(customProfileArray ,index))
+ {
+ customProfileArray->At(index)->SaveL();
+ if(!defaultprofilefound && customProfileArray->At(index)->IntValue(EDSProfileDefaultProfile))
+ {
+ //Set the ProfileID to be used as a Default Profile
+ WriteRepositoryL( KCRUidDSDefaultProfileInternalKeys, KNsmlDsDefaultProfile,
+ customProfileArray->At(index)->IntValue(EDSProfileId) );
+ defaultprofilefound = ETrue;
+ }
+ }
+ }
+
+ CleanupStack::PopAndDestroy(); // wFile
+ CleanupStack::PopAndDestroy(); // cb
+
+ customProfileArray->ResetAndDestroy();
+ CleanupStack::PopAndDestroy(); //customProfileArray
+
+
+ }
+
+//===============================================
+// CNSmlDSSettings::CheckXMLProfileSettings()
+//
+//
+//===============================================
+TBool CNSmlDSSettings::CheckXMLProfileSettings(CNSmlProfileArray* aProfileArray,TInt aIndex)
+ {
+
+ const TInt KMaxXMLProfileCount = 5;
+ TBuf<160> buf;
+ TInt count = aProfileArray->Count();
+ //max count
+ if (count > KMaxXMLProfileCount)
+ {
+ return EFalse;
+ }
+
+ //mandatory settings
+ if (aProfileArray->At(aIndex)->StrValue(EDSProfileDisplayName).Compare(KEmpty) == 0
+ ||aProfileArray->At(aIndex)->StrValue(EDSProfileServerURL).Compare(KEmpty) == 0
+ )
+ {
+ return EFalse;
+ }
+
+ //Unique Server Id
+ buf = aProfileArray->At(aIndex)->StrValue(EDSProfileServerId);
+ if (buf.Compare(KEmpty) != 0)
+ {
+ for(TInt i = 0 ; i < iResourceProfileArray->Count() ; i++ )
+ {
+ if (iResourceProfileArray->At(i)->StrValue(EDSProfileServerId)
+ .Compare(buf) == 0)
+ {
+ return EFalse;
+ }
+ }
+ }
+
+ if(buf.Compare(KEmpty) != 0)
+ {
+ for (TInt i = 0; i < count ;i++)
+ {
+ if (buf.Compare(aProfileArray->At(i)->StrValue(EDSProfileServerId)) == 0
+ && i < aIndex)
+ {
+ return EFalse;
+ }
+ }
+ }
+
+ return ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlDSSettings::ReadRepositoryL
+//
+// -----------------------------------------------------------------------------
+//
+void CNSmlDSSettings::ReadRepositoryL(TInt aKey, TInt& aValue)
+ {
+ const TUid KRepositoryId = KCRUidDataSyncInternalKeys;
+
+ CRepository* rep = CRepository::NewLC(KRepositoryId);
+ TInt err = rep->Get(aKey, aValue);
+ User::LeaveIfError(err);
+ CleanupStack::PopAndDestroy(rep);
+
+ }
+// -----------------------------------------------------------------------------
+// CNSmlDSSettings::WriteRepositoryL
+//
+// -----------------------------------------------------------------------------
+//
+void CNSmlDSSettings::WriteRepositoryL(TUid aUid, TInt aKey, TInt aValue)
+ {
+ const TUid KRepositoryId = aUid;
+
+ CRepository* rep = CRepository::NewLC(KRepositoryId);
+ TInt err = rep->Set(aKey, aValue);
+ User::LeaveIfError(err);
+ CleanupStack::PopAndDestroy(rep);
+
+ }
+//===============================================
+// CNSmlDSSettings::UpdateHiddenProfilesL()
+// Updates the profiles with data from
+// resource file
+//===============================================
+EXPORT_C void CNSmlDSSettings::UpdateHiddenProfilesL()
+{
+
+ CNSmlDSProfileList* profList = new (ELeave) CArrayPtrFlat<CNSmlDSProfileListItem>(1);
+ CleanupStack::PushL(profList);
+ GetAllProfileListL( profList );
+ for( TInt i = 0 ; i < profList->Count() ; i++ )
+ {
+ TInt id = profList->At(i)->IntValue( EDSProfileId );
+ CNSmlDSProfile* prof = ProfileL(id);
+ CleanupStack::PushL( prof );
+ if(!prof->IntValue(EDSProfileDeleteAllowed))
+ {
+
+ DeleteProfileL(id);
+ }
+ CleanupStack::PopAndDestroy(); // prof
+ }
+
+ profList->ResetAndDestroy();
+ CleanupStack::PopAndDestroy();
+
+ CreateHiddenProfilesL();
+
+ TInt keyVal;
+ TRAPD (err ,ReadRepositoryL(KNsmlDsCustomProfiles, keyVal));
+ if (err == KErrNone && keyVal)
+ {
+ TInt aRestore = ETrue;
+ CreateXMLProfilesL(aRestore);
+ }
+}
+//=============================================
+// CNSmlDSSettings::CreateProfileL()
+// Returns a pointer to newly created CNSmlDSProfile object.
+//=============================================
+
+EXPORT_C CNSmlDSProfile* CNSmlDSSettings::CreateProfileL()
+ {
+ CNSmlDSProfile* profile = CNSmlDSProfile::NewL( this->Database() );
+
+ profile->SetIntValue( EDSProfileId, KNSmlNewObject );
+ profile->SetIntValue( EDSProfileTransportId, KUidNSmlMediumTypeInternet.iUid );
+ profile->SetIntValue( EDSProfileHidden, EFalse);
+ profile->SetIntValue( EDSProfileDeleteAllowed, ETrue);
+
+ profile->SetIntValue( EDSProfileServerAlertedAction,ESmlConfirmSync);
+
+ profile->SetIntValue( EDSProfileIAPId, -2 );
+
+ profile->SetIntValue( EDSProfileHttpAuthUsed, EFalse);
+ profile->SetIntValue( EDSProfileAutoChangeIAP, EFalse);
+
+ profile->SetIntValue( EDSProfileProtocolVersion, ESmlVersion1_2 );
+
+ profile->InitVisibilityArray(KNSmlDefaultVisibility);
+
+ return profile;
+ }
+
+//=============================================
+// CNSmlDSSettings::CreateProfileL()
+// Copies all profile data with given Id to
+// a newly created CNSmlDSProfile object.
+//=============================================
+
+EXPORT_C CNSmlDSProfile* CNSmlDSSettings::CreateProfileL( const TInt aId )
+ {
+ CNSmlDSProfile* profile = ProfileOnlyL( aId);
+ CleanupStack::PushL( profile );
+ if ( profile )
+ {
+ profile->SetIntValue( EDSProfileId, KNSmlNewObject );
+
+ CNSmlDSProfile* copyProfile = ProfileL( aId);
+ CleanupStack::PushL(copyProfile);
+ if(!copyProfile)
+ {
+ profile = 0;
+ return profile;
+ }
+
+ for ( TInt i = 0; i < copyProfile->iContentTypes->Count(); i++ )
+ {
+ TInt uid = copyProfile->iContentTypes->At( i )->IntValue(EDSAdapterImplementationId);
+ TDesC clientDataSource = copyProfile->iContentTypes->At( i )->StrValue( EDSAdapterClientDataSource );
+ TDesC serverDataSource = copyProfile->iContentTypes->At( i )->StrValue( EDSAdapterServerDataSource );
+ profile->AddContentTypeL( uid, clientDataSource, serverDataSource );
+ CNSmlDSContentType* content = profile->ContentType( uid );
+ content->SetIntValue( EDSAdapterEnabled, copyProfile->iContentTypes->At( i )->IntValue(EDSAdapterEnabled) );
+ content->SetStrValue( EDSAdapterDisplayName, copyProfile->iContentTypes->At( i )->StrValue(EDSAdapterDisplayName) );
+ content->SetIntValue( EDSAdapterSyncType, copyProfile->iContentTypes->At( i )->IntValue(EDSAdapterSyncType) );
+ content->SetIntValue( EDSAdapterFilterMatchType, copyProfile->iContentTypes->At( i )->IntValue(EDSAdapterFilterMatchType) );
+ }
+
+ CleanupStack::PopAndDestroy(); // copyProfile
+ }
+ CleanupStack::Pop(); //profile
+ return profile;
+ }
+
+//=============================================
+// CNSmlDSSettings::Database()
+// Returns a reference to settings database object.
+//=============================================
+
+EXPORT_C RDbNamedDatabase* CNSmlDSSettings::Database()
+ {
+ return &iDatabase;
+ }
+
+//=============================================
+// CNSmlDSSettings::ProfileIdL()
+// Returns Profile ID with given AdapterId.
+// If there's no corresponding Id returns 0.
+//=============================================
+
+EXPORT_C TInt CNSmlDSSettings::ProfileIdL( TInt aId)
+ {
+ TInt profileId = 0;
+
+ HBufC* sqlStatement = HBufC::NewLC( KDSSQLGetProfileId().Length() + KNSmlDsSettingsMaxIntegerLength);
+ TPtr sqlStatementPtr = sqlStatement->Des();
+
+ sqlStatementPtr.Format( KDSSQLGetProfileId, aId );
+
+ PrepareViewL( sqlStatementPtr, iView.EReadOnly );
+
+ CleanupStack::PopAndDestroy(); // sqlStatement
+
+ if( iView.FirstL() )
+ {
+ iView.GetL();
+
+ profileId = ViewColUint( KNSmlDSProfileId );
+ }
+ else
+ {
+ //couldn't find
+ profileId = KErrNotFound;
+ }
+
+ return profileId;
+ }
+
+//=============================================
+// CNSmlDSSettings::ProfileL()
+// Returns a pointer to CNSmlDSProfile object with given Id.
+// If there's no corresponding Id in the database, returns NULL.
+//=============================================
+
+EXPORT_C CNSmlDSProfile* CNSmlDSSettings::ProfileL( TInt aId, const TNSmlDSContentTypeGetMode aMode)
+ {
+ HBufC* sqlStatement = HBufC::NewLC( KDSSQLGetProfile().Length() + KNSmlDsSettingsMaxIntegerLength);
+ TPtr sqlStatementPtr = sqlStatement->Des();
+
+ sqlStatementPtr.Format( KDSSQLGetProfile, aId );
+
+ PrepareViewL( sqlStatementPtr, iView.EReadOnly );
+
+ CleanupStack::PopAndDestroy(); // sqlStatement
+
+ CNSmlDSProfile* profile = CNSmlDSProfile::NewLC( Database() );
+
+ if( iView.FirstL() )
+ {
+ CNSmlDSCrypt* crypt = new(ELeave) CNSmlDSCrypt;
+ CleanupStack::PushL(crypt);
+ iView.GetL();
+
+ profile->SetIntValue( EDSProfileId, ViewColUint( KNSmlDSProfileId ) );
+ profile->SetStrValue( EDSProfileDisplayName, ViewColDes( KNSmlDSProfileDisplayName ) );
+ profile->SetIntValue( EDSProfileIAPId, ViewColInt( KNSmlDSProfileIAPId ) );
+ profile->SetIntValue( EDSProfileTransportId, ViewColInt( ( KNSmlDSProfileTransportId ) ) );
+ profile->SetStrValue( EDSProfileServerURL, ViewColDes( KNSmlDSProfileServerURL ) );
+ profile->SetStrValue( EDSProfileServerId, ViewColDes( KNSmlDSProfileServerId ) );
+
+ profile->SetStrValue( EDSProfileSyncServerUsername, ViewColDes( KNSmlDSProfileSyncServerUsername ) );
+ profile->SetStrValue( EDSProfileSyncServerPassword, crypt->DecryptedL(ViewColDes( KNSmlDSProfileSyncServerPassword ) ) );
+
+ profile->SetIntValue( EDSProfileServerAlertedAction, ViewColInt( KNSmlDSProfileServerAlertedAction ) );
+ profile->SetIntValue( EDSProfileDeleteAllowed, ViewColInt( KNSmlDSProfileDeleteAllowed ) );
+ profile->SetIntValue( EDSProfileHidden, ViewColInt( KNSmlDSProfileHidden ) );
+
+ profile->SetIntValue( EDSProfileHttpAuthUsed, ViewColInt( KNSmlDSProfileHttpAuthUsed ) );
+ profile->SetStrValue( EDSProfileHttpAuthUsername, ViewColDes( KNSmlDSProfileHttpAuthUsername ) );
+ profile->SetStrValue( EDSProfileHttpAuthPassword, crypt->DecryptedL(ViewColDes( KNSmlDSProfileHttpAuthPassword ) ) );
+ profile->SetIntValue( EDSProfileAutoChangeIAP, ViewColInt( KNSmlDSProfileAutoChangeIAP ) );
+ profile->SetIntValue( EDSProfileCreatorId, ViewColInt( KNSmlDSProfileCreatorID ) );
+
+ profile->InitVisibilityArray( ViewColDes( KNSmlDSProfileVisibilityStr ) );
+
+ profile->SetIntValue( EDSProfileProtocolVersion, ViewColInt( KNSmlDSProfileProtocolVersion ) );
+
+ CleanupStack::PopAndDestroy(); // crypt
+ }
+ else
+ {
+ delete profile;
+ //couldn't find
+ profile = NULL;
+ }
+//
+// Get adapters in profile
+//
+ if ( profile )
+ {
+ profile->GetContentTypesL( aMode );
+ }
+
+ CleanupStack::Pop(); // profile
+
+ return profile;
+ }
+
+//=============================================
+// CNSmlDSSettings::ProfileOnlyL()
+// Returns a pointer to CNSmlDSProfile object with given Id.
+// If there's no corresponding Id in the database, returns NULL.
+//=============================================
+
+CNSmlDSProfile* CNSmlDSSettings::ProfileOnlyL( TInt aId )
+ {
+ HBufC* sqlStatement = HBufC::NewLC( KDSSQLGetProfile().Length() + KNSmlDsSettingsMaxIntegerLength);
+ TPtr sqlStatementPtr = sqlStatement->Des();
+
+ sqlStatementPtr.Format( KDSSQLGetProfile, aId );
+
+ PrepareViewL( sqlStatementPtr, iView.EReadOnly );
+
+ CleanupStack::PopAndDestroy(); // sqlStatement
+
+ CNSmlDSProfile* profile = CNSmlDSProfile::NewLC( Database() );
+
+ if( iView.FirstL() )
+ {
+ CNSmlDSCrypt* crypt = new(ELeave) CNSmlDSCrypt;
+ CleanupStack::PushL(crypt);
+ iView.GetL();
+
+ profile->SetIntValue( EDSProfileId, ViewColUint( KNSmlDSProfileId ) );
+ profile->SetStrValue( EDSProfileDisplayName, ViewColDes( KNSmlDSProfileDisplayName ) );
+ profile->SetIntValue( EDSProfileIAPId, ViewColInt( KNSmlDSProfileIAPId ) );
+ profile->SetIntValue( EDSProfileTransportId, ViewColInt( KNSmlDSProfileTransportId ) );
+ profile->SetStrValue( EDSProfileServerURL, ViewColDes( KNSmlDSProfileServerURL ) );
+ profile->SetStrValue( EDSProfileServerId, ViewColDes( KNSmlDSProfileServerId ) );
+
+ profile->SetStrValue( EDSProfileSyncServerUsername, ViewColDes( KNSmlDSProfileSyncServerUsername ) );
+ profile->SetStrValue( EDSProfileSyncServerPassword, crypt->DecryptedL(ViewColDes( KNSmlDSProfileSyncServerPassword ) ) );
+
+ profile->SetIntValue( EDSProfileServerAlertedAction, ViewColInt( KNSmlDSProfileServerAlertedAction ) );
+ profile->SetIntValue( EDSProfileDeleteAllowed, ViewColInt( KNSmlDSProfileDeleteAllowed ) );
+ profile->SetIntValue( EDSProfileHidden, ViewColInt( KNSmlDSProfileHidden ) );
+
+ profile->SetIntValue( EDSProfileHttpAuthUsed, ViewColInt( KNSmlDSProfileHttpAuthUsed ) );
+ profile->SetStrValue( EDSProfileHttpAuthUsername, ViewColDes( KNSmlDSProfileHttpAuthUsername ) );
+ profile->SetStrValue( EDSProfileHttpAuthPassword, crypt->DecryptedL(ViewColDes( KNSmlDSProfileHttpAuthPassword ) ) );
+ profile->SetIntValue( EDSProfileAutoChangeIAP, ViewColInt( KNSmlDSProfileAutoChangeIAP ) );
+ profile->SetIntValue( EDSProfileCreatorId, ViewColInt( KNSmlDSProfileCreatorID ) );
+
+ profile->InitVisibilityArray( ViewColDes( KNSmlDSProfileVisibilityStr ) );
+
+ profile->SetIntValue( EDSProfileProtocolVersion, ViewColInt( KNSmlDSProfileProtocolVersion ) );
+
+ CleanupStack::PopAndDestroy(); // crypt
+ CleanupStack::Pop(); // profile
+ }
+ else
+ {
+ CleanupStack::PopAndDestroy(profile);
+ //couldn't find
+ profile = NULL;
+ }
+
+ return profile;
+ }
+//=============================================
+// CNSmlDSSettings::GetProfileListL()
+// Appends CNSmlDSProfileListItem objects to aProfileList.
+//=============================================
+
+EXPORT_C void CNSmlDSSettings::GetProfileListL( CNSmlDSProfileList* aProfileList )
+ {
+ aProfileList->ResetAndDestroy();
+
+ PrepareViewL( KDSSQLGetProfiles, iView.EUpdatable );
+
+ if(iView.Unevaluated())
+ {
+ iView.EvaluateAll(); // Needed for order by
+ }
+
+ while ( iView.NextL() )
+ {
+ AddToProfileListL( aProfileList );
+ }
+
+ }
+
+//=============================================
+// CNSmlDSSettings::GetaAllProfileListL()
+// Appends CNSmlDSProfileListItem objects to aProfileList.
+//=============================================
+
+EXPORT_C void CNSmlDSSettings::GetAllProfileListL( CNSmlDSProfileList* aProfileList )
+ {
+ aProfileList->ResetAndDestroy();
+
+ PrepareViewL( KDSSQLGetAllProfiles, iView.EUpdatable );
+
+ if(iView.Unevaluated())
+ {
+ iView.EvaluateAll(); // Needed for order by
+ }
+
+ while ( iView.NextL() )
+ {
+ AddToProfileListL( aProfileList );
+ }
+ }
+
+//=============================================
+// CNSmlDSSettings::DeleteProfileL()
+// Permanently deletes profile with given Id.
+// If delete is successful returns KErrNone,
+// otherwise returns negative integer
+// (defined in EPOC error codes).
+//=============================================
+
+EXPORT_C TInt CNSmlDSSettings::DeleteProfileL( TInt aId )
+ {
+ if ( iDatabase.InTransaction() )
+ {
+ return ( KErrAccessDenied );
+ }
+
+ TBuf<64> sqlStatement;
+
+ TInt err( KErrNone );
+
+ iDatabase.Begin();
+
+ sqlStatement.Format( KDSSQLDeleteProfile, aId );
+ err = iDatabase.Execute( sqlStatement );
+ if ( err < KErrNone )
+ {
+ iDatabase.Rollback();
+ return err;
+ }
+
+ sqlStatement.Format( KDSSQLDeleteAdapter, aId );
+ err = iDatabase.Execute( sqlStatement );
+ if ( err < KErrNone )
+ {
+ iDatabase.Rollback();
+ return err;
+ }
+
+ // Delete IAP Id's from RoamTable
+ CNSmlRoamTable* roamTable = CNSmlRoamTable::NewL( iDatabase );
+ CleanupStack::PushL( roamTable );
+ TRAPD( errRoam, roamTable->RemoveAllByIdL( aId ) );
+ if ( errRoam < KErrNone )
+ {
+ CleanupStack::PopAndDestroy(); // roamTable
+ iDatabase.Rollback();
+ return errRoam;
+ }
+ CleanupStack::PopAndDestroy(); // roamTable
+
+ CommitAndCompact();
+
+ return KErrNone;
+ }
+
+//=============================================
+// CNSmlDSSettings::PrepareViewL()
+// Closes and prepares the view
+//
+//=============================================
+void CNSmlDSSettings::PrepareViewL( const TDesC& aSql, RDbRowSet::TAccess aAccess )
+ {
+ iView.Close();
+ User::LeaveIfError( iView.Prepare( iDatabase, TDbQuery( aSql ), aAccess ) );
+ }
+
+//=============================================
+// CNSmlDSSettings::CommitAndCompact
+// Commits update and compacts the database
+//
+//=============================================
+void CNSmlDSSettings::CommitAndCompact()
+ {
+ iDatabase.Commit();
+ iDatabase.Compact();
+ }
+
+//=============================================
+// CNSmlDSSettings::AddToProfileListL
+// Adds database field to profile list
+//
+//=============================================
+void CNSmlDSSettings::AddToProfileListL( CNSmlDSProfileList* aProfileList )
+ {
+ iView.GetL();
+
+ aProfileList->AppendL( CNSmlDSProfileListItem::NewLC( iView.ColUint( iColSet->ColNo( KNSmlDSProfileId ) ) ) );
+ CleanupStack::Pop();
+ }
+
+//=============================================
+// CNSmlDSSettings::ViewColDes
+//
+//
+//=============================================
+TPtrC CNSmlDSSettings::ViewColDes( const TDesC& aFieldName )
+ {
+ return iView.ColDes( iColSet->ColNo( aFieldName ) );
+ }
+
+//=============================================
+// CNSmlDSSettings::ViewColInt
+//
+//
+//=============================================
+TInt CNSmlDSSettings::ViewColInt( const TDesC& aFieldName )
+ {
+ return iView.ColInt( iColSet->ColNo( aFieldName ) );
+ }
+
+//=============================================
+// CNSmlDSSettings::ViewColUint
+//
+//
+//=============================================
+TUint CNSmlDSSettings::ViewColUint( const TDesC& aFieldName )
+ {
+ return iView.ColUint( iColSet->ColNo( aFieldName ) );
+ }
+
+
+// End of File