diff -r 000000000000 -r b497e44ab2fc syncmlfw/ds/adapterlog/src/NSmlAdapterLog.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/syncmlfw/ds/adapterlog/src/NSmlAdapterLog.cpp Thu Dec 17 09:07:52 2009 +0200 @@ -0,0 +1,413 @@ +/* +* 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: AdapterLog source +* +*/ + + + +// INCLUDE FILES +#include +#include +#include + +#include +#include +#include +#include "NSmlAdapterLog.h" + + +// STATIC CONSTANTS +const TInt CNSmlAdapterLog::KMaxPathLength; + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CNSmlAdapterLog::CNSmlAdapterLog +// C++ default constructor. +// ----------------------------------------------------------------------------- +// +CNSmlAdapterLog::CNSmlAdapterLog() + { + } + +// ----------------------------------------------------------------------------- +// CNSmlAdapterLog::ConstructL +// Symbian 2nd phase constructor. +// ----------------------------------------------------------------------------- +// +void CNSmlAdapterLog::ConstructL() + { + User::LeaveIfError(iFsSession.Connect()); + User::LeaveIfError(iRdbSession.Connect()); + + iPath = HBufC::NewL(CNSmlAdapterLog::KMaxPathLength); + TPtr path = iPath->Des(); + + User::LeaveIfError(iFsSession.SetSessionToPrivate(KNSmlAdapterLogDrive)); + User::LeaveIfError(iFsSession.SessionPath(path)); + + BaflUtils::EnsurePathExistsL(iFsSession, *iPath); + delete iPath; + iPath = NULL; + + TParse name; + +#ifdef SYMBIAN_SECURE_DBMS + name.Set(KNSmlAdapterLogDbName(), NULL, NULL); +#else + name.Set(KNSmlAdapterLogDbName(), KNSmlDatabasesNonSecurePath, NULL); +#endif + TInt err(KErrNone); + RProcess currentProcess; + const TSecureId secureId = currentProcess.SecureId(); + currentProcess.Close(); + if ( secureId.iId == KNSmlDSHostRWServerSecureID.iId ) + { + err = iDatabase.Open(iRdbSession, + name.FullName(), KNSmlDBMSSecureDSHostRWID); + if ( err == KErrNotFound ) + { + CreateDatabaseL(name.FullName()); + err = iDatabase.Open(iRdbSession, + name.FullName(), KNSmlDBMSSecureDSHostRWID); + } + } + else if (secureId.iId == KNSmlDSHostNULLServerSecureID.iId) + { + err = iDatabase.Open(iRdbSession, + name.FullName(), KNSmlDBMSSecureDSHostNULLID); + if ( err == KErrNotFound ) + { + CreateDatabaseL(name.FullName()); + err = iDatabase.Open(iRdbSession, name.FullName(), + KNSmlDBMSSecureDSHostNULLID); + + } + } + else + { + User::Leave( KErrAccessDenied ); + } + + User::LeaveIfError(err); + User::LeaveIfError(iTable.Open(iDatabase, KNSmlTableAdapterLog)); + iColSet = iTable.ColSetL(); + } + +// ----------------------------------------------------------------------------- +// CNSmlAdapterLog::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CNSmlAdapterLog* CNSmlAdapterLog::NewL() + { + CNSmlAdapterLog* self = CNSmlAdapterLog::NewLC(); + CleanupStack::Pop(self); + + return self; + } + +// ----------------------------------------------------------------------------- +// CNSmlAdapterLog::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CNSmlAdapterLog* CNSmlAdapterLog::NewLC() + { + CNSmlAdapterLog* self = new (ELeave) CNSmlAdapterLog; + CleanupStack::PushL(self); + self->ConstructL(); + + return self; + } + +// ----------------------------------------------------------------------------- +// CNSmlAdapterLog::~CNSmlAdapterLog() +// Destructor +// ----------------------------------------------------------------------------- +CNSmlAdapterLog::~CNSmlAdapterLog() + { + delete iPath; + + if (iDictionaryStore) + { + iDictionaryStore->Commit(); + delete iDictionaryStore; + } + + iView.Close(); + delete iColSet; + + iTable.Close(); + iDatabase.Close(); + iFsSession.Close(); + iRdbSession.Close(); + } + +// ----------------------------------------------------------------------------- +// CNSmlAdapterLog::SetAdapterLogKeyL +// Sets the sync relationship key. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CNSmlAdapterLog::SetAdapterLogKeyL( + const TInt aImplUid, const TDesC& aLocalDB, + const TDesC& aServerId, const TDesC& aRemoteDB) + { + HBufC* sql = HBufC::NewLC(KSqlGetAdapterLogRow().Length() + 5 + + aLocalDB.Length() + aServerId.Length() + aRemoteDB.Length()); + + TPtr tmp = sql->Des(); + tmp.Format(KSqlGetAdapterLogRow, aImplUid, &aLocalDB, &aServerId, + &aRemoteDB); + + iView.Close(); + User::LeaveIfError(iView.Prepare(iDatabase, TDbQuery(*sql), + RDbView::/*TAccess::*/EUpdatable)); + + if (iView.FirstL()) + { + // existing row + iView.GetL(); + iID = iView.ColInt(iColSet->ColNo(KNSmlAdapterLogId)); + } + else + { + // new row + iID = GenerateIdL(); + iDatabase.Begin(); + iView.InsertL(); + iView.SetColL(iColSet->ColNo(KNSmlAdapterLogId), iID); + iView.SetColL(iColSet->ColNo(KNSmlAdapterLogImplementationUID), aImplUid); + iView.SetColL(iColSet->ColNo(KNSmlAdapterLogLocalDatabase), aLocalDB); + iView.SetColL(iColSet->ColNo(KNSmlAdapterLogServerId), aServerId); + iView.SetColL(iColSet->ColNo(KNSmlAdapterLogRemoteDatabase), aRemoteDB); + iView.PutL(); + iDatabase.Commit(); + iDatabase.Compact(); + } + + CleanupStack::PopAndDestroy(sql); + + OpenDictionaryStoreL(); + } + +// ----------------------------------------------------------------------------- +// CNSmlAdapterLog::SetServerIdL +// Sets server id. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CNSmlAdapterLog::SetServerIdL( TDesC& aOldServerId, TDesC& aNewValue ) + { + HBufC* sql = HBufC::NewLC( KSqlGetAdapterLogRowFromServerId().Length() + aOldServerId.Length() ); + + TPtr tmp = sql->Des(); + tmp.Format( KSqlGetAdapterLogRowFromServerId, &aOldServerId ); + + iView.Close(); + User::LeaveIfError( iView.Prepare( iDatabase, TDbQuery(*sql), + RDbView::EUpdatable ) ); + iDatabase.Begin(); + if ( iView.FirstL() ) + { + //existing row + iView.GetL(); + iView.UpdateL(); + iView.SetColL( iColSet->ColNo( KNSmlAdapterLogServerId ), aNewValue ); + iView.PutL(); + + iDatabase.Commit(); + iDatabase.Compact(); + } + + CleanupStack::PopAndDestroy( sql ); + } + +// ----------------------------------------------------------------------------- +// CNSmlAdapterLog::SyncTaskKey +// Returns the unique identifier for the synchronization relationship. The +// default value for the identifier (zero) is returned, if the adapter log key +// has not been set. +// ----------------------------------------------------------------------------- +// +EXPORT_C TSmlSyncTaskKey CNSmlAdapterLog::SyncTaskKey() const + { + return static_cast(iID); + } + +// ----------------------------------------------------------------------------- +// CNSmlAdapterLog::OpenReadStreamLC +// Opens the dictionary stream associated with the given UID, leaving the +// cleanup item on cleanup stack. The adapter log key has to be set before this +// method can be used. Method leaves, if association with a stream and the +// given uid does not exist in the store. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CNSmlAdapterLog::OpenReadStreamLC(RReadStream& aReadStream, + TUid aStreamUid) + { + if (!IsStreamPresentL(aStreamUid)) + { + User::Leave(KErrNotFound); + } + + static_cast(aReadStream).OpenLC( + *iDictionaryStore, aStreamUid); + } + +// ----------------------------------------------------------------------------- +// CNSmlAdapterLog::OpenWriteStreamLC +// Opens the dictionary stream associated with the given UID, leaving the +// cleanup item on cleanup stack. If no stream is associated with the UID, new +// stream is created with association to given UID. The adapter log key has to +// be set before this method can be used. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CNSmlAdapterLog::OpenWriteStreamLC(RWriteStream& aWriteStream, + TUid aStreamUid) + { + if (iID == NULL) + { + User::Leave(KErrNotFound); + } + + static_cast(aWriteStream).AssignLC( + *iDictionaryStore, aStreamUid); + } + +// ----------------------------------------------------------------------------- +// CNSmlAdapterLog::IsStreamPresentL +// Checks if a stream associated with given UID is present in the opened +// dictionary store. The adapter log key has to be set before this +// method can be used. +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CNSmlAdapterLog::IsStreamPresentL(TUid aStreamUid) const + { + if (iID == NULL) + { + User::Leave(KErrNotFound); + } + + return iDictionaryStore->IsPresentL(aStreamUid); + } + +// ----------------------------------------------------------------------------- +// CNSmlAdapterLog::CreateDatabaseL +// Creates new database with AdapterLog table in the specified file. +// ----------------------------------------------------------------------------- +// +void CNSmlAdapterLog::CreateDatabaseL(const TDesC& aFullName) + { + _LIT(KCreateAdapterLogTable, "CREATE TABLE AdapterLog (Id \ + INTEGER NOT NULL, ImplementationUID INTEGER NOT NULL, LocalDatabase CHAR(%d) \ + NOT NULL, ServerId CHAR(%d), RemoteDatabase CHAR(%d) NOT NULL)"); + + HBufC* createAdapterLogTable = + HBufC::NewLC(KCreateAdapterLogTable().Length() + 20); + + TPtr AdapterLogTablePtr = createAdapterLogTable->Des(); + + AdapterLogTablePtr.Format(KCreateAdapterLogTable, KNSmlMaxDataLength, + KNSmlMaxServerIdLength, KNSmlMaxRemoteNameLength); + + RProcess currentProcess; + const TSecureId secureId = currentProcess.SecureId(); + currentProcess.Close(); + if ( secureId.iId == KNSmlDSHostRWServerSecureID.iId ) + { + User::LeaveIfError(iDatabase.Create(iRdbSession, + aFullName, + KNSmlDBMSSecureDSHostRWID)); + } + else if (secureId.iId == KNSmlDSHostNULLServerSecureID.iId) + { + User::LeaveIfError(iDatabase.Create(iRdbSession, + aFullName, + KNSmlDBMSSecureDSHostNULLID)); + } + else + { + User::Leave( KErrAccessDenied ); + } + iDatabase.Begin(); + iDatabase.Execute(*createAdapterLogTable); + iDatabase.Commit(); + iDatabase.Compact(); + iDatabase.Close(); + + CleanupStack::PopAndDestroy(createAdapterLogTable); + } + +// ----------------------------------------------------------------------------- +// CNSmlAdapterLog::GenerateIdL +// Generates a unique identifier for the table by searching the adapter log ID +// with highest value and increments it. +// ----------------------------------------------------------------------------- +// +TInt CNSmlAdapterLog::GenerateIdL() + { + TInt highestKey(0); + if (iTable.LastL()) + { + TInt currentKey(0); + do + { + iTable.GetL(); + currentKey = iTable.ColInt(iColSet->ColNo(KNSmlAdapterLogId)); + if (highestKey < currentKey) + { + highestKey = currentKey; + } + } + while (iTable.PreviousL()); + } + return highestKey + 1; + } + +// ----------------------------------------------------------------------------- +// CNSmlAdapterLog::OpenDictionaryStoreL +// Opens the dictionary file store associated with the adapter log ID. +// If dictionary store has already been opened, method establishes new commit +// point for opened store and closes the store before opening another. +// ----------------------------------------------------------------------------- +// +void CNSmlAdapterLog::OpenDictionaryStoreL() + { + if (iDictionaryStore) + { + iDictionaryStore->CommitL(); + delete iDictionaryStore; + iDictionaryStore = NULL; + } + + HBufC* storeName = HBufC::NewLC(KNSmlAdapterLogStore().Length() + 10); + TPtr tmp = storeName->Des(); + tmp.Format(KNSmlAdapterLogStore(), iID); + + iPath = HBufC::NewL(CNSmlAdapterLog::KMaxPathLength); + TPtr path = iPath->Des(); + + TParse file; + User::LeaveIfError(file.Set(*storeName, iPath, NULL)); + + iDictionaryStore = CDictionaryFileStore::OpenL(iFsSession, file.FullName(), + TUid::Uid(iID)); + + CleanupStack::PopAndDestroy(storeName); + } + + +// End of File