--- /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;
+ }