--- /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 <apgcli.h>
+#include <eikenv.h>
+#include <eikappui.h>
+#include <eikdoc.h>
+#include <s32mem.h> // for CBufStore
+#include <s32std.h> // for CStreamDictionary
+#include <AiwGenericParam.h>
+#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.