Symbian: better Series 80 support
Jarkko Hietaniemi [Wed, 26 Oct 2005 15:50:08 +0000 (18:50 +0300)]
Message-ID: <B356D8F434D20B40A8CEDAEC305A1F24E7A6AA@esebe105.NOE.Nokia.com>

p4raw-id: //depot/perl@25856

MANIFEST
symbian/PerlApp.cpp
symbian/PerlApp.h
symbian/PerlAppS80.rss
symbian/config.pl
symbian/hexdump.pl [new file with mode: 0644]
symbian/makesis.pl
symbian/sisify.pl

index 1c279af..95c06fd 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -2644,6 +2644,7 @@ symbian/config.sh         Configuration data for Symbian
 symbian/cwd.pl                 Helper code for config.pl
 symbian/demo_pl                        "Archive" of demo code
 symbian/find_writeable_data.pl Development utility
+symbian/hexdump.pl             Helper for sisify.pl updating
 symbian/install.cfg            Installation instructions
 symbian/makesis.pl             Installation file creator
 symbian/PerlAppAif.rss         Symbian sample app code
index f5fa29e..819f13f 100644 (file)
@@ -19,6 +19,9 @@
 # include <eikon.hrh>
 # include <cknflash.h>
 # include <ckndgopn.h>
+# include <ckndgfob.h>
+# include <eiklabel.h>
+# include <cknconf.h>
 #endif /* #ifdef __SERIES80__ */
 
 #include <apparc.h>
 
 #include <coemain.h>
 
-#ifndef PerlMin
+#ifndef PerlAppMinimal
 
 #include "PerlApp.hrh"
 
 #include "PerlApp.rsg"
 
-#endif //#ifndef PerlMin
+#ifdef __SERIES80__
+#include "Eikon.rsg"
+#endif /* #ifdef __SERIES80__ */
+
+#endif //#ifndef PerlAppMinimal
 
 #include "EXTERN.h"
 #include "perl.h"
 #include "PerlBase.h"
 
 const TUid KPerlAppUid = {
-#ifdef PerlMinUid
-  PerlMinUid
+#ifdef PerlAppMinimalUid
+  PerlAppMinimalUid
 #else
   0x102015F6
 #endif
@@ -61,13 +68,13 @@ _LIT(KDefaultScript, "default.pl");
 # define _LIT_NO_L(n, s) static const TLitC<sizeof(s)/2> n={sizeof(s)/2-1,s}
 #endif // #ifndef _LIT_NO_L
 
-#ifdef PerlMinName
-_LIT_NO_L(KAppName, PerlMinName);
+#ifdef PerlAppMinimalName
+_LIT_NO_L(KAppName, PerlAppMinimalName);
 #else
 _LIT(KAppName, "PerlApp");
 #endif
 
-#ifndef PerlMin
+#ifndef PerlAppMinimal
 
 _LIT_NO_L(KFlavor, PERL_SYMBIANSDK_FLAVOR);
 _LIT(KAboutFormat,
@@ -83,7 +90,7 @@ typedef TBuf<256>  TMessageBuffer;
 typedef TBuf8<256> TPeekBuffer;
 typedef TBuf8<256> TFileName8;
 
-#endif // #ifndef PerlMin
+#endif // #ifndef PerlAppMinimal
 
 // Usage: DEBUG_PRINTF((_L("%S"), &aStr))
 #if 1
@@ -131,7 +138,7 @@ CPerlAppUi::~CPerlAppUi()
         iDoorObserver->NotifyExit(MApaEmbeddedDocObserver::EEmpty);
 }
 
-#ifndef PerlMin
+#ifndef PerlAppMinimal
 
 #ifdef __SERIES60__
 
@@ -152,9 +159,7 @@ static TBool OkCancelDialogL(TDesC& aMessage)
     return DlgOk(dlg);
 #endif /* #ifdef __SERIES60__ */
 #ifdef __SERIES80__
-    return CCknFlashingDialog::RunDlgLD(_L("OK/Cancel"), aMessage, NULL,
-                                        CCknFlashingDialog::EShort,
-                                        NULL);
+    return CCknConfirmationDialog::RunDlgWithDefaultIconLD(aMessage, R_EIK_BUTTONS_CANCEL_OK);
 #endif /* #ifdef __SERIES80__ */
 }
 
@@ -168,35 +173,18 @@ static TBool YesNoDialogL(TDesC& aMessage)
     return DlgOk(dlg);
 #endif /* #ifdef __SERIES60__ */
 #ifdef __SERIES80__
-    return CCknFlashingDialog::RunDlgLD(_L("Yes/No"), aMessage, NULL,
-                                        CCknFlashingDialog::EShort,
-                                        NULL);
+    return CCknConfirmationDialog::RunDlgWithDefaultIconLD(aMessage, R_EIK_BUTTONS_NO_YES);
 #endif /* #ifdef __SERIES80__ */
 }
 
-static TInt InformationNoteL(TDesC& aMessage)
+static void InformationNoteL(TDesC& aMessage)
 {
 #ifdef __SERIES60__
     CAknInformationNote* note = new (ELeave) CAknInformationNote;
-    return note->ExecuteLD(aMessage);
+    note->ExecuteLD(aMessage);
 #endif /* #ifdef __SERIES60__ */
 #ifdef __SERIES80__
-    return CCknFlashingDialog::RunDlgLD(_L("Info"), aMessage, NULL,
-                                        CCknFlashingDialog::ENormal,
-                                        NULL);
-#endif /* #ifdef __SERIES80__ */
-}
-
-static TInt ConfirmationNoteL(TDesC& aMessage)
-{
-#ifdef __SERIES60__
-    CAknConfirmationNote* note = new (ELeave) CAknConfirmationNote;
-    return note->ExecuteLD(aMessage);
-#endif /* #ifdef __SERIES60__ */
-#ifdef __SERIES80__
-    return CCknFlashingDialog::RunDlgLD(_L("Confirmation"), aMessage, NULL,
-                                        CCknFlashingDialog::ENormal,
-                                        NULL);
+    CEikonEnv::Static()->InfoMsg(aMessage);
 #endif /* #ifdef __SERIES80__ */
 }
 
@@ -212,7 +200,32 @@ static TInt WarningNoteL(TDesC& aMessage)
 #endif /* #ifdef __SERIES80__ */
 }
 
