--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/commonuisupport/uikon/test/tpackage/TPACKAGE.CPP Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,659 @@
+// Copyright (c) 2005-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:
+// This test aims to test embedding feature of the application.
+// It work together with uiktestserver framework as part of the chain:
+// Testexecute.exe -> tpackagestarter.dll -> tpackage.app -> tembed.app
+// Tpackage communicates with tpackagestarter.dll via client-server architecture.
+// Client passes to server 3 parameters, packed in structure:
+// first is message to log, second is filename, third - the number of line.
+// To test embedding technology tpackage embeds application, tembed,
+// inside its instance and provide consequences of acts as follow: inserting object,
+// editing object, closing, deleting object.
+// To provide logging test information tpackage client send log buffer to the
+// server using the message EMessageServSetFromString for an Info message and
+// EMessageServSetErrorFromString for an error message.
+// Those two messages can be sent via funcions SetFromString and SetErrorFromString.
+// After a consequence is completed, the EmessageServStop message will be sent,
+// that causes closing client-server session and the tpackagestarter test step itself.
+//
+//
+
+/**
+ @file
+ @internalComponent - Internal Symbian test code
+*/
+
+
+#include <eikenv.h>
+#include <coecntrl.h>
+#include <basched.h>
+#include <coeccntx.h>
+#include <eikappui.h>
+#include <e32keys.h>
+#include <eikembal.h>
+#include <bamdesca.h>
+#include <techview/eikon.hrh>
+#include <techview/eikdialg.h>
+#include <techview/eikchlst.h>
+#include <eikdoc.h>
+#include <eikapp.h>
+#include <s32file.h>
+#include <techview/eikprtpv.h>
+#include <eikproc.h>
+#include <techview/eikon.rsg>
+#include <techview/eikmisdg.h>
+#include "messageservclient.h"
+
+#include <eikstart.h>
+
+#include "tpackage.rsg"
+#include "TPACKAGE.HRH"
+
+
+#include "appfwk_test_AppUi.h"
+
+#include "TEMBED.h"
+
+#include "messageservserver.h"
+
+
+#define FORCE_AUTO
+
+_LIT(KTestText, "ABCDEF");
+
+const TUid KUidPackagerApp={0x10207F6E};
+
+struct SPackage
+ {
+public:
+ TBuf<20> iPrompt;
+ CApaDocument* iDocument;
+ };
+
+//
+// CPackagerModel
+//
+class CPackagerModel : public CArrayFixFlat<SPackage>
+ {
+public:
+ CPackagerModel(CApaProcess* aProcess);
+ ~CPackagerModel();
+ void AppendDocL(CApaDocument* aDoc);
+ void DeleteDoc(TInt aPos);
+private:
+ CApaProcess* iProcess;
+ };
+
+CPackagerModel::CPackagerModel(CApaProcess* aProcess)
+ : CArrayFixFlat<SPackage> (2)
+ {
+ iProcess=aProcess;
+ }
+
+CPackagerModel::~CPackagerModel()
+ {
+ const TInt count=Count();
+ for (TInt pos=0; pos<count; pos++)
+ iProcess->DestroyDocument((*this)[pos].iDocument);
+ }
+
+void CPackagerModel::AppendDocL(CApaDocument* aDoc)
+ {
+ SPackage package;
+ package.iDocument=aDoc;
+ TRAPD(err,AppendL(package));
+ if (err)
+ {
+ iProcess->DestroyDocument(aDoc);
+ User::Leave(err);
+ }
+ }
+
+void CPackagerModel::DeleteDoc(TInt aPos)
+ {
+ CApaDocument* doc=(*this)[aPos].iDocument;
+ iProcess->DestroyDocument(doc);
+ Delete(aPos);
+ }
+
+//
+// CPackagerContainer
+//
+
+class CPackagerContainer : public CCoeControl, public MCoeControlBrushContext
+ {
+public:
+ void ConstructL(const TRect& aRect);
+ ~CPackagerContainer();
+private: // framework
+ void Draw(const TRect& aRect) const;
+ TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType);
+ void SizeChanged();
+ void FocusChanged(TDrawNow aDrawNow);
+private:
+ };
+
+void CPackagerContainer::FocusChanged(TDrawNow /*aDrawNow*/)
+ {
+ }
+
+void CPackagerContainer::ConstructL(const TRect& aRect)
+ {
+ CreateWindowL();
+ Window().SetShadowDisabled(ETrue);
+ EnableDragEvents();
+ iBrushStyle=CGraphicsContext::ESolidBrush;
+ iBrushColor=KRgb1in4DitheredGray;
+ iContext=this;
+ Window().SetBackgroundColor(KRgb1in4DitheredGray);
+ SetRect(aRect);
+ ActivateL();
+ }
+
+CPackagerContainer::~CPackagerContainer()
+ {
+ }
+
+void CPackagerContainer::Draw(const TRect& aRect) const
+ {
+ CGraphicsContext& gc=SystemGc();
+ gc.SetPenStyle(CGraphicsContext::ENullPen);
+ gc.DrawRect(aRect);
+ }
+
+void CPackagerContainer::SizeChanged()
+ {
+ }
+
+TKeyResponse CPackagerContainer::OfferKeyEventL(const TKeyEvent& /*aKeyEvent*/,TEventCode /*aType*/)
+ {
+ return(EKeyWasConsumed);
+ }
+
+//
+// CPackagerDocument - definition
+//
+
+class CPackagerDocument : public CEikDocument
+ {
+public:
+ CPackagerDocument(CEikApplication& aApp): CEikDocument(aApp), iModel(Process()) { }
+ CPackagerModel* Model() { return(&iModel); }
+private: // from CEikDocument
+ CEikAppUi* CreateAppUiL();
+private: // from CApaDocument
+ void StoreL(CStreamStore& aStore,CStreamDictionary& aStreamDic) const;
+ void RestoreL(const CStreamStore& aStore,const CStreamDictionary& aStreamDic);
+private:
+ CPackagerModel iModel;
+ };
+
+
+
+//
+// CPackagerAppUi
+//
+
+class CPackagerAppUi : public CTestAppUi
+ {
+public:
+ CPackagerAppUi() :
+ CTestAppUi(NULL, KNullDesC)
+ {
+ iTestText.Set(KTestText);
+ }
+ void ConstructL();
+ ~CPackagerAppUi();
+ RMessageServ* iServ;
+ void SetFromString(const TDesC& aString, const TText8* aString1, TInt aLineNumber);
+ void SetErrorFromString(const TDesC& aString, const TText8* aString1, TInt aLineNumber, TInt aErr);
+
+private: // from CEikAppUi
+ void HandleCommandL(TInt aCommand);
+private: // internal functions
+ void CmdInsertObjectL();
+ void CmdEditObjectL();
+ void CmdDeleteObjectL();
+ TInt SelectDocumentL(TInt aHelpRid,TInt aTitleRid);
+ void RunTestStepL(TInt aNumStep);
+ void SendKeyEventToApplicationL(TKeyEvent theKeyEvent);
+ TInt FindIndex(CEikEmbeddableAppList* aList, TInt* aDestIndex);
+ void TestEmbeddableAppListL();
+private:
+ CPackagerContainer* iContainer;
+ CPackagerModel* iModel;
+ TPtrC iTestText;
+
+ };
+
+
+void CPackagerAppUi::ConstructL()
+ {
+ iModel=((CPackagerDocument*)iDocument)->Model();
+ //BaseConstructL();
+ CTestAppUi::ConstructL();
+
+ iContainer=new(ELeave) CPackagerContainer;
+ iContainer->ConstructL(ClientRect());
+ AddToStackL(iContainer);
+
+ iServ = new RMessageServ;
+ TInt theRes = iServ->Connect();
+ if(theRes != KErrNone)
+ {
+ delete iServ;
+ iServ = NULL;
+ }
+
+ AutoTestManager().StartAutoTest();
+ }
+
+CPackagerAppUi::~CPackagerAppUi()
+ {
+ RemoveFromStack(iContainer);
+ delete iContainer;
+
+ if(iServ)
+ {
+ iServ->Stop();
+ iServ->Close();
+ }
+ delete iServ;
+ }
+
+void CPackagerAppUi::HandleCommandL(TInt aCommand)
+ {
+ switch (aCommand)
+ {
+ case EEikCmdExit:
+ SaveAnyChangesL();
+ Exit();
+ break;
+ case ETPackagerCmdInsertObject:
+ CmdInsertObjectL();
+ break;
+ case ETPackagerCmdEditObject:
+ CmdEditObjectL();
+ break;
+ case ETPackagerCmdDeleteObject:
+ CmdDeleteObjectL();
+ break;
+ }
+ }
+
+TInt CPackagerAppUi::SelectDocumentL(TInt aHelpRid,TInt /*aTitleRid*/)
+ {
+ const TInt max=iModel->Count();
+ if (!max)
+ {
+ TBuf<20> tmp;
+ iCoeEnv->ReadResource(tmp,aHelpRid);
+ iEikonEnv->LeaveWithInfoMsg(R_TPCK_TBUF_NO_OBJECTS_TO_XXX,&tmp);
+ }
+ TInt pos=1;
+ //if (max>1)
+ // {
+ // if (CEikNumDialog::RunDlgLD(pos,1,max,aTitleRid,R_TPCK_TBUF_DLG_PROMPT))
+ // CBaActiveScheduler::LeaveNoAlert();
+ // }
+ return(pos-1);
+ }
+
+void CPackagerAppUi::CmdEditObjectL()
+ {
+ TInt pos=SelectDocumentL(R_TPCK_TBUF_EDIT,R_TPCK_TBUF_EDIT_DLG_TITLE);
+ CDocument* doc=(CDocument*) ((*iModel)[pos].iDocument);
+
+ if(doc->iBuf.Compare(iTestText) == 0)
+ {
+ ((CEikDocument*)doc)->EditL(NULL);
+ }
+ else
+ {//this is the error
+
+ }
+
+
+
+ }
+
+void CPackagerAppUi::CmdDeleteObjectL()
+ {
+ TInt pos=SelectDocumentL(R_TPCK_TBUF_DELETE,R_TPCK_TBUF_DELETE_DLG_TITLE);
+ iModel->DeleteDoc(pos);
+ }
+
+
+TInt CPackagerAppUi::FindIndex(CEikEmbeddableAppList* aList, TInt* aDestIndex)
+ {
+ TInt theNumElem = aList->Count();
+
+ RDebug::Print(_L("Number elements in embeded list : %d\n"), theNumElem);
+
+ for(TInt theIndex = 0; theIndex < theNumElem; theIndex++)
+ {
+ TApaAppInfo& appInfo = (*aList)[theIndex];
+ RDebug::Print(_L("Element number %d : %S\n"), theIndex, &appInfo.iFullName);
+ if(appInfo.iFullName.FindF(_L("embed")) >= 0)
+ {
+
+ TBuf<128> buf;
+ buf.Format(_L("Element embed has been found with index : %d\n"), theIndex);
+ SetFromString(buf, ((TText8*)__FILE__), __LINE__);
+
+ //RDebug::Print(_L("Element embed has been found with index : %d\n"), theIndex);
+ *aDestIndex = theIndex;
+ return KErrNone;
+ }
+ }
+
+ return KErrNotFound;
+ }
+
+void CPackagerAppUi::CmdInsertObjectL()
+ {
+ CEikEmbeddableAppList* list=new(ELeave) CEikEmbeddableAppList;
+ CleanupStack::PushL(list);
+
+ // sleep for 5 sec to give apparc time to initialise properly
+ User::After(5000000);
+
+ list->ConstructL();
+ TInt count=list->Count();
+ if (!count)
+ iEikonEnv->InfoMsg(R_TPCK_TBUF_NO_EMBEDDABLE_APPS_FOUND);
+ else
+ {
+ TInt choice=0;
+ RDebug::Print(_L("Find index in list\n"));
+ TInt theErr = FindIndex(list, &choice);
+ if(theErr == KErrNone)
+ {
+ RDebug::Print(_L("Creating the embeded document\n"));
+ CEikDocument* newDoc=list->CreateEmbeddedDocumentL(choice,iEikonEnv->Process());
+ iModel->AppendDocL(newDoc);
+ newDoc->EditL(NULL);
+ }
+ }
+ CleanupStack::PopAndDestroy(); // list
+ }
+
+
+void CPackagerAppUi::SetFromString(const TDesC& aString, const TText8* aString1, TInt aLineNumber)
+ {
+ if(iServ)
+ {
+ iServ->SetFromString(aString, aString1, aLineNumber);
+ }
+ }
+
+void CPackagerAppUi::SetErrorFromString(const TDesC& aString, const TText8* aString1,
+ TInt aLineNumber, TInt aErr)
+ {
+ if(iServ)
+ {
+ iServ->SetErrorFromString(aString, aString1, aLineNumber, aErr);
+ }
+ }
+
+void CPackagerAppUi::RunTestStepL(TInt aNumStep)
+ {
+ TKeyEvent theKeyEvent;
+ Mem::FillZ(&theKeyEvent, sizeof(TKeyEvent));
+ TBuf<128> buf;
+
+ //only for debug
+#ifdef FORCE_AUTO
+ User::After(TTimeIntervalMicroSeconds32(1000000));
+#endif
+ switch(aNumStep)
+ {
+ case 1:
+ {
+ RDebug::Print(_L("Insert the object\n"));
+ buf.Copy(_L("Insert the holy object\n"));
+ SetFromString(buf, ((TText8*)__FILE__), __LINE__);
+ TRAPD(res, CmdInsertObjectL());
+ if(res == KErrGeneral)
+ {
+ //RDebug::Print(_L("Error during inserting object : %d\n"), res);
+ buf.Format(_L("Error during inserting object : %d\n"), res);
+ SetFromString(buf, ((TText8*)__FILE__), __LINE__);
+
+
+ RDebug::Print(_L("Try insert object again\n"));
+ TRAP(res, CmdInsertObjectL());
+ }
+ if(res != KErrNone)
+ {
+ buf.Format(_L("Error during inserting object : %d\n"), res);
+ SetErrorFromString(buf, ((TText8*)__FILE__), __LINE__, res);
+ AutoTestManager().FinishAllTestCases(CAutoTestManager::EFailed);
+ }
+ break;
+ }
+ case 2:
+ {
+ //test.Next(_L("Type chars"));
+ SetFromString(_L("Type chars\n"), ((TText8*)__FILE__), __LINE__);
+ theKeyEvent.iCode = iTestText[0];
+ SendKeyEventToApplicationL(theKeyEvent);
+ theKeyEvent.iCode = iTestText[1];
+ SendKeyEventToApplicationL(theKeyEvent);
+ theKeyEvent.iCode = iTestText[2];
+ SendKeyEventToApplicationL(theKeyEvent);
+ break;
+ }
+ case 3:
+ {
+ theKeyEvent.iCode = EKeyEnter;
+ //RDebug::Print(_L("Type Key Enter\n"));
+ SetFromString(_L("Type Key Enter\n"), ((TText8*)__FILE__), __LINE__);
+ //SendKeyEventToApplicationL(theKeyEvent);
+ break;
+ }
+ case 4:
+ {
+ theKeyEvent.iCode = iTestText[3];
+ SendKeyEventToApplicationL(theKeyEvent);
+ theKeyEvent.iCode = iTestText[4];
+ SendKeyEventToApplicationL(theKeyEvent);
+ theKeyEvent.iCode = iTestText[5];
+ SendKeyEventToApplicationL(theKeyEvent);
+ SetFromString(_L("Type chars\n"), ((TText8*)__FILE__), __LINE__);
+ break;
+ }
+ case 5: case 8:
+ {
+ //test.Next(_L("Close the embeded document"));
+ //RDebug::Print(_L("Close the embeded document\n"));
+ SetFromString(_L("Close the embeded document\n"), ((TText8*)__FILE__), __LINE__);
+ theKeyEvent.iCode = CTRL('e');
+ theKeyEvent.iModifiers=EModifierCtrl;
+
+ SendKeyEventToApplicationL(theKeyEvent);
+ break;
+ }
+ case 6:
+ {
+ //test.Next(_L("Edit the embeded document"));
+ //RDebug::Print(_L("Edit the embeded document\n"));
+ SetFromString(_L("Edit the embeded document\n"), ((TText8*)__FILE__), __LINE__);
+ TRAPD(err, CmdEditObjectL());
+ if(err != KErrNone)
+ {
+ buf.Format(_L("Error during editting embeded document : %d\n"), err);
+ SetErrorFromString(buf, ((TText8*)__FILE__), __LINE__, err);
+ AutoTestManager().FinishAllTestCases(CAutoTestManager::EFailed);
+ }
+ break;
+ }
+ case 7:
+ {
+ theKeyEvent.iCode = EKeyBackspace;
+ //RDebug::Print(_L("Type Key BackSpace\n"));
+ SetFromString(_L("Type Key BackSpace\n"), ((TText8*)__FILE__), __LINE__);
+ SendKeyEventToApplicationL(theKeyEvent);
+ SendKeyEventToApplicationL(theKeyEvent);
+ break;
+ }
+ case 9:
+ {
+ //RDebug::Print(_L("Delete the embeded document\n"));
+ SetFromString(_L("Delete the embeded document\n"), ((TText8*)__FILE__), __LINE__);
+ TRAPD(err, CmdDeleteObjectL());
+ if(err != KErrNone)
+ {
+ //RDebug::Print(_L("Error during deleting embeded document : %d\n"), err);
+ TBuf<128> buf;
+ buf.Format(_L("Error during deleting embeded document : %d\n"), err);
+ SetErrorFromString(buf, ((TText8*)__FILE__), __LINE__, err);
+
+ AutoTestManager().FinishAllTestCases(CAutoTestManager::EFailed);
+ }
+ break;
+ }
+ case 10:
+ {
+ TRAPD(err, SaveAnyChangesL());
+ if(err != KErrNone)
+ {
+ //RDebug::Print(_L("Error during saving embeded document : %d\n"), err);
+ buf.Format(_L("Error during saving embeded document : %d\n"), err);
+ SetErrorFromString(buf, ((TText8*)__FILE__), __LINE__, err);
+ AutoTestManager().FinishAllTestCases(CAutoTestManager::EFailed);
+ }
+ break;
+ }
+ case 11:
+ {
+ TRAPD(err, TestEmbeddableAppListL());
+ if(err != KErrNone)
+ {
+ buf.Format(_L("Leave from TestEmbeddableAppListL with err : %d\n"), err);
+ SetErrorFromString(buf, ((TText8*)__FILE__), __LINE__, err);
+ AutoTestManager().FinishAllTestCases(CAutoTestManager::EFailed);
+ }
+ else
+ {
+ AutoTestManager().FinishAllTestCases(CAutoTestManager::EPass);
+ }
+ break;
+ }
+ }
+ }
+
+void CPackagerAppUi::TestEmbeddableAppListL()
+ {
+ TBuf<128> buf;
+ buf = _L("CPackagerAppUi::TestEmbeddableAppList");
+ SetFromString(buf, ((TText8*)__FILE__), __LINE__);
+
+ CEikEmbeddableAppList* appList = new (ELeave) CEikEmbeddableAppList();
+ CleanupStack::PushL(appList);
+
+ TApaEmbeddabilityFilter filter;
+ filter.AddEmbeddability(TApaAppCapability::EEmbeddable);
+ filter.AddEmbeddability(TApaAppCapability::EEmbeddableOnly);
+ appList->ConstructL(filter);
+ const TInt numberOfApps = appList->Count();
+ if (numberOfApps == 0)
+ {
+ User::Leave(KErrGeneral);
+ }
+
+ CleanupStack::PopAndDestroy(appList);
+ }
+
+void CPackagerAppUi::SendKeyEventToApplicationL(TKeyEvent theKeyEvent)
+ {
+ TEventCode theType;
+ theType = EEventKeyDown;
+ iCoeEnv->SimulateKeyEventL(theKeyEvent,theType);
+ theType = EEventKey;
+ iCoeEnv->SimulateKeyEventL(theKeyEvent,theType);
+ theType = EEventKeyUp;
+ iCoeEnv->SimulateKeyEventL(theKeyEvent,theType);
+ }
+
+
+//
+// CPackagerDocument - implementation
+//
+
+CEikAppUi* CPackagerDocument::CreateAppUiL()
+ {
+ return(new(ELeave) CPackagerAppUi);
+ }
+
+void CPackagerDocument::StoreL(CStreamStore& aStore,CStreamDictionary& aStreamDic) const
+ {
+ RStoreWriteStream stream;
+ TStreamId streamId=stream.CreateLC(aStore);
+// stream<<iModel;
+ stream.CommitL();
+ CleanupStack::PopAndDestroy(); // stream
+ aStreamDic.AssignL(KUidPackagerApp,streamId);
+ }
+
+void CPackagerDocument::RestoreL(const CStreamStore& aStore,const CStreamDictionary& aStreamDic)
+ {
+ TStreamId headStreamId=aStreamDic.At(KUidPackagerApp);
+ RStoreReadStream stream;
+ stream.OpenLC(aStore,headStreamId);
+// stream>>iModel;
+ CleanupStack::PopAndDestroy(); // stream
+ }
+
+//
+// CPackagerApplication
+//
+
+class CPackagerApplication : public CEikApplication
+ {
+private: // from CApaApplication
+ CApaDocument* CreateDocumentL();
+ TUid AppDllUid() const;
+private:
+ CApaDocument* CreateDocumentL(CApaProcess* a) { return CEikApplication::CreateDocumentL(a); }
+ };
+
+TUid CPackagerApplication::AppDllUid() const
+ {
+ return(KUidPackagerApp);
+ }
+
+CApaDocument* CPackagerApplication::CreateDocumentL()
+ {
+ return new(ELeave) CPackagerDocument(*this);
+ }
+
+//
+// EXPORTed functions
+//
+
+
+
+LOCAL_C CApaApplication* NewApplication()
+ {
+ return new CPackagerApplication;
+ }
+
+GLDEF_C TInt E32Main()
+ {
+ return EikStart::RunApplication(NewApplication);
+ }
+
+
+