diff -r 000000000000 -r b497e44ab2fc syncmlfw/ds/settings/src/NSmlDSProfile.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/syncmlfw/ds/settings/src/NSmlDSProfile.cpp Thu Dec 17 09:07:52 2009 +0200 @@ -0,0 +1,1242 @@ +/* +* 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 FILES +#include + +#include +#include +#include "nsmldssettings.h" + + +//============================================= +// +// CNSmlDSProfile +// +//============================================= + +//============================================= +// CNSmlDSProfile::NewL() +// Creates a new instance of CNSmlDSProfile object. +//============================================= + +CNSmlDSProfile* CNSmlDSProfile::NewL( RDbNamedDatabase* aDatabase ) + { + CNSmlDSProfile* self = CNSmlDSProfile::NewLC( aDatabase ); + CleanupStack::Pop(); + return self; + } + +//============================================= +// CNSmlDSProfile::NewLC() +// Creates a new instance of CNSmlDSProfile object. +// Pushes and leaves new instance into CleanupStack. +//============================================= + +CNSmlDSProfile* CNSmlDSProfile::NewLC( RDbNamedDatabase* aDatabase ) + { + CNSmlDSProfile* self = new( ELeave ) CNSmlDSProfile; + CleanupStack::PushL( self ); + self->ConstructL( aDatabase ); + return self; + } + +//============================================= +// CNSmlDSProfile::ConstructL() +// Second phase constructor. +//============================================= + +void CNSmlDSProfile::ConstructL( RDbNamedDatabase* aDatabase ) + { + iDatabase = aDatabase; + iId = KNSmlNewObject; + + User::LeaveIfError( iTableProfiles.Open( *iDatabase, KNSmlTableProfiles ) ); + iColSetProfiles = iTableProfiles.ColSetL(); + + User::LeaveIfError( iTableAdapters.Open( *iDatabase, KNSmlTableAdapters ) ); + iColSetAdapters = iTableAdapters.ColSetL(); + + iDisplayName = HBufC::NewL( KNSmlMaxProfileNameLength ); + iSyncServerUsername = HBufC::NewL( KNSmlMaxUsernameLength ); + iSyncServerPassword = HBufC::NewL( KNSmlMaxPasswordLength ); + iServerURL = HBufC::NewL( KNSmlMaxURLLength ); + iServerId = HBufC::NewL( KNSmlMaxServerIdLength ); + + iHttpAuthUsername = HBufC::NewL( KNSmlMaxHttpAuthUsernameLength ); + iHttpAuthPassword = HBufC::NewL( KNSmlMaxHttpAuthPasswordLength ); + + iContentTypes = new ( ELeave ) CArrayPtrFlat( KSmlArrayGranularity ); + } + +//============================================= +// CNSmlDSProfile::~CNSmlDSProfile() +// Destructor. +//============================================= + +EXPORT_C CNSmlDSProfile::~CNSmlDSProfile() + { + delete iDisplayName; + delete iSyncServerUsername; + delete iSyncServerPassword; + delete iServerURL; + delete iServerId; + + delete iHttpAuthUsername; + delete iHttpAuthPassword; + + iView.Close(); + iRSView.Close(); + iWSView.Close(); + + delete iColSetProfiles; + delete iColSetAdapters; + + iTableAdapters.Close(); + iTableProfiles.Close(); + + iContentTypes->ResetAndDestroy(); + delete iContentTypes; + } + +//============================================= +// CNSmlDSProfile::AddContentTypeL() +// Appends a new content type to iContentTypes -list, +// if it doesn't exist before. +//============================================= + + EXPORT_C CNSmlDSContentType* CNSmlDSProfile::AddContentTypeL( TInt aImplementationUID, TDesC& aClientDataSource, TDesC& aServerDataSource ) + { + if ( ContentType( aImplementationUID ) ) // Check if type already on the list + { + return NULL; + } + + iAdapterId = KNSmlNewObject; + + iContentTypes->AppendL( CNSmlDSContentType::NewLC( this->iDatabase ) ); + CleanupStack::Pop(); + + ( iContentTypes->At( iContentTypes->Count() -1 ) )->SetIntValue( EDSAdapterTableId, iAdapterId); + ( iContentTypes->At( iContentTypes->Count() -1 ) )->SetIntValue( EDSAdapterProfileId, iId); + ( iContentTypes->At( iContentTypes->Count() -1 ) )->SetIntValue( EDSAdapterImplementationId, aImplementationUID); + ( iContentTypes->At( iContentTypes->Count() -1 ) )->SetIntValue( EDSAdapterEnabled, TRUE); + ( iContentTypes->At( iContentTypes->Count() -1 ) )->SetIntValue( EDSAdapterCreatorId, iCreatorId); + ( iContentTypes->At( iContentTypes->Count() -1 ) )->SetStrValue( EDSAdapterServerDataSource, aServerDataSource ); + ( iContentTypes->At( iContentTypes->Count() -1 ) )->SetStrValue( EDSAdapterClientDataSource, aClientDataSource ); + ( iContentTypes->At( iContentTypes->Count() -1 ) )->SetIntValue( EDSAdapterFilterMatchType, ESyncMLMatchDisabled ); + + return iContentTypes->At( iContentTypes->Count() - 1 ); + } + +//============================================= +// CNSmlDSProfile::ContentType() +// Returns a pointer to a CNSmlDSContentType +// object with given ImplementationUID. +//============================================= + +EXPORT_C CNSmlDSContentType* CNSmlDSProfile::ContentType( TInt aImplementationUID ) const + { + for ( TInt i = 0; i < iContentTypes->Count(); i++ ) + { + if ( iContentTypes->At( i )->IntValue( EDSAdapterImplementationId ) == aImplementationUID ) + { + return iContentTypes->At( i ); + } + } + + return NULL; + } + +//============================================= +// CNSmlDSProfile::ContentTypeId() +// Returns a pointer to a CNSmlDSContentType +// object with given content id. +//============================================= + +EXPORT_C CNSmlDSContentType* CNSmlDSProfile::ContentTypeId( TInt aId ) const + { + for ( TInt i = 0; i < iContentTypes->Count(); i++ ) + { + if ( iContentTypes->At( i )->IntValue( EDSAdapterTableId ) == aId ) + { + return iContentTypes->At( i ); + } + } + return NULL; + } + +//============================================= +// CNSmlDSProfile::DeleteContentTypeL() +// Delete object with given task id. +// +//============================================= + +EXPORT_C TBool CNSmlDSProfile::DeleteContentTypeL( TInt aTaskId ) + { + HBufC* sqlStatement = HBufC::NewLC( KDSSQLGetAdapterId().Length() + KNSmlDsSettingsMaxIntegerLength); + TPtr sqlStatementPtr = sqlStatement->Des(); + + TInt err; + + for ( TInt i = 0; i < iContentTypes->Count(); i++ ) + { + if ( iContentTypes->At( i )->IntValue( EDSAdapterTableId ) == aTaskId ) + { +// +// Remove first from database +// + iDatabase->Begin(); + + sqlStatementPtr.Format( KDSSQLGetAdapterId, aTaskId ); + + PrepareViewL( sqlStatementPtr, iView.EUpdatable ); + + if ( iView.FirstL() ) + { + iView.GetL(); + iAdapterId = iView.ColUint( iColSetAdapters->ColNo( KNSmlAdapterId ) ); + } + + sqlStatementPtr.Format( KDSSQLDeleteAdapterById, iAdapterId ); + err = iDatabase->Execute( sqlStatementPtr ); + CleanupStack::PopAndDestroy(); // sqlStatement + if ( err < KErrNone ) + { + iDatabase->Rollback(); + return EFalse; + } + + CommitAndCompact(); +// +// Delete object from list +// + CNSmlDSContentType* contentType = ContentTypeId( iAdapterId ); + delete contentType; + contentType = 0; +// +// Remove it also from list +// + iContentTypes->Delete( i ); + iContentTypes->Compress(); + + return ETrue; + } + } + + CleanupStack::PopAndDestroy(); // sqlStatement + return EFalse; + } + + +//============================================= +// CNSmlDSProfile::SaveL() +// Saves a profile ie. writes all profile data to the database. +// If save is successful returns KErrNone, +// otherwise returns negative integer (defined in EPOC error codes). +//============================================= + +EXPORT_C TInt CNSmlDSProfile::SaveL() + { + + if ( iDatabase->InTransaction() ) + { + return ( KErrAccessDenied ); + } + + iDatabase->Begin(); + + CNSmlDSCrypt* crypt = new( ELeave ) CNSmlDSCrypt; + CleanupStack::PushL( crypt ); + + if ( iId == KNSmlNewObject ) + { + // Check OOD before saving a New profile + RFs fs; + User::LeaveIfError( fs.Connect() ); + CleanupClosePushL(fs); + + if (SysUtil::FFSSpaceBelowCriticalLevelL(&fs, KNSmlDsSettingsFatMinSize)) + { + CleanupStack::PopAndDestroy(2); // fs, crypt + iDatabase->Rollback(); + return KErrDiskFull; + // do not write + } + CleanupStack::PopAndDestroy(); //fs + + //new profile + iTableProfiles.InsertL(); + + TableProfilesSetColDesL( KNSmlDSProfileDisplayName, *iDisplayName ); + TableProfilesSetColIntL( KNSmlDSProfileTransportId, iTransportId ); + TableProfilesSetColIntL( KNSmlDSProfileIAPId, iIAPId ); + + TableProfilesSetColDesL( KNSmlDSProfileSyncServerUsername, *iSyncServerUsername ); + TableProfilesSetColDesL( KNSmlDSProfileSyncServerPassword, crypt->EncryptedL( *iSyncServerPassword) ); + + TableProfilesSetColDesL( KNSmlDSProfileServerURL, *iServerURL ); + TableProfilesSetColDesL( KNSmlDSProfileServerId, *iServerId ); + + TableProfilesSetColIntL( KNSmlDSProfileServerAlertedAction, iServerAlertedAction ); + TableProfilesSetColIntL( KNSmlDSProfileDeleteAllowed, iDeleteAllowed ); + TableProfilesSetColIntL( KNSmlDSProfileHidden, iProfileHidden ); + + TableProfilesSetColIntL( KNSmlDSProfileHttpAuthUsed, iHttpAuthUsed ); + TableProfilesSetColDesL( KNSmlDSProfileHttpAuthUsername, *iHttpAuthUsername ); + TableProfilesSetColDesL( KNSmlDSProfileHttpAuthPassword, crypt->EncryptedL( *iHttpAuthPassword) ); + TableProfilesSetColIntL( KNSmlDSProfileAutoChangeIAP, iAutoChangeIAP ); + TableProfilesSetColIntL( KNSmlDSProfileCreatorID, iCreatorId ); + + HBufC* v = GetVisibilityStrL(); + CleanupStack::PushL(v); + TableProfilesSetColDesL( KNSmlDSProfileVisibilityStr, *v); + CleanupStack::PopAndDestroy(); // v + + TableProfilesSetColIntL( KNSmlDSProfileProtocolVersion, iProtocolVersion ); + + TBuf<64> sqlStatement; + sqlStatement.Format( KDSSQLCountProfiles ); + PrepareViewL( sqlStatement, iView.EReadOnly ); + + iId = iTableProfiles.ColUint( iColSetProfiles->ColNo( KNSmlDSProfileId) ); // Use autoincrement + + iTableProfiles.PutL(); + + for ( TInt i = 0; i < iContentTypes->Count(); i++ ) + { + if( iContentTypes->At(i)->StrValue( EDSAdapterClientDataSource ).Compare( + iContentTypes->At(i)->StrValue( EDSAdapterServerDataSource ) ) == 0 ) + { + iDatabase->Rollback(); + CleanupStack::PopAndDestroy(); //crypt + return KErrArgument; + } + InsertTableAdaptersL( i ); + + } + } + else + { + //existing profile + TBuf<64> sqlStatement; + sqlStatement.Format( KDSSQLGetProfile, iId ); + + PrepareViewL( sqlStatement, iView.EUpdatable ); + if ( iView.FirstL() ) + { + iView.GetL(); + iView.UpdateL(); + + ViewSetColDesL( KNSmlDSProfileDisplayName, *iDisplayName ); + ViewSetColIntL( KNSmlDSProfileTransportId, iTransportId ); + ViewSetColIntL( KNSmlDSProfileIAPId, iIAPId ); + ViewSetColDesL( KNSmlDSProfileSyncServerUsername, *iSyncServerUsername ); + ViewSetColDesL( KNSmlDSProfileSyncServerPassword, crypt->EncryptedL( *iSyncServerPassword ) ); + ViewSetColDesL( KNSmlDSProfileServerURL, *iServerURL ); + ViewSetColDesL( KNSmlDSProfileServerId, *iServerId ); + + ViewSetColIntL( KNSmlDSProfileServerAlertedAction, iServerAlertedAction ); + ViewSetColIntL( KNSmlDSProfileDeleteAllowed, iDeleteAllowed ); + ViewSetColIntL( KNSmlDSProfileHidden, iProfileHidden ); + + ViewSetColIntL( KNSmlDSProfileHttpAuthUsed, iHttpAuthUsed ); + ViewSetColDesL( KNSmlDSProfileHttpAuthUsername, *iHttpAuthUsername ); + ViewSetColDesL( KNSmlDSProfileHttpAuthPassword, crypt->EncryptedL( *iHttpAuthPassword) ); + ViewSetColIntL( KNSmlDSProfileAutoChangeIAP, iAutoChangeIAP ); + ViewSetColIntL( KNSmlDSProfileCreatorID, iCreatorId ); + + HBufC* v = GetVisibilityStrL(); + CleanupStack::PushL(v); + ViewSetColDesL( KNSmlDSProfileVisibilityStr, *v); + CleanupStack::PopAndDestroy(); // v + + ViewSetColIntL( KNSmlDSProfileProtocolVersion, iProtocolVersion ); + + iView.PutL(); + } + else + { + iDatabase->Rollback(); + CleanupStack::PopAndDestroy(); //crypt + return KErrNotFound; + } + + for ( TInt i = 0; i < iContentTypes->Count(); i++ ) + { + if( iContentTypes->At(i)->StrValue( EDSAdapterClientDataSource ).Compare( + iContentTypes->At(i)->StrValue( EDSAdapterServerDataSource ) ) == 0 ) + { + iDatabase->Rollback(); + CleanupStack::PopAndDestroy(); //crypt + return KErrArgument; + } + if ( iContentTypes->At( i )->IntValue( EDSAdapterTableId ) == KNSmlNewObject ) + { + //existing profile & new contentType + InsertTableAdaptersL( i ); + } + else + { + //existing profile & existing contentType + sqlStatement.Format( KDSSQLFindContentType, iContentTypes->At( i )->IntValue( EDSAdapterTableId ) ); + + PrepareViewL( sqlStatement, iView.EUpdatable ); + if ( iView.FirstL() ) + { + iView.GetL(); + iView.UpdateL(); + + iView.SetColL( iColSetAdapters->ColNo( KNSmlAdapterEnabled ), ( TInt ) iContentTypes->At( i )->IntValue( EDSAdapterEnabled ) ); + iView.SetColL( iColSetAdapters->ColNo( KNSmlAdapterImlementationUID ), ( TInt ) iContentTypes->At( i )->IntValue( EDSAdapterImplementationId ) ); + iView.SetColL( iColSetAdapters->ColNo( KNSmlAdapterCreatorID ), ( TInt ) iContentTypes->At( i )->IntValue( EDSAdapterCreatorId ) ); + iView.SetColL( iColSetAdapters->ColNo( KNSmlAdapterDisplayName ), iContentTypes->At( i )->StrValue( EDSAdapterDisplayName ) ); + iView.SetColL( iColSetAdapters->ColNo( KNSmlAdapterClientDataSource ), iContentTypes->At( i )->StrValue( EDSAdapterClientDataSource ) ); + iView.SetColL( iColSetAdapters->ColNo( KNSmlAdapterServerDataSource ), iContentTypes->At( i )->StrValue( EDSAdapterServerDataSource ) ); + iView.SetColL( iColSetAdapters->ColNo( KNSmlAdapterSyncType ), ( TInt ) iContentTypes->At( i )->IntValue( EDSAdapterSyncType ) ); + iView.SetColL( iColSetAdapters->ColNo( KNSmlAdapterFilterMatchType ), ( TInt ) iContentTypes->At( i )->IntValue( EDSAdapterFilterMatchType ) ); + iView.PutL(); + } + else + { + iDatabase->Rollback(); + CleanupStack::PopAndDestroy(); //crypt + return KErrNotFound; + } + } + + } + } + + CleanupStack::PopAndDestroy(); //crypt + CommitAndCompact(); + + return KErrNone; + } + +//============================================= +// CNSmlDSProfile::IsNew() +// Returns true if profile is new, otherwise false. +//============================================= + +EXPORT_C TBool CNSmlDSProfile::IsNew() const + { + return ( iId == KNSmlNewObject ); + } + +//============================================= +// CNSmlDSProfile::SetHiddenL() +// Returns true if update done otherwise false. +//============================================= + +EXPORT_C TBool CNSmlDSProfile::SetHiddenL(TBool aHidden) + { + TBool ret = EFalse; + + if (iId < 1) + { + return ret; + } + + HBufC* sqlStatement = HBufC::NewLC( KDSSQLGetProfile().Length() + KNSmlDsSettingsMaxIntegerLength); + TPtr sqlStatementPtr = sqlStatement->Des(); + + sqlStatementPtr.Format( KDSSQLGetProfile, iId ); + + PrepareViewL( sqlStatementPtr, iView.EUpdatable ); + + CleanupStack::PopAndDestroy(); // sqlStatement + + if ( iView.FirstL() ) + { + iView.GetL(); + iView.UpdateL(); + iView.SetColL( iColSetProfiles->ColNo( KNSmlDSProfileHidden ), aHidden ); + iView.PutL(); + + ret = ETrue; + + // Also profile value set for SaveL() + SetIntValue( EDSProfileHidden, aHidden); + } + + return ret; + } + +//============================================= +// CNSmlDSProfile::IsNullL() +// Returns true if profile data is NULL, +// otherwise false. +//============================================= + +EXPORT_C TBool CNSmlDSProfile::IsNullL( const TDesC& aFieldName ) + { + HBufC* sqlStatement = HBufC::NewLC( KDSSQLGetProfile().Length() + KNSmlDsSettingsMaxIntegerLength); + TPtr sqlStatementPtr = sqlStatement->Des(); + + sqlStatementPtr.Format( KDSSQLGetProfile, iId ); + + PrepareViewL( sqlStatementPtr, iView.EReadOnly ); + + CleanupStack::PopAndDestroy(); // sqlStatement + + if ( iView.FirstL() ) + { + iView.GetL(); + if ( iView.IsColNull( iColSetProfiles->ColNo( aFieldName ) ) ) + { + return ETrue; + } + } + return EFalse; + } + +//============================================= +// CNSmlDSProfile::StrValue() +// Returns a given string value. +//============================================= + +EXPORT_C const TDesC& CNSmlDSProfile::StrValue( TNSmlDSProfileData aProfileItem ) const + { + HBufC* result = 0; + switch ( aProfileItem ) + { + case ( EDSProfileDisplayName ) : + { + result = iDisplayName; + } + break; + + case ( EDSProfileSyncServerUsername ) : + { + result = iSyncServerUsername; + } + break; + + case ( EDSProfileSyncServerPassword ) : + { + result = iSyncServerPassword; + } + break; + + case ( EDSProfileServerURL ) : + { + result = iServerURL; + } + break; + + case ( EDSProfileServerId ) : + { + result = iServerId; + } + break; + + case ( EDSProfileHttpAuthUsername ) : + { + result = iHttpAuthUsername; + } + break; + + case ( EDSProfileHttpAuthPassword ) : + { + result = iHttpAuthPassword; + } + break; + + default: + { + User::Panic( KNSmlIndexOutOfBoundStr, KNSmlPanicIndexOutOfBound ); + } + } + return *result; + } + +//============================================= +// CNSmlDSProfile::IntValue() +// Returns a given int value. +//============================================= + +EXPORT_C TInt CNSmlDSProfile::IntValue( TNSmlDSProfileData aProfileItem ) const + { + TInt result( 0 ); + switch ( aProfileItem ) + { + case ( EDSProfileId ) : + { + result = iId; + } + break; + + case ( EDSProfileIAPId ) : + { + result = iIAPId; + } + break; + + case ( EDSProfileTransportId ) : + { + result = iTransportId; + } + break; + + case ( EDSProfileServerAlertedAction ) : + { + result = iServerAlertedAction; + } + break; + + case ( EDSProfileDeleteAllowed ) : + { + result = iDeleteAllowed; + } + break; + + case ( EDSProfileHidden ) : + { + result = iProfileHidden; + } + break; + + case ( EDSProfileHttpAuthUsed ) : + { + result = iHttpAuthUsed; + } + break; + + case ( EDSProfileAutoChangeIAP ) : + { + result = iAutoChangeIAP; + } + break; + + case ( EDSProfileProtocolVersion ) : + { + result = iProtocolVersion; + } + break; + + case ( EDSProfileCreatorId ) : + { + result = iCreatorId; + } + break; + + case ( EDSProfileDefaultProfile ) : + { + result = iDefaultProfile; + } + break; + + default: + { + User::Panic( KNSmlIndexOutOfBoundStr, KNSmlPanicIndexOutOfBound ); + } + } + return result; + } + +//============================================= +// CNSmlDSProfile::SetStrValue() +// Sets a given string value. +//============================================= + +EXPORT_C void CNSmlDSProfile::SetStrValue( TNSmlDSProfileData aProfileItem, const TDesC& aNewValue ) + { + switch ( aProfileItem ) + { + case ( EDSProfileDisplayName ) : + { + *iDisplayName = aNewValue; + } + break; + + case ( EDSProfileSyncServerUsername ) : + { + *iSyncServerUsername = aNewValue; + } + break; + + case ( EDSProfileSyncServerPassword ) : + { + *iSyncServerPassword = aNewValue; + } + break; + + case ( EDSProfileServerURL ) : + { + *iServerURL = aNewValue; + } + break; + + case ( EDSProfileServerId ) : + { + *iServerId = aNewValue; + } + break; + + case ( EDSProfileHttpAuthUsername ) : + { + *iHttpAuthUsername = aNewValue; + } + break; + + case ( EDSProfileHttpAuthPassword ) : + { + *iHttpAuthPassword = aNewValue; + } + break; + + default: + { + User::Panic( KNSmlIndexOutOfBoundStr, KNSmlPanicIndexOutOfBound ); + } + } + } + +//============================================= +// CNSmlDSProfile::SetIntValue() +// Sets a given int value. +//============================================= + +EXPORT_C void CNSmlDSProfile::SetIntValue( TNSmlDSProfileData aProfileItem, const TInt aNewValue ) + { + switch ( aProfileItem ) + { + case ( EDSProfileId ) : + { + iId = aNewValue; + } + break; + + case ( EDSProfileIAPId ) : + { + iIAPId = aNewValue; + } + break; + + case ( EDSProfileTransportId ) : + { + iTransportId = aNewValue; + } + break; + + case ( EDSProfileServerAlertedAction ) : + { + iServerAlertedAction = aNewValue; + } + break; + + case ( EDSProfileDeleteAllowed ) : + { + iDeleteAllowed = aNewValue; + } + break; + + case ( EDSProfileHidden ) : + { + iProfileHidden = aNewValue; + } + break; + + case ( EDSProfileHttpAuthUsed ) : + { + iHttpAuthUsed = aNewValue; + } + break; + + case ( EDSProfileAutoChangeIAP ) : + { + iAutoChangeIAP = aNewValue; + } + break; + + case ( EDSProfileProtocolVersion ) : + { + iProtocolVersion = aNewValue; + } + break; + + case ( EDSProfileCreatorId ) : + { + iCreatorId = aNewValue; + } + break; + + case ( EDSProfileDefaultProfile ) : + { + iDefaultProfile = aNewValue; + } + break; + + default: + { + User::Panic( KNSmlIndexOutOfBoundStr, KNSmlPanicIndexOutOfBound ); + } + } + } + +//============================================= +// CNSmlDSProfile::Visibility() +// Returns the visibility of the given +// dataitem. +//============================================= + +EXPORT_C TNSmlDSFieldVisibility CNSmlDSProfile::Visibility( TNSmlDSProfileData aProfileItem ) const + { + + TInt index = (TInt)aProfileItem; + + if (index >= iVisibilityArray.Count() || index < 0) + { + // unknown field. TNSmlDSProfileData-enum has been changed without changing + // the size of iVisibilityArray, or negative + // values has been assigned to some of those fields + User::Panic( KNSmlIndexOutOfBoundStr, KNSmlPanicIndexOutOfBound ); + } + + return iVisibilityArray[index]; + } + +//============================================= +// CNSmlDSProfile::SetVisibility() +// Sets the visibility of the given +// dataitem. +//============================================= + +EXPORT_C void CNSmlDSProfile::SetVisibility( TNSmlDSProfileData aProfileItem, + const TNSmlDSFieldVisibility aVisibility ) + { + + TInt index = (TInt)aProfileItem; + + if (index >= iVisibilityArray.Count() || index < 0) + { + // unknown field. TNSmlDSProfileData-enum has been changed without changing + // the size of iVisibilityArray, or negative + // values has been assigned to some of those fields + User::Panic( KNSmlIndexOutOfBoundStr, KNSmlPanicIndexOutOfBound ); + } + + iVisibilityArray[index] = aVisibility; + } + +//============================================= +// CNSmlDSProfile::InitVisibilityArray() +// Method for initializing the +// visibilityArray, i.e. parses the given +// string's characters and maps them to +// dataitem's visibilities. +//============================================= + +void CNSmlDSProfile::InitVisibilityArray( const TDesC& aVisibilityStr ) + { + + if ( aVisibilityStr.Length() != iVisibilityArray.Count()) + { + // The given string must be equal in size to visibilityarray, otherwise + // there is something wrong with the format + User::Panic( KNSmlIndexOutOfBoundStr, KNSmlPanicIndexOutOfBound ); + } + + for (TInt i=0; i < aVisibilityStr.Length(); ++i) + { + iVisibilityArray[i] = CharToVisibility( aVisibilityStr[i] ); + } + + } + +//============================================= +// CNSmlDSProfile::GetVisibilityStrL() +// Return the visibility array as a +// string (the form in which it is written +// and read from the database). +//============================================= + +HBufC* CNSmlDSProfile::GetVisibilityStrL() const + { + + HBufC* result = HBufC::NewL(KNSmlDSVisibilityArraySize); + TPtr ptr = result->Des(); + + for (TInt i=0; i < iVisibilityArray.Count(); ++i) + { + ptr += VisibilityToChar( iVisibilityArray[i] ); + } + + return result; + } + +//============================================= +// CNSmlDSProfile::CharToVisibility() +// Turns the given char into +// TNSmlDSFieldVisibility. +//============================================= +TNSmlDSFieldVisibility CNSmlDSProfile::CharToVisibility( const TText aCh ) const + { + switch ( aCh ) + { + case KNSmlDSNormalChar: + { + return EVisibilityNormal; + } + case KNSmlDSReadOnlyChar: + { + return EVisibilityReadOnly; + } + case KNSmlDSHiddenChar: + { + return EVisibilityHidden; + } + default: + { + User::Panic( KNSmlIndexOutOfBoundStr, KNSmlPanicIndexOutOfBound ); + return EVisibilityNormal; + } + } + } + + +//============================================= +// CNSmlDSProfile::VisibilityToChar() +// Turns the given visibility into char. +//============================================= +TPtrC CNSmlDSProfile::VisibilityToChar( const TNSmlDSFieldVisibility aVisibility ) const + { + switch (aVisibility) + { + case EVisibilityNormal: + { + return KNSmlDSVisibilityNormal(); + } + case EVisibilityReadOnly: + { + return KNSmlDSVisibilityReadOnly(); + } + case EVisibilityHidden: + { + return KNSmlDSVisibilityHidden(); + } + default: + { + User::Panic( KNSmlIndexOutOfBoundStr, KNSmlPanicIndexOutOfBound ); + return KNullDesC(); + } + } + } + +//============================================= +// CNSmlDSProfile::HasLogL() +// Returns true if profile has Log-data, +// otherwise false. +//============================================= + +EXPORT_C TBool CNSmlDSProfile::HasLogL() + { + HBufC* sqlStatement = HBufC::NewLC( KDSSQLGetProfile().Length() + KNSmlDsSettingsMaxIntegerLength); + TPtr sqlStatementPtr = sqlStatement->Des(); + + sqlStatementPtr.Format( KDSSQLGetProfile, iId ); + + PrepareViewL( sqlStatementPtr, iView.EReadOnly ); + + CleanupStack::PopAndDestroy(); // sqlStatement + + if ( iView.FirstL() ) + { + iView.GetL(); + if ( iView.IsColNull( iColSetProfiles->ColNo( KNSmlDSProfileLog ) ) ) + { + return EFalse; + } + } + return ETrue; + } + +//============================================= +// CNSmlDSProfile::LogReadStreamL() +// Reads log-data from database +//============================================= +EXPORT_C RReadStream& CNSmlDSProfile::LogReadStreamL() +{ + HBufC* sqlStatement = HBufC::NewLC( KDSSQLGetProfile().Length() + KNSmlDsSettingsMaxIntegerLength); + TPtr sqlStatementPtr = sqlStatement->Des(); + + sqlStatementPtr.Format(KDSSQLGetProfile, iId); + + User::LeaveIfError(iRSView.Prepare(*iDatabase, TDbQuery( sqlStatementPtr ), RDbRowSet::EReadOnly)); + User::LeaveIfError(iRSView.EvaluateAll()); + + CleanupStack::PopAndDestroy(); // sqlStatement + + // Get the structure of rowset + CDbColSet* colSet = iRSView.ColSetL(); + TDbColNo col = colSet->ColNo(KNSmlDSProfileLog()); // Ordinal position of long column + delete colSet; + colSet = NULL; + + // get row + if( iRSView.FirstL() ) + { + iRSView.GetL(); + iRs.OpenL(iRSView, col); + } + + return iRs; +} + +//============================================= +// CNSmlDSProfile::LogWriteStreamL() +// Writes given stream-data to database +//============================================= + +EXPORT_C RWriteStream& CNSmlDSProfile::LogWriteStreamL() + { + HBufC* sqlStatement = HBufC::NewLC( KDSSQLGetProfile().Length() + KNSmlDsSettingsMaxIntegerLength); + TPtr sqlStatementPtr = sqlStatement->Des(); + + sqlStatementPtr.Format(KDSSQLGetProfile, iId); + + // create a view on the database + User::LeaveIfError(iWSView.Prepare(*iDatabase, TDbQuery(sqlStatementPtr), RDbRowSet::EUpdatable)); + User::LeaveIfError(iWSView.EvaluateAll()); + + CleanupStack::PopAndDestroy(); // sqlStatement + + // Get the structure of rowset + CDbColSet* colSet = iWSView.ColSetL(); + TDbColNo col = colSet->ColNo(KNSmlDSProfileLog()); // Ordinal position of long column + delete colSet; + colSet = NULL; + + // get row + iDatabase->Begin(); + if( iWSView.FirstL() ) + { + iWSView.GetL(); + iWSView.UpdateL(); + iWs.OpenL(iWSView, col); + } + + return iWs; + } + + +//============================================= +// CNSmlDSProfile::WriteStreamCommitL() +// +// +//============================================= +EXPORT_C void CNSmlDSProfile::WriteStreamCommitL() + { + iWSView.PutL(); + iWSView.Close(); + CommitAndCompact(); + } + +//============================================= +// CNSmlDSProfile::PrepareViewL() +// Closes and prepares the view +// +//============================================= +void CNSmlDSProfile::PrepareViewL( const TDesC& aSql, RDbRowSet::TAccess aAccess ) + { + iView.Close(); + User::LeaveIfError( iView.Prepare( *iDatabase, TDbQuery( aSql ), aAccess ) ); + } + +//============================================= +// CNSmlDSProfile::UpdateToDeleteAllowedL() +// +// +//============================================= +void CNSmlDSProfile::UpdateToDeleteAllowedL() + { + iView.GetL(); + iView.UpdateL(); + iView.SetColL( iColSetProfiles->ColNo( KNSmlDSProfileDeleteAllowed ), ( TInt ) EDSAllowed ); + iView.PutL(); + } + +//============================================= +// CNSmlDSProfile::CommitAndCompact +// Commits update and compacts the database +// +//============================================= +void CNSmlDSProfile::CommitAndCompact() + { + iDatabase->Commit(); + iDatabase->Compact(); + } + +//============================================= +// CNSmlDSProfile::ResetContentTypesL() +// +// +//============================================= +void CNSmlDSProfile::ResetContentTypesL() + { + iView.GetL(); + iContentTypes->AppendL( CNSmlDSContentType::NewLC( this->iDatabase ) ); + CleanupStack::Pop(); + ( iContentTypes->At( iContentTypes->Count() -1 ) )->SetIntValue( EDSAdapterTableId, iView.ColUint( iColSetAdapters->ColNo( KNSmlAdapterId ) ) ); + ( iContentTypes->At( iContentTypes->Count() -1 ) )->SetIntValue( EDSAdapterProfileId, iView.ColInt( iColSetAdapters->ColNo( KNSmlAdapterProfileId ) ) ); + ( iContentTypes->At( iContentTypes->Count() -1 ) )->SetIntValue( EDSAdapterImplementationId, iView.ColUint( iColSetAdapters->ColNo( KNSmlAdapterImlementationUID ) ) ); + ( iContentTypes->At( iContentTypes->Count() -1 ) )->SetIntValue( EDSAdapterEnabled, iView.ColInt( iColSetAdapters->ColNo( KNSmlAdapterEnabled) ) ); + ( iContentTypes->At( iContentTypes->Count() -1 ) )->SetIntValue( EDSAdapterCreatorId, iView.ColInt( iColSetAdapters->ColNo( KNSmlAdapterCreatorID) ) ); + ( iContentTypes->At( iContentTypes->Count() -1 ) )->SetStrValue( EDSAdapterDisplayName, iView.ColDes( iColSetAdapters->ColNo( KNSmlAdapterDisplayName) ) ); + ( iContentTypes->At( iContentTypes->Count() -1 ) )->SetStrValue( EDSAdapterServerDataSource, iView.ColDes( iColSetAdapters->ColNo( KNSmlAdapterServerDataSource) ) ); + ( iContentTypes->At( iContentTypes->Count() -1 ) )->SetStrValue( EDSAdapterClientDataSource, iView.ColDes( iColSetAdapters->ColNo( KNSmlAdapterClientDataSource) ) ); + ( iContentTypes->At( iContentTypes->Count() -1 ) )->SetIntValue( EDSAdapterSyncType, iView.ColInt( iColSetAdapters->ColNo( KNSmlAdapterSyncType) ) ); + ( iContentTypes->At( iContentTypes->Count() -1 ) )->SetIntValue( EDSAdapterFilterMatchType, iView.ColInt( iColSetAdapters->ColNo( KNSmlAdapterFilterMatchType) ) ); + } + +//============================================= +// CNSmlDSProfile::TableProfilesSetColIntL +// +// +//============================================= +void CNSmlDSProfile::TableProfilesSetColIntL( const TDesC& aFieldName, TInt aValue) + { + iTableProfiles.SetColL( iColSetProfiles->ColNo( aFieldName ), aValue ); + } + +//============================================= +// CNSmlDSProfile::TableProfilesSetColDesL +// +// +//============================================= +void CNSmlDSProfile::TableProfilesSetColDesL( const TDesC& aFieldName, TDesC& aValue) + { + iTableProfiles.SetColL( iColSetProfiles->ColNo( aFieldName ), aValue ); + } + +//============================================= +// CNSmlDSProfile::ViewSetColIntL +// +// +//============================================= +void CNSmlDSProfile::ViewSetColIntL( const TDesC& aFieldName, TInt aValue) + { + iView.SetColL( iColSetProfiles->ColNo( aFieldName ), aValue ); + } + +//============================================= +// CNSmlDSProfile::ViewSetColDesL +// +// +//============================================= +void CNSmlDSProfile::ViewSetColDesL( const TDesC& aFieldName, TDesC& aValue) + { + iView.SetColL( iColSetProfiles->ColNo( aFieldName ), aValue ); + } + +//============================================= +// CNSmlDSProfile::InsertTableAdaptersL +// Insert adapterdata to database +// +//============================================= +void CNSmlDSProfile::InsertTableAdaptersL( TInt aInd) + { + iTableAdapters.InsertL(); + + iTableAdapters.SetColL( iColSetAdapters->ColNo( KNSmlAdapterProfileId ), iId ); + iTableAdapters.SetColL( iColSetAdapters->ColNo( KNSmlAdapterImlementationUID ), ( TInt ) iContentTypes->At( aInd )->IntValue( EDSAdapterImplementationId ) ); + iTableAdapters.SetColL( iColSetAdapters->ColNo( KNSmlAdapterEnabled ), iContentTypes->At( aInd )->IntValue( EDSAdapterEnabled ) ); + iTableAdapters.SetColL( iColSetAdapters->ColNo( KNSmlAdapterCreatorID ), iContentTypes->At( aInd )->IntValue( EDSAdapterCreatorId ) ); + iTableAdapters.SetColL( iColSetAdapters->ColNo( KNSmlAdapterDisplayName ), iContentTypes->At( aInd )->StrValue( EDSAdapterDisplayName ) ); + iTableAdapters.SetColL( iColSetAdapters->ColNo( KNSmlAdapterServerDataSource ), iContentTypes->At( aInd )->StrValue( EDSAdapterServerDataSource ) ); + iTableAdapters.SetColL( iColSetAdapters->ColNo( KNSmlAdapterClientDataSource ), iContentTypes->At( aInd )->StrValue( EDSAdapterClientDataSource ) ); + iTableAdapters.SetColL( iColSetAdapters->ColNo( KNSmlAdapterSyncType ), iContentTypes->At( aInd )->IntValue( EDSAdapterSyncType ) ); + iTableAdapters.SetColL( iColSetAdapters->ColNo( KNSmlAdapterFilterMatchType ), iContentTypes->At( aInd )->IntValue( EDSAdapterFilterMatchType ) ); + + TInt id = iTableAdapters.ColUint( iColSetAdapters->ColNo(KNSmlAdapterId )); + + iTableAdapters.PutL(); + + iContentTypes->At( aInd )->SetIntValue( EDSAdapterTableId, id); + } + +//============================================= +// CNSmlDSProfile::GetContentTypesL() +// Member iContentTypes is resetted and appended +// with CNSmlDSContentType objects. +// Depending on parameter aMode method appends all or active content types. +//============================================= + +void CNSmlDSProfile::GetContentTypesL( const TNSmlDSContentTypeGetMode aMode ) + { + HBufC* sqlStatement = HBufC::NewLC( KDSSQLGetAllContentTypes().Length() + KNSmlDsSettingsMaxIntegerLength); + TPtr sqlStatementPtr = sqlStatement->Des(); + + switch ( aMode ) + { + case ( EDSAllContentTypes ) : + { + sqlStatementPtr.Format( KDSSQLGetAllContentTypes, iId ); + } + break; + + default: + { + CleanupStack::PopAndDestroy(); // sqlStatement + + User::Panic( KNSmlIndexOutOfBoundStr, KNSmlPanicIndexOutOfBound ); + } + } + + iContentTypes->Reset(); + + PrepareViewL( sqlStatementPtr, iView.EReadOnly ); + + CleanupStack::PopAndDestroy(); // sqlStatement + + if ( iView.FirstL() ) + { + ResetContentTypesL(); + while ( iView.NextL() ) + { + ResetContentTypesL(); + } + } + } + + +//============================================= +// CNSmlDSProfile::GetContentTypeL( TInt aImplementationUID ) +// Gets contenttype with given impl. id. +//============================================= +CNSmlDSContentType* CNSmlDSProfile::GetContentTypeL( TInt aImplementationUID ) + { + HBufC* sqlStatement = HBufC::NewLC( KDSSQLGetAllContentTypesByImplementationId().Length() + KNSmlDsSettingsMaxIntegerLength); + TPtr sqlStatementPtr = sqlStatement->Des(); + sqlStatementPtr.Format( KDSSQLGetAllContentTypesByImplementationId, iId, aImplementationUID ); + + PrepareViewL( sqlStatementPtr, iView.EReadOnly ); + + CleanupStack::PopAndDestroy(); // sqlStatement + + if ( iView.FirstL() ) + { + ResetContentTypesL(); + } + + return iContentTypes->At( iContentTypes->Count() - 1 ); + } + +// End of File