syncmlfw/ds/settings/src/NSmlDSProfile.cpp
changeset 0 b497e44ab2fc
--- /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 <sysutil.h>
+
+#include <nsmlconstants.h>
+#include <nsmldsconstants.h>
+#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<CNSmlDSContentType>( 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