--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/appfw/apparchitecture/tef/TSTAPP.CPP Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,410 @@
+// Copyright (c) 2007-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:
+// tstapp.cpp
+//
+
+/**
+ @file tstapp.cpp
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+#include <e32uid.h>
+#include <s32std.h>
+#include <s32stor.h>
+#include <s32file.h>
+#include <apgicnfl.h>
+#include "apfdef.h"
+#include "tstapp.h"
+#include <apgcli.h>
+
+#include <eikstart.h>
+#include <ecom/ecom.h>
+#include <ecom/implementationproxy.h>
+
+_LIT(KTestAppCaption, "Test App");
+_LIT(KTempFilePath, "c:\\system\\temp\\");
+_LIT(KTestAppIniFilePath, "c:\\system\\data\\tstapp.ini");
+
+
+GLDEF_C TInt E32Dll(
+ )
+ {
+ return KErrNone;
+ }
+
+LOCAL_C CApaApplication* NewApplicationL()
+ {
+ CApaApplication* thing=NULL;
+ thing=CTestApp::NewL();
+ return thing;
+ //return new CExampleApplication;
+ }
+
+LOCAL_D const TImplementationProxy ImplementationTable[]=
+ {
+ IMPLEMENTATION_PROXY_ENTRY(KTestAppUidValue, NewApplicationL)
+ };
+
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
+ {
+ aTableCount=sizeof(ImplementationTable)/sizeof(ImplementationTable[0]);
+ return ImplementationTable;
+ }
+
+
+//
+// CBasicAppUi
+//
+
+void CBasicAppUi::ConstructL()
+ {
+ BaseConstructL(ENoAppResourceFile|ENoScreenFurniture);
+ }
+
+//
+// CTestApp
+//
+
+CTestApp* CTestApp::NewL()
+// The gated function
+//
+ {
+ CTestApp* self=new(ELeave) CTestApp();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+
+CTestApp::CTestApp()
+ :iCaption(KTestAppCaption)
+ {}
+
+
+CTestApp::~CTestApp()
+ {
+ }
+
+void CTestApp::ConstructL()
+ {
+ User::LeaveIfError(iFs.Connect());
+ }
+
+
+void CTestApp::PreDocConstructL()
+ {
+ }
+
+
+CEikDocument* CTestApp::CreateDocumentL()
+ {
+ return CTestAppDoc::NewL(*this);
+ }
+
+TDesC& CTestApp::Caption()
+// return the app title in current system language
+//
+ {
+ return iCaption;
+ }
+
+
+TUid CTestApp::AppDllUid()const
+ {
+ return KUidTestApp;
+ }
+
+CDictionaryStore* CTestApp::OpenIniFileLC(RFs& aFs) const
+// Opens the applications ini file if it exists, otherwise creates a new one
+// The ini file is located on KTestAppIniFilePath
+ {
+ aFs.MkDirAll(KTestAppIniFilePath); // ignore the error
+ //
+ // open the ini file if it exists, otherwise create a new one
+ return CDictionaryFileStore::OpenLC(aFs, KTestAppIniFilePath(), AppDllUid());
+ }
+
+
+void CTestApp::Capability(TDes8& aInfo)const
+ {
+ RApaLsSession apaLsSession;
+ TInt err = apaLsSession.Connect();
+ __ASSERT_ALWAYS(!err, User::Panic(_L("CTestApp::Capability"), err));
+ apaLsSession.GetAppCapability(aInfo, CTestApp::AppDllUid());
+ apaLsSession.Close();
+ }
+
+
+//
+// CTestAppDoc
+//
+
+CTestAppDoc* CTestAppDoc::NewL(CEikApplication& aApp)
+ {
+ CTestAppDoc* self=new(ELeave) CTestAppDoc(aApp);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+
+CTestAppDoc::CTestAppDoc(CEikApplication& aApp)
+ : CEikDocument(aApp),
+ iValue(0)
+ {}
+
+
+void CTestAppDoc::ConstructL()
+ {
+ iEmbedList = new(ELeave) CArrayFixFlat<TPictureHeader>(1);
+ }
+
+CEikAppUi* CTestAppDoc::CreateAppUiL()
+ {
+
+ return new(ELeave) CBasicAppUi();
+ }
+
+CTestAppDoc::~CTestAppDoc()
+ {
+ // delete all the embedded doc's first...
+ if (iEmbedList)
+ {
+ for (TInt i=iEmbedList->Count()-1 ; i>=0 ; i--)
+ delete EmbeddedDoor(i); // destroys the door (which in turn removes doc from the process and deletes it)
+ }
+ // then...
+ delete iEmbedList;
+ delete iStore;
+ }
+
+
+TBool CTestAppDoc::IsEmpty()const
+ {
+ // return ETrue if the document is empty
+ if (iValue==0)
+ return ETrue;
+ else
+ return EFalse;
+ }
+
+
+TBool CTestAppDoc::HasChanged()const
+ {
+ return iHasChanged;
+ }
+
+/** builds a new embedded or main document without loading from a store (may create the content from
+ eg code or a template file).
+*/
+void CTestAppDoc::NewDocumentL()
+ {}
+
+
+/** Create a document file & store of the specified name, storing into the store.
+ On system startup the name might not have a filename component in which case this function should parse the
+ passed name with a related default file name appropriate to this application and in an appropriate language
+*/
+CFileStore* CTestAppDoc::CreateFileStoreLC(RFs& aFs,const TDesC& aFileName)
+ {
+ // set the default name just in case...
+ TFileName defaultName(_L("temp"));
+ TParse parser;
+ User::LeaveIfError(parser.Set(aFileName,&defaultName,NULL));
+ // create the file store
+ CFileStore* store;
+ store = CDirectFileStore::CreateLC(aFs,parser.FullName(),EFileWrite);
+ store->SetTypeL(TUidType(KDirectFileStoreLayoutUid,KUidAppDllDoc,KUidTestApp));
+ CStreamDictionary* streamDic=CStreamDictionary::NewL();
+ CleanupStack::PushL(streamDic);
+ StoreL(*store,*streamDic);
+ Process()->WriteRootStreamL(*store,*streamDic,*Application());
+ store->CommitL(); // now the store will be fully initialised
+ CleanupStack::PopAndDestroy(); // streamDic
+ return store;
+ }
+
+
+void CTestAppDoc::EditL(MApaEmbeddedDocObserver* /*aContainer*/,TBool aReadOnly)
+ {
+ if (aReadOnly)
+ {
+ if (iContainer)
+ {
+ iContainer->NotifyExit(MApaEmbeddedDocObserver::ENoChanges);
+ iContainer = NULL; // iContainer must be nulled when editing is finished
+ }
+ }
+ else
+ {
+ iValue++;
+ iHasChanged = ETrue;
+ if (iContainer)
+ {
+ iContainer->NotifyExit(MApaEmbeddedDocObserver::EKeepChanges);
+ iContainer = NULL; // iContainer must be nulled when editing is finished
+ }
+ }
+ }
+
+void CTestAppDoc::NotifyExit(MApaEmbeddedDocObserver::TExitMode aMode)
+ {
+ switch (aMode)
+ {
+ case EKeepChanges:
+ iHasChanged = ETrue; // note that my contents have changed
+ break;
+ case ERevertToSaved:
+ // reload whole document (panic if I'm not the main doc)
+ break;
+ case ENoChanges:
+ // no changes
+ break;
+ case EEmpty:
+ // the embedded doc is empty
+ break;
+ }
+ }
+
+
+void CTestAppDoc::PrintL(const CStreamStore& /*aSourceStore*/)
+ {}
+
+
+void CTestAppDoc::SaveL()
+ {
+
+ CDirectFileStore* store;
+ TParse newFilePath;
+ // create temp file
+ User::LeaveIfError( newFilePath.Set(Process()->MainDocFileName(),NULL,NULL) ); // abuse new file path
+ TBuf<2> drive=newFilePath.Drive();
+ TFileName filePath(KTempFilePath);
+ User::LeaveIfError( newFilePath.Set(drive,&filePath,NULL) );
+ Process()->FsSession().MkDirAll(newFilePath.DriveAndPath());
+ TFileName tempName;
+ store = CDirectFileStore::TempLC(Process()->FsSession(),newFilePath.DriveAndPath(),tempName,EFileWrite);
+ store->SetTypeL(((CFileStore*)iStore)->Type());
+
+ // store main in temp
+ CStreamDictionary* streamDic=CStreamDictionary::NewL();
+ CleanupStack::PushL(streamDic);
+ StoreL(*store,*streamDic);
+ iStore->CommitL();
+
+ // write root stream
+ Process()->WriteRootStreamL(*store,*streamDic,*Application());
+ CleanupStack::PopAndDestroy(); // streamDic
+ // close the new store
+ store->CommitL();
+ CleanupStack::PopAndDestroy(); // store
+ // close the old store
+ delete iStore;
+ iStore = NULL;
+ // replace the old file
+ User::LeaveIfError( Process()->FsSession().Replace(tempName,Process()->MainDocFileName()) );
+ // open new file
+ iStore = CDirectFileStore::OpenL(Process()->FsSession(),Process()->MainDocFileName(),EFileShareExclusive);
+ }
+
+
+void CTestAppDoc::StoreL(CStreamStore& aStore,CStreamDictionary& aStreamDic)const
+ {
+ //
+ // create map and store embedded doc's
+ CStoreMap* map=CStoreMap::NewLC(aStore);
+ StoreComponentsL(aStore,*map);
+ // store the headstream
+ RStoreWriteStream stream(*map);
+ TStreamId id=stream.CreateLC(aStore);
+ ExternalizeL(stream);
+ stream.CommitL();
+ // assign the headstream in the dictionary
+ aStreamDic.AssignL(KUidTestAppHeadStream,id);
+ // tidy up
+ map->Reset();
+ CleanupStack::PopAndDestroy(2); // map,stream
+ }
+
+
+void CTestAppDoc::RestoreL(const CStreamStore& aStore,const CStreamDictionary& aStreamDic)
+ {
+ //
+ TStreamId headStreamId=aStreamDic.At(KUidTestAppHeadStream);
+ RStoreReadStream stream;
+ stream.OpenLC(aStore,headStreamId);
+ InternalizeL(stream);
+ CleanupStack::PopAndDestroy(); // stream
+ // restore the embedded bits
+ RestoreComponentsL(aStore);
+ }
+
+
+void CTestAppDoc::DetachFromStoreL(CPicture::TDetach aDegree)
+ {
+ for (TInt i=0 ; i<iEmbedList->Count() ; i++)
+ EmbeddedDoor(i)->DetachFromStoreL(aDegree);
+ }
+
+
+void CTestAppDoc::StoreComponentsL(CStreamStore& aStore,CStoreMap& aMap)const
+ {
+ for (TInt i=0 ; i<iEmbedList->Count() ; i++)
+ {
+ TStreamId id=EmbeddedDoor(i)->StoreL(aStore);
+ aMap.BindL((*iEmbedList)[i].iPicture,id);
+ }
+ }
+
+
+void CTestAppDoc::RestoreComponentsL(const CStreamStore& aStore)
+ {
+ TApaPictureFactory factory(Process());
+ for (TInt i=0 ; i<iEmbedList->Count() ; i++)
+ {
+ TRAPD(ret, factory.NewPictureL((*iEmbedList)[i],aStore) );
+ if ((ret!=KErrNone)&&(ret!=KErrNotFound))
+ User::Leave(ret);
+ }
+ }
+
+
+void CTestAppDoc::ExternalizeL(RWriteStream& aStream)const
+ {
+ aStream.WriteInt32L(iValue);
+ // externalize num of embedded objects
+ TInt numObjects=iEmbedList->Count();
+ aStream.WriteInt32L(numObjects);
+ // externalize the doors
+ for (TInt i=0 ; i<numObjects ; i++)
+ aStream<< (*iEmbedList)[i].iPicture;
+ }
+
+
+void CTestAppDoc::InternalizeL(RReadStream& aStream)
+ {
+ // reset();
+ iValue = aStream.ReadInt32L();
+ TInt numObjects=aStream.ReadInt32L();
+ for (TInt i=0 ; i<numObjects ; i++)
+ {
+ TPictureHeader header;
+ header.iPictureType = KUidPictureTypeDoor;
+ aStream>> header.iPicture;
+ iEmbedList->AppendL(header);
+ }
+ }