diff -r 000000000000 -r d0791faffa3f mtpdataproviders/mtpimagedp/mediasyncserver/src/cmediasyncserversession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mtpdataproviders/mtpimagedp/mediasyncserver/src/cmediasyncserversession.cpp Tue Feb 02 01:11:40 2010 +0200 @@ -0,0 +1,198 @@ +// Copyright (c) 2009 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: +// + +/** + @file + @internalTechnology +*/ + +#include "cmediasyncserversession.h" +#include "cmediasyncserver.h" +#include "cmediasyncdatabase.h" +#include "cmediasyncobserver.h" +#include "cmediasyncdatawriter.h" + +__FLOG_STMT(_LIT8(KComponent,"MediaSyncServerSession");) + +const TInt KDefGlobalSharedHeapSize = 64 * 1024;//64K byte memory +const TInt KReduceFactor = 2; +const TInt KMaxRetryTimes = 3; + +CMediaSyncServerSession::CMediaSyncServerSession(CMediaSyncServer* aServer) : + iServer(aServer), + iAllocated(EFalse) + { + __FLOG_OPEN(KMSSSubsystem, KComponent); + __FLOG(_L8("CMediaSyncServerSession::CMediaSyncServerSession - Entry")); + __FLOG(_L8("CMediaSyncServerSession::CMediaSyncServerSession - Exit")); + } + +/** +Destructor. +*/ +CMediaSyncServerSession::~CMediaSyncServerSession() + { + __FLOG(_L8("CMediaSyncServerSession::~CMediaSyncServerSession - Entry")); + + if (iAllocated) + { + iGlobalSharedHeap.Close(); + } + + __FLOG(_L8("CMediaSyncServerSession::~CMediaSyncServerSession - Exit")); + __FLOG_CLOSE; + } + +// -------------------------------------------------------------------------- +// +// From CSession2, passes the request forward to DispatchMessageL. +// -------------------------------------------------------------------------- +// +void CMediaSyncServerSession::ServiceL(const RMessage2& aMessage) + { + __FLOG_VA((_L8("CMediaSyncServerSession::ServiceL - Function: %d"), aMessage.Function())); + + DispatchMessageL(aMessage); + } + +void CMediaSyncServerSession::DispatchMessageL(const RMessage2& aMessage) + { + __FLOG(_L8("CMediaSyncServerSession::DispatchMessageL - Entry")); + + switch( aMessage.Function() ) + { + case EMediaSyncClientGetGSHHandle: + { + AllocateGlobalSharedHeapL(aMessage); + aMessage.Complete(iGlobalSharedHeap); + } + break; + + case EMediaSyncClientGetChanges: + aMessage.Complete(GetChangesL(aMessage)); + break; + + case EMediaSyncClientRemoveAllRecords: + { + iServer->MediaSyncDatabase()->RemoveAllNotificationsL(); + iGlobalSharedHeap.Close(); + iAllocated = EFalse; + aMessage.Complete(KErrNone); + } + break; + + case EMediaSyncClientEnableMonitor: + iServer->MediaSyncObserver()->SubscribeForChangeNotificationL(); + aMessage.Complete(KErrNone); + break; + + case EMediaSyncClientDisableMonitor: + iServer->MediaSyncObserver()->UnsubscribeForChangeNotificationL(); + aMessage.Complete(KErrNone); + break; + + case EMediaSyncClientNeedFullSync: + aMessage.Complete(GetFullSyncFlag(aMessage)); + break; + + case EMediaSyncClientClearFullSync: + iServer->ClearFullSyncFlag(); + aMessage.Complete(KErrNone); + break; + + case EMediaSyncClientShutdown: + CActiveScheduler::Stop(); + aMessage.Complete(KErrNone); + break; + + default: + aMessage.Panic(KMediaSyncClientPanicCategory, EBadRequest); + break; + } + + __FLOG(_L8("CMediaSyncServerSession::DispatchMessageL - Exit")); + } + +void CMediaSyncServerSession::AllocateGlobalSharedHeapL(const RMessage2& aMessage) + { + __FLOG(_L8("CMediaSyncServerSession::AllocateGlobalSharedHeapL - Entry")); + + if (!iAllocated) + { + TInt attemptedSize = aMessage.Int0(); + if (attemptedSize > KDefGlobalSharedHeapSize || attemptedSize <= 0) + { + attemptedSize = KDefGlobalSharedHeapSize; + } + + TInt retryCount = KMaxRetryTimes; + TInt redFactor = KReduceFactor; + TInt result = KErrNone; + + for (; retryCount > 0; retryCount--) + { + result = iGlobalSharedHeap.CreateGlobal(KNullDesC, attemptedSize, attemptedSize); + + if (result == KErrNone) + { + // We have succesfully allocated a GSH + break; + } + else + { + // Reduce the size of the GSH by a scale factor + attemptedSize = attemptedSize / redFactor; + } + } + + User::LeaveIfError(result); + iAllocated = ETrue; + } + + __FLOG(_L8("CMediaSyncServerSession::AllocateGlobalSharedHeapL - Exit")); + } + +TInt CMediaSyncServerSession::GetChangesL(const RMessage2& aMessage) + { + __FLOG(_L8("CMediaSyncServerSession::GetChangesL - Entry")); + + TInt maxFetchCount = aMessage.Int0(); + CMediaSyncDataWriter* writer = CMediaSyncDataWriter::NewLC(iGlobalSharedHeap); + TBool finished = EFalse; + + iServer->MediaSyncDatabase()->FetchNotificationsL(*writer, maxFetchCount, finished); + TPtr8 finishPtr((TUint8*)&finished, sizeof(TBool), sizeof(TBool)); + + aMessage.Write(1, finishPtr); + + CleanupStack::PopAndDestroy(writer); + + __FLOG(_L8("CMediaSyncServerSession::GetChangesL - Exit")); + + return KErrNone; + } + +TInt CMediaSyncServerSession::GetFullSyncFlag(const RMessage2& aMessage) + { + __FLOG(_L8("CMediaSyncServerSession::GetFullSyncFlagL - Entry")); + + TBool needFullSync = iServer->NeedFullSync(); + TPtr8 finishPtr((TUint8*)&needFullSync, sizeof(TBool), sizeof(TBool)); + aMessage.Write(0, finishPtr); + + __FLOG(_L8("CMediaSyncServerSession::GetFullSyncFlagL - Exit")); + + return KErrNone; + }