diff -r 000000000000 -r b497e44ab2fc syncmlfw/ds/agentlog/src/nsmlagentlog.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/syncmlfw/ds/agentlog/src/nsmlagentlog.cpp Thu Dec 17 09:07:52 2009 +0200 @@ -0,0 +1,2056 @@ +/* +* Copyright (c) 2005 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: AgentLog db-interface +* +*/ + + + +// INCLUDE FILES +#include +#include +#include +#include +#include + +#include "nsmldbcaps.h" +#include "nsmldsdefines.h" +#include "nsmlagentlog.h" +#include "smldevinfdtd.h" + + +// CONSTANTS + +// Size of empty AgentLog database in bytes. +const TInt KNSmlAgentLogEmptyDatabaseSize = 580; +// Estimated maximum size of AgentLog table row without the unrestricted +// ServerDeviceInfo and ServerFilterInfo fields. +const TInt KNSmlAgentLogMaxFixedLogRowSize = 860; +// Maximum size of Authentication table row without unrestricted Nonce field. +const TInt KNSmlAgentLogMaxFixedAuthRowSize = 320; +// Additional treshold used with OOD checks. +const TInt KNSmlAgentLogTreshold = 50; + +_LIT8( KTabSeparator, " "); + +//============================================= +// +// CNSmlDSAgentLog +// +//============================================= + +//============================================= +// CNSmlDSAgentLog::NewL() +// Creates a new instance of CNSmlDSAgentLog object. +//============================================= + +EXPORT_C CNSmlDSAgentLog* CNSmlDSAgentLog::NewL() + { + DBG_FILE(_S8("CNSmlDSAgentLog::NewL")); + CNSmlDSAgentLog* self = CNSmlDSAgentLog::NewLC(); + CleanupStack::Pop(); + return self; + } + +//============================================= +// CNSmlDSAgentLog::NewLC() +// Creates a new instance of CNSmlDSAgentLog object. +// Pushes and leaves new instance into CleanupStack. +//============================================= +EXPORT_C CNSmlDSAgentLog* CNSmlDSAgentLog::NewLC() + { + DBG_FILE(_S8("CNSmlDSAgentLog::NewLC")); + CNSmlDSAgentLog* self = new ( ELeave ) CNSmlDSAgentLog; + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +//============================================= +// CNSmlDSAgentLog::ConstructL() +// Second phase constructor. +//============================================= + +void CNSmlDSAgentLog::ConstructL() + { + DBG_FILE(_S8("CNSmlDSAgentLog::ConstructL(): begin")); + iLocalDB = HBufC::NewL( KNSmlMaxStringColumnLength ); + iServerId = HBufC::NewL( KNSmlMaxServerIdLength ); + iRemoteDB = HBufC::NewL( KNSmlMaxStringColumnLength ); + + User::LeaveIfError( iFsSession.Connect() ); + User::LeaveIfError( iRdbSession.Connect() ); + iFsSession.SetSessionToPrivate( KNSmlAgentLogDbDrive ); + + TParse name; + + TBool createdDatabase = EFalse; + +#ifdef SYMBIAN_SECURE_DBMS + name.Set( KNSmlAgentLogDbName(), NULL, NULL ); +#else + name.Set( KNSmlAgentLogDbName(), KNSmlDatabasesNonSecurePath, NULL ); +#endif + // PP: data compatibility fix: If incompatible database is + // found, it will be deleted & recreated. + TInt retry0(5); + while ( retry0>0 ) + { + retry0 = retry0 - 1; + TInt err = iDatabase.Open( iRdbSession /*iFsSession*/, + name.FullName(), + KNSmlDBMSSecureSOSServerID ); + if (err == KErrNone) + { + User::LeaveIfError( iTableAgentLog.Open( iDatabase, KNSmlTableAgentLog ) ); + iColSet = iTableAgentLog.ColSetL(); + + //RD_SUSPEND_RESUME + if (iColSet->ColNo( KNSmlAgentLogSuspendedState ) == KDbNullColNo + || iColSet->ColNo( KNSmlAgentLogPreviousSyncType ) == KDbNullColNo + || iColSet->ColNo( KNSmlAgentLogPreviousClientSyncType ) == KDbNullColNo) + { + iTableAgentLog.Close(); + iDatabase.Close(); + TInt error = iRdbSession.DeleteDatabase( name.FullName(), KNSmlSOSServerPolicyUID ); + if (error == KErrNone) + { + err = KErrNotFound; + } + + } + } + + if ( err == KErrNotFound ) + { + CreateDatabaseL( name.FullName() ); + User::LeaveIfError( iDatabase.Open( iRdbSession, + name.FullName(), + KNSmlDBMSSecureSOSServerID ) ); + createdDatabase = ETrue; + } + else + { + User::LeaveIfError( err ); + } + + if (createdDatabase) + { + User::LeaveIfError( iTableAgentLog.Open( iDatabase, KNSmlTableAgentLog ) ); + iColSet = iTableAgentLog.ColSetL(); + } + + User::LeaveIfError( iTableAuthentication.Open( iDatabase, KNSmlTableAuthentication ) ); + iColSetTableAuth = iTableAuthentication.ColSetL(); + TInt err2 = iTableDatastore.Open( iDatabase, KNSmlTableDatastore() ); + // Table datastore missing => must delete db + if ( err2==KErrNotFound ) + { + delete iColSetTableDS; + iColSetTableDS = NULL; + delete iColSetTableAuth; + iColSetTableAuth = NULL; + iTableAgentLog.Close(); + iTableAuthentication.Close(); + User::LeaveIfError(iDatabase.Destroy()); + } + else + { + retry0=0; + User::LeaveIfError( err2 ); + } + } + iColSetTableDS = iTableDatastore.ColSetL(); + + DBG_FILE(_S8("CNSmlDSAgentLog::ConstructL(): end")); + } + +//============================================= +// CNSmlDSAgentLog::~CNSmlDSAgentLog() +// Destructor. +//============================================= + +CNSmlDSAgentLog::~CNSmlDSAgentLog() + { + DBG_FILE(_S8("CNSmlDSAgentLog::~CNSmlDSAgentLog begins")); + + delete iLocalDB; + delete iServerId; + delete iRemoteDB; + + iView.Close(); + delete iColSet; + iTableAgentLog.Close(); + +// + delete iColSetTableDS; + iTableDatastore.Close(); +// + + delete iColSetTableAuth; + iTableAuthentication.Close(); + + iDatabase.Close(); + iFsSession.Close(); + iRdbSession.Close(); + + DBG_FILE(_S8("CNSmlDSAgentLog::~CNSmlDSAgentLog ends")); + } + +//============================================= +// CNSmlDSAgentLog::CreateDatabaseL() +// Creates Agent Log database. +//============================================= + +void CNSmlDSAgentLog::CreateDatabaseL(const TDesC& aFullName) + { + DBG_FILE(_S8("CNSmlDSAgentLog::CreateDatabaseL begins")); + + // Check OOD before crating new AgentLog database + if ( SysUtil::FFSSpaceBelowCriticalLevelL( &iFsSession, + KNSmlAgentLogEmptyDatabaseSize + KNSmlAgentLogTreshold ) ) + { + User::Leave( KErrDiskFull ); + } + + _LIT( KCreateAgentLogTable, "CREATE TABLE AgentLog ( Id INTEGER NOT NULL, \ +ImplementationUID INTEGER NOT NULL, LocalDatabase CHAR(%d) NOT NULL, \ +ServerId CHAR(%d), RemoteDatabase CHAR(%d) NOT NULL, \ +LastSyncronised TIMESTAMP, SyncAnchor TIMESTAMP, SlowSyncRequest INTEGER, \ +ServerDeviceInfo LONG VARCHAR, ServerSupportsNOC BIT, ServerSyncTypes INTEGER, \ +ServerFilterInfo LONG VARCHAR, ServerSupportsHierarchicalSync BIT ,\ +SyncSuspendedState INTEGER,PreviousSyncType INTEGER,\ +PreviousClientSyncType INTEGER)" ); + +//RD_SUSPEND_RESUME- 3 new columns added + _LIT( KCreateAuthenticationTable, "CREATE TABLE Authentication ( ServerId \ +CHAR(%d), Nonce LONG VARCHAR, Type INTEGER, SessionId INTEGER )" ); + +// + _LIT( KCreateDatastoreTable, "CREATE TABLE %S ( %S COUNTER NOT NULL, \ + %S INTEGER NOT NULL, %S INTEGER NOT NULL, %S LONG VARBINARY )" ); +// + + _LIT( KCreateVersionTable, "CREATE TABLE Version ( \ +VerMajor UNSIGNED TINYINT, VerMinor UNSIGNED TINYINT )" ); + + HBufC* createAgentLogTable = HBufC::NewLC( KCreateAgentLogTable().Length() + 20 ); + TPtr agentLogTablePtr = createAgentLogTable->Des(); + HBufC* createAuthenticationTable = HBufC::NewLC( KCreateAuthenticationTable().Length() + 10); + TPtr authenticationTablePtr = createAuthenticationTable->Des(); + +// + HBufC* createDatastoreTable = HBufC::NewLC( KCreateDatastoreTable().Length() * 3); + TPtr datastoreTablePtr = createDatastoreTable->Des(); +// + + agentLogTablePtr.Format( KCreateAgentLogTable, KNSmlMaxDataLength, + KNSmlMaxServerIdLength, KNSmlMaxRemoteNameLength ); + authenticationTablePtr.Format( KCreateAuthenticationTable, KNSmlMaxServerIdLength ); + +// + datastoreTablePtr.Format(KCreateDatastoreTable(), &KNSmlTableDatastore(), &KNSmlDatastoreRowID(), &KNSmlDatastoreAgentlogID(), &KNSmlDatastoreStreamID(), &KNSmlDatastoreStreamData()); +// + + User::LeaveIfError( iDatabase.Create( iRdbSession, + aFullName, + KNSmlDBMSSecureSOSServerID ) ); + iDatabase.Begin(); + iDatabase.Execute( *createAgentLogTable ); + iDatabase.Execute( *createAuthenticationTable ); +// + iDatabase.Execute( *createDatastoreTable ); +// + iDatabase.Execute( KCreateVersionTable() ); + + RDbTable table; + User::LeaveIfError( table.Open( iDatabase, KNSmlTableVersion() ) ); + CleanupClosePushL( table ); + CDbColSet* colSet = table.ColSetL(); + CleanupStack::PushL( colSet ); + table.InsertL(); + table.SetColL( colSet->ColNo( KNSmlVersionColumnMajor ), KNSmlAgentLogCurrentVersionMajor ); + table.SetColL( colSet->ColNo( KNSmlVersionColumnMinor ), KNSmlAgentLogCurrentVersionMinor ); + table.PutL(); + + CommitAndCompact(); + iDatabase.Close(); + + DBG_FILE(_S8("CNSmlDSAgentLog::CreateDatabaseL ends")); +// + CleanupStack::PopAndDestroy( 5 ); // createAgentLogTable, createAuthenticationTable, colset, table + //CleanupStack::PopAndDestroy( 4 ); // createAgentLogTable, createAuthenticationTable, colset, table +// + } + +//============================================= +// CNSmlDSAgentLog::SetAgentLogKeyL() +// Sets AgentLog key with given string values. +//============================================= + +EXPORT_C void CNSmlDSAgentLog::SetAgentLogKeyL( const TInt aImplUid, const TDesC& aLocalDB, const TDesC& aServerId, const TDesC& aRemoteDB ) + { + DBG_FILE(_S8("CNSmlDSAgentLog::SetAgentLogKeyL begins")); + HBufC* sql = HBufC::NewLC( KSQLGetAgentLogRow().Length() + 5 + aLocalDB.Length() + aServerId.Length() ); + + TPtr sqlPtr = sql->Des(); + sqlPtr.Format( KSQLGetAgentLogRow, aImplUid, &aLocalDB, &aServerId ); + + PrepareViewL( *sql, iView.EReadOnly ); + + if ( iView.FirstL() ) + { + for(TInt i = 0; i < iView.CountL() ; i++ ) + { + iView.GetL(); + if( aRemoteDB.CompareF( iView.ColDes16( iColSet->ColNo( KNSmlAgentLogRemoteDatabase ) ) ) == 0 ) + { + iID = iView.ColInt( iColSet->ColNo( KNSmlAgentLogId ) ); + i = iView.CountL() ; // terminates the loop + } + else + { + iView.NextL(); + } + + } + } + else + { + iID = KNSmlNewObject; + } + + CleanupStack::PopAndDestroy( 1 ); // sql + + iImplUid = aImplUid; + *iLocalDB = aLocalDB; + *iServerId = aServerId; + *iRemoteDB = aRemoteDB; + + DBG_FILE(_S8("CNSmlDSAgentLog::SetAgentLogKeyL ends")); + } + + +//============================================= +// CNSmlDSAgentLog::SetIntValueL() +// Sets given integer value. +//============================================= + +EXPORT_C void CNSmlDSAgentLog::SetIntValueL( TNSmlAgentLogData aType, const TInt aNewValue ) + { + DBG_FILE(_S8("CNSmlDSAgentLog::SetIntValueL begins")); + // BPSS-7NZESW : return if remote database value is empty + if ( iLocalDB == NULL || iServerId == NULL ||iRemoteDB == NULL || iRemoteDB->Length() < 1 ) + { + return; + } + + TBuf<32> columnName; + TInt setValue( aNewValue ); + + switch ( aType ) + { + case ( EAgentLogSlowSyncRequest ) : + columnName = KNSmlAgentLogSlowSyncRequest; + break; + + case ( EAgentLogServerSupportsNOC ) : + columnName = KNSmlAgentLogServerSupportsNOC; + // Make sure that value is 1 or 0 + if ( setValue ) + { + setValue = 1; + } + else + { + setValue = 0; + } + break; + + case ( EAgentLogServerSupportsHierarchicalSync ) : + columnName = KNSmlAgentLogServerSupportsHierarchicalSync ; + // Make sure that value is 1 or 0 + if ( setValue ) + { + setValue = 1; + } + else + { + setValue = 0; + } + break; + + case ( EAgentLogServerSyncTypes ) : + columnName = KNSmlAgentLogServerSyncTypes; + break; + //RD_SUSPEND_RESUME + case (EAgentLogSyncSuspendedState) : + columnName = KNSmlAgentLogSuspendedState; + break; + + case (EAgentLogPreviousSyncType) : + columnName=KNSmlAgentLogPreviousSyncType; + break; + case (EAgentLogPreviousClientSyncType): + columnName=KNSmlAgentLogPreviousClientSyncType; + break; + + default: + User::Panic( KNSmlIndexOutOfBoundStr, KNSmlPanicIndexOutOfBound ); + } + + HBufC* sql = AgentLogRowSqlLC(); + PrepareViewL( *sql, iView.EUpdatable ); + + iDatabase.Begin(); + if ( iView.FirstL() ) + { + //existing row + iView.GetL(); + iView.UpdateL(); + iView.SetColL( iColSet->ColNo( columnName ), setValue ); + iView.PutL(); + } + else + { + //new row + InitNewRowL(); + iTableAgentLog.SetColL( iColSet->ColNo( columnName ), setValue ); + iTableAgentLog.PutL(); + } + CommitAndCompact(); + + CleanupStack::PopAndDestroy( 1 ); // sql + DBG_FILE(_S8("CNSmlDSAgentLog::SetIntValueL ends")); + } + +//============================================= +// CNSmlDSAgentLog::IntValueL() +// Gets given integer value. +//============================================= + +EXPORT_C TInt CNSmlDSAgentLog::IntValueL( TNSmlAgentLogData aType ) + { + DBG_FILE(_S8("CNSmlDSAgentLog::IntValueL begins")); + HBufC* sql = AgentLogRowSqlLC(); + + TBuf<30>columnName; + + switch ( aType ) + { + case ( EAgentLogSlowSyncRequest ) : + columnName = KNSmlAgentLogSlowSyncRequest; + break; + + case ( EAgentLogServerSupportsNOC ) : + columnName = KNSmlAgentLogServerSupportsNOC; + break; + + case ( EAgentLogServerSyncTypes ) : + columnName = KNSmlAgentLogServerSyncTypes; + break; + + case EAgentLogServerSupportsHierarchicalSync: + columnName = KNSmlAgentLogServerSupportsHierarchicalSync; + break; + //RD_SUSPEND_RESUME + case (EAgentLogSyncSuspendedState) : + columnName = KNSmlAgentLogSuspendedState; + break; + case (EAgentLogPreviousSyncType) : + columnName=KNSmlAgentLogPreviousSyncType; + break; + case(EAgentLogPreviousClientSyncType): + columnName=KNSmlAgentLogPreviousClientSyncType; + break; + //RD_SUSPEND_RESUME + default: + { + User::Panic( KNSmlIndexOutOfBoundStr, KNSmlPanicIndexOutOfBound ); + } + } + + PrepareViewL( *sql, iView.EReadOnly ); + + TInt status( 0 ); + + if ( iView.FirstL() ) + { + iView.GetL(); + status = iView.ColInt( iColSet->ColNo( columnName ) ); + } + + CleanupStack::PopAndDestroy( 1 ); // sql + DBG_FILE(_S8("CNSmlDSAgentLog::IntValueL ends")); + return status; + } + +//============================================= +// CNSmlDSAgentLog::SetTimeValueL() +// Sets given datetime value. +//============================================= + +EXPORT_C void CNSmlDSAgentLog::SetTimeValueL( TNSmlAgentLogData aType, const TTime& aNewValue ) + { + DBG_FILE(_S8("CNSmlDSAgentLog::SetTimeValueL begins")); + if ( iLocalDB == NULL || iServerId == NULL || iRemoteDB == NULL ) + { + return; + } + + HBufC* sql = AgentLogRowSqlLC(); + + TBuf<20> columnName; + + switch ( aType ) + { + case ( EAgentLogLastSyncronised ) : + { + columnName.Format( KColumn, &KNSmlAgentLogLastSyncronised ); + } + break; + + case ( EAgentLogLastSyncAnchor ) : + { + columnName.Format( KColumn, &KNSmlAgentLogLastSyncAnchor ); + } + break; + + default: + { + User::Panic( KNSmlIndexOutOfBoundStr, KNSmlPanicIndexOutOfBound ); + } + } + + PrepareViewL( *sql, iView.EUpdatable ); + + iDatabase.Begin(); + if ( iView.FirstL() ) + { + //existing row + iView.GetL(); + iView.UpdateL(); + iView.SetColL( iColSet->ColNo( columnName ), aNewValue ); //check + iView.PutL(); + } + else + { + //new row + InitNewRowL(); + iTableAgentLog.SetColL( iColSet->ColNo( columnName ), aNewValue ); + iTableAgentLog.PutL(); + } + + CommitAndCompact(); + CleanupStack::PopAndDestroy( 1 ); // sql, + DBG_FILE(_S8("CNSmlDSAgentLog::SetTimeValueL ends")); + } + +//============================================= +// CNSmlDSAgentLog::TimeValueL() +// Gets given datetime value. +// If the returned value is TTime(0), +// given value was not found. +//============================================= + +EXPORT_C TTime CNSmlDSAgentLog::TimeValueL( TNSmlAgentLogData aType ) + { + DBG_FILE(_S8("CNSmlDSAgentLog::TimeValueL begins")); + HBufC* sql = AgentLogRowSqlLC(); + TBuf<20> columnName; + + switch ( aType ) + { + case ( EAgentLogLastSyncronised ) : + { + columnName.Format( KColumn, &KNSmlAgentLogLastSyncronised ); + } + break; + + case ( EAgentLogLastSyncAnchor ) : + { + columnName.Format( KColumn, &KNSmlAgentLogLastSyncAnchor ); + } + break; + + default: + { + User::Panic( KNSmlIndexOutOfBoundStr, KNSmlPanicIndexOutOfBound ); + } + } + + PrepareViewL( *sql, iView.EReadOnly ); + + TTime dateTimeValue( 0 ); + + if ( iView.FirstL() ) + { + iView.GetL(); + dateTimeValue = iView.ColTime( iColSet->ColNo( columnName ) ); + } + + CleanupStack::PopAndDestroy( 1 ); // sql + DBG_FILE(_S8("CNSmlDSAgentLog::TimeValueL ends")); + return dateTimeValue; + } + +//============================================= +// CNSmlDSAgentLog::SetNonceL() +// Sets nonce. +//============================================= + +EXPORT_C void CNSmlDSAgentLog::SetNonceL( const TDesC& aServerId, const TDesC& aNewValue ) + { + DBG_FILE(_S8("CNSmlDSAgentLog::SetNonceL begins")); + HBufC* sql = AuthenticationSqlLC( aServerId ); + + PrepareViewL( *sql, iView.EUpdatable ); + iDatabase.Begin(); + + RDbColReadStream in; + TInt oldNonceSize(0); + if ( iView.FirstL() ) + { + iView.GetL(); + in.OpenLC( iView, iColSetTableAuth->ColNo( KNSmlAuthenticationNonce ) ); + oldNonceSize = in.Source()->SizeL(); + CleanupStack::PopAndDestroy(); // in + } + + RDbColWriteStream out; + if ( iView.FirstL() ) + { + //existing row + + // Check OOD before updating existing nonce value + if ((aNewValue.Size() > oldNonceSize ) && (SysUtil::FFSSpaceBelowCriticalLevelL( &iFsSession, + ( aNewValue.Size() - oldNonceSize ) + KNSmlAgentLogTreshold ))) + { + iDatabase.Rollback(); + User::Leave( KErrDiskFull ); + } + + // Replace nonce + iView.GetL(); + iView.UpdateL(); + out.OpenLC( iView, iColSetTableAuth->ColNo( KNSmlAuthenticationNonce ) ); + out.WriteL( aNewValue ); + out.Close(); + iView.PutL(); + } + else + { + //new row + + // Check OOD before inserting new row into Authentication table + if ( SysUtil::FFSSpaceBelowCriticalLevelL( &iFsSession, aNewValue.Size() + + KNSmlAgentLogMaxFixedAuthRowSize + KNSmlAgentLogTreshold ) ) + { + iDatabase.Rollback(); + User::Leave( KErrDiskFull ); + } + + // Insert new row + PrepareViewL( KSQLGetAuthenticationAll, iView.EUpdatable ); + iView.InsertL(); + out.OpenLC( iView, iColSetTableAuth->ColNo( KNSmlAuthenticationNonce ) ); + out.WriteL( aNewValue ); + out.Close(); + iView.SetColL( iColSetTableAuth->ColNo( KNSmlAuthenticationServerId ), aServerId ); + iView.PutL(); + } + + CommitAndCompact(); + CleanupStack::PopAndDestroy( 2 ); // sql, out + DBG_FILE(_S8("CNSmlDSAgentLog::SetNonceL ends")); + } + +//============================================= +// CNSmlDSAgentLog::NonceL() +// Gets nonce. +// If length of the returned string is 0, +// nonce was not found. +//============================================= + +EXPORT_C HBufC* CNSmlDSAgentLog::NonceL( const TDesC& aServerId ) +{ + DBG_FILE(_S8("CNSmlDSAgentLog::NonceL begins")); + + HBufC* sql = AuthenticationSqlLC( aServerId ); + + PrepareViewL( *sql, iView.EReadOnly ); + + HBufC* stringValue; + + if ( iView.FirstL() ) + { + iView.GetL(); + RDbColReadStream in; + in.OpenLC( iView, iColSetTableAuth->ColNo( KNSmlAuthenticationNonce ) ); + stringValue = HBufC::NewLC( iView.ColLength( iColSetTableAuth->ColNo( KNSmlAuthenticationNonce ) ) ); + TPtr ptr = stringValue->Des(); + in.ReadL( ptr, iView.ColLength( iColSetTableAuth->ColNo( KNSmlAuthenticationNonce ) ) ); + CleanupStack::Pop( 1 ); // stringValue + CleanupStack::PopAndDestroy( 1 ); //in + } + else + { + //couldn't find + stringValue = HBufC::NewL( 0 ); + } + + CleanupStack::PopAndDestroy( 1 ); // sql + DBG_FILE(_S8("CNSmlDSAgentLog::NonceL ends")); + return stringValue; + } + +//============================================= +// CNSmlDSAgentLog::SetSessionIDL() +// Sets session Id. +//============================================= + +EXPORT_C void CNSmlDSAgentLog::SetSessionIDL( const TDesC& aServerId, const TInt aSessionID ) + { + DBG_FILE(_S8("CNSmlDSAgentLog::SetSessionIDL begins")); + + HBufC* sql = AuthenticationSqlLC( aServerId ); + + PrepareViewL( *sql, iView.EUpdatable ); + + iDatabase.Begin(); + + if ( iView.FirstL() ) + { + //existing row + iView.GetL(); + iView.UpdateL(); + iView.SetColL( iColSetTableAuth->ColNo( KNSmlAuthenticationSessionId ), ( TInt ) aSessionID ); + iView.PutL(); + } + else + { + //new row + + // Check OOD before inserting new row into Authentication table + if ( SysUtil::FFSSpaceBelowCriticalLevelL( &iFsSession, + KNSmlAgentLogMaxFixedAuthRowSize + KNSmlAgentLogTreshold ) ) + { + iDatabase.Rollback(); + User::Leave( KErrDiskFull ); + } + + iTableAuthentication.InsertL(); + iTableAuthentication.SetColL( iColSetTableAuth->ColNo( KNSmlAuthenticationServerId ), aServerId ); + iTableAuthentication.SetColL( iColSetTableAuth->ColNo( KNSmlAuthenticationSessionId ), aSessionID ); + iTableAuthentication.PutL(); + } + + CommitAndCompact(); + CleanupStack::PopAndDestroy( 1 ); // sql + DBG_FILE(_S8("CNSmlDSAgentLog::SetSessionIDL ends")); + } + +//============================================= +// CNSmlDSAgentLog::SessionIDL() +// Get Session Id +//============================================= + +EXPORT_C TInt CNSmlDSAgentLog::SessionIDL( const TDesC& aServerId ) + { + DBG_FILE(_S8("CNSmlDSAgentLog::SessionIDL begins")); + + HBufC* sql = AuthenticationSqlLC( aServerId ); + + PrepareViewL( *sql, iView.EReadOnly ); + + TInt id( 0 ); + + if ( iView.FirstL() ) + { + iView.GetL(); + id = iView.ColInt( iColSetTableAuth->ColNo( KNSmlAuthenticationSessionId ) ); + } + + CleanupStack::PopAndDestroy( 1 ); // sql + DBG_FILE(_S8("CNSmlDSAgentLog::SessionIDL ends")); + return id; + } + +//============================================= +// CNSmlDSAgentLog::SetAuthTypeL() +// Set Authentication type +//============================================= + +EXPORT_C void CNSmlDSAgentLog::SetAuthTypeL( const TDesC& aServerId, const TNSmlAgentLogAuthenticationType aNewValue ) +{ + DBG_FILE(_S8("CNSmlDSAgentLog::SetAuthTypeL begins")); + + HBufC* sql = AuthenticationSqlLC( aServerId ); + + PrepareViewL( *sql, iView.EUpdatable ); + + iDatabase.Begin(); + + if ( iView.FirstL() ) + { + //existing row + iView.GetL(); + iView.UpdateL(); + iView.SetColL( iColSetTableAuth->ColNo( KNSmlAuthenticationType ), ( TInt ) aNewValue ); + iView.PutL(); + } + else + { + //new row + + // Check OOD before inserting new row into Authentication table + if ( SysUtil::FFSSpaceBelowCriticalLevelL( &iFsSession, + KNSmlAgentLogMaxFixedAuthRowSize + KNSmlAgentLogTreshold ) ) + { + iDatabase.Rollback(); + User::Leave( KErrDiskFull ); + } + + iTableAuthentication.InsertL(); + iTableAuthentication.SetColL( iColSetTableAuth->ColNo( KNSmlAuthenticationServerId ), aServerId ); + iTableAuthentication.SetColL( iColSetTableAuth->ColNo( KNSmlAuthenticationType ), (TInt)aNewValue ); + iTableAuthentication.PutL(); + } + + CommitAndCompact(); + CleanupStack::PopAndDestroy( 1 ); // sql + DBG_FILE(_S8("CNSmlDSAgentLog::SetAuthTypeL ends")); + } + +//============================================= +// CNSmlDSAgentLog::AuthTypeL() +// Get authentication type +//============================================= + +EXPORT_C TInt CNSmlDSAgentLog::AuthTypeL( const TDesC& aServerId ) + { + DBG_FILE(_S8("CNSmlDSAgentLog::AuthTypeL begins")); + + HBufC* sql = AuthenticationSqlLC( aServerId ); + + PrepareViewL( *sql, iView.EReadOnly ); + + TInt type( 0 ); + + if ( iView.FirstL() ) + { + iView.GetL(); + type = iView.ColInt( iColSetTableAuth->ColNo( KNSmlAuthenticationType ) ); + } + + CleanupStack::PopAndDestroy( 1 ); // sql + DBG_FILE(_S8("CNSmlDSAgentLog::AuthTypeL ends")); + return type; + } + +//============================================= +// CNSmlDSAgentLog::SetServerIdL() +// Sets ServerId. +//============================================= + +EXPORT_C void CNSmlDSAgentLog::SetServerIdL( TDesC& aOldServerId, TDesC& aNewValue ) + { + DBG_FILE(_S8("CNSmlDSAgentLog::SetServerIdL begins")); + HBufC* sql = AuthenticationSqlLC( aOldServerId ); + + PrepareViewL( *sql, iView.EUpdatable ); + TInt replaceCount(0); // Number of replaced Server Ids + + iDatabase.Begin(); + if ( iView.FirstL() ) + { + ++replaceCount; + + //existing row + iView.GetL(); + iView.UpdateL(); + iView.SetColL( iColSetTableAuth->ColNo( KNSmlAuthenticationServerId ), aNewValue ); + iView.PutL(); + } + else + { + // Given ServerId was not found. Update unsuccessful. + DBG_FILE(_S8("CNSmlDSAgentLog::AuthenticationTable update unsuccessful")); + } + CleanupStack::PopAndDestroy(); // sql + + // Update all old Server Ids also in the agentlog table + *iServerId = aNewValue; + + HBufC* sqlAgentLog = HBufC::NewLC( KSQLGetAgentLogRowWithServerId().Length() + aOldServerId.Length() ); + TPtr sqlPtr = sqlAgentLog->Des(); + sqlPtr.Format( KSQLGetAgentLogRowWithServerId, &aOldServerId ); + + + PrepareViewL( *sqlAgentLog, iView.EUpdatable ); + + if ( iView.FirstL() ) + { + replaceCount += iView.CountL(); + + do + { + //existing row + iView.GetL(); + iView.UpdateL(); + iView.SetColL( iColSet->ColNo( KNSmlAgentLogServerId ), aNewValue ); + iView.PutL(); + } + while ( iView.NextL() ); + } + else + { + // Given ServerId was not found. Update unsuccessful. + DBG_FILE(_S8("CNSmlDSAgentLog::AgentLogTable update unsuccessful")); + } + + // Check OOD before commiting + if ( (aNewValue.Size() > aOldServerId.Size()) && (SysUtil::FFSSpaceBelowCriticalLevelL( &iFsSession, (replaceCount * + (aNewValue.Size() - aOldServerId.Size())) + KNSmlAgentLogTreshold ))) + { + iDatabase.Rollback(); + User::Leave( KErrDiskFull ); + } + + CommitAndCompact(); + CleanupStack::PopAndDestroy(); // sqlAgentLog + DBG_FILE(_S8("CNSmlDSAgentLog::SetServerIdL ends")); + } + +//============================================= +// CNSmlDSAgentLog::SetServerDeviceInfoL() +// Sets Server Device Info given in parameter. +//============================================= + +EXPORT_C void CNSmlDSAgentLog::SetServerDeviceInfoL( const RPointerArray& aDbCaps ) + { + DBG_FILE(_S8("CNSmlDSAgentLog::SetServerDeviceInfoL begins")); + + _LIT8( KSeparator, ";"); + + CBufFlat* deviceData = CBufFlat::NewL(8); + CleanupStack::PushL( deviceData ); + TInt pos( 0 ); + TBuf8<6> buffer; //for num part + + HBufC* stringValue16=0; + + TInt arrayCount(0); + while (arrayCountDatastoreL(); + CleanupStack::PushL(dataStore); + + buffer.Num( ( TInt )CNSmlDSAgentLog::EDataStore ); + deviceData->InsertL( pos, buffer ); + pos += buffer.Length(); + + deviceData->InsertL( pos, KSeparator ); + pos++; + deviceData->InsertL( pos, KSeparator ); + pos++; + + + if (dataStore->sourceref) + { + buffer.Num( ( TInt )CNSmlDSAgentLog::ESourceRef ); + deviceData->InsertL( pos, buffer ); + pos += buffer.Length(); + + deviceData->InsertL( pos, KSeparator ); + pos++; + + deviceData->InsertL( pos, dataStore->sourceref->Data()); + pos += dataStore->sourceref->Data().Length(); + + deviceData->InsertL( pos, KSeparator ); + pos++; + } + + if (dataStore->displayname) + { + buffer.Num( ( TInt )CNSmlDSAgentLog::EDisplayName ); + deviceData->InsertL( pos, buffer ); + pos += buffer.Length(); + + deviceData->InsertL( pos, KSeparator ); + pos++; + + deviceData->InsertL( pos, dataStore->displayname->Data()); + pos += dataStore->displayname->Data().Length(); + + deviceData->InsertL( pos, KSeparator ); + pos++; + } + + if (dataStore->maxguidsize) + { + buffer.Num( ( TInt )CNSmlDSAgentLog::EMaxGUIDSize ); + deviceData->InsertL( pos, buffer ); + pos += buffer.Length(); + + deviceData->InsertL( pos, KSeparator ); + pos++; + + deviceData->InsertL( pos, dataStore->maxguidsize->Data()); + pos += dataStore->maxguidsize->Data().Length(); + + deviceData->InsertL( pos, KSeparator ); + pos++; + } + + if (dataStore->rxpref) + { + buffer.Num( ( TInt )CNSmlDSAgentLog::ERxPref ); + deviceData->InsertL( pos, buffer ); + pos += buffer.Length(); + + deviceData->InsertL( pos, KSeparator ); + pos++; + + deviceData->InsertL( pos, dataStore->rxpref->cttype->Data()); + pos += dataStore->rxpref->cttype->Data().Length(); + + deviceData->InsertL( pos, KTabSeparator ); + pos++; + + deviceData->InsertL( pos, dataStore->rxpref->verct->Data()); + pos += dataStore->rxpref->verct->Data().Length(); + + deviceData->InsertL( pos, KSeparator ); + pos++; + } + + if (dataStore->rx) + { + SmlDevInfXmitListPtr_t rx= dataStore->rx; + + while (rx) + { + buffer.Num( ( TInt )CNSmlDSAgentLog::ERx); + deviceData->InsertL( pos, buffer ); + pos += buffer.Length(); + + deviceData->InsertL( pos, KSeparator ); + pos++; + + deviceData->InsertL( pos, rx->data->cttype->Data()); + pos += rx->data->cttype->Data().Length(); + + deviceData->InsertL( pos, KTabSeparator ); + pos++; + + deviceData->InsertL( pos, rx->data->verct->Data()); + pos += rx->data->verct->Data().Length(); + + deviceData->InsertL( pos, KSeparator ); + pos++; + + rx=rx->next; + } + } + + if (dataStore->txpref) + { + buffer.Num( ( TInt )CNSmlDSAgentLog::ETxPref ); + deviceData->InsertL( pos, buffer ); + pos += buffer.Length(); + + deviceData->InsertL( pos, KSeparator ); + pos++; + + deviceData->InsertL( pos, dataStore->txpref->cttype->Data()); + pos += dataStore->txpref->cttype->Data().Length(); + + deviceData->InsertL( pos, KTabSeparator ); + pos++; + + deviceData->InsertL( pos, dataStore->txpref->verct->Data()); + pos += dataStore->txpref->verct->Data().Length(); + + deviceData->InsertL( pos, KSeparator ); + pos++; + } + + if (dataStore->tx) + { + SmlDevInfXmitListPtr_t tx= dataStore->tx; + + while (tx) + { + buffer.Num( ( TInt )CNSmlDSAgentLog::ETx); + deviceData->InsertL( pos, buffer ); + pos += buffer.Length(); + + deviceData->InsertL( pos, KSeparator ); + pos++; + + deviceData->InsertL( pos, tx->data->cttype->Data()); + pos += tx->data->cttype->Data().Length(); + + deviceData->InsertL( pos, KTabSeparator ); + pos++; + + deviceData->InsertL( pos, tx->data->verct->Data()); + pos += tx->data->verct->Data().Length(); + + deviceData->InsertL( pos, KSeparator ); + pos++; + + tx=tx->next; + } + } + + if (dataStore->dsmem) + { + buffer.Num( ( TInt )CNSmlDSAgentLog::EDSMem ); + deviceData->InsertL( pos, buffer ); + pos += buffer.Length(); + + deviceData->InsertL( pos, KSeparator ); + pos++; + + deviceData->InsertL( pos, dataStore->dsmem->Data()); + pos += dataStore->dsmem->Data().Length(); + + deviceData->InsertL( pos, KSeparator ); + pos++; + } + + if (dataStore->supportHierarchicalSync) + { + buffer.Num( ( TInt )CNSmlDSAgentLog::ESupportHierarchicalSync ); + deviceData->InsertL( pos, buffer ); + pos += buffer.Length(); + + deviceData->InsertL( pos, KSeparator ); + pos++; + + deviceData->InsertL( pos, KSeparator ); + pos++; + } + + if (dataStore->synccap) + { + SmlPcdataListPtr_t syncType=dataStore->synccap->synctype; + + while (syncType) + { + buffer.Num( ( TInt )CNSmlDSAgentLog::ESyncCap); + deviceData->InsertL( pos, buffer ); + pos += buffer.Length(); + + deviceData->InsertL( pos, KSeparator ); + pos++; + + deviceData->InsertL( pos, dataStore->synccap->synctype->data->Data()); + pos += dataStore->synccap->synctype->data->Data().Length(); + + deviceData->InsertL( pos, KSeparator ); + pos++; + + syncType=syncType->next; + } + } + + sml_devinf_ctcaplist_s *ctCaps = dataStore->ctcap; + + CNSmlCtCapsHandler* ctCapsHandler = new(ELeave) CNSmlCtCapsHandler( ctCaps ); + CleanupStack::PushL( ctCapsHandler ); + CArrayFix* ctCapArray = new( ELeave ) CArrayFixFlat(8); + CleanupStack::PushL( ctCapArray ); + ctCapsHandler->GetCtCapsL( *ctCapArray ); + + for ( TInt i = 0; i < ctCapArray->Count(); i++ ) + { + buffer.Num( ( TInt ) ctCapArray->At( i ).iTag ); + deviceData->InsertL( pos, buffer ); + pos += buffer.Length(); + + deviceData->InsertL( pos, KSeparator ); + pos++; + + deviceData->InsertL( pos, ctCapArray->At( i ).iValue ); + pos += ctCapArray->At( i ).iValue.Length(); + + deviceData->InsertL( pos, KSeparator ); + pos++; + } + + CleanupStack::PopAndDestroy(3); //dataStore,ctCapsHandler,ctCapArray + + arrayCount++; + } + if (arrayCount>0) + { + TPtr8 stringValue = deviceData->Ptr( 0 ); + stringValue16 = HBufC::NewLC( stringValue.Size() * 2 ); + TPtr ptrStringValue16( stringValue16->Des() ); + CnvUtfConverter::ConvertToUnicodeFromUtf8( ptrStringValue16, stringValue ); + } + else + { + stringValue16 = KNullDesC().AllocLC(); + } + + + HBufC* sql = AgentLogRowSqlLC(); + + PrepareViewL( *sql, iView.EUpdatable ); + iDatabase.Begin(); + + RDbColReadStream in; + TInt oldDeviceInfoSize(0); + if ( iView.FirstL() ) + { + iView.GetL(); + in.OpenLC( iView, iColSet->ColNo( KNSmlAgentLogServerDeviceInfo ) ); + oldDeviceInfoSize = in.Source()->SizeL(); + CleanupStack::PopAndDestroy(&in); + } + + RDbColWriteStream out; + if ( iView.FirstL() ) + { + //existing row + + // Check OOD before writing device info on existing row + if ((stringValue16->Size() > oldDeviceInfoSize ) && (SysUtil::FFSSpaceBelowCriticalLevelL( &iFsSession, + ( stringValue16->Size() - oldDeviceInfoSize ) + KNSmlAgentLogTreshold ))) + { + iDatabase.Rollback(); + User::Leave( KErrDiskFull ); + } + + // Update device info + iView.GetL(); + iView.UpdateL(); + out.OpenLC( iView, iColSet->ColNo( KNSmlAgentLogServerDeviceInfo ) ); + out.WriteL( *stringValue16 ); + out.Close(); + iView.PutL(); + } + else + { + //new row + + // Check OOD before inserting new row into AgentLog table + if ( SysUtil::FFSSpaceBelowCriticalLevelL( &iFsSession, + KNSmlAgentLogMaxFixedLogRowSize + stringValue16->Size() + + KNSmlAgentLogTreshold ) ) + { + iDatabase.Rollback(); + User::Leave( KErrDiskFull ); + } + + // Insert new row + PrepareViewL( KSQLGetAgentLogAll, iView.EUpdatable ); + iID = GenerateIdL(); + iView.InsertL(); + iView.SetColL( iColSet->ColNo( KNSmlAgentLogId ), iID ); + out.OpenLC( iView, iColSet->ColNo( KNSmlAgentLogServerDeviceInfo ) ); + out.WriteL( *stringValue16 ); + out.Close(); + iView.SetColL( iColSet->ColNo( KNSmlAgentLogImplementationUID ), iImplUid ); + iView.SetColL( iColSet->ColNo( KNSmlAgentLogLocalDatabase ), *iLocalDB ); + iView.SetColL( iColSet->ColNo( KNSmlAgentLogServerId ), *iServerId ); + iView.SetColL( iColSet->ColNo( KNSmlAgentLogRemoteDatabase ), *iRemoteDB ); + iView.PutL(); + } + + CommitAndCompact(); + CleanupStack::PopAndDestroy( 4 ); // sql, out, stringValue16, deviceData + + DBG_FILE(_S8("CNSmlDSAgentLog::SetServerDeviceInfoL ends")); + } + +//============================================= +// CNSmlDSAgentLog::GetServerDeviceInfoL() +// Gets Server Device Info. +//============================================= + +EXPORT_C void CNSmlDSAgentLog::GetServerDeviceInfoL( RPointerArray& aDbCaps ) + { + DBG_FILE(_S8("CNSmlDSAgentLog::GetServerDeviceInfoL begins")); + + + HBufC* sql = AgentLogRowSqlLC(); + + PrepareViewL( *sql, iView.EReadOnly ); + + HBufC* stringValue; + + if ( iView.FirstL() ) + { + iView.GetL(); + RDbColReadStream in; + stringValue = HBufC::NewLC( iView.ColLength( iColSet->ColNo( KNSmlAgentLogServerDeviceInfo ) ) ); + in.OpenLC( iView, iColSet->ColNo( KNSmlAgentLogServerDeviceInfo ) ); + TPtr ptr = stringValue->Des(); + in.ReadL( ptr, iView.ColLength( iColSet->ColNo( KNSmlAgentLogServerDeviceInfo ) ) ); + CleanupStack::PopAndDestroy( 1 ); // in + } + else + { + //couldn't find + CleanupStack::PopAndDestroy( 1 ); // sql + return; + } + + TInt start( 0 ); + TInt firstSeparator( 0 ); + TBool firstFound( EFalse ); + TLex lex; + TInt numPart( 0 ); + TPtr ptrStringValue = stringValue->Des(); + + + if (stringValue->Length()>0) + { + CNSmlDbCaps* dbCaps = NULL; // + + CNSmlCtCap* cap=NULL; + CNSmlDevInfProp* prop=NULL; + CNSmlPropParam* param=NULL; + TInt pc(0); + for ( TInt i = 0; i < stringValue->Length(); i++ ) + { + if ( ptrStringValue[i] == ';' ) //; = separator + { + if ( !firstFound ) + { + firstSeparator = i; + firstFound = ETrue; + } + else + { + lex.Assign( stringValue->Mid( start, firstSeparator - start ) ); + lex.Val( numPart ); + + TPtrC ptrTemp = stringValue->Mid( firstSeparator + 1, i - firstSeparator - 1 ); + + HBufC8* stringPart = HBufC8::NewLC( ptrTemp.Length() ); + pc++; + TPtr8 ptrStringPart = stringPart->Des(); + + CnvUtfConverter::ConvertFromUnicodeToUtf8( ptrStringPart, ptrTemp ); + + TInt separator; + + switch(numPart) + { + case TNSmlCtCapData::ECtType: + cap = dbCaps->AddCtCapLC(); pc++; + cap->SetCtTypeL(ptrStringPart); + prop=0; + param=0; + break; + + case TNSmlCtCapData::EVerCt: + if (cap) + { + cap->SetVerCtL(ptrStringPart); + } + break; + + case TNSmlCtCapData::EFieldLevel: + if (cap) + { + cap->SetFieldLevelL(); + } + break; + + case TNSmlCtCapData::EPropName: + if (cap) + { + prop = cap->AddDevInfPropLC(ptrStringPart); + pc++; + param=0; + } + break; + + case TNSmlCtCapData::EPropDataType: + if (prop) + { + prop->SetDataTypeL(ptrStringPart); + } + break; + + case TNSmlCtCapData::EPropMaxOccur: + if (prop) + { + prop->SetMaxOccurL(ptrStringPart); + } + break; + + case TNSmlCtCapData::EPropNoTruncate: + if (prop) + { + prop->SetNoTruncateL(); + } + break; + + case TNSmlCtCapData::EPropValEnum: + if (prop) + { + prop->AddValEnumL(ptrStringPart); + } + break; + + case TNSmlCtCapData::EPropDisplayName: + if (prop) + { + prop->SetDisplayNameL(ptrStringPart); + } + break; + + case TNSmlCtCapData::EParamName: + if (prop) + { + param = prop->AddParamLC(ptrStringPart); + pc++; + } + break; + + case TNSmlCtCapData::EParamValEnum: + if (param) + { + param->AddValEnumL(ptrStringPart); + } + break; + + case TNSmlCtCapData::EParamDataType: + if (param) + { + param->SetDataTypeL(ptrStringPart); + } + break; + + case TNSmlCtCapData::EParamDisplayName: + if (param) + { + param->SetDisplayNameL(ptrStringPart); + } + break; + ////////////////////////// + + case EDataStore: + dbCaps = CNSmlDbCaps::NewL(); + aDbCaps.Append(dbCaps); + break; + + case ESourceRef: + dbCaps->SetSourceRefL(ptrStringPart); + + break; + + case EDisplayName: + dbCaps->SetDisplayNameL(ptrStringPart); + break; + + case EMaxGUIDSize: + dbCaps->SetMaxGuidSizeL(ptrStringPart); + break; + + case ERxPref: + separator = ptrStringPart.Locate(KTabSeparator()[0]); + dbCaps->SetRxPrefL(ptrStringPart.Left(separator),ptrStringPart.Right(ptrStringPart.Length()-separator-1)); + break; + + case ERx: + separator = ptrStringPart.Locate(KTabSeparator()[0]); + dbCaps->AddRxL(ptrStringPart.Left(separator),ptrStringPart.Right(ptrStringPart.Length()-separator-1)); + break; + + case ETxPref: + separator = ptrStringPart.Locate(KTabSeparator()[0]); + dbCaps->SetTxPrefL(ptrStringPart.Left(separator),ptrStringPart.Right(ptrStringPart.Length()-separator-1)); + break; + + + case ETx: + separator = ptrStringPart.Locate(KTabSeparator()[0]); + dbCaps->AddTxL(ptrStringPart.Left(separator),ptrStringPart.Right(ptrStringPart.Length()-separator-1)); + break; + + + case EDSMem: + break; + + case ESupportHierarchicalSync: + dbCaps->SetSupportHierarchicalSyncL(); + break; + + case ESyncCap: + break; + + default: + break; + + } + + start = i + 1; + firstFound = EFalse; + } + } + } + + CleanupStack::PopAndDestroy( pc ); // pc + + } + + CleanupStack::PopAndDestroy( 2 ); // sql, stringValue + + DBG_FILE(_S8("CNSmlDSAgentLog::GetServerDeviceInfoL ends")); + } + +//============================================= +// CNSmlDSAgentLog::SetServerFilterInfoL() +// Sets Server Filter Info given in parameter. +//============================================= + +EXPORT_C void CNSmlDSAgentLog::SetServerFilterInfoL( const CArrayFix* aFilterInfoArr ) + { + DBG_FILE(_S8("CNSmlDSAgentLog::SetServerFilterInfoL begins")); + _LIT8( KSeparator, ";"); + + CBufFlat* filterData = CBufFlat::NewL(8); + CleanupStack::PushL( filterData ); + TInt pos( 0 ); + TBuf8<6> buffer; //for num part + + for ( TInt i = 0; i < aFilterInfoArr->Count(); i++ ) + { + buffer.Num( ( TInt ) aFilterInfoArr->At( i ).iTag ); + filterData->InsertL( pos, buffer ); + pos += buffer.Length(); + + filterData->InsertL( pos, KSeparator ); + pos++; + + filterData->InsertL( pos, aFilterInfoArr->At( i ).iValue ); + pos += aFilterInfoArr->At( i ).iValue.Length(); + + filterData->InsertL( pos, KSeparator ); + pos++; + } + + TPtr8 stringValue = filterData->Ptr( 0 ); + + HBufC* stringValue16; + stringValue16 = HBufC::NewLC( stringValue.Size() * 2 ); + + TPtr ptrStringValue16( stringValue16->Des() ); + CnvUtfConverter::ConvertToUnicodeFromUtf8( ptrStringValue16, stringValue ); + + HBufC* sql = AgentLogRowSqlLC(); + + PrepareViewL( *sql, iView.EUpdatable ); + iDatabase.Begin(); + + RDbColReadStream in; + TInt oldFilterInfoSize(0); + if ( iView.FirstL() ) + { + iView.GetL(); + in.OpenLC( iView, iColSet->ColNo( KNSmlAgentLogServerFilterInfo ) ); + oldFilterInfoSize = in.Source()->SizeL(); + CleanupStack::PopAndDestroy(&in); + } + + RDbColWriteStream out; + if ( iView.FirstL() ) + { + //existing row + + // Check OOD before writing filter info on existing row + if ( (stringValue16->Size() > oldFilterInfoSize) && (SysUtil::FFSSpaceBelowCriticalLevelL( &iFsSession, + (stringValue16->Size() - oldFilterInfoSize) + KNSmlAgentLogTreshold ))) + { + iDatabase.Rollback(); + User::Leave( KErrDiskFull ); + } + + // Update filter info + iView.GetL(); + iView.UpdateL(); + out.OpenLC( iView, iColSet->ColNo( KNSmlAgentLogServerFilterInfo ) ); + out.WriteL( ptrStringValue16 ); + out.Close(); + iView.PutL(); + } + else + { + //new row + + // Check OOD before inserting new row into AgentLog table + if ( SysUtil::FFSSpaceBelowCriticalLevelL( &iFsSession, + KNSmlAgentLogMaxFixedLogRowSize + stringValue16->Size() + + KNSmlAgentLogTreshold ) ) + { + iDatabase.Rollback(); + User::Leave( KErrDiskFull ); + } + + // Insert new row + PrepareViewL( KSQLGetAgentLogAll, iView.EUpdatable ); + iID = GenerateIdL(); + iView.InsertL(); + iView.SetColL( iColSet->ColNo( KNSmlAgentLogId ), iID ); + out.OpenLC( iView, iColSet->ColNo( KNSmlAgentLogServerFilterInfo ) ); + out.WriteL( ptrStringValue16 ); + out.Close(); + iView.SetColL( iColSet->ColNo( KNSmlAgentLogImplementationUID ), iImplUid ); + iView.SetColL( iColSet->ColNo( KNSmlAgentLogLocalDatabase ), *iLocalDB ); + iView.SetColL( iColSet->ColNo( KNSmlAgentLogServerId ), *iServerId ); + iView.SetColL( iColSet->ColNo( KNSmlAgentLogRemoteDatabase ), *iRemoteDB ); + iView.PutL(); + } + + CommitAndCompact(); + CleanupStack::PopAndDestroy( 4 ); // sql, out, stringValue16, filterData + DBG_FILE(_S8("CNSmlDSAgentLog::SetServerFilterInfoL ends")); + } + +//============================================= +// CNSmlDSAgentLog::GetServerFilterInfoL() +// Gets Server Device Info. +//============================================= + +EXPORT_C void CNSmlDSAgentLog::GetServerFilterInfoL( CArrayFix* aFilterInfoArr ) + { + DBG_FILE(_S8("CNSmlDSAgentLog::GetServerFilterInfoL begins")); + + HBufC* sql = AgentLogRowSqlLC(); + + PrepareViewL( *sql, iView.EReadOnly ); + + HBufC* stringValue; + + if ( iView.FirstL() ) + { + iView.GetL(); + RDbColReadStream in; + stringValue = HBufC::NewLC( iView.ColLength( iColSet->ColNo( KNSmlAgentLogServerFilterInfo ) ) ); + in.OpenLC( iView, iColSet->ColNo( KNSmlAgentLogServerFilterInfo ) ); + TPtr ptr = stringValue->Des(); + in.ReadL( ptr, iView.ColLength( iColSet->ColNo( KNSmlAgentLogServerFilterInfo ) ) ); + CleanupStack::PopAndDestroy( 1 ); // in + } + else + { + //couldn't find + CleanupStack::PopAndDestroy( 1 ); // sql + return; + } + + TInt start( 0 ); + TInt firstSeparator( 0 ); + TBool firstFound( EFalse ); + TLex lex; + TInt numPart( 0 ); + TPtr ptrStringValue = stringValue->Des(); + + for ( TInt i = 0; i < stringValue->Length(); i++ ) + { + if ( ptrStringValue[i] == ';' ) //; = separator + { + if ( !firstFound ) + { + firstSeparator = i; + firstFound = ETrue; + } + else + { + lex.Assign( stringValue->Mid( start, firstSeparator - start ) ); + lex.Val( numPart ); + + TPtrC ptrTemp = stringValue->Mid( firstSeparator + 1, i - firstSeparator - 1 ); + + HBufC8* stringPart = HBufC8::NewLC( ptrTemp.Length() ); + TPtr8 ptrStringPart = stringPart->Des(); + + CnvUtfConverter::ConvertFromUnicodeToUtf8( ptrStringPart, ptrTemp ); + + aFilterInfoArr->AppendL( TNSmlFilterCapData( TNSmlFilterCapData::TNSmlFilterCapTag(numPart), ptrStringPart ) ); + + CleanupStack::PopAndDestroy( 1 ); //stringPart + + start = i + 1; + firstFound = EFalse; + } + } + } + CleanupStack::PopAndDestroy( 2 ); // sql, stringValue + DBG_FILE(_S8("CNSmlDSAgentLog::GetServerFilterInfoL ends")); + } + +//============================================= +// CNSmlDSAgentLog::GenerateIdL() +// Generates a unique Id (Id's highest value before + 1) +// to a given table. +//============================================= + +TInt CNSmlDSAgentLog::GenerateIdL() + { + TInt lastKey( 0 ); + if ( iTableAgentLog.LastL() ) + { + iTableAgentLog.GetL(); + lastKey = iTableAgentLog.ColInt( iColSet->ColNo( KNSmlAgentLogId ) ); + iTableAgentLog.FirstL(); + iTableAgentLog.GetL(); + while ( iTableAgentLog.NextL() ) + { + iTableAgentLog.GetL(); + if ( lastKey < iTableAgentLog.ColInt( iColSet->ColNo( KNSmlAgentLogId ) ) ) + { + lastKey = iTableAgentLog.ColInt( iColSet->ColNo( KNSmlAgentLogId ) ); + } + } + } + return ( lastKey + 1 ); + } + +//============================================= +// CNSmlDSAgentLog::InitNewRowL() +// Initialises new row in Agent Log table +// +//============================================= + +void CNSmlDSAgentLog::InitNewRowL() + { + // Check OOD before inserting new row into AgentLog table + if ( SysUtil::FFSSpaceBelowCriticalLevelL( &iFsSession, + KNSmlAgentLogMaxFixedLogRowSize + KNSmlAgentLogTreshold ) ) + { + iDatabase.Rollback(); + User::Leave( KErrDiskFull ); + } + + // Insert new row + iID = GenerateIdL(); + iTableAgentLog.InsertL(); + iTableAgentLog.SetColL( iColSet->ColNo( KNSmlAgentLogId ), iID ); + iTableAgentLog.SetColL( iColSet->ColNo( KNSmlAgentLogImplementationUID ), iImplUid ); + iTableAgentLog.SetColL( iColSet->ColNo( KNSmlAgentLogLocalDatabase ), *iLocalDB ); + iTableAgentLog.SetColL( iColSet->ColNo( KNSmlAgentLogServerId ), *iServerId ); + iTableAgentLog.SetColL( iColSet->ColNo( KNSmlAgentLogRemoteDatabase ), *iRemoteDB ); + } + +//============================================= +// CNSmlDSAgentLog::AgentLogRowSqlLC() +// Makes SQL string for Agent Log table +// +//============================================= + +HBufC* CNSmlDSAgentLog::AgentLogRowSqlLC() const + { + HBufC* sql = HBufC::NewLC( KSQLGetAgentLogRowWithId().Length() + 5 ); + TPtr sqlPtr = sql->Des(); + sqlPtr.Format( KSQLGetAgentLogRowWithId, iID ); + return sql; + } + +//============================================= +// CNSmlDSAgentLog::AgentLogRowSqlLC() +// Makes SQL string for Authentication table +// +//============================================= + +HBufC* CNSmlDSAgentLog::AuthenticationSqlLC( const TDesC& aServerId ) const + { + HBufC* sql = HBufC::NewLC( KSQLGetAuthenticationRow().Length() + aServerId.Length() ); + TPtr sqlPtr = sql->Des(); + sqlPtr.Format( KSQLGetAuthenticationRow, &aServerId ); + return sql; + } + +//============================================= +// CNSmlDSAgentLog::PrepareViewL() +// Closes and prepares the view +// +//============================================= + +void CNSmlDSAgentLog::PrepareViewL( const TDesC& aSql, RDbRowSet::TAccess aAccess ) + { + iView.Close(); + User::LeaveIfError( iView.Prepare( iDatabase, TDbQuery( aSql ), aAccess ) ); + } + +//============================================= +// CNSmlDSAgentLog::CommitAndCompact +// Commits update and compacts the database +// +//============================================= + +void CNSmlDSAgentLog::CommitAndCompact() + { + iDatabase.Commit(); + iDatabase.Compact(); + } + +// + +//============================================= +// +//============================================= +EXPORT_C MStreamBuf* CNSmlDSAgentLog::OpenReadStreamL( TUid aUid ) + { + DBG_FILE(_S8("CNSmlDSAgentLog::OpenReadStreamL(): begin")); + if( iReadStreamOpen ) + { + DBG_FILE(_S8("CNSmlDSAgentLog::OpenReadStreamL(): end (readstream already open)")); + User::Leave(KErrInUse); + } + + if( !IsPresentL(aUid) ) + { + DBG_FILE(_S8("CNSmlDSAgentLog::OpenReadStreamL(): end (readstream not found)")); + User::Leave(KErrNotFound); + } + + _LIT(KSQLStatement, "SELECT DatastoreData FROM Datastore WHERE DatastoreAID = %d AND DatastoreSID = %d"); + + HBufC* sqlStatement = HBufC::NewLC( KSQLStatement().Length() + 15); + TPtr sqlStatementPtr = sqlStatement->Des(); + + sqlStatementPtr.Format(KSQLStatement(), iID, aUid.iUid); + + // create a view on the database + User::LeaveIfError(iRSView.Prepare(iDatabase, TDbQuery(sqlStatementPtr, EDbCompareNormal), RDbRowSet::EReadOnly)); + User::LeaveIfError(iRSView.EvaluateAll()); + + // Get the structure of rowset + CDbColSet* colSet = iRSView.ColSetL(); + TDbColNo col = colSet->ColNo(KNSmlDatastoreStreamData()); // Ordinal position of long column + delete colSet; + + // get row + if( iRSView.FirstL() ) + { + iRSView.GetL(); + iRs.OpenL(iRSView, col); + } + + iReadStreamOpen = ETrue; + + DBG_FILE(_S8("CNSmlDSAgentLog::OpenReadStreamL(): end")); + + CleanupStack::PopAndDestroy(); // sqlStatement + + return iRs.Source(); + } + +//============================================= +// Open writestream for Uid +//============================================= +EXPORT_C MStreamBuf* CNSmlDSAgentLog::OpenWriteStreamL( TUid aUid ) + { + DBG_FILE(_S8("CNSmlDSAgentLog::OpenWriteStreamL(): begin")); + if( iWriteStreamOpen ) + { + DBG_FILE(_S8("CNSmlDSAgentLog::OpenWriteStreamL(): end (writestream already open)")); + User::Leave(KErrInUse); + } + + if( !IsPresentL(aUid) ) + { + DBG_FILE(_S8("CNSmlDSAgentLog::OpenWriteStreamL(): creating new stream begin")); + iDatabase.Begin(); + RDbView view; + User::LeaveIfError(view.Prepare(iDatabase, TDbQuery(KSQLGetDatastoreAll()), RDbView::EUpdatable)); + DBG_FILE(_S8("CNSmlDSAgentLog::OpenWriteStreamL(): Preparing view successful")); + CleanupClosePushL(view); + view.InsertL(); + view.SetColL( iColSetTableDS->ColNo( KNSmlDatastoreAgentlogID ), iID ); + view.SetColL( iColSetTableDS->ColNo( KNSmlDatastoreStreamID ), aUid.iUid ); + view.PutL(); + CleanupStack::PopAndDestroy(); // view + CommitAndCompact(); + DBG_FILE(_S8("CNSmlDSAgentLog::OpenWriteStreamL(): creating new stream end")); + } + + _LIT(KSQLStatement, "SELECT DatastoreData FROM Datastore WHERE DatastoreAID = %d AND DatastoreSID = %d"); + + HBufC* sqlStatement = HBufC::NewLC( KSQLStatement().Length() + 15 ); + TPtr sqlStatementPtr = sqlStatement->Des(); + sqlStatementPtr.Format(KSQLStatement(), iID, aUid.iUid); + + // create a view on the database + User::LeaveIfError(iWSView.Prepare(iDatabase, TDbQuery(sqlStatementPtr, EDbCompareNormal), RDbRowSet::EUpdatable)); + DBG_FILE(_S8("CNSmlDSAgentLog::OpenWriteStreamL(): Preparing view successful (second)")); + User::LeaveIfError(iWSView.EvaluateAll()); + DBG_FILE(_S8("CNSmlDSAgentLog::OpenWriteStreamL(): EvaluateAll successful...")); + + // Get the structure of rowset + CDbColSet* colSet = iWSView.ColSetL(); + TDbColNo col = colSet->ColNo(KNSmlDatastoreStreamData()); // Ordinal position of long column + delete colSet; + + // get row + if( iWSView.FirstL() ) + { + iWSView.UpdateL(); + iWs.OpenL(iWSView, col); + } + + iWriteStreamOpen = ETrue; + + DBG_FILE(_S8("CNSmlDSAgentLog::OpenWriteStreamL(): end")); + + CleanupStack::PopAndDestroy(); // sqlStatement + + return iWs.Sink(); + } + +//============================================= +// Check if Uid already in use +//============================================= +EXPORT_C TBool CNSmlDSAgentLog::IsPresentL( TUid aUid ) + { + DBG_FILE(_S8("CNSmlDSAgentLog::IsPresentL(): begin")); + _LIT(KSQLStatement, "SELECT DatastoreData FROM Datastore WHERE DatastoreAID = %d AND DatastoreSID = %d"); + + HBufC* sqlStatement = HBufC::NewLC( KSQLStatement().Length() + 15); + TPtr sqlStatementPtr = sqlStatement->Des(); + + sqlStatementPtr.Format(KSQLStatement(), iID, aUid.iUid); + RDbView view; + User::LeaveIfError(view.Prepare(iDatabase, TDbQuery(sqlStatementPtr, EDbCompareNormal), RDbRowSet::EReadOnly)); + CleanupClosePushL(view); + User::LeaveIfError(view.EvaluateAll()); + TBool result(!view.IsEmptyL()); + DBG_FILE_CODE( result, _S8("CNSmlDSAgentLog::IsPresentL(): IsEmpty called...") ); + + CleanupStack::PopAndDestroy(2); // view, sqlStatement + + DBG_FILE(_S8("CNSmlDSAgentLog::IsPresentL(): end")); + return result; + } + +//============================================= +// Delete stream for Uid +//============================================= +EXPORT_C void CNSmlDSAgentLog::DeleteStreamL( TUid aUid ) + { + DBG_FILE(_S8("CNSmlDSAgentLog::DeleteStreamL(): begin")); + _LIT( KSQLDeleteDatastoreRow, "DELETE FROM Datastore WHERE DatastoreAID = %d AND DatastoreSID = %d" ); + + HBufC* sqlStatement = HBufC::NewLC( KSQLDeleteDatastoreRow().Length() + 15); + TPtr sqlStatementPtr = sqlStatement->Des(); + + sqlStatementPtr.Format(KSQLDeleteDatastoreRow(), iID, aUid.iUid); + iDatabase.Begin(); + TInt err = iDatabase.Execute(sqlStatementPtr); + if( err < KErrNone ) + { + iDatabase.Rollback(); + } + else + { + iDatabase.Commit(); + } + iDatabase.Compact(); + + CleanupStack::PopAndDestroy(); // sqlStatement + DBG_FILE(_S8("CNSmlDSAgentLog::DeleteStreamL(): end")); + } + +//============================================= +// Delete stream for datastore +//============================================= +EXPORT_C void CNSmlDSAgentLog::DeleteStoreL() + { + DBG_FILE(_S8("CNSmlDSAgentLog::DeleteStoreL(): begin")); + _LIT( KSQLDeleteDatastore, "DELETE FROM Datastore WHERE DatastoreAID = %d" ); + + HBufC* sqlStatement = HBufC::NewLC( KSQLDeleteDatastore().Length() + 15); + TPtr sqlStatementPtr = sqlStatement->Des(); + + sqlStatementPtr.Format(KSQLDeleteDatastore(), iID); + iDatabase.Begin(); + TInt err = iDatabase.Execute(sqlStatementPtr); + if( err < KErrNone ) + { + iDatabase.Rollback(); + } + else + { + iDatabase.Commit(); + } + iDatabase.Compact(); + + CleanupStack::PopAndDestroy(); // sqlStatement + + DBG_FILE(_S8("CNSmlDSAgentLog::DeleteStoreL(): end")); + } + +//============================================= +// Close write stream +//============================================= +EXPORT_C void CNSmlDSAgentLog::CloseWriteStreamL( TBool aCommit ) + { + DBG_FILE(_S8("CNSmlDSAgentLog::CloseWriteStreamL(): begin")); + if( !iWriteStreamOpen ) + { + DBG_FILE(_S8("CNSmlDSAgentLog::CloseWriteStreamL(): end (no writestream open)")); + return; + } + iWs.Close(); + if( aCommit ) + { + // Check OOD before saving + if (SysUtil::FFSSpaceBelowCriticalLevelL(&iFsSession, KNSmlAgentLogFatMinSize)) + { + iWSView.Close(); + iWriteStreamOpen = EFalse; + User::Leave( KErrDiskFull ); + } + iWSView.PutL(); + } + else + { + iWSView.Cancel(); + } + iWSView.Close(); + iWriteStreamOpen = EFalse; + DBG_FILE(_S8("CNSmlDSAgentLog::CloseWriteStreamL(): end")); + } + +//============================================= +// Close read stream +//============================================= +EXPORT_C void CNSmlDSAgentLog::CloseReadStreamL() + { + DBG_FILE(_S8("CNSmlDSAgentLog::CloseReadStreamL(): begin")); + if( !iReadStreamOpen ) + { + return; + } + iRs.Close(); + iRSView.Close(); + iReadStreamOpen = EFalse; + DBG_FILE(_S8("CNSmlDSAgentLog::CloseReadStreamL(): end")); + } + +// + +//End of File