diff -r 000000000000 -r 2f259fa3e83a uifw/AvKon/src/AknOpenFileService.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/AvKon/src/AknOpenFileService.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,406 @@ +/* +* Copyright (c) 2004 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: Server applications framework: Open file service + * + * +*/ + + +#include +#include +#include +#include +#include // for CBufStore +#include // for CStreamDictionary +#include +#include "AknOpenFileServiceImpl.h" + +const TUid KUidEmbedInputStream = { 0x1000 }; +// const TUid KUidEmbedOutputStream = { 0x2000 }; + +// --------------------------------------------------------- +// +// --------------------------------------------------------- +// +void RAknOpenFileService::OpenFileNameL(const TDesC& aFileName) + { + TInt err = SendReceive(EAknOpenFileServiceCmdOpenFilename, TIpcArgs(&aFileName)); + User::LeaveIfError(err); + } + +// --------------------------------------------------------- +// +// --------------------------------------------------------- +// +void RAknOpenFileService::OpenFileNameL(const TDesC& aFileName, CAiwGenericParamList* aParam) + { + TIpcArgs args; + HBufC8* buf = aParam->PackForServerL(args); // packs params 0 and 1. + + // pack more params. + args.Set(2, &aFileName); + + TInt err = SendReceive(EAknOpenFileServiceCmdOpenFilenameWithParams, args); + + delete buf; + + User::LeaveIfError(err); + } + +// --------------------------------------------------------- +// +// --------------------------------------------------------- +// +void RAknOpenFileService::OpenHandleL(const RFile& aFile, CAiwGenericParamList* aParam) + { + TAiwVariant filehandle(aFile); + TAiwGenericParam param(EGenericParamInternalFile, filehandle); + aParam->AppendL(param); + + TIpcArgs args; + HBufC8* buf = aParam->PackForServerL(args); // packs params 0 and 1. + + TInt err = SendReceive(EAknOpenFileServiceCmdOpenHandleWithParams, args); + + delete buf; + + User::LeaveIfError(err); + } + +// --------------------------------------------------------- +// +// --------------------------------------------------------- +// +TUid RAknOpenFileService::ServiceUid() const + { + return KAknOpenFileServiceUid; + } + + + +// --------------------------------------------------------- +// +// --------------------------------------------------------- +// +CAknOpenFileServiceSession::CAknOpenFileServiceSession() +: iDoc(CEikonEnv::Static()->EikAppUi()->Document()) + { + } + +// --------------------------------------------------------- +// +// --------------------------------------------------------- +// +CAknOpenFileServiceSession::~CAknOpenFileServiceSession() + { + delete iStore; + delete iDictionary; + } + +// --------------------------------------------------------- +// +// --------------------------------------------------------- +// +void CAknOpenFileServiceSession::CreateL() + { + CAknAppServiceBase::CreateL(); + } + +// --------------------------------------------------------- +// +// --------------------------------------------------------- +// +void CAknOpenFileServiceSession::ServiceL(const RMessage2& aMessage) + { + switch (aMessage.Function()) + { + case EAknOpenFileServiceCmdOpenFilename: + OpenFileNameL(aMessage); + break; + + case EAknOpenFileServiceCmdOpenFilenameWithParams: + OpenFileNameWithParamsL(aMessage); + break; + + case EAknOpenFileServiceCmdOpenHandleWithParams: + OpenHandleWithParamsL(aMessage); + break; + + default: + CAknAppServiceBase::ServiceL(aMessage); + break; + } + } + +// --------------------------------------------------------- +// +// --------------------------------------------------------- +// +void CAknOpenFileServiceSession::ServiceError(const RMessage2& aMessage,TInt aError) + { + CAknAppServiceBase::ServiceError(aMessage, aError); + } + +// --------------------------------------------------------- +// +// --------------------------------------------------------- +// +void CAknOpenFileServiceSession::OpenFileNameL(const RMessage2& aMessage) + { + CAiwGenericParamList* paramList = CAiwGenericParamList::NewLC(); + + TSecureId clientSid = aMessage.SecureId(); + TAiwVariant clientAppUid((TUid)clientSid); + TAiwGenericParam uid(EGenericParamApplication, clientAppUid); + paramList->AppendL(uid); + + ExternalizeParamsL(paramList); + + CleanupStack::PopAndDestroy(); // paramList + + TFileName fileName; + aMessage.Read(0, fileName); + + iDoc->OpenFileL(ETrue, fileName, CEikonEnv::Static()->FsSession()); + + aMessage.Complete(KErrNone); + } + +// --------------------------------------------------------- +// +// --------------------------------------------------------- +// +void CAknOpenFileServiceSession::OpenFileNameWithParamsL(const RMessage2& aMessage) + { + CAiwGenericParamList* paramList = CAiwGenericParamList::NewLC(); + paramList->UnpackFromClientL(aMessage); + + TSecureId clientSid = aMessage.SecureId(); + TAiwVariant clientAppUid((TUid)clientSid); + TAiwGenericParam uid(EGenericParamApplication, clientAppUid); + paramList->AppendL(uid); + + ExternalizeParamsL(paramList); + + CleanupStack::PopAndDestroy(); // paramList + + TFileName fileName; + aMessage.Read(2, fileName); + + iDoc->OpenFileL(ETrue, fileName, CEikonEnv::Static()->FsSession()); + + aMessage.Complete(KErrNone); + } + + +// --------------------------------------------------------- +// +// --------------------------------------------------------- +// +void CAknOpenFileServiceSession::OpenHandleWithParamsL(const RMessage2& aMessage) + { + CAiwGenericParamList* paramList = CAiwGenericParamList::NewLC(); + paramList->UnpackFromClientL(aMessage); + + TSecureId clientSid = aMessage.SecureId(); + TAiwVariant clientAppUid((TUid)clientSid); + TAiwGenericParam uid(EGenericParamApplication, clientAppUid); + paramList->AppendL(uid); + + RFile fileHandle; + TInt index = 0; + const TAiwGenericParam* param = NULL; + + param = paramList->FindFirst(index, EGenericParamInternalFile, EVariantTypeFileHandle); + + if (index >= 0 && param) + { + param->Value().Get(fileHandle); + paramList->Remove(EGenericParamInternalFile); + } + + ExternalizeParamsL(paramList); + + CleanupStack::PopAndDestroy(); // paramList + + CFileStore* filestore=NULL; + iDoc->OpenFileL(filestore,fileHandle); + + aMessage.Complete(KErrNone); + } + +// --------------------------------------------------------- +// +// --------------------------------------------------------- +// +void CAknOpenFileServiceSession::ExternalizeParamsL(CAiwGenericParamList* aParamList) + { + // Create an in-memory store of parameters. + delete iStore; + iStore = NULL; + iStore = CBufStore::NewL(127); + + RStoreWriteStream outStream; + iStreamId = outStream.CreateLC(*iStore); + aParamList->ExternalizeL(outStream); + iStore->CommitL(); + CleanupStack::PopAndDestroy(); // outStream + + delete iDictionary; + iDictionary = NULL; + iDictionary = CStreamDictionary::NewL(); + + iDictionary->AssignL(KUidEmbedInputStream, iStreamId); + outStream.CreateLC(*iStore); + iDictionary->ExternalizeL(outStream); + iStore->CommitL(); + CleanupStack::PopAndDestroy(); // outstream + + RStoreReadStream readStream; + readStream.OpenLC(*iStore, iStreamId); + iDoc->RestoreL(*iStore, *iDictionary); + CleanupStack::PopAndDestroy(); // readStream + } + + +// --------------------------------------------------------- +// +// --------------------------------------------------------- +// +EXPORT_C CAknOpenFileService* CAknOpenFileService::NewL( + const TDesC& aFileName, MAknServerAppExitObserver* aObserver, CAiwGenericParamList* aParam) + { + CAknOpenFileService* self = NewLC(aFileName, aObserver, aParam); + CleanupStack::Pop(self); + return self; + } + +// --------------------------------------------------------- +// +// --------------------------------------------------------- +// +CAknOpenFileService* CAknOpenFileService::NewLC( + const TDesC& aFileName, MAknServerAppExitObserver* aObserver, CAiwGenericParamList* aParam) + { + CAknOpenFileServiceImpl* self = new (ELeave) CAknOpenFileServiceImpl(); + CleanupStack::PushL(self); + self->ConstructL(aFileName, aObserver, aParam); + return self; + } + +// --------------------------------------------------------- +// +// --------------------------------------------------------- +// +EXPORT_C CAknOpenFileService* CAknOpenFileService::NewL( + const TUid& aAppUid, const RFile& aFileHandle, MAknServerAppExitObserver* aObserver, CAiwGenericParamList* aParam) + { + CAknOpenFileService* self = NewLC(aAppUid, aFileHandle, aObserver, aParam); + CleanupStack::Pop(self); + return self; + } + + +// --------------------------------------------------------- +// +// --------------------------------------------------------- +// +CAknOpenFileService* CAknOpenFileService::NewLC( + const TUid& aAppUid, const RFile& aFileHandle, MAknServerAppExitObserver* aObserver, CAiwGenericParamList* aParam) + { + CAknOpenFileServiceImpl* self = new (ELeave) CAknOpenFileServiceImpl(); + CleanupStack::PushL(self); + self->ConstructL(aAppUid, aFileHandle, aObserver, aParam); + return self; + } + +// --------------------------------------------------------- +// +// --------------------------------------------------------- +// +CAknOpenFileServiceImpl::CAknOpenFileServiceImpl() + { + } + +// --------------------------------------------------------- +// +// --------------------------------------------------------- +// +CAknOpenFileServiceImpl::~CAknOpenFileServiceImpl() + { + delete iMonitor; + iService.Close(); + } + +// --------------------------------------------------------- +// +// --------------------------------------------------------- +// +void CAknOpenFileServiceImpl::ConstructL( + const TDesC& aFileName, MAknServerAppExitObserver* aObserver, CAiwGenericParamList* aParam) + { + TUid app = FindAppForFileL(aFileName); + iService.ConnectChainedAppL(app); + + if (aObserver) + { + iMonitor = CApaServerAppExitMonitor::NewL(iService, *aObserver, EActivePriorityRedrawEvents+1); // priority used to get exit messages before the client app redraws + } + + if (aParam && aParam->Count()) + { + iService.OpenFileNameL(aFileName, aParam); + } + else + { + iService.OpenFileNameL(aFileName); + } + } + +// --------------------------------------------------------- +// +// --------------------------------------------------------- +// +void CAknOpenFileServiceImpl::ConstructL( + const TUid& aAppUid, const RFile& aFileHandle, MAknServerAppExitObserver* aObserver, CAiwGenericParamList* aParam) + { + iService.ConnectChainedAppL(aAppUid); + + if (aObserver) + { + iMonitor = CApaServerAppExitMonitor::NewL(iService, *aObserver, EActivePriorityRedrawEvents+1); // priority used to get exit messages before the client app redraws + } + + iService.OpenHandleL(aFileHandle, aParam); + } + +// --------------------------------------------------------- +// +// --------------------------------------------------------- +// +TUid CAknOpenFileServiceImpl::FindAppForFileL(const TDesC& aFileName) + { + TUid uid; + TDataType type; + + RApaLsSession ls; + User::LeaveIfError(ls.Connect()); + CleanupClosePushL(ls); + User::LeaveIfError(ls.AppForDocument(aFileName, uid, type)); + CleanupStack::PopAndDestroy(&ls); + + return uid; + } + +// End of file.