-static TInt TextQueryDialogL(const TDesC& aPrompt, TDes& aData, const TInt aMaxLength)
+#ifdef __SERIES80__
+
+CPerlAppTextQueryDialog::CPerlAppTextQueryDialog(HBufC*& aBuffer) :
+  iData(aBuffer)
+{
+}
+
+TBool CPerlAppTextQueryDialog::OkToExitL(TInt /* aKeycode */)
+{
+  iData = static_cast<CEikEdwin*>(Control(EPerlAppTextQueryInputField))->GetTextInHBufL();
+  return ETrue;
+}
+
+void CPerlAppTextQueryDialog::PreLayoutDynInitL()
+{
+  SetTitleL(iTitle);
+  CEikLabel* promptLabel = ControlCaption(EPerlAppTextQueryInputField);
+  promptLabel->SetTextL(iPrompt);
+}
+
+/* TODO: OfferKeyEventL() so that newline can be seen as 'OK'.
+ * Or a hotkey for the button? */
+
+#endif /* #ifdef __SERIES80__ */
+
+static TInt TextQueryDialogL(const TDesC& aTitle, const TDesC& aPrompt, TDes& aData, const TInt aMaxLength)
 {
 #ifdef __SERIES60__
     CAknTextQueryDialog* dlg =
@@ -222,9 +235,42 @@ static TInt TextQueryDialogL(const TDesC& aPrompt, TDes& aData, const TInt aMaxL
     return dlg->ExecuteLD(R_TEXT_QUERY_DIALOG);
 #endif /* #ifdef __SERIES60__ */
 #ifdef __SERIES80__
-    /* TODO */
-    return ETrue;
-#endif
+    HBufC* data = NULL;
+    CPerlAppTextQueryDialog* dlg =
+      new (ELeave) CPerlAppTextQueryDialog(data);
+    dlg->iTitle.Set(aTitle);
+    dlg->iPrompt.Set(aPrompt);
+    dlg->iMaxLength = aMaxLength;
+    if (dlg->ExecuteLD(R_PERL_ONELINER_DIALOG)) {
+      aData.Copy(*data);
+      return ETrue;
+    }
+    return EFalse;
+#endif /* #ifdef __SERIES80__ */
+}
+
+static TBool FileQueryDialogL(TDes& aFilename)
+{
+#ifdef __SERIES60__
+  return AknCommonDialogs::RunSelectLD(aFilename,
+                                      R_MEMORY_SELECTION_DIALOG);
+#endif /* #ifdef __SERIES60__ */
+#ifdef __SERIES80__
+  if (CCknOpenFileDialog::RunDlgLD(aFilename,
+                                   CCknFileListDialogBase::EShowAllDrives
+                                  |CCknFileListDialogBase::EShowSystemFilesAndFolders
+                                  |CCknFileListDialogBase::EShowBothFilesAndFolders
+                                  )) {
+    TEntry aEntry; // Be paranoid and check that the file is there.
+    RFs aFs;
+    aFs.Connect();
+    if (aFs.Entry(aFilename, aEntry) == KErrNone)
+      return ETrue;
+    else
+      CEikonEnv::Static()->InfoMsg(_L("File not found"));
+  }
+  return EFalse;
+#endif /* #ifdef __SERIES80__ */
 }
 
 // The isXXX() come from the Perl headers.
@@ -280,7 +326,7 @@ static void CopyFromInboxL(RFs aFs, const TFileName& aSrc, const TFileName& aDst
                 TInt err = BaflUtils::CopyFile(aFs, aSrc, aDst);
                 if (err == KErrNone) {
                     message.Format(_L("Installed %S"), &aDst);
-                    ConfirmationNoteL(message);
+                    InformationNoteL(message);
                 }
                 else {
                     message.Format(_L("Failure %d installing %S"), err, &aDst);
@@ -408,7 +454,6 @@ static TBool RunStuffL(const TFileName& aScriptName, TPeekBuffer aPeekBuffer)
             message.Format(_L("Run %S?"), &aScriptName);
         if (YesNoDialogL(message))
             DoRunScriptL(aScriptName);
-
         return ETrue;
     }
 
@@ -458,23 +503,23 @@ void CPerlAppUi::InstallOrRunL(const TFileName& aFileName)
         Exit();
 }
 
-#endif // #ifndef PerlMin
+#endif // #ifndef PerlAppMinimal
 
 static void DoRunScriptL(TFileName aScriptName)
 {
     CPerlBase* perl = CPerlBase::NewInterpreterLC();
     TRAPD(error, perl->RunScriptL(aScriptName));
-#ifndef PerlMin
+#ifndef PerlAppMinimal
     if (error != KErrNone) {
         TMessageBuffer message;
         message.Format(_L("Error %d"), error);
         YesNoDialogL(message);
     }
-#endif // #ifndef PerlMin
+#endif // #ifndef PerlAppMinimal
     CleanupStack::PopAndDestroy(perl);
 }
 
-#ifndef PerlMin
+#ifndef PerlAppMinimal
 
 void CPerlAppUi::OpenFileL(const TDesC& aFileName)
 {
@@ -482,7 +527,7 @@ void CPerlAppUi::OpenFileL(const TDesC& aFileName)
     return;
 }
 
-#endif // #ifndef PerlMin
+#endif // #ifndef PerlAppMinimal
 
 TBool CPerlAppUi::ProcessCommandParametersL(TApaCommand aCommand, TFileName& /* aDocumentName */, const TDesC8& /* aTail */)
 {
@@ -501,23 +546,23 @@ TBool CPerlAppUi::ProcessCommandParametersL(TApaCommand aCommand, TFileName& /*
     return aCommand == EApaCommandOpen ? ETrue : EFalse;
 }
 
-#ifndef PerlMin
+#ifndef PerlAppMinimal
 
 void CPerlAppUi::SetFs(const RFs& aFs)
 {
     iFs = (RFs*) &aFs;
 }
 
-#endif // #ifndef PerlMin
+#endif // #ifndef PerlAppMinimal
 
 static void DoHandleCommandL(TInt aCommand) {
-#ifndef PerlMin
+#ifndef PerlAppMinimal
     TMessageBuffer message;
-#endif // #ifndef PerlMin
+#endif // #ifndef PerlAppMinimal
 
     switch(aCommand)
     {
-#ifndef PerlMin
+#ifndef PerlAppMinimal
     case EPerlAppCommandAbout:
         {
             message.Format(KAboutFormat,
@@ -547,37 +592,23 @@ static void DoHandleCommandL(TInt aCommand) {
      case EPerlAppCommandRunFile:
         {
             TFileName aScriptUtf16;
-#ifdef __SERIES60__
-            if (AknCommonDialogs::RunSelectDlgLD(aScriptUtf16,
-                                                 R_MEMORY_SELECTION_DIALOG))
-                DoRunScriptL(aScriptUtf16);
-#endif /* #ifdef __SERIES60__ */
-#ifdef __SERIES80__
            aScriptUtf16.Copy(_L("C:\\"));
-           if (CCknOpenFileDialog::RunDlgLD(aScriptUtf16,
-               CCknOpenFileDialog::EShowSystemFilesAndFolders |
-               CCknOpenFileDialog::EShowHiddenFilesAndFolders |
-               CCknOpenFileDialog::EShowAllDrives             |
-               CCknOpenFileDialog::EShowExtendedView          |
-               CCknOpenFileDialog::EShowNoFilesText) {
-             /* TODO: despite all the above flags still does not seem
-              * to allow navigating outside the default directory. */
-             TEntry aEntry;
-             RFs aFs;
-             aFs.Connect();
-             if (aFs.Entry(aScriptUtf16, aEntry) == KErrNone)
-                DoRunScriptL(aScriptUtf16);
-             /* else show error message? */
-           }
-#endif /* #ifdef __SERIES80__ */
+           if (FileQueryDialogL(aScriptUtf16))
+             DoRunScriptL(aScriptUtf16);
        }
         break;
      case EPerlAppCommandOneLiner:
         {
+#ifdef __SERIES60__
             _LIT(prompt, "Oneliner:");
+#endif /* #ifdef __SERIES60__ */
+#ifdef __SERIES80__
+            _LIT(prompt, "Code:"); // The title has "Oneliner" already.
+#endif /* #ifdef __SERIES80__ */
             CPerlAppUi* cAppUi =
               STATIC_CAST(CPerlAppUi*, CEikonEnv::Static()->EikAppUi());
-            if (TextQueryDialogL(prompt,
+            if (TextQueryDialogL(_L("Oneliner"),
+                                prompt,
                                 cAppUi->iOneLiner,
                                  KPerlAppOneLinerSize)) {
                const TUint KPerlAppUtf8Multi = 3;
@@ -620,13 +651,13 @@ static void DoHandleCommandL(TInt aCommand) {
                      PERL_SYMBIANSDK_MAJOR,
                      PERL_SYMBIANSDK_MINOR
                      );
-            InformationNoteL(message);
+            InformationNoteL(m1);
+           User::After((TTimeIntervalMicroSeconds32) (1000*1000));
             m2.Format(KCopyrightFormat);
-           message.Format(_L("%S %S"), &m1, &m2);
-            InformationNoteL(message);
+            InformationNoteL(m2);
         }
         break;
-#endif // #ifndef PerlMin
+#endif // #ifndef PerlAppMinimal
     default:
         Panic(EPerlAppCommandUnknown);
     }
@@ -716,7 +747,7 @@ CEikAppUi* CPerlAppDocument::CreateAppUiL()
 }
 
 
-#ifndef PerlMin
+#ifndef PerlAppMinimal
 
 CFileStore* CPerlAppDocument::OpenFileL(TBool aDoOpen, const TDesC& aFileName, RFs& aFs)
 {
@@ -728,7 +759,7 @@ CFileStore* CPerlAppDocument::OpenFileL(TBool aDoOpen, const TDesC& aFileName, R
     return NULL;
 }
 
-#endif // #ifndef PerlMin
+#endif // #ifndef PerlAppMinimal
 
 EXPORT_C CApaApplication* NewApplication() 
 {
index 04cc0c7..8782fa0 100644 (file)
 # include <eikdoc.h>
 # include <eikbctrl.h>
 # include <eikgted.h>
+# include <eikdialg.h>
 #endif /* #ifdef __SERIES60__ */
 
 #include <coecntrl.h>
 #include <f32file.h>
 
 /* The source code can be compiled into "PerlApp" which is the simple
- * launchpad application/demonstrator, or into "PerlMin", which is the
- * minimal Perl launchpad application.  Define the cpp symbols
- * PerlMin (a boolean), PerlMinUid (the Symbian application uid in
- * the 0x... format), and PerlMinName (a C wide string, with the L prefix)
- * to compile as "PerlMin". */
-
-#define PerlMinSample
-
-#ifdef PerlMinSample
-# define PerlMin
-# define PerlMinUid 0x102015F6
-# define PerlMinName L"PerlMin"
+ * launchpad application/demonstrator, or into "PerlAppMinimal", which
+ * is the minimal Perl launchpad application.  Define the cpp symbols
+ * CreatePerlAppMinimal (a boolean), PerlAppMinimalUid (the Symbian
+ * application uid in the 0x... format), and PerlAppMinimalName (a C
+ * wide string, with the L prefix) to compile as "PerlAppMinimal". */
+
+// #define CreatePerlAppMinimal
+
+#ifdef CreatePerlAppMinimal
+# define PerlAppMinimal
+# ifndef PerlAppMinimalUid // PerlApp is ...F6, PerlRecog is ...F7
+#  define PerlAppMinimalUid 0x102015F8
+# endif
+# ifndef PerlAppMinimalName
+#  define PerlAppMinimalName L"PerlAppMinimal"
+# endif
 #endif
 
-#ifdef PerlMin
-# ifndef PerlMinUid
-#   error PerlMin defined but PerlMinUid undefined
+#ifdef PerlAppMinimal
+# ifndef PerlAppMinimalUid
+#   error PerlAppMinimal defined but PerlAppMinimalUid undefined
 # endif
-# ifndef PerlMinName
-#  error PerlMin defined but PerlMinName undefined
+# ifndef PerlAppMinimalName
+#  error PerlAppMinimal defined but PerlAppMinimalName undefined
 # endif
 #endif
 
@@ -66,9 +71,9 @@ class CPerlAppDocument : public CMyDocument
 {
   public:
     CPerlAppDocument(CEikApplication& aApp):CMyDocument(aApp) {;}
-#ifndef PerlMin
+#ifndef PerlAppMinimal
     CFileStore* OpenFileL(TBool aDoOpen, const TDesC& aFilename, RFs& aFs);
-#endif // #ifndef PerlMin
+#endif // #ifndef PerlAppMinimal
   private: // from CEikDocument
     CEikAppUi* CreateAppUiL();
 };
@@ -92,11 +97,11 @@ class CPerlAppUi : public CMyAppUi
      ~CPerlAppUi();
     TBool ProcessCommandParametersL(TApaCommand aCommand, TFileName& aDocumentName, const TDesC8& aTail);
     void HandleCommandL(TInt aCommand);
-#ifndef PerlMin
+#ifndef PerlAppMinimal
     void OpenFileL(const TDesC& aFileName);
     void InstallOrRunL(const TFileName& aFileName);
     void SetFs(const RFs& aFs);
-#endif // #ifndef PerlMin
+#endif // #ifndef PerlAppMinimal
     TBuf<KPerlAppOneLinerSize> iOneLiner; // Perl source code to evaluate.
     CPerlAppView* iAppView;
   private:
@@ -117,4 +122,23 @@ class CPerlAppView : public CMyAppView
     void ConstructL(const TRect& aRect);
 };
 
+#ifdef __SERIES80__
+
+class CPerlAppTextQueryDialog : public CEikDialog
+{
+  public:
+    CPerlAppTextQueryDialog(HBufC*& aBuffer);
+    /* TODO: OfferKeyEventL() so that newline can be seen as 'OK'. */
+    HBufC*& iData;
+    TPtrC iTitle;  // used in S80 but not in S60
+    TPtrC iPrompt; // used in S60 and S80
+    TInt iMaxLength;
+  protected:
+    void PreLayoutDynInitL();
+  private:
+    TBool OkToExitL(TInt aKeycode);
+};
+
+#endif /* #ifdef __SERIES80__ */
+
 #endif // __PerlApp_h__
index 28c862f..4f892cb 100644 (file)
@@ -72,3 +72,22 @@ RESOURCE MENU_PANE r_Perl_menu
         };
 }
 
+
+RESOURCE DIALOG r_Perl_oneliner_dialog
+{
+    title = "Title";
+    buttons = R_EIK_BUTTONS_CANCEL_OK;
+    flags = EEikDialogFlagWait;
+    items = {
+        DLG_LINE {
+            type = EEikCtEdwin;
+           prompt = "Prompt";
+            id = EPerlAppTextQueryInputField;
+            control = EDWIN {
+                width = 10;
+                maxlength = 128;
+            };
+        }
+    };
+}
+
index b45e84d..77538b2 100644 (file)
@@ -384,6 +384,7 @@ __EOF__
        push @LIB, <<__EOF__;
 LIBRARY                eikctl.lib
 LIBRARY                eikcoctl.lib
+LIBRARY                eikdlg.lib
 LIBRARY                ckndlg.lib
 __EOF__
     }
@@ -464,6 +465,8 @@ build_${WIN}:       abld.bat ${WIN}_perl.mf ${WIN}_miniperl.mf ${WIN}_${VERSION}.mf pe
 
 build_vc6:     abld.bat ${WIN}_perl.mf ${WIN}_miniperl.mf ${WIN}_${VERSION}.mf vc6.mf perldll_wins
 
+build_vc7:     abld.bat ${WIN}_perl.mf ${WIN}_miniperl.mf ${WIN}_${VERSION}.mf vc7.mf perldll_wins
+
 build_cw:      abld.bat ${WIN}_perl.mf ${WIN}_miniperl.mf ${WIN}_${VERSION}.mf cw.mf perldll_winscw
 
 build_arm:     abld.bat perl_arm miniperl_arm arm_${VERSION}.mf perldll_arm
@@ -511,10 +514,12 @@ rerename_makedef:
 abld.bat abld: bld.inf
        bldmake bldfiles
 
-makefiles: win.mf arm.mf vc6.mf cw.mf
+makefiles: win.mf arm.mf vc6 vc7.mf cw.mf
 
 vc6:   win.mf vc6.mf build_vc6
 
+vc7:   win.mf vc7.mf build_vc7
+
 cw:    win.mf cw.mf build_cw
 
 ${WIN}_miniperl.mf: abld.bat symbian\\config.pl
@@ -555,6 +560,10 @@ vc6.mf: abld.bat symbian\\config.pl
        abld makefile vc6
        echo > vc6.mf
 
+vc7.mf: abld.bat symbian\\config.pl
+       abld makefile vc7
+       echo > vc7.mf
+
 cw.mf: abld.bat symbian\\config.pl
        abld makefile cw_ide
        echo > cw.mf
@@ -674,12 +683,19 @@ perl${VERSION}dist.zip perldist.zip: \$(ALLSIS) \$(SDKZIP) \$(ETC)
 
 perlapp:       sdkinstall perlapp_${WIN} perlapp_arm
 
+perlapp_arm_minimal sisify_hex perlappmin.hex perlrscmin.hex:  sdkinstall config.h
+       cd symbian; make perlapp_arm USERDEFS=-DCreatePerlAppMinimal
+       perl symbian\\hexdump.pl
+
 perlapp_win perlapp_${WIN}: config.h
        cd symbian; make perlapp_${WIN}
 
 perlapp_arm: config.h
        cd symbian; make perlapp_arm
 
+perlapp_arm_clean:
+       cd symbian; make clean
+
 perlapp_demo_extract:
        cd symbian; make perlapp_demo_extract
 
@@ -730,7 +746,8 @@ clean:      clean_${WIN} clean_arm rerename_makedef
        -del /f symbian\\abld.bat symbian\\*.sis symbian\\*.zip
        -del /f symbian\\perl5*.pkg symbian\\miniperl.pkg
        -del /f symbian\\PerlApp.rss
-       -del arm_*.mf ${WIN}_*.mf vc6*.mf cw*.mf
+       -del arm_*.mf ${WIN}_*.mf vc*.mf cw*.mf
+       -del perlappmin.hex perlrscmin.hex
        -perl symbian\\xsbuild.pl \$(XSBOPT) --clean \$(EXT)
        -rmdir /s /q perl${VERSION}_Data
        -cd symbian; make clean
@@ -780,6 +797,7 @@ perlapp_arm: ..\\config.h PerlApp.h PerlApp.cpp
 win.mf:
        bldmake bldfiles
        abld makefile vc6
+       abld makefile vc7
        abld makefile cw_ide
 
 perlapp_demo_extract:
@@ -794,6 +812,8 @@ clean:
        -perl demo_pl cleanup
        -del /f perlapp.sis
        -del /f b.pl
+       abld clean $WIN
+       abld clean thumb
 
 distclean: clean
        -del /f *.cwlink *.resources *.pref
diff --git a/symbian/hexdump.pl b/symbian/hexdump.pl
new file mode 100644 (file)
index 0000000..37adff3
--- /dev/null
@@ -0,0 +1,41 @@
+#!/usr/bin/perl -w
+
+use strict;
+
+die "$0: EPOCROOT unset\n" unless exists $ENV{EPOCROOT};
+die "$0: EPOCROOT directory does exists\n" unless -d $ENV{EPOCROOT};
+
+my $EPOC32 = "$ENV{EPOCROOT}epoc32";
+my $EXE = "$EPOC32\\release\\thumb\\urel\\perlapp.app";
+my $RSC = "$EPOC32\\data\\z\\system\\apps\\perlapp\\perlapp.rsc";
+
+use Fcntl qw(O_RDONLY);
+
+my %new = ($EXE => 'perlappmin.hex',
+          $RSC => 'perlrscmin.hex');
+
+for my $fn ($EXE, $RSC) {
+    if (sysopen(my $fh, $fn, O_RDONLY)) {
+       my $buffer;
+       my $size = -s $fn;
+       my $read;
+       my $newfn = $new{$fn};
+       unlink($newfn);
+       if (($read = sysread($fh, $buffer, $size)) == $size) {
+           if (open(my $newfh, ">$newfn")) {
+               binmode($newfh);
+               print $newfh unpack("H*", $buffer);
+               close($newfh);
+               print "Created $newfn\n";
+           } else {
+               die qq[$0: open ">$newfn" failed: $!\n];
+           }
+       } else {
+           die qq[$0: sysread $size returned $read\n];
+       }
+       close($fh);
+    } else {
+       die qq[$0: sysopen "$fn": $!\n];
+    }
+}
+
index d570310..8072249 100644 (file)
@@ -129,9 +129,9 @@ for my $target (@target) {
         "perl${VERSION}dll" => $UID + 0,
         "perl${VERSION}ext" => $UID + 1,
         "perl${VERSION}lib" => $UID + 2,
-
-        # app = + 3
-        # rec = + 4
+        "perlapp"           => $UID + 3,
+        "perlrecog"         => $UID + 4,
+        "perlappmin"        => $UID + 5,
     );
 
     die "$0: target has no UID\n" unless defined $UID{$target};
index ae0b0e6..9f8172f 100644 (file)
@@ -232,7 +232,7 @@ for my $i (sort @c) {
 }
 
 sub hex2data {
-  pack("H*", shift); # unpack("H*", $data) for the hex creation.
+  pack("H*", shift); # symbian\hexdump.pl to create the hexdumps.
 }
 
 my $APPHEX;
@@ -342,6 +342,7 @@ sub init_hex {
   # by compiling the PerlApp.cpp with PerlMinSample defined in PerlApp.h.
   # The following executable has been compiled using the Series 60 SDK 2.6
   # for Visual C.
+  # Use symbian\hexdump.pl to create the perlappmin.hex for this hexdump.
   if ($Variant eq 'S60') {
       $APPHEX = <<__APP__;
 79000010ce390010f61520108581107645504f430020000056176fa5000000000100bf00803e2bde56e1e0000300000180110000000000000010000000001000002000000000000001000000000000100000000007000000f8110000010000003c0f00007c00000000000000fc110000fc140000000000005e01000000b500f0f7f902bc084700000148006870470000280c001000b5011c024800f0b3fc01bc00470000480c001030b585b00490002100f004fd6846049900f046fb684600f01bf9011c049cb4256d006019016004980022002300f002fab6256d0065190020286000f003fa012100f006fa05b030bc01bc0047f0b5071c0e1c1e4878611e48b8611e48f8611e48b8641e48f8641e483860b42464003d192968002910d0786800f018fb2968002905d008688268081c032100f0a3f9b4246400391900200860b62464003d192868002803d000f060fc00202860b96a002905d008688268081c032100f08bf9381c311c00f0adfcf0bc01bc0047c40e0010280f0010180f0010f80e0010040f00105c0c001084b010b595b01790189119921a9301200021002200f07efc041c14a901a800f037fc002808d10090201c17a90222002300f076fc00f032fc00f036fc15b010bc08bc04b018470000f0b5474680b4324ca544071c8846022952d100f0bbfa011c0a687ea8126a00f043f98026f6006e44301c00f07dfa2949301c7eaa002300f07dfac425ed006d44281c00f07ffa244c6c440021224868440160201c042100f07bfa301c00f07efa011c201c2a1c00f07ffa002824d1301c00f074fa011c8420000168448022520000f0f4fb8521090169446846fc22520000f0f2fb84200001684400680f49694409680f4a6a4412680e4b6b441b68fff783ff381c00f070fa00204446002c00d10120094b9d4408bc9846f0bc02bc0847b4f5ffff2c0c0010480a000044080000480800004c0800004c0a000000b50120fff7e6fe01bc004700b5021c80204000814202d00348814206d1101c00f044fa05e00000c10b0000081cfff7e7ff01bc0047000010b500f007f8041c00f0aafb201c10bc02bc084730b5051c302000f0a7fb041c002c05d000f0f2f80748606007482060201c00f0a1fb201c291c00f009f8201c30bc02bc08470000d40c0010e40c001030b5041c0d1c00f0dff8201c291c00f0e1f82068016a201c00f08af830bc01bc0047000000b5044a4260044a026000f0d7f801bc00470000d40c0010e40c001030b584b0041c00f0d1f8051c6846211c00f0d2f82868b8300268281c694600f069f804b030bc01bc0047000030b5051c242000f053fb041c002c04d0291c00f085fb03482060201c30bc02bc08470000940d001070b5b820400000f03ffb061c002e18d000f0c4f90d48b0640d48f0640d4d75610d4cb4610d4bf3610d4ab2640d49f1640d4830600d483060301c6030802100f02ffb301c70bc02bc084700002c0e0010380e0010c40e0010280f0010180f0010f80e0010040f00104c0e00105c0c001010b58b20800000f019fb041c002c03d000f092f902482060201c10bc02bc0847f00d0010002070470047704708477047104770471847704720477047284770473047704738477047404770474847704750477047584770476047704770477047014b1b681847c0463c0f0010014b1b681847c046440f0010014b1b681847c046480f0010014b1b681847c046400f001040b4024e3668b44640bc6047900f0010014b1b681847c04610100010014b1b681847c0462c100010014b1b681847c0461c100010014b1b681847c046a00f0010014b1b681847c04608100010014b1b681847c04618100010014b1b681847c04614100010014b1b681847c046e80f0010014b1b681847c046dc0f0010014b1b681847c046d40f0010014b1b681847c04600100010014b1b681847c046fc0f0010014b1b681847c046980f0010014b1b681847c0468c0f0010014b1b681847c046e40f0010014b1b681847c04628100010014b1b681847c046f40f0010014b1b681847c04604100010014b1b681847c046c40f0010014b1b681847c046d80f0010014b1b681847c046bc0f0010014b1b681847c046a80f0010014b1b681847c046ac0f0010014b1b681847c046cc0f0010014b1b681847c046b80f0010014b1b681847c046b40f0010014b1b681847c046a40f0010014b1b681847c0460c100010014b1b681847c046e00f0010014b1b681847c0469c0f0010014b1b681847c046940f0010014b1b681847c046ec0f0010014b1b681847c046f00f0010014b1b681847c046d00f0010014b1b681847c046b00f0010014b1b681847c046c00f0010014b1b681847c046f80f0010014b1b681847c046c80f0010014b1b681847c04630100010014b1b681847c04634100010014b1b681847c04620100010014b1b681847c04624100010014b1b681847c0463c100010014b1b681847c04638100010014b1b681847c0465410001040b4024e3668b44640bc60474c100010014b1b681847c04650100010014b1b681847c04640100010014b1b681847c04648100010014b1b681847c04644100010014b1b681847c04668100010014b1b681847c046d8100010014b1b681847c04658100010014b1b681847c0468c100010014b1b681847c04624110010014b1b681847c04620110010014b1b681847c04638110010014b1b681847c046e8100010014b1b681847c04698100010014b1b681847c046a8100010014b1b681847c04608110010014b1b681847c046d4100010014b1b681847c046c8100010014b1b681847c04678100010014b1b681847c046ac100010014b1b681847c04614110010014b1b681847c046ec100010014b1b681847c046f0100010014b1b681847c04674100010014b1b681847c046c4100010014b1b681847c04660100010014b1b681847c046e0100010014b1b681847c04694100010014b1b681847c0465c100010014b1b681847c046f4100010014b1b681847c046bc100010014b1b681847c0467c100010014b1b681847c04688100010014b1b681847c046cc100010014b1b681847c04600110010014b1b681847c0460c110010014b1b681847c046f8100010014b1b681847c04690100010014b1b681847c046b8100010014b1b681847c046b4100010014b1b681847c046dc100010014b1b681847c046e4100010014b1b681847c04610110010014b1b681847c0462c11001040b4024e3668b44640bc6047b0100010014b1b681847c04604110010014b1b681847c04670100010014b1b681847c0469c100010014b1b681847c0466410001040b4024e3668b44640bc6047fc100010014b1b681847c04684100010014b1b681847c04680100010014b1b681847c046c0100010014b1b681847c04628110010014b1b681847c0466c10001040b4024e3668b44640bc6047d0100010014b1b681847c046a0100010014b1b681847c04630110010014b1b681847c0463411001040b4024e3668b44640bc6047a4100010014b1b681847c0461c110010014b1b681847c04618110010014b1b681847c04644110010014b1b681847c04664110010014b1b681847c04654110010014b1b681847c04658110010014b1b681847c04648110010014b1b681847c0465c110010014b1b681847c0463c110010014b1b681847c0464c110010014b1b681847c04640110010014b1b681847c04650110010014b1b681847c04660110010014b1b681847c04668110010014b1b681847c0466c110010014b1b681847c0467011001040b4024e3668b44640bc604774110010014b1b681847c0464c0f0010014b1b681847c046840f0010014b1b681847c046880f0010014b1b681847c046640f0010014b1b681847c046740f0010014b1b681847c046540f0010014b1b681847c0465c0f001040b4024e3668b44640bc6047500f0010014b1b681847c046800f0010014b1b681847c0467c0f0010014b1b681847c046700f0010014b1b681847c0466c0f001040b4024e3668b44640bc6047680f0010014b1b681847c046580f0010014b1b681847c046600f0010014b1b681847c046780f00107047000000b5fff72fff01bc0047000000b5fff72fff01bc0047000000b5fff723ff01bc0047000010b581b0039c14380094fff7b1fe01b010bc01bc0047000000b51438fff7d6ff01bc004700b51438fff7aafe01bc004700b51838fff7fcfe02bc084700b51c38fff7f0fe02bc084700b51c38fff7e4fe02bc084700b50438fff774fd02bc084700b50438fff768fd02bc084700b54838fff7a0ff01bc004700b54c38fff7a0ff01bc0047ffffffff00000000ffffffff00000000280c0010480c0010c40e0010280f0010180f0010f80e0010040f00105c0c00102c0c0010d40c0010e40c0010d40c0010e40c0010940d00102c0e0010380e0010c40e0010280f0010180f0010f80e0010040f00104c0e00105c0c0010580d0010f00d0010f61520100a000000640065006600610075006c0074002e0070006c0000000000070000005000650072006c004d0069006e000000000000000000000079000010650a0010710a00101507001021070010fd050010090600107d0a001015060010890a00102d070010210600102d0600102d00001039070010590100104507001051020010510700105d07001069070010950a001075070010810700108d07001099070010a50a0010b10a0010fcffffff00000000910b0010850b00100000000000000000f1020010d1040010dd040010e9040010f5040010010500100d0500101905001025050010310500103d0500104905001055050010610500106d0500107905001085050010910500109d050010a9050010b5050010c1050010cd050010d90500100d030010e5050010f105001000000000000000000d0b0010bd0a0010a5070010190a0010c90a0010b107001031040010bd070010c9070010d5070010e1070010ed070010190a00100000000000000000190b0010f9070010050800103d040010110800101d080010290800103508001041080010090b00104d08001059080010490400105504001065080010710800107d08001061030010d50a001089080010950800100000000000000000250b0010bd0a0010a50700100d000010c90a0010b107001031040010bd070010c9070010d5070010e1070010ed070010390300100000000000000000190a00100000000000000000190a0010390600104506001000000000000000004d0a0010650a0010710a00101507001021070010fd050010090600107d0a001015060010890a00102d070010210600102d06001021090010390700102d090010450700103d090010510700105d07001069070010950a001075070010810700108d07001099070010a50a0010b10a0010ecffffff00000000490b0010bd080010c9080010d5080010e1080010f1080010fd080010310b001009090010550b001015090010b8ffffff000000009d0b0010b4ffffff00000000a90b00103906001045060010e4ffffff00000000790b00106d0b0010e8ffffff00000000610b0010510600105d06001003000000060000001b000000470000003f000000ee020000f502000022030000230300002503000028030000b5040000b6040000d2040000e6040000f304000044050000480500000008000005080000030000000c0000001c0000001d000000210000002800000042000000480000004a000000520000005400000055000000570000005a0000005f0000006000000064000000650000008a0000008b0000008f0000009300000099000000a0000000ad000000b1000000b9000000bb000000c5000000c8000000d0000000d6000000dd000000df000000e2000000e8000000ec000000ff0000000001000014010000150100002401000025010000380100003a010000120000002700000033000000b7000000e3000000e600000011000000140000001e0000001f0000002000000028000000300000003100000033000000340000004000000041000000420000004300000044000000470000004a0000004b0000004c00000050000000510000005200000054000000560000006400000074000000790000007a0000007c0000008200000085000000860000008c0000008e0000008f00000092000000930000009500000096000000970000009b0000009d000000a1000000b3000000c6000000c8000000cc000000ce000000d5000000d6000000de000000e0000000e2000000fd000000080100002201000028010000020000000300000029030000380300003c0300005a0300007c0400008c0400000205000003050000e00500002e0600004b060000040000008905000000000000d103000000030000780200000400000003000000060000001b000000470000008d020000100000003f000000ee020000f502000022030000230300002503000028030000b5040000b6040000d2040000e6040000f304000044050000480500000008000005080000a10200002d000000030000000c0000001c0000001d000000210000002800000042000000480000004a000000520000005400000055000000570000005a0000005f0000006000000064000000650000008a0000008b0000008f0000009300000099000000a0000000ad000000b1000000b9000000bb000000c5000000c8000000d0000000d6000000dd000000df000000e2000000e8000000ec000000ff0000000001000014010000150100002401000025010000380100003a010000b402000006000000120000002700000033000000b7000000e3000000e6000000c80200003900000011000000140000001e0000001f0000002000000028000000300000003100000033000000340000004000000041000000420000004300000044000000470000004a0000004b0000004c00000050000000510000005200000054000000560000006400000074000000790000007a0000007c0000008200000085000000860000008c0000008e0000008f00000092000000930000009500000096000000970000009b0000009d000000a1000000b3000000c6000000c8000000cc000000ce000000d5000000d6000000de000000e0000000e2000000fd000000080100002201000028010000de0200000d000000020000000300000029030000380300003c0300005a0300007c0400008c0400000205000003050000e00500002e0600004b060000f20200000200000004000000890500004150504152435b31303030336133645d2e444c4c0041564b4f4e5b31303030353663365d2e444c4c00434f4e455b31303030336134315d2e444c4c0045465352565b31303030333965345d2e444c4c0045494b434f52455b31303030343839325d2e444c4c0045555345525b31303030333965355d2e444c4c005045524c3539332e444c4c000000c00200005c01000000000000c002000014302830f830fc300031043108310c312c32c432c832043308335c33ac33b033b433b833bc33c033c433c833cc33f0333834443450345c346c347834843490349c34a834b434c034cc34d834e434f034fc340835143520352c353835443550355c356835743580358c359835a435b035bc35c835d435e035ec35f835043610361c362836343640364c365836643670367c3688369836a436b036bc36c836d436e036ec36f836043710371c372837343740374c375837643770377c3788379437a037ac37b837c437d037dc37e837f43700380c381838243830383c384838543860386c387838843890389c38ac38b838c438d038dc38ec38f838043910391c3928393839443950395c396c397839843990399c39a839b439c039cc39d839e439f039fc39083a143a203a2c3a3c3a483a543a603a6c3a783a843a903aa03aac3ab83ac43ad03ae03aec3af83a043bc43bc83bcc3bd03bd43bd83bdc3be03be43be83bec3bf03bf43bf83bfc3b003c043c083c0c3c103c143c183c1c3c203c243c643c683c6c3c703c743c783c7c3c803c843c883c8c3c903c943c983c9c3ca03ca43ca83cac3cb03cb43cb83cbc3cc03cc43cc83ccc3cd03cdc3ce03cec3cf03cf43cf83cfc3c003d043d083d0c3d103d143d183d1c3d203d243d283d2c3d303d343d383d3c3d403d443d483d4c3d503d543d603d643d683d6c3d703d743d783d7c3d803d843d883d8c3d903d9c3da03da43da83dac3db03db43db83dbc3dc03dc43dc83dcc3dd03dd43dd83ddc3de03de43de83dec3df83dfc3d003e043e083e0c3e103e143e183e1c3e203e243e283e343e403e443e483e543e583e5c3e603e643e683e6c3e703e743e783e7c3e803e843e883e8c3e903e943e983e9c3ea03ea43ea83eac3eb03eb43eb83ebc3ec03ecc3ed03ed43ed83edc3ee03ee43ee83eec3ef03ef43e003f0c3f103f143f203f243f303f343f383f
@@ -353,6 +354,7 @@ __APP__
   # by compiling the PerlApp.cpp.
   # The following resource has been compiled using the Series 60 SDK 2.6
   # for Visual C.
+  # Use symbian\hexdump.pl to create the perlrscmin.hex for this hexdump.
   if ($Variant eq 'S60') {
     $RSCHEX = <<__RSC__;
 6b4a1f10000000005fde04001ca360de01b80010000400000001f0e54d0000000004f0e54d00000000000000001a00cc0800000000010005f0e54d000000000000ffffffff0000000000000000000f0500000400000000000000000000050541626f7574170000ffffffff00000000010400000000000000000000040454696d65170000ffffffff00000000020400000000000000000000030352756e170000ffffffff0000000003040000000000000000000008084f6e656c696e6572170000ffffffff000000000404000000000000000000000909436f707972696768740e0000ffffffff00000000000000000120000000000000001400cc0801006816000100000000000100000000ffffffff00ffffffff0000000000000000ffff000000000000000120000000000000002400cc0801006816000100000000000100000000ffffffff00ffffffff0000000000000000ffff000000000000004122000000000000001400cc08010069160000050000000001000000000000000001000000040007000800ff020100ffffffff00000000000000000000ffff000000000000004122000000000000001400cc08010074160007000000000054160000ffffffff000000000000ffff00000000000000000000000015001d001d0035004d00ef0026015d01a301d201d701
@@ -364,6 +366,7 @@ __RSC__
   # by compiling the PerlApp.cpp with PerlMinSample defined in PerlApp.h.
   # The following executable has been compiled using the Series 80 SDK 2.0
   # for Visual C.
+  # Use symbian\hexdump.pl to create the perlappmin.hex for this hexdump.
   if ($Variant eq 'S80') {
       $APPHEX = <<__APP__;
 79000010ce390010f61520108581107645504f43002000009f6ac520000000000100bb00401aaa8157e1e00003000001980e0000000000000010000000001000002000000000000001000000000000100000000007000000100f000001000000900c00007c00000000000000140f0000dc110000000000005e01000000b500f0cff902bc0847000001480068704700009c0a001000b5011c024800f075fc01bc00470000bc0a001030b585b00490002100f0e6fa6846049900f0e8fa684600f013f9011c049c9e256d006019016004980022002300f0daf9a0256d0065190020286000f0dbf9012100f0def905b030bc01bc0047f0b5071c0e1c1b4878611b48b8611b4838609e2464003d192968002910d0786800f0c0fa2968002905d008688268081c032100f081f99e246400391900200860a02464003d192868002803d000f028fc00202860796a002905d008688268081c032100f069f9381c311c00f0a1faf0bc01bc0047480c00107c0c0010d00a001084b010b595b01790189119921a9301200021002200f046fc041c14a901a800f005fc002808d10090201c17a90222002300f03efc00f000fc00f004fc15b010bc08bc04b018470000f0b5474680b4324ca544071c8846022952d100f06ffa011c0a687ea8126a00f027f98026f6006e44301c00f025fa2949301c7eaa002300f025fac425ed006d44281c00f027fa244c6c440021224868440160201c042100f023fa301c00f026fa011c201c2a1c00f027fa002824d1301c00f01cfa011c8420000168448022520000f0c2fb8521090169446846fc22520000f0c0fb84200001684400680f49694409680f4a6a4412680e4b6b441b68fff783ff381c00f024fa00204446002c00d10120094b9d4408bc9846f0bc02bc0847b4f5ffffa00a0010480a000044080000480800004c0800004c0a000000b50120fff7f2fe01bc004700b5081cfff7f6ff01bc004710b5021c80204000814203d1101c00f0f5f905e09e24640010190068fff7eaff10bc01bc0047000010b500f007f8041c00f074fb201c10bc02bc084730b5051c2c2000f071fb041c002c03d000f092fb06482060201c00f06dfb201c291c00f007f8201c30bc02bc084700003c0b001030b5041c0d1c00f0bdf8201c291c00f0bff82068016a201c00f06ef830bc01bc0047000000b5034a026000f0b7f801bc004700003c0b001030b584b0041c00f0b3f8051c6846211c00f0b4f82868b8300268281c694600f051f804b030bc01bc0047000030b5051c242000f025fb041c002c04d0291c00f08ff903482060201c30bc02bc08470000b00b001010b5a220400000f011fb041c002c0cd000f082f9074860610748a06107482060201c3430802100f00dfb201c10bc02bc08470000480c00107c0c0010d00a001010b58b20800000f003fb041c002c03d000f068f902482060201c10bc02bc08470c0c0010002070470047704708477047104770471847704720477047284770473047704738477047404770474847704750477047584770476047704770477047014b1b681847c046900c0010014b1b681847c046980c0010014b1b681847c0469c0c0010014b1b681847c046940c001040b4024e3668b44640bc6047a40c0010014b1b681847c046100d0010014b1b681847c046280d0010014b1b681847c046b40c0010014b1b681847c046080d0010014b1b681847c046180d0010014b1b681847c046140d0010014b1b681847c046f00c0010014b1b681847c046e40c0010014b1b681847c046dc0c0010014b1b681847c046000d0010014b1b681847c046fc0c0010014b1b681847c046ac0c0010014b1b681847c046a00c0010014b1b681847c046ec0c0010014b1b681847c046240d0010014b1b681847c046040d0010014b1b681847c046e00c0010014b1b681847c046bc0c0010014b1b681847c046d40c0010014b1b681847c046c80c0010014b1b681847c046c40c0010014b1b681847c046b80c0010014b1b681847c0460c0d0010014b1b681847c046e80c0010014b1b681847c046b00c0010014b1b681847c046a80c0010014b1b681847c046f40c0010014b1b681847c046d80c0010014b1b681847c046c00c0010014b1b681847c046cc0c0010014b1b681847c046f80c0010014b1b681847c046d00c0010014b1b681847c0461c0d0010014b1b681847c046200d0010014b1b681847c046400d001040b4024e3668b44640bc6047380d0010014b1b681847c0463c0d0010014b1b681847c0462c0d0010014b1b681847c046340d0010014b1b681847c046300d0010014b1b681847c046540e0010014b1b681847c0466c0d0010014b1b681847c046e80d0010014b1b681847c046300e0010014b1b681847c0465c0d0010014b1b681847c0468c0d0010014b1b681847c046340e0010014b1b681847c0463c0e0010014b1b681847c046380e0010014b1b681847c046480e0010014b1b681847c046500e0010014b1b681847c046f40d0010014b1b681847c046fc0d0010014b1b681847c046440e0010014b1b681847c046b40d0010014b1b681847c046980d0010014b1b681847c046a80d0010014b1b681847c046e40d0010014b1b681847c046d00d0010014b1b681847c046780d001040b4024e3668b44640bc6047a00d0010014b1b681847c046ac0d0010014b1b681847c046240e0010014b1b681847c046000e0010014b1b681847c046040e0010014b1b681847c046d80d0010014b1b681847c046740d0010014b1b681847c046d40d0010014b1b681847c046c80d0010014b1b681847c046640d0010014b1b681847c046f00d0010014b1b681847c046940d0010014b1b681847c046600d0010014b1b681847c046080e0010014b1b681847c046c00d0010014b1b681847c0467c0d0010014b1b681847c046880d0010014b1b681847c046dc0d0010014b1b681847c046140e0010014b1b681847c0461c0e0010014b1b681847c0460c0e0010014b1b681847c046900d0010014b1b681847c046bc0d0010014b1b681847c046b80d0010014b1b681847c046ec0d0010014b1b681847c046f80d001040b4024e3668b44640bc6047cc0d0010014b1b681847c046200e0010014b1b681847c0464c0e001040b4024e3668b44640bc6047a40d0010014b1b681847c046e00d001040b4024e3668b44640bc6047b00d0010014b1b681847c046180e0010014b1b681847c046700d0010014b1b681847c0469c0d0010014b1b681847c046680d001040b4024e3668b44640bc6047100e0010014b1b681847c046840d0010014b1b681847c046800d0010014b1b681847c046c40d0010014b1b681847c046400e0010014b1b681847c0462c0e0010014b1b681847c046280e0010014b1b681847c046600e0010014b1b681847c046800e0010014b1b681847c046700e0010014b1b681847c046740e0010014b1b681847c046640e0010014b1b681847c046780e0010014b1b681847c046580e0010014b1b681847c046680e0010014b1b681847c0465c0e0010014b1b681847c0466c0e0010014b1b681847c0467c0e0010014b1b681847c046840e0010014b1b681847c046880e001040b4024e3668b44640bc60478c0e0010014b1b681847c046540d0010014b1b681847c046500d0010014b1b681847c0464c0d0010014b1b681847c046480d0010014b1b681847c046440d0010014b1b681847c046580d00107047000000b5fff77bff01bc0047000000b5fff76fff01bc0047000010b581b0039c14380094fff725ff01b010bc01bc0047000000b51438fff716ff01bc004700b51438fff71eff01bc004700b51838fff702ff02bc0847ffffffff00000000ffffffff000000009c0a0010bc0a0010480c00107c0c0010d00a0010a00a00103c0b00103c0b0010b00b0010480c00107c0c0010d00a00100c0c0010f61520100a000000640065006600610075006c0074002e0070006c0000000000070000005000650072006c004d0069006e000000000000000000000079000010710600107d06001089060010950600106505001071050010a10600107d050010ad060010b906001089050010950500102d000010c50600104101001045020010d1060010dd060010e9060010f506001005070010110700101d070010290700100000000000000000d902001075040010810400108d04001099040010a5040010b1040010bd040010c9040010c5090010d5040010d1090010e1040010dd090010e9090010ed040010f904001005050010110500101d0500102905001035050010410500104d050010ed020010f5090010590500100000000000000000050a0010a1070010ad070010ed030010b9070010c5070010d1070010dd070010e9070010010a0010f507001001080010f9030010050400100d08001019080010250800104103001031080010410800104d0800100000000000000000110a001035070010410700100d0000104d07001059070010e103001065070010710700107d070010890700109507001019030010ecffffff00000000350a0010910800109d080010a9080010b5080010c5080010d10800101d0a0010dd080010410a0010e9080010e8ffffff000000004d0a0010a1050010ad05001003000000060000001b00000047000000030000000c0000001c0000001d0000002100000028000000420000004a0000005200000054000000550000005a0000006000000064000000650000008a0000008b0000008f0000009300000099000000a0000000b1000000bb000000c5000000c8000000d0000000d6000000dd000000df000000e2000000e8000000ff000000000100001401000015010000120000002700000033000000b7000000e3000000e6000000260100005601000065010000800200000a040000af04000011000000140000001e0000001f00000020000000300000003100000033000000340000004000000041000000420000004300000044000000470000004a0000004b0000004e0000005000000051000000520000005400000055000000560000006400000074000000790000007a0000007b0000007c0000007d0000007f0000008200000083000000860000008c0000008e0000008f0000009000000092000000930000009500000096000000970000009b0000009d000000a1000000b3000000c8000000cc000000ce000000d5000000d6000000d9000000db000000de000000e0000000e2000000e5000000fb000000fd000000fe0000002f010000020000000300000029030000380300003c0300005a0300007c0400008c0400000205000003050000e00500002e06000004000000890500000000000081030000c80200003c0200000400000003000000060000001b000000470000005102000023000000030000000c0000001c0000001d0000002100000028000000420000004a0000005200000054000000550000005a0000006000000064000000650000008a0000008b0000008f0000009300000099000000a0000000b1000000bb000000c5000000c8000000d0000000d6000000dd000000df000000e2000000e8000000ff0000000001000014010000150100006402000006000000120000002700000033000000b7000000e3000000e60000007802000006000000260100005601000065010000800200000a040000af0400008f0200003f00000011000000140000001e0000001f00000020000000300000003100000033000000340000004000000041000000420000004300000044000000470000004a0000004b0000004e0000005000000051000000520000005400000055000000560000006400000074000000790000007a0000007b0000007c0000007d0000007f0000008200000083000000860000008c0000008e0000008f0000009000000092000000930000009500000096000000970000009b0000009d000000a1000000b3000000c8000000cc000000ce000000d5000000d6000000d9000000db000000de000000e0000000e2000000e5000000fb000000fd000000fe0000002f010000a50200000c000000020000000300000029030000380300003c0300005a0300007c0400008c0400000205000003050000e00500002e060000b90200000200000004000000890500004150504152435b31303030336133645d2e444c4c00434f4e455b31303030336134315d2e444c4c0045465352565b31303030333965345d2e444c4c0045494b434f43544c5b31303030343839655d2e444c4c0045494b434f52455b31303030343839325d2e444c4c0045555345525b31303030333965355d2e444c4c005045524c3539332e444c4c0000000004020000fe000000000000000402000014302830ec30f030f4301432b032e8323c33743378337c33a033e833f43300340c341c342834343440344c345834643470347c3488349434a034ac34b834c434d034dc34e834f43400350c351835243530353c354835543560356c357835843590359c35a835b435c035d035dc35e835f43500360c361836243630363c364836543660366c367836843690369c36a836b436c036cc36d836e436f03600370c371837243730373c374837543760376c377837843790379c37a837b437c037cc37d837e437f037fc370838143820382c383c38483854386438703880388c389838a438b038c038cc38d838e438f038fc380839143920392c393839443950395c396839743980398c399839a439b439c039cc39d839e439f039fc39683a6c3a703a743a783a7c3a803a843a883a8c3a903a943a983ad83adc3ae03ae43ae83aec3af03af43af83afc3a003b043b083b0c3b103b143b183b1c3b203b243b283b2c3b303b343b383b443b483b4c3b503b543b583b5c3b603b643b683b6c3b703b743b783b7c3b803b843b883b8c3b903b943b983b9c3ba03ba43ba83bac3bb83bbc3bc03bc43bc83bcc3bd03bd43bd83bdc3be03be43be83bec3bf03bf43bf83bfc3b003c043c083c143c183c1c3c203c243c283c2c3c303c343c383c3c3c403c443c503c543c583c5c3c603c643c683c6c3c703c743c783c843c883c8c3c__APP__
@@ -374,6 +377,7 @@ __RSC__
   # by compiling the PerlApp.cpp.
   # The following resource has been compiled using the Series 80 SDK 2.0
   # for Visual C.
+  # Use symbian\hexdump.pl to create the perlrscmin.hex for this hexdump.
   if ($Variant eq 'S80') {
     $RSCHEX = <<__RSC__;
 6b4a1f10000000005fde04001ca360de01b800380400000001f0e54d0000000005f0e54d000000000000000004f0e54d000000000010010000005000000000000400000204030352756e0900ffffffff00030408084f6e656c696e65720900ffffffff000504050541626f75740900ffffffff0000010404457869740500ffffffff0007010006f0e54d07074f7074696f6e73110000000000ffffffff0000000000000000000f0500000400000000000000000000050541626f7574170000ffffffff00000000010400000000000000000000040454696d65170000ffffffff00000000020400000000000000000000030352756e170000ffffffff0000000003040000000000000000000008084f6e656c696e6572170000ffffffff000000000404000000000000000000000909436f707972696768740e0000ffffffff000000000000000014001c001c0034008200a5004701__RSC__