diff -r 000000000000 -r d0791faffa3f mtpdataproviders/mtpimagedp/mediasyncserver/src/rmediasyncserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mtpdataproviders/mtpimagedp/mediasyncserver/src/rmediasyncserver.cpp Tue Feb 02 01:11:40 2010 +0200 @@ -0,0 +1,262 @@ +// 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 + +#include "rmediasyncserver.h" + +const TInt KDefGlobalSharedHeapSize = 64 * 1024;//64K byte memory + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// +EXPORT_C RMediaSyncServer::RMediaSyncServer() : + iHasSharedHeap(EFalse) + { + } + +EXPORT_C TInt RMediaSyncServer::Startup() + { + const TUidType serverUid(KNullUid, KNullUid, KMediaSyncServerUid3); + + // Create the server process. + RProcess server; + TInt err(server.Create(KMediaSyncServerName, KNullDesC, serverUid)); + + // Loading failed. + if ( err != KErrNone ) + { + return err; + } + + TRequestStatus status; + server.Rendezvous(status); + + if (status != KRequestPending) + { + server.Kill(0); // abort startup + server.Close(); + return KErrGeneral; + } + else + { + server.Resume(); // Logon OK - start the server. + } + + User::WaitForRequest(status); + server.Close(); + + return status.Int(); + } + +EXPORT_C void RMediaSyncServer::Shutdown() + { + SendReceive(EMediaSyncClientShutdown); + } + +EXPORT_C TInt RMediaSyncServer::Connect() + { + TFindProcess findMdEServer(KFinderMSSName); + TFullName name; + TInt result = findMdEServer.Next(name); + if(result == KErrNotFound) + { + // Server is not running + result = Startup(); + } + else if(KErrNone == result) + { + RProcess mss; + result = mss.Open(findMdEServer, EOwnerProcess); + if((result != KErrNone) && (mss.ExitReason() != KErrNone)) + { + result = Startup(); + } + mss.Close(); + } + + if(KErrNone == result) + { + TVersion version(KMediaSyncServerVersionMajor, KMediaSyncServerVersionMinor, 0); + result = CreateSession( KMediaSyncServerName, version ); + } + + return result; + } + +EXPORT_C void RMediaSyncServer::Close() + { + RSessionBase::Close(); + + if (iHasSharedHeap) + { + iGlobalSharedHeap.Close(); + iHasSharedHeap = EFalse; + } + } + +EXPORT_C TInt RMediaSyncServer::NeedFullSync(TBool& aNeedFullSync) + { + TPtr8 finishPtr((TUint8*)&aNeedFullSync, sizeof(TBool), sizeof(TBool)); + + TIpcArgs args; + args.Set(0, &finishPtr); + + return SendReceive(EMediaSyncClientNeedFullSync, args); + } + +EXPORT_C TInt RMediaSyncServer::ClearFullSync() + { + return SendReceive(EMediaSyncClientClearFullSync); + } + +EXPORT_C void RMediaSyncServer::GetChangesL(CMediaSyncDataReader*& aDataReader, TBool& aIsFinished, TRequestStatus& aStatus, TInt aMaxFetchCount) + { + if (!iHasSharedHeap) + { + User::LeaveIfError(GetGlobalSharedHeapHandle()); + iHasSharedHeap = ETrue; + } + + TPtr8 finishPtr((TUint8*)&aIsFinished, sizeof(TBool), sizeof(TBool)); + + TIpcArgs args; + args.Set(0, aMaxFetchCount); + args.Set(1, &finishPtr); + + TInt ret = SendReceive(EMediaSyncClientGetChanges, args); + User::LeaveIfError(ret); + + aDataReader = CMediaSyncDataReader::NewL(iGlobalSharedHeap); + + TRequestStatus* pClient = &aStatus; + User::RequestComplete(pClient, ret); + } + +EXPORT_C void RMediaSyncServer::RemoveAllRecords() + { + SendReceive(EMediaSyncClientRemoveAllRecords); + RelaseGlobalSharedHeap(); + return; + } + +EXPORT_C TInt RMediaSyncServer::EnableMonitor() + { + return SendReceive(EMediaSyncClientEnableMonitor); + } + +EXPORT_C TInt RMediaSyncServer::DisableMonitor() + { + return SendReceive(EMediaSyncClientDisableMonitor); + } + +TInt RMediaSyncServer::GetGlobalSharedHeapHandle() + { + TIpcArgs args; + args.Set(0, KDefGlobalSharedHeapSize); + + TInt ret = SendReceive(EMediaSyncClientGetGSHHandle, args); + ret = iGlobalSharedHeap.SetReturnedHandle(ret); + + return ret; + } + +void RMediaSyncServer::RelaseGlobalSharedHeap() + { + iGlobalSharedHeap.Close(); + iHasSharedHeap = EFalse; + } + +CMediaSyncDataReader* CMediaSyncDataReader::NewL(const RChunk& aChunk) + { + CMediaSyncDataReader* self = new(ELeave) CMediaSyncDataReader(); + CleanupStack::PushL(self); + self->ConstructL(aChunk); + CleanupStack::Pop(self); + return self; + } + +EXPORT_C CMediaSyncDataReader::~CMediaSyncDataReader() + { + + } + +CMediaSyncDataReader::CMediaSyncDataReader() : + iOffset(0), + iCurrentIdx(0) + { + + } + +void CMediaSyncDataReader::ConstructL(const RChunk& aChunk) + { + TUint8* base = aChunk.Base(); + User::LeaveIfNull(base); + + iHeaderInfo = reinterpret_cast(base); + iReadBase = base + sizeof(TDataHeaderInfo); + } + +EXPORT_C TInt CMediaSyncDataReader::Count() + { + return iHeaderInfo->iCount; + } + +EXPORT_C TBool CMediaSyncDataReader::HasNext() + { + return (iCurrentIdx < iHeaderInfo->iCount); + } + +EXPORT_C void CMediaSyncDataReader::GetNextL(TUint32& aObjectId, TUint8& aType, TPtr16& aUri) + { + if (iCurrentIdx < iHeaderInfo->iCount) + { + //read object id + Mem::Copy(&aObjectId, (iReadBase + iOffset), sizeof(TUint32)); + iOffset += sizeof(TUint32); + + //read notification type + Mem::Copy(&aType, (iReadBase + iOffset), sizeof(TUint8)); + iOffset += sizeof(TUint8); + + //read uri length + TUint8 uriLen = 0; + Mem::Copy(&uriLen, (iReadBase + iOffset), sizeof(TUint8)); + iOffset += sizeof(TUint8); + if (uriLen > 0) + { + //read uri content + TUint16* ptr = (TUint16*)(iReadBase + iOffset); + aUri.Set(ptr, uriLen, uriLen); + iOffset += (uriLen * sizeof(TUint16)); + } + else + { + aUri.Set(NULL, 0, 0); + } + + ++iCurrentIdx; + } + else + { + User::Leave(KErrOverflow); + } + }