Symbian update blead@26025
Jarkko Hietaniemi [Mon, 7 Nov 2005 13:32:15 +0000 (15:32 +0200)]
Message-ID: <B356D8F434D20B40A8CEDAEC305A1F24E7A70C@esebe105.NOE.Nokia.com>

p4raw-id: //depot/perl@26030

30 files changed:
MANIFEST
doio.c
perl.c
symbian/PerlApp.cpp
symbian/PerlApp.h
symbian/PerlApp.hrh
symbian/PerlBase.h
symbian/PerlUi.cpp [new file with mode: 0644]
symbian/PerlUi.h [new file with mode: 0644]
symbian/PerlUi.hrh [new file with mode: 0644]
symbian/PerlUiS60.rss [moved from symbian/PerlAppS60.rss with 87% similarity]
symbian/PerlUiS80.rss [moved from symbian/PerlAppS80.rss with 78% similarity]
symbian/PerlUiUIQ.rss [moved from symbian/PerlAppUIQ.rss with 69% similarity]
symbian/TODO
symbian/config.pl
symbian/config.sh
symbian/ext/Moped/Msg/Msg.mmp [new file with mode: 0644]
symbian/ext/Moped/Msg/Msg.pkg [new file with mode: 0644]
symbian/ext/Moped/Msg/Msg.pm [new file with mode: 0644]
symbian/ext/Moped/Msg/Msg.xs [new file with mode: 0644]
symbian/ext/Moped/Msg/README [new file with mode: 0644]
symbian/ext/Moped/Msg/bld.inf [new file with mode: 0644]
symbian/ext/Moped/Msg/location.pl [new file with mode: 0644]
symbian/sanity.pl
symbian/sdk.pl
symbian/sisify.pl
symbian/symbian_proto.h
symbian/symbian_utils.cpp
symbian/symbianish.h
symbian/xsbuild.pl

index 3da312c..eaedbe1 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -2647,6 +2647,13 @@ symbian/config.pl                Configuration script for Symbian
 symbian/config.sh              Configuration data for Symbian
 symbian/cwd.pl                 Helper code for config.pl
 symbian/demo_pl                        "Archive" of demo code
+symbian/ext/Moped/Msg/bld.inf  Demo extension build configuraion
+symbian/ext/Moped/Msg/location.pl      Demo extension script
+symbian/ext/Moped/Msg/Msg.mmp  Demo extension building
+symbian/ext/Moped/Msg/Msg.pkg  Demo extension packaging
+symbian/ext/Moped/Msg/Msg.pm   Demo extension Perl glue
+symbian/ext/Moped/Msg/Msg.xs   Demo extension code
+symbian/ext/Moped/Msg/README   Demo extension documentation
 symbian/find_writeable_data.pl Development utility
 symbian/hexdump.pl             Helper for sisify.pl updating
 symbian/install.cfg            Installation instructions
@@ -2655,14 +2662,17 @@ symbian/PerlAppAif.rss          Symbian app launcher code
 symbian/PerlApp.cpp            Symbian app launcher code
 symbian/PerlApp.h              Symbian app launcher header
 symbian/PerlApp.hrh            Symbian app launcher resource header
-symbian/PerlAppS60.rss         Symbian app launcher resource definition
-symbian/PerlAppS80.rss         Symbian app launcher resource definition
-symbian/PerlAppUIQ.rss         Symbian app launcher resource definition
 symbian/PerlBase.cpp           Symbian Perl base class
 symbian/PerlBase.h             Symbian Perl base class header
 symbian/PerlBase.pod           Symbian Perl base class documentation
 symbian/PerlRecog.cpp          Symbian recognizer code
 symbian/PerlRecog.mmp          Symbian recognizer build
+symbian/PerlUi.cpp             Symbian Perl UI class
+symbian/PerlUi.h               Symbian Perl UI class header
+symbian/PerlUi.hrh             Symbian Perl UI class resource header
+symbian/PerlUiS60.rss          Symbian app launcher resource definition
+symbian/PerlUiS80.rss          Symbian app launcher resource definition
+symbian/PerlUiUIQ.rss          Symbian app launcher resource definition
 symbian/PerlUtil.cpp           Symbian Perl utility class
 symbian/PerlUtil.h             Symbian Perl utility class header
 symbian/PerlUtil.pod           Symbian Perl utility class documentation
diff --git a/doio.c b/doio.c
index 5511b55..d1bc72c 100644 (file)
--- a/doio.c
+++ b/doio.c
@@ -1577,11 +1577,11 @@ Perl_apply(pTHX_ I32 type, register SV **mark, register SV **sp)
        platforms where kill was not defined.  */
 #ifndef HAS_KILL
     if (type == OP_KILL)
-       DIE(aTHX_ PL_no_func, "kill");
+       Perl_die(aTHX_ PL_no_func, "kill");
 #endif
 #ifndef HAS_CHOWN
     if (type == OP_CHOWN)
-       DIE(aTHX_ PL_no_func, "chown");
+       Perl_die(aTHX_ PL_no_func, "chown");
 #endif
 
 
diff --git a/perl.c b/perl.c
index a77c886..4a15b0c 100644 (file)
--- a/perl.c
+++ b/perl.c
@@ -2064,7 +2064,7 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
     if (xsinit)
        (*xsinit)(aTHX);        /* in case linked C routines want magical variables */
 #ifndef PERL_MICRO
-#if defined(VMS) || defined(WIN32) || defined(DJGPP) || defined(__CYGWIN__) || defined(EPOC)
+#if defined(VMS) || defined(WIN32) || defined(DJGPP) || defined(__CYGWIN__) || defined(EPOC) || defined(SYMBIAN)
     init_os_extras();
 #endif
 #endif
index ee95c93..d90cc04 100644 (file)
@@ -1,35 +1,12 @@
 /* Copyright (c) 2004-2005 Nokia. All rights reserved. */
 
 /* The PerlApp application is licensed under the same terms as Perl itself.
- * Note that this PerlApp is for Symbian/Series 60/80 smartphones and it has
- * nothing whatsoever to do with the ActiveState PerlApp. */
+ *
+ * Note that this PerlApp is for Symbian/Series 60/80/UIQ smartphones
+ * and it has nothing whatsoever to do with the ActiveState PerlApp. */
 
 #include "PerlApp.h"
 
-#ifdef __SERIES60__
-# include <avkon.hrh>
-# include <aknnotewrappers.h> 
-# include <AknCommonDialogs.h>
-# ifndef __SERIES60_1X__
-#  include <CAknFileSelectionDialog.h>
-# endif
-#endif /* #ifdef __SERIES60__ */
-
-#ifdef __SERIES80__
-# include <eikon.hrh>
-# include <cknflash.h>
-# include <ckndgopn.h>
-# include <ckndgfob.h>
-# include <eiklabel.h>
-# include <cknconf.h>
-#endif /* #ifdef __SERIES80__ */
-
-#ifdef __UIQ__
-# include <qikon.hrh>
-# include <eikedwin.h>
-# include <eiklabel.h>
-#endif /* #ifdef __UIQ__ */
-
 #include <apparc.h>
 #include <e32base.h>
 #include <e32cons.h>
 
 #include "PerlApp.hrh"
 
-#include "PerlApp.rsg"
-
-#ifdef __SERIES80__
-#include "Eikon.rsg"
-#endif /* #ifdef __SERIES80__ */
-
 #endif //#ifndef PerlAppMinimal
 
+#define PERL_GLOBAL_STRUCT
+#define PERL_GLOBAL_STRUCT_PRIVATE
+
 #include "EXTERN.h"
 #include "perl.h"
+#include "XSUB.h"
+
 #include "PerlBase.h"
+#include "PerlUtil.h"
+
+#define symbian_get_vars() Dll::Tls() // Not visible from perlXYZ.lib?
 
 const TUid KPerlAppUid = {
 #ifdef PerlAppMinimalUid
@@ -67,13 +46,6 @@ const TUid KPerlAppUid = {
 
 _LIT(KDefaultScript, "default.pl");
 
-// This is like the Symbian _LIT() but without the embedded L prefix,
-// which enables using #defined constants (which need to carry their
-// own L prefix).
-#ifndef _LIT_NO_L
-# define _LIT_NO_L(n, s) static const TLitC<sizeof(s)/2> n={sizeof(s)/2-1,s}
-#endif // #ifndef _LIT_NO_L
-
 #ifdef PerlAppMinimalName
 _LIT_NO_L(KAppName, PerlAppMinimalName);
 #else
@@ -98,11 +70,6 @@ typedef TBuf8<256> TFileName8;
 
 #endif // #ifndef PerlAppMinimal
 
-// Usage: DEBUG_PRINTF((_L("%S"), &aStr))
-#if 1
-#define DEBUG_PRINTF(s) {TMessageBuffer message; message.Format s; YesNoDialogL(message);}
-#endif
-
 static void DoRunScriptL(TFileName aScriptName);
 
 TUid CPerlAppApplication::AppDllUid() const
@@ -120,167 +87,8 @@ void Panic(TPerlAppPanic aReason)
     User::Panic(KAppName, aReason);
 }
 
-void CPerlAppUi::ConstructL()
-{
-    BaseConstructL();
-    iAppView = CPerlAppView::NewL(ClientRect());
-    AddToStackL(iAppView);
-    iFs = NULL;
-    CEikonEnv::Static()->DisableExitChecks(ETrue); // Symbian FAQ-0577.
-}
-
-CPerlAppUi::~CPerlAppUi()
-{
-    if (iAppView) {
-        iEikonEnv->RemoveFromStack(iAppView);
-        delete iAppView;
-        iAppView = NULL;
-    }
-    if (iFs) {
-        delete iFs;
-        iFs = NULL;
-    }
-    if (iDoorObserver) // Otherwise the embedding application waits forever.
-        iDoorObserver->NotifyExit(MApaEmbeddedDocObserver::EEmpty);
-}
-
 #ifndef PerlAppMinimal
 
-static TBool OkCancelDialogL(TDesC& aMessage)
-{
-#ifdef __SERIES60__
-    CAknNoteDialog* dlg =
-        new (ELeave) CAknNoteDialog(CAknNoteDialog::EConfirmationTone);
-    dlg->PrepareLC(R_OK_CANCEL_DIALOG);
-    dlg->SetTextL(aMessage);
-    return dlg->RunDlgLD() == EAknSoftkeyOk;
-#endif /* #ifdef __SERIES60__ */
-#ifdef __SERIES80__
-    return CCknConfirmationDialog::RunDlgWithDefaultIconLD(aMessage, R_EIK_BUTTONS_CANCEL_OK);
-#endif /* #ifdef __SERIES80__ */
-#ifdef __UIQ__
-    CEikDialog* dlg = new (ELeave) CEikDialog();
-    return dlg->ExecuteLD(R_OK_CANCEL_DIALOG) == EEikBidOk;
-#endif /* #ifdef __UIQ__ */
-}
-
-static TBool YesNoDialogL(TDesC& aMessage)
-{
-#ifdef __SERIES60__
-    CAknNoteDialog* dlg =
-        new (ELeave) CAknNoteDialog(CAknNoteDialog::EConfirmationTone);
-    dlg->PrepareLC(R_YES_NO_DIALOG);
-    dlg->SetTextL(aMessage);
-    return dlg->RunDlgLD() == EAknSoftkeyOk;
-#endif /* #ifdef __SERIES60__ */
-#ifdef __SERIES80__
-    return CCknConfirmationDialog::RunDlgWithDefaultIconLD(aMessage, R_EIK_BUTTONS_NO_YES);
-#endif /* #ifdef __SERIES80__ */
-#ifdef __UIQ__
-    CEikDialog* dlg = new (ELeave) CEikDialog();
-    return dlg->ExecuteLD(R_YES_NO_DIALOG) == EEikBidOk;
-#endif /* #ifdef __UIQ__ */
-}
-
-static void InformationNoteL(TDesC& aMessage)
-{
-#ifdef __SERIES60__
-    CAknInformationNote* note = new (ELeave) CAknInformationNote;
-    note->ExecuteLD(aMessage);
-#endif /* #ifdef __SERIES60__ */
-#if defined(__SERIES80__) || defined(__UIQ__)
-    CEikonEnv::Static()->InfoMsg(aMessage);
-#endif /* #if defined(__SERIES80__) || defined(__UIQ__) */
-}
-
-static TInt WarningNoteL(TDesC& aMessage)
-{
-#ifdef __SERIES60__
-    CAknWarningNote* note = new (ELeave) CAknWarningNote;
-    return note->ExecuteLD(aMessage);
-#endif /* #ifdef __SERIES60__ */
-#if defined(__SERIES80__) || defined(__UIQ__)
-    CEikonEnv::Static()->AlertWin(aMessage);
-    return ETrue;
-#endif /* #if defined(__SERIES80__) || defined(__UIQ__) */
-}
-
-#if defined(__SERIES80__) || defined(__UIQ__)
-
-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 /* #if defined(__SERIES80__) || defined(__UIQ__) */
-
-static TInt TextQueryDialogL(const TDesC& aTitle, const TDesC& aPrompt, TDes& aData, const TInt aMaxLength)
-{
-#ifdef __SERIES60__
-    CAknTextQueryDialog* dlg =
-        new (ELeave) CAknTextQueryDialog(aData);
-    dlg->SetPromptL(aPrompt);
-    dlg->SetMaxLength(aMaxLength);
-    return dlg->ExecuteLD(R_TEXT_QUERY_DIALOG);
-#endif /* #ifdef __SERIES60__ */
-#if defined(__SERIES80__) || defined(__UIQ__)
-    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 /* #if defined(__SERIES80__) || defined(__UIQ__) */
-}
-
-static TBool FileQueryDialogL(TDes& aFilename)
-{
-#ifdef __SERIES60__
-  return AknCommonDialogs::RunSelectDlgLD(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__ */
-#ifdef __UIQ__
-  return EFalse; // No filesystem access in UIQ 2.x!
-#endif /* #ifdef __UIQ__ */
-}
-
 // The isXXX() come from the Perl headers.
 #define FILENAME_IS_ABSOLUTE(n) \
         (isALPHA(((n)[0])) && ((n)[1]) == ':' && ((n)[2]) == '\\')
@@ -321,12 +129,12 @@ static void CopyFromInboxL(RFs aFs, const TFileName& aSrc, const TFileName& aDst
     TMessageBuffer message;
 
     message.Format(_L("%S is untrusted. Install only if you trust provider."), &aDst);
-    if (OkCancelDialogL(message)) {
+    if (CPerlUi::OkCancelDialogL(message)) {
         message.Format(_L("Install as %S?"), &aDst);
-        if (OkCancelDialogL(message)) {
+        if (CPerlUi::OkCancelDialogL(message)) {
             if (BaflUtils::FileExists(aFs, aDst)) {
                 message.Format(_L("Replace old %S?"), &aDst);
-                if (!OkCancelDialogL(message))
+                if (!CPerlUi::OkCancelDialogL(message))
                     proceed = EFalse;
             }
             if (proceed) {
@@ -334,11 +142,11 @@ 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);
-                    InformationNoteL(message);
+                    CPerlUi::InformationNoteL(message);
                 }
                 else {
                     message.Format(_L("Failure %d installing %S"), err, &aDst);
-                    WarningNoteL(message);
+                    CPerlUi::WarningNoteL(message);
                 }
             }
         }
@@ -460,7 +268,7 @@ static TBool RunStuffL(const TFileName& aScriptName, TPeekBuffer aPeekBuffer)
             message.Format(_L("Really run module %S?"), &aScriptName);
         else 
             message.Format(_L("Run %S?"), &aScriptName);
-        if (YesNoDialogL(message))
+        if (CPerlUi::YesNoDialogL(message))
             DoRunScriptL(aScriptName);
         return ETrue;
     }
@@ -468,7 +276,7 @@ static TBool RunStuffL(const TFileName& aScriptName, TPeekBuffer aPeekBuffer)
     return EFalse;
 }
 
-void CPerlAppUi::InstallOrRunL(const TFileName& aFileName)
+void CPerlAppAppUi::InstallOrRunL(const TFileName& aFileName)
 {
     TParse aFile;
     TParse aDrive;
@@ -495,15 +303,15 @@ void CPerlAppUi::InstallOrRunL(const TFileName& aFileName)
                   InstallStuffL(aFileName, aDrive, aFile, aPeekBuffer, *iFs) :
                   RunStuffL(aFileName, aPeekBuffer))) {
                 message.Format(_L("Failed for file %S"), &aFileName);
-                WarningNoteL(message);
+                CPerlUi::WarningNoteL(message);
             }
         } else {
             message.Format(_L("Error %d reading %S"), err, &aFileName);
-            WarningNoteL(message);
+            CPerlUi::WarningNoteL(message);
         }
     } else {
         message.Format(_L("Error %d opening %S"), err, &aFileName);
-        WarningNoteL(message);
+        CPerlUi::WarningNoteL(message);
     }
     if (iDoorObserver)
         delete CEikonEnv::Static()->EikAppUi();
@@ -511,7 +319,22 @@ void CPerlAppUi::InstallOrRunL(const TFileName& aFileName)
         Exit();
 }
 
-#endif // #ifndef PerlAppMinimal
+#endif /* #ifndef PerlAppMinimal */
+
+CPerlAppAppUi::~CPerlAppAppUi()
+{
+    if (iAppView) {
+        iEikonEnv->RemoveFromStack(iAppView);
+        delete iAppView;
+        iAppView = NULL;
+    }
+    if (iFs) {
+        delete iFs;
+        iFs = NULL;
+    }
+    if (iDoorObserver) // Otherwise the embedding application waits forever.
+        iDoorObserver->NotifyExit(MApaEmbeddedDocObserver::EEmpty);
+}
 
 static void DoRunScriptL(TFileName aScriptName)
 {
@@ -521,7 +344,7 @@ static void DoRunScriptL(TFileName aScriptName)
     if (error != KErrNone) {
         TMessageBuffer message;
         message.Format(_L("Error %d"), error);
-        YesNoDialogL(message);
+        CPerlUi::YesNoDialogL(message);
     }
 #endif // #ifndef PerlAppMinimal
     CleanupStack::PopAndDestroy(perl);
@@ -529,7 +352,7 @@ static void DoRunScriptL(TFileName aScriptName)
 
 #ifndef PerlAppMinimal
 
-void CPerlAppUi::OpenFileL(const TDesC& aFileName)
+void CPerlAppAppUi::OpenFileL(const TDesC& aFileName)
 {
     InstallOrRunL(aFileName);
     return;
@@ -537,7 +360,7 @@ void CPerlAppUi::OpenFileL(const TDesC& aFileName)
 
 #endif // #ifndef PerlAppMinimal
 
-TBool CPerlAppUi::ProcessCommandParametersL(TApaCommand aCommand, TFileName& /* aDocumentName */, const TDesC8& /* aTail */)
+TBool CPerlAppAppUi::ProcessCommandParametersL(TApaCommand aCommand, TFileName& /* aDocumentName */, const TDesC8& /* aTail */)
 {
     if (aCommand == EApaCommandRun) {
         TFileName appName = Application()->AppFullName();
@@ -556,14 +379,14 @@ TBool CPerlAppUi::ProcessCommandParametersL(TApaCommand aCommand, TFileName& /*
 
 #ifndef PerlAppMinimal
 
-void CPerlAppUi::SetFs(const RFs& aFs)
+void CPerlAppAppUi::SetFs(const RFs& aFs)
 {
     iFs = (RFs*) &aFs;
 }
 
 #endif // #ifndef PerlAppMinimal
 
-static void DoHandleCommandL(TInt aCommand) {
+void CPerlAppAppUi::DoHandleCommandL(TInt aCommand) {
 #ifndef PerlAppMinimal
     TMessageBuffer message;
 #endif // #ifndef PerlAppMinimal
@@ -584,7 +407,7 @@ static void DoHandleCommandL(TInt aCommand) {
                            PERL_SYMBIANSDK_MAJOR,
                            PERL_SYMBIANSDK_MINOR
                            );
-            InformationNoteL(message);
+            CPerlUi::InformationNoteL(message);
         }
         break;
     case EPerlAppCommandTime:
@@ -597,14 +420,16 @@ static void DoHandleCommandL(TInt aCommand) {
             CleanupStack::PopAndDestroy(perl);
         }
         break;
+#ifndef __UIQ__
      case EPerlAppCommandRunFile:
         {
             TFileName aScriptUtf16;
-           aScriptUtf16.Copy(_L("C:\\"));
-           if (FileQueryDialogL(aScriptUtf16))
-             DoRunScriptL(aScriptUtf16);
-       }
+            aScriptUtf16.Copy(_L("C:\\"));
+            if (CPerlUi::FileQueryDialogL(aScriptUtf16))
+              DoRunScriptL(aScriptUtf16);
+        }
         break;
+#endif
      case EPerlAppCommandOneLiner:
         {
 #ifdef __SERIES60__
@@ -613,16 +438,17 @@ static void DoHandleCommandL(TInt aCommand) {
 #if defined(__SERIES80__) || defined(__UIQ__)
             _LIT(prompt, "Code:"); // The title has "Oneliner" already.
 #endif /* #if defined(__SERIES80__) || defined(__UIQ__) */
-            CPerlAppUi* cAppUi =
-              STATIC_CAST(CPerlAppUi*, CEikonEnv::Static()->EikAppUi());
-            if (TextQueryDialogL(_L("Oneliner"),
-                                prompt,
-                                cAppUi->iOneLiner,
-                                 KPerlAppOneLinerSize)) {
-               const TUint KPerlAppUtf8Multi = 3;
-                TBuf8<KPerlAppUtf8Multi * KPerlAppOneLinerSize> utf8;
-
-                CnvUtfConverter::ConvertFromUnicodeToUtf8(utf8, cAppUi->iOneLiner);
+            CPerlAppAppUi* cAppUi =
+              static_cast<CPerlAppAppUi*>(CEikonEnv::Static()->EikAppUi());
+            if (CPerlUi::TextQueryDialogL(_L("Oneliner"),
+                                          prompt,
+                                          cAppUi->iOneLiner,
+                                          KPerlUiOneLinerSize)) {
+                const TUint KPerlUiUtf8Multi = 3; // Expansion multiplier.
+                TBuf8<KPerlUiUtf8Multi * KPerlUiOneLinerSize> utf8;
+
+                CnvUtfConverter::ConvertFromUnicodeToUtf8(utf8,
+                                                          cAppUi->iOneLiner);
                 CPerlBase* perl = CPerlBase::NewInterpreterLC();
                 int argc = 3;
                 char **argv = (char**) malloc(argc * sizeof(char *));
@@ -641,28 +467,28 @@ static void DoHandleCommandL(TInt aCommand) {
      case EPerlAppCommandCopyright:
         {
             message.Format(KCopyrightFormat);
-            InformationNoteL(message);
+            CPerlUi::InformationNoteL(message);
         }
         break;
      case EPerlAppCommandAboutCopyright:
         {
-           TMessageBuffer m1;
-           TMessageBuffer m2;
+            TMessageBuffer m1;
+            TMessageBuffer m2;
             m1.Format(KAboutFormat,
-                     PERL_REVISION,
-                     PERL_VERSION,
-                     PERL_SUBVERSION,
-                     PERL_SYMBIANPORT_MAJOR,
-                     PERL_SYMBIANPORT_MINOR,
-                     PERL_SYMBIANPORT_PATCH,
-                     &KFlavor,
-                     PERL_SYMBIANSDK_MAJOR,
-                     PERL_SYMBIANSDK_MINOR
-                     );
-            InformationNoteL(m1);
-           User::After((TTimeIntervalMicroSeconds32) (1000*1000));
+                      PERL_REVISION,
+                      PERL_VERSION,
+                      PERL_SUBVERSION,
+                      PERL_SYMBIANPORT_MAJOR,
+                      PERL_SYMBIANPORT_MINOR,
+                      PERL_SYMBIANPORT_PATCH,
+                      &KFlavor,
+                      PERL_SYMBIANSDK_MAJOR,
+                      PERL_SYMBIANSDK_MINOR
+                      );
+            CPerlUi::InformationNoteL(m1);
+            User::After((TTimeIntervalMicroSeconds32) (1000*1000)); // 1 sec.
             m2.Format(KCopyrightFormat);
-            InformationNoteL(m2);
+            CPerlUi::InformationNoteL(m2);
         }
         break;
 #endif // #ifndef PerlAppMinimal
@@ -671,87 +497,16 @@ static void DoHandleCommandL(TInt aCommand) {
     }
 }
 
-#ifdef __SERIES60__
-
-void CPerlAppUi::HandleCommandL(TInt aCommand)
-{
-    switch(aCommand)
-    {
-    case EEikCmdExit:
-    case EAknSoftkeyExit:
-        Exit();
-        break;
-    default:
-        DoHandleCommandL(aCommand);
-        break;
-    }
-}
-
-#endif /* #ifdef __SERIES60__ */
-
-#if defined(__SERIES80__) || defined(__UIQ__)
-
-void CPerlAppView::HandleCommandL(TInt aCommand) {
-    DoHandleCommandL(aCommand);
-}
-
-void CPerlAppUi::HandleCommandL(TInt aCommand) {
-    switch(aCommand)
-    {
-    case EEikCmdExit:
-        Exit();
-        break;
-    default:
-        iAppView->HandleCommandL(aCommand);
-        break;
-    }
-}
-
-#endif /* #if defined(__SERIES80__) || defined(__UIQ__) */
-
-CPerlAppView* CPerlAppView::NewL(const TRect& aRect)
-{
-    CPerlAppView* self = CPerlAppView::NewLC(aRect);
-    CleanupStack::Pop(self);
-    return self;
-}
-
-CPerlAppView* CPerlAppView::NewLC(const TRect& aRect)
-{
-    CPerlAppView* self = new (ELeave) CPerlAppView;
-    CleanupStack::PushL(self);
-    self->ConstructL(aRect);
-    return self;
-}
-
-void CPerlAppView::ConstructL(const TRect& aRect)
-{
-    CreateWindowL();
-    SetRect(aRect);
-    ActivateL();
-}
-
-CPerlAppView::~CPerlAppView()
-{
-}
-
-void CPerlAppView::Draw(const TRect& /*aRect*/) const
-{
-    CWindowGc& gc = SystemGc();
-    TRect rect = Rect();
-    gc.Clear(rect);
-}
-
 CApaDocument* CPerlAppApplication::CreateDocumentL() 
 {
-    CPerlAppDocument* document = new (ELeave) CPerlAppDocument(*this);
-    return document;
+    CPerlAppDocument* cDoc = new (ELeave) CPerlAppDocument(*this);
+    return cDoc;
 }
 
 CEikAppUi* CPerlAppDocument::CreateAppUiL()
 {
-    CPerlAppUi* appui = new (ELeave) CPerlAppUi();
-    return appui;
+    CPerlAppAppUi* cAppUi = new (ELeave) CPerlAppAppUi();
+    return cAppUi;
 }
 
 
@@ -759,11 +514,11 @@ CEikAppUi* CPerlAppDocument::CreateAppUiL()
 
 CFileStore* CPerlAppDocument::OpenFileL(TBool aDoOpen, const TDesC& aFileName, RFs& aFs)
 {
-    CPerlAppUi* appui =
-      STATIC_CAST(CPerlAppUi*, CEikonEnv::Static()->EikAppUi());
-    appui->SetFs(aFs);
+    CPerlAppAppUi* cAppUi =
+      static_cast<CPerlAppAppUi*>(CEikonEnv::Static()->EikAppUi());
+    cAppUi->SetFs(aFs);
     if (aDoOpen)
-        appui->OpenFileL(aFileName);
+        cAppUi->OpenFileL(aFileName);
     return NULL;
 }
 
index 12131a4..43f61b6 100644 (file)
@@ -5,30 +5,7 @@
 #ifndef __PerlApp_h__
 #define __PerlApp_h__
 
-#ifdef __SERIES60__
-# include <aknapp.h>
-# include <aknappui.h>
-# include <akndoc.h>
-#endif /* #ifdef __SERIES60__ */
-
-#ifdef __SERIES80__
-# include <eikapp.h>
-# include <eikappui.h>
-# include <eikdoc.h>
-# include <eikbctrl.h>
-# include <eikgted.h>
-# include <eikdialg.h>
-#endif /* #ifdef __SERIES60__ */
-
-#ifdef __UIQ__
-# include <qikapplication.h>
-# include <qikappui.h>
-# include <qikdocument.h>
-# include <eikdialg.h>
-#endif /* #ifdef __UIQ____ */
-
-#include <coecntrl.h>
-#include <f32file.h>
+#include "PerlUi.h"
 
 /* The source code can be compiled into "PerlApp" which is the simple
  * launchpad application/demonstrator, or into "PerlAppMinimal", which
 # endif
 #endif
 
-#ifdef __SERIES60__
-# define CMyDocument    CAknDocument
-# define CMyApplication CAknApplication
-# define CMyAppUi       CAknAppUi
-# define CMyNoteDialog  CAknNoteDialog
-# define CMyAppView     CCoeControl
-#endif /* #ifdef __SERIES60__ */
-
-#ifdef __SERIES80__
-# define CMyDocument    CEikDocument
-# define CMyApplication CEikApplication
-# define CMyAppUi       CEikAppUi
-# define CMyNoteDialog  CCknFlashingDialog
-# define CMyAppView     CEikBorderedControl
-#endif /* #ifdef __SERIES60__ */
-
-#ifdef __UIQ__
-# define CMyDocument    CEikDocument
-# define CMyApplication CQikApplication
-# define CMyAppUi       CQikAppUi
-# define CMyNoteDialog  CCknFlashingDialog
-# define CMyAppView     CCoeControl
-#endif /* #ifdef __UIQ__ */
-
-class CPerlAppDocument : public CMyDocument
+class CPerlAppDocument : public CgPerlUiDocument
 {
   public:
-    CPerlAppDocument(CEikApplication& aApp):CMyDocument(aApp) {;}
+    CPerlAppDocument(CEikApplication& aApp) : CgPerlUiDocument(aApp) {;}
 #ifndef PerlAppMinimal
     CFileStore* OpenFileL(TBool aDoOpen, const TDesC& aFilename, RFs& aFs);
 #endif // #ifndef PerlAppMinimal
@@ -93,67 +46,36 @@ class CPerlAppDocument : public CMyDocument
     CEikAppUi* CreateAppUiL();
 };
 
-class CPerlAppApplication : public CMyApplication
+class CPerlAppApplication : public CPerlUiApplication
 {
   private:
     CApaDocument* CreateDocumentL();
     TUid AppDllUid() const;
 };
 
-const TUint KPerlAppPromptSize   = 20;
-const TUint KPerlAppOneLinerSize = 128;
-
-class CPerlAppView;
+class CPerlAppAppView;
 
-class CPerlAppUi : public CMyAppUi
+class CPerlAppAppUi : public CPerlUiAppUi
 {
   public:
-    void ConstructL();
-     ~CPerlAppUi();
     TBool ProcessCommandParametersL(TApaCommand aCommand, TFileName& aDocumentName, const TDesC8& aTail);
-    void HandleCommandL(TInt aCommand);
+    void DoHandleCommandL(TInt aCommand);
 #ifndef PerlAppMinimal
     void OpenFileL(const TDesC& aFileName);
     void InstallOrRunL(const TFileName& aFileName);
     void SetFs(const RFs& aFs);
 #endif // #ifndef PerlAppMinimal
-    TBuf<KPerlAppOneLinerSize> iOneLiner; // Perl source code to evaluate.
-    CPerlAppView* iAppView;
+    ~CPerlAppAppUi();
   private:
     RFs* iFs;
 };
 
-class CPerlAppView : public CMyAppView
+class CPerlAppAppView : public CPerlUiAppView
 {
   public:
-    static CPerlAppView* NewL(const TRect& aRect);
-    static CPerlAppView* NewLC(const TRect& aRect);
-    ~CPerlAppView();
-    void Draw(const TRect& aRect) const;
 #if defined(__SERIES80__) || defined(__UIQ__)
     void HandleCommandL(TInt aCommand);
 #endif /* #if defined(__SERIES80__) || defined(__UIQ__) */
-  private:
-    void ConstructL(const TRect& aRect);
 };
 
-#if defined(__SERIES80__) || defined(__UIQ__)
-
-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 /* #if defined(__SERIES80__) || defined(__UIQ__) */
-
 #endif // __PerlApp_h__
index b3969c5..fd37a96 100644 (file)
@@ -5,7 +5,7 @@
 #ifndef __PerlApp_HRH__
 #define __PerlApp_HRH__
 
-enum TPerlIds
+enum TPerlAppIds
 {
     EPerlAppCommandAbout              = 1024,  // start value must not be 0
     EPerlAppCommandTime               = 1025,
@@ -13,7 +13,6 @@ enum TPerlIds
     EPerlAppCommandOneLiner           = 1027,
     EPerlAppCommandCopyright          = 1028,
     EPerlAppCommandAboutCopyright     = 1029,
-    EPerlAppTextQueryInputField       = 1030,
     EPerlAppLast                      = 1099   // no comma here
 };
 
index f6765fb..a2dbcf6 100644 (file)
@@ -47,7 +47,7 @@ class CPerlBase : public CBase
   public:
     CPerlBase();
     IMPORT_C virtual ~CPerlBase();
-    IMPORT_C static CPerlBase* NewInterpreterL(TBool iCloseStdlib = ETrue,
+    IMPORT_C static CPerlBase* NewInterpreterL(TBool aCloseStdlib = ETrue,
                                                void (*aStdioInitFunc)(void*) = NULL,
                                                void *aStdioInitCookie = NULL);
     IMPORT_C static CPerlBase* NewInterpreterLC(TBool iCloseStdlib = ETrue,
@@ -84,7 +84,6 @@ class CPerlBase : public CBase
     TPerlState        iState;
 
    private:
     void              ConstructL();
     CConsoleBase*     iConsole;                /* The screen. */
     TUint16*          iConsoleBuffer;  /* The UTF-16 characters. */
@@ -114,5 +113,12 @@ class CPerlBase : public CBase
 #define PerlCopyD(s,d,n,t)     (MEM_WRAP_CHECK(n,t), memcpy((char*)(d),(char*)(s), (n) * sizeof(t)))
 #define PerlNew(x,v,n,t)       (v = (MEM_WRAP_CHECK(n,t), (t*)safemalloc((MEM_SIZE)((n)*sizeof(t)))))
 
+// This is like the Symbian _LIT() but without the embedded L prefix,
+// which enables using #defined constants (which need to carry their
+// own L prefix).
+#ifndef _LIT_NO_L
+# define _LIT_NO_L(n, s) static const TLitC<sizeof(s)/2> n={sizeof(s)/2-1,s}
+#endif // #ifndef _LIT_NO_L
+
 #endif /* #ifndef __PerlBase_h__ */
 
diff --git a/symbian/PerlUi.cpp b/symbian/PerlUi.cpp
new file mode 100644 (file)
index 0000000..384148b
--- /dev/null
@@ -0,0 +1,273 @@
+/* Copyright (c) 2005 Nokia. All rights reserved. */
+
+/* The PerlUi class is licensed under the same terms as Perl itself. */
+
+#include "PerlUi.h"
+
+#ifdef __SERIES60__
+# include <avkon.hrh>
+# include <aknnotewrappers.h> 
+# include <AknCommonDialogs.h>
+# ifndef __SERIES60_1X__
+#  include <CAknFileSelectionDialog.h>
+# endif
+#endif /* #ifdef __SERIES60__ */
+
+#ifdef __SERIES80__
+# include <eikon.hrh>
+# include <cknflash.h>
+# include <ckndgopn.h>
+# include <ckndgfob.h>
+# include <eiklabel.h>
+# include <cknconf.h>
+#endif /* #ifdef __SERIES80__ */
+
+#ifdef __UIQ__
+# include <qikon.hrh>
+# include <eikedwin.h>
+# include <eiklabel.h>
+#endif /* #ifdef __UIQ__ */
+
+#include <apparc.h>
+#include <e32base.h>
+#include <e32cons.h>
+#include <eikenv.h>
+#include <bautils.h>
+#include <eikappui.h>
+#include <utf.h>
+#include <f32file.h>
+
+#include <coemain.h>
+
+#include "PerlUi.hrh"
+#include "PerlUi.rsg"
+
+#ifdef __SERIES80__
+#include "Eikon.rsg"
+#endif /* #ifdef __SERIES80__ */
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#include "PerlBase.h"
+#include "PerlUtil.h"
+
+#define symbian_get_vars() Dll::Tls() // Not visible from perlXYZ.lib?
+
+_LIT(KDefaultScript, "default.pl");
+
+EXPORT_C void CPerlUiAppUi::ConstructL()
+{
+    BaseConstructL();
+    iAppView = CPerlUiAppView::NewL(ClientRect());
+    AddToStackL(iAppView);
+    CEikonEnv::Static()->DisableExitChecks(ETrue); // Symbian FAQ-0577.
+}
+
+EXPORT_C TBool CPerlUi::OkCancelDialogL(TDesC& aMessage)
+{
+#ifdef __SERIES60__
+    CAknNoteDialog* dlg =
+        new (ELeave) CAknNoteDialog(CAknNoteDialog::EConfirmationTone);
+    dlg->PrepareLC(R_PERLUI_OK_CANCEL_DIALOG);
+    dlg->SetTextL(aMessage);
+    return dlg->RunDlgLD() == EAknSoftkeyOk;
+#endif /* #ifdef __SERIES60__ */
+#ifdef __SERIES80__
+    return CCknConfirmationDialog::RunDlgWithDefaultIconLD(aMessage, R_EIK_BUTTONS_CANCEL_OK);
+#endif /* #ifdef __SERIES80__ */
+#ifdef __UIQ__
+    CEikDialog* dlg = new (ELeave) CEikDialog();
+    return dlg->ExecuteLD(R_PERLUI_OK_CANCEL_DIALOG) == EEikBidOk;
+#endif /* #ifdef __UIQ__ */
+}
+
+EXPORT_C TBool CPerlUi::YesNoDialogL(TDesC& aMessage)
+{
+#ifdef __SERIES60__
+    CAknNoteDialog* dlg =
+        new (ELeave) CAknNoteDialog(CAknNoteDialog::EConfirmationTone);
+    dlg->PrepareLC(R_PERLUI_YES_NO_DIALOG);
+    dlg->SetTextL(aMessage);
+    return dlg->RunDlgLD() == EAknSoftkeyOk;
+#endif /* #ifdef __SERIES60__ */
+#ifdef __SERIES80__
+    return CCknConfirmationDialog::RunDlgWithDefaultIconLD(aMessage, R_EIK_BUTTONS_NO_YES);
+#endif /* #ifdef __SERIES80__ */
+#ifdef __UIQ__
+    CEikDialog* dlg = new (ELeave) CEikDialog();
+    return dlg->ExecuteLD(R_PERLUI_YES_NO_DIALOG) == EEikBidOk;
+#endif /* #ifdef __UIQ__ */
+}
+
+EXPORT_C void CPerlUi::InformationNoteL(TDesC& aMessage)
+{
+#ifdef __SERIES60__
+    CAknInformationNote* note = new (ELeave) CAknInformationNote;
+    note->ExecuteLD(aMessage);
+#endif /* #ifdef __SERIES60__ */
+#if defined(__SERIES80__) || defined(__UIQ__)
+    CEikonEnv::Static()->InfoMsg(aMessage);
+#endif /* #if defined(__SERIES80__) || defined(__UIQ__) */
+}
+
+EXPORT_C TInt CPerlUi::WarningNoteL(TDesC& aMessage)
+{
+#ifdef __SERIES60__
+    CAknWarningNote* note = new (ELeave) CAknWarningNote;
+    return note->ExecuteLD(aMessage);
+#endif /* #ifdef __SERIES60__ */
+#if defined(__SERIES80__) || defined(__UIQ__)
+    CEikonEnv::Static()->AlertWin(aMessage);
+    return ETrue;
+#endif /* #if defined(__SERIES80__) || defined(__UIQ__) */
+}
+
+#if defined(__SERIES80__) || defined(__UIQ__)
+
+CPerlUiTextQueryDialog::CPerlUiTextQueryDialog(HBufC*& aBuffer) :
+  iData(aBuffer)
+{
+}
+
+TBool CPerlUiTextQueryDialog::OkToExitL(TInt /* aKeycode */)
+{
+  iData = static_cast<CEikEdwin*>(Control(EPerlUiTextQueryInputField))->GetTextInHBufL();
+  return ETrue;
+}
+
+void CPerlUiTextQueryDialog::PreLayoutDynInitL()
+{
+  SetTitleL(iTitle);
+  CEikLabel* promptLabel = ControlCaption(EPerlUiTextQueryInputField);
+  promptLabel->SetTextL(iPrompt);
+}
+
+/* TODO: OfferKeyEventL() so that newline can be seen as 'OK'.
+ * Or a hotkey for the button? */
+
+#endif /* #if defined(__SERIES80__) || defined(__UIQ__) */
+
+EXPORT_C TBool CPerlUi::TextQueryDialogL(const TDesC& aTitle, const TDesC& aPrompt, TDes& aData, const TInt aMaxLength)
+{
+#ifdef __SERIES60__
+    CAknTextQueryDialog* dlg =
+        new (ELeave) CAknTextQueryDialog(aData);
+    dlg->SetPromptL(aPrompt);
+    dlg->SetMaxLength(aMaxLength);
+    return dlg->ExecuteLD(R_PERLUI_TEXT_QUERY_DIALOG);
+#endif /* #ifdef __SERIES60__ */
+#if defined(__SERIES80__) || defined(__UIQ__)
+    HBufC* data = NULL;
+    CPerlUiTextQueryDialog* dlg =
+      new (ELeave) CPerlUiTextQueryDialog(data);
+    dlg->iTitle.Set(aTitle);
+    dlg->iPrompt.Set(aPrompt);
+    dlg->iMaxLength = aMaxLength;
+    if (dlg->ExecuteLD(R_PERLUI_ONELINER_DIALOG)) {
+        aData.Copy(*data);
+        return ETrue;
+    }
+    return EFalse;
+#endif /* #if defined(__SERIES80__) || defined(__UIQ__) */
+}
+
+EXPORT_C TBool CPerlUi::FileQueryDialogL(TDes& aFilename)
+{
+#ifdef __SERIES60__
+  return AknCommonDialogs::RunSelectDlgLD(aFilename,
+                                          R_PERLUI_FILE_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__ */
+#ifdef __UIQ__
+  return EFalse; // No filesystem access in UIQ 2.x!
+#endif /* #ifdef __UIQ__ */
+}
+
+#ifdef __SERIES60__
+
+EXPORT_C void CPerlUiAppUi::HandleCommandL(TInt aCommand)
+{
+    switch(aCommand)
+    {
+    case EEikCmdExit:
+    case EAknSoftkeyExit:
+        Exit();
+        break;
+    default:
+        DoHandleCommandL(aCommand);
+        break;
+    }
+}
+
+#endif /* #ifdef __SERIES60__ */
+
+#if defined(__SERIES80__) || defined(__UIQ__)
+
+EXPORT_C void CPerlUiAppView::HandleCommandL(TInt aCommand, CPerlUiAppUi* aAppUi) {
+    aAppUi->DoHandleCommandL(aCommand);
+}
+
+EXPORT_C void CPerlUiAppUi::HandleCommandL(TInt aCommand) {
+    switch(aCommand)
+    {
+    case EEikCmdExit:
+        Exit();
+        break;
+    default:
+        iAppView->HandleCommandL(aCommand, this);
+        break;
+    }
+}
+
+#endif /* #if defined(__SERIES80__) || defined(__UIQ__) */
+
+CPerlUiAppView* CPerlUiAppView::NewL(const TRect& aRect)
+{
+    CPerlUiAppView* self = CPerlUiAppView::NewLC(aRect);
+    CleanupStack::Pop(self);
+    return self;
+}
+
+CPerlUiAppView* CPerlUiAppView::NewLC(const TRect& aRect)
+{
+    CPerlUiAppView* self = new (ELeave) CPerlUiAppView;
+    CleanupStack::PushL(self);
+    self->ConstructL(aRect);
+    return self;
+}
+
+void CPerlUiAppView::ConstructL(const TRect& aRect)
+{
+    CreateWindowL();
+    SetRect(aRect);
+    ActivateL();
+}
+
+CPerlUiAppView::~CPerlUiAppView()
+{
+}
+
+void CPerlUiAppView::Draw(const TRect& /*aRect*/) const
+{
+    CWindowGc& gc = SystemGc();
+    TRect rect = Rect();
+    gc.Clear(rect);
+}
+
diff --git a/symbian/PerlUi.h b/symbian/PerlUi.h
new file mode 100644 (file)
index 0000000..b6011c8
--- /dev/null
@@ -0,0 +1,120 @@
+/* Copyright (c) 2005 Nokia. All rights reserved. */
+
+/* The PerlUi class is licensed under the same terms as Perl itself. */
+
+#ifndef __PerlUi_h__
+#define __PerlUi_h__
+
+#ifdef __SERIES60__
+# include <aknapp.h>
+# include <aknappui.h>
+# include <akndoc.h>
+#endif /* #ifdef __SERIES60__ */
+
+#ifdef __SERIES80__
+# include <eikapp.h>
+# include <eikappui.h>
+# include <eikdoc.h>
+# include <eikbctrl.h>
+# include <eikgted.h>
+# include <eikdialg.h>
+#endif /* #ifdef __SERIES60__ */
+
+#ifdef __UIQ__
+# include <qikapplication.h>
+# include <qikappui.h>
+# include <qikdocument.h>
+# include <eikdialg.h>
+#endif /* #ifdef __UIQ____ */
+
+#include <coecntrl.h>
+#include <f32file.h>
+
+#ifdef __SERIES60__
+# define CgPerlUiDocument    CAknDocument
+# define CgPerlUiApplication CAknApplication
+# define CgPerlUiAppUi       CAknAppUi
+# define CgPerlUiNoteDialog  CAknNoteDialog
+# define CgPerlUiAppView     CCoeControl
+#endif /* #ifdef __SERIES60__ */
+
+#ifdef __SERIES80__
+# define CgPerlUiDocument    CEikDocument
+# define CgPerlUiApplication CEikApplication
+# define CgPerlUiAppUi       CEikAppUi
+# define CgPerlUiNoteDialog  CCknFlashingDialog
+# define CgPerlUiAppView     CEikBorderedControl
+#endif /* #ifdef __SERIES60__ */
+
+#ifdef __UIQ__
+# define CgPerlUiDocument    CEikDocument
+# define CgPerlUiApplication CQikApplication
+# define CgPerlUiAppUi       CQikAppUi
+# define CgPerlUiNoteDialog  CCknFlashingDialog
+# define CgPerlUiAppView     CCoeControl
+#endif /* #ifdef __UIQ__ */
+
+class CPerlUiApplication : public CgPerlUiApplication
+{
+};
+
+const TUint KPerlUiPromptSize   = 20;
+const TUint KPerlUiOneLinerSize = 128;
+
+class CPerlUiAppView;
+
+class CPerlUiAppUi : public CgPerlUiAppUi
+{
+  public:
+    IMPORT_C void ConstructL();
+    void virtual DoHandleCommandL(TInt aCommand) = 0;
+    IMPORT_C void HandleCommandL(TInt aCommand);
+    TBuf<KPerlUiOneLinerSize> iOneLiner; // Perl code to evaluate.
+    CPerlUiAppView* iAppView;
+};
+
+class CPerlUiAppView : public CgPerlUiAppView
+{
+  public:
+    static CPerlUiAppView* NewL(const TRect& aRect);
+    static CPerlUiAppView* NewLC(const TRect& aRect);
+    ~CPerlUiAppView();
+    void Draw(const TRect& aRect) const;
+#if defined(__SERIES80__) || defined(__UIQ__)
+    IMPORT_C void HandleCommandL(TInt aCommand, CPerlUiAppUi* aAppUi);
+#endif /* #if defined(__SERIES80__) || defined(__UIQ__) */
+  private:
+    void ConstructL(const TRect& aRect);
+};
+
+#if defined(__SERIES80__) || defined(__UIQ__)
+
+class CPerlUiTextQueryDialog : public CEikDialog
+{
+  public:
+    CPerlUiTextQueryDialog(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 /* #if defined(__SERIES80__) || defined(__UIQ__) */
+
+class CPerlUi : public CgPerlUiAppUi
+{
+  public:
+    IMPORT_C static TBool OkCancelDialogL(TDesC& aMessage);
+    IMPORT_C static TBool YesNoDialogL(TDesC& aMessage);
+    IMPORT_C static void  InformationNoteL(TDesC& aMessage);
+    IMPORT_C static TInt  WarningNoteL(TDesC& aMessage);
+    IMPORT_C static TBool TextQueryDialogL(const TDesC& aTitle, const TDesC& aPrompt, TDes& aData, const TInt aMaxLength);
+    IMPORT_C static TBool FileQueryDialogL(TDes& aFilename);
+};
+
+#endif // __PerlUi_h__
diff --git a/symbian/PerlUi.hrh b/symbian/PerlUi.hrh
new file mode 100644 (file)
index 0000000..edb657d
--- /dev/null
@@ -0,0 +1,14 @@
+/* Copyright (c) 2005 Nokia.  All rights reserved. */
+
+/* The PerlUi class is licensed under the same terms as Perl itself. */
+
+#ifndef __PerlUi_HRH__
+#define __PerlUi_HRH__
+
+enum TPerlUiIds
+{
+    EPerlUiTextQueryInputField        = 2048,
+    EPerlUiLast                       = 2099  // no comma here
+};
+
+#endif // __PerlUi_HRH__
similarity index 87%
rename from symbian/PerlAppS60.rss
rename to symbian/PerlUiS60.rss
index c352c52..757fb33 100644 (file)
@@ -1,6 +1,8 @@
 /* Copyright (c) 2004-2005 Nokia. All rights reserved. */ 
 
-/* The PerlApp application is licensed under the same terms as Perl itself. */
+/* The PerlUi class is licensed under the same terms as Perl itself. */
+
+/* The S60 definitions. */
 
 NAME PERL
 
@@ -8,6 +10,7 @@ NAME PERL
 #include <avkon.rh>
 #include <avkon.rsg>
 
+#include "PerlUi.hrh"
 #include "PerlApp.hrh"
 
 RESOURCE RSS_SIGNATURE
@@ -63,7 +66,7 @@ RESOURCE MENU_PANE r_Perl_menu
         };
 }
 
-RESOURCE DIALOG r_ok_cancel_dialog
+RESOURCE DIALOG r_perlui_ok_cancel_dialog
 {
     flags = EEikDialogFlagWait | EEikDialogFlagCbaButtons;
     buttons = R_AVKON_SOFTKEYS_OK_CANCEL;
@@ -80,7 +83,7 @@ RESOURCE DIALOG r_ok_cancel_dialog
     };
 }
 
-RESOURCE DIALOG r_yes_no_dialog
+RESOURCE DIALOG r_perlui_yes_no_dialog
 {
     flags = EEikDialogFlagWait | EEikDialogFlagCbaButtons;
     buttons = R_AVKON_SOFTKEYS_YES_NO;
@@ -97,7 +100,7 @@ RESOURCE DIALOG r_yes_no_dialog
     };
 }
 
-RESOURCE DIALOG r_text_query_dialog
+RESOURCE DIALOG r_perlui_text_query_dialog
 {
     flags = EGeneralQueryFlags;
     buttons = R_AVKON_SOFTKEYS_OK_CANCEL;
@@ -115,7 +118,7 @@ RESOURCE DIALOG r_text_query_dialog
     }; 
 }
 
-RESOURCE AVKON_LIST_QUERY r_list_query_dialog
+RESOURCE AVKON_LIST_QUERY r_perlui_list_query_dialog
 {
     flags = EGeneralQueryFlags;
     softkeys = R_AVKON_SOFTKEYS_OK_CANCEL;
@@ -135,7 +138,7 @@ RESOURCE AVKON_LIST_QUERY r_list_query_dialog
 #include <CommonDialogs.hrh>
 #include <CommonDialogs.rh>
 
-RESOURCE MEMORYSELECTIONDIALOG r_memory_selection_dialog
+RESOURCE MEMORYSELECTIONDIALOG r_perlui_file_selection_dialog
 {
 }
 
similarity index 78%
rename from symbian/PerlAppS80.rss
rename to symbian/PerlUiS80.rss
index 4f892cb..8028311 100644 (file)
@@ -1,12 +1,15 @@
 /* Copyright (c) 2004-2005 Nokia. All rights reserved. */ 
 
-/* The PerlApp application is licensed under the same terms as Perl itself. */
+/* The PerlUi class is licensed under the same terms as Perl itself. */
+
+/* The S80 definitions. */
 
 NAME PERL
 
 #include <eikon.rh>
 #include <eikon.rsg>
 
+#include "PerlUi.hrh"
 #include "PerlApp.hrh"
 
 RESOURCE RSS_SIGNATURE
@@ -20,11 +23,11 @@ RESOURCE TBUF r_default_document_name
 
 RESOURCE EIK_APP_INFO
 {
-    menubar = r_Perl_menubar;
-    cba = r_Perl_cba;
+    menubar = r_perlui_menubar;
+    cba = r_perlui_cba;
 }
 
-RESOURCE CBA r_Perl_cba
+RESOURCE CBA r_perlui_cba
 {
     buttons = {
         CBA_BUTTON { id = EPerlAppCommandRunFile;        txt = "Run"; },
@@ -35,18 +38,18 @@ RESOURCE CBA r_Perl_cba
 }
 
 
-RESOURCE MENU_BAR r_Perl_menubar
+RESOURCE MENU_BAR r_perlui_menubar
 {
     titles = {
         MENU_TITLE
             {
-            menu_pane = r_Perl_menu; txt = "Options";
+            menu_pane = r_perlui_menu; txt = "Options";
             }
     };
 }
 
 
-RESOURCE MENU_PANE r_Perl_menu
+RESOURCE MENU_PANE r_perlui_menu
 {
     items = {
         MENU_ITEM {
@@ -72,8 +75,7 @@ RESOURCE MENU_PANE r_Perl_menu
         };
 }
 
-
-RESOURCE DIALOG r_Perl_oneliner_dialog
+RESOURCE DIALOG r_perlui_oneliner_dialog
 {
     title = "Title";
     buttons = R_EIK_BUTTONS_CANCEL_OK;
@@ -82,7 +84,7 @@ RESOURCE DIALOG r_Perl_oneliner_dialog
         DLG_LINE {
             type = EEikCtEdwin;
            prompt = "Prompt";
-            id = EPerlAppTextQueryInputField;
+            id = EPerlUiTextQueryInputField;
             control = EDWIN {
                 width = 10;
                 maxlength = 128;
similarity index 69%
rename from symbian/PerlAppUIQ.rss
rename to symbian/PerlUiUIQ.rss
index 6e07312..55362a9 100644 (file)
@@ -1,6 +1,8 @@
-/* Copyright (c) 2004-2005 Nokia. All rights reserved. */ 
+/* Copyright (c) 200-2005 Nokia. All rights reserved. */ 
 
-/* The PerlApp application is licensed under the same terms as Perl itself. */
+/* The PerlUi class is licensed under the same terms as Perl itself. */
+
+/* The UIQ definitions. */
 
 NAME PERL
 
@@ -8,6 +10,7 @@ NAME PERL
 #include <eikcore.rsg>
 #include <qikon.rh>
 
+#include "PerlUi.hrh"
 #include "PerlApp.hrh"
 
 RESOURCE RSS_SIGNATURE
@@ -21,23 +24,23 @@ RESOURCE TBUF r_default_document_name
 
 RESOURCE EIK_APP_INFO
 {
-    menubar = r_Perl_menubar;
-    toolbar = r_Perl_menubar;
+    menubar = r_perlui_menubar;
+    toolbar = r_perlui_menubar;
 }
 
 
-RESOURCE MENU_BAR r_Perl_menubar
+RESOURCE MENU_BAR r_perlui_menubar
 {
     titles = {
         MENU_TITLE
             {
-            menu_pane = r_Perl_menu; txt = "Options";
+            menu_pane = r_perlui_menu; txt = "Options";
             }
     };
 }
 
 
-RESOURCE MENU_PANE r_Perl_menu
+RESOURCE MENU_PANE r_perlui_menu
 {
     items = {
         MENU_ITEM {
@@ -49,10 +52,6 @@ RESOURCE MENU_PANE r_Perl_menu
             txt = "Time";
         },
         MENU_ITEM {
-            command = EPerlAppCommandRunFile;
-            txt = "Run";
-        },
-        MENU_ITEM {
             command = EPerlAppCommandOneLiner;
             txt = "Oneliner";
         },
@@ -63,7 +62,7 @@ RESOURCE MENU_PANE r_Perl_menu
         };
 }
 
-RESOURCE DIALOG r_Perl_oneliner_dialog
+RESOURCE DIALOG r_perlui_oneliner_dialog
 {
     title = "Title";
     buttons = R_EIK_BUTTONS_CANCEL_OK;
@@ -72,7 +71,7 @@ RESOURCE DIALOG r_Perl_oneliner_dialog
         DLG_LINE {
             type = EEikCtEdwin;
            prompt = "Prompt";
-            id = EPerlAppTextQueryInputField;
+            id = EPerlUiTextQueryInputField;
             control = EDWIN {
                 width = 10;
                 maxlength = 128;
@@ -81,13 +80,13 @@ RESOURCE DIALOG r_Perl_oneliner_dialog
     };
 }
 
-RESOURCE DIALOG r_ok_cancel_dialog
+RESOURCE DIALOG r_perlui_ok_cancel_dialog
 {
     title = "OK / Cancel ?";
-    buttons = r_ok_cancel_buttons;
+    buttons = r_perlui_ok_cancel_buttons;
 }
 
-RESOURCE DLG_BUTTONS r_ok_cancel_buttons
+RESOURCE DLG_BUTTONS r_perlui_ok_cancel_buttons
 {
     buttons = {
         DLG_BUTTON {
@@ -101,13 +100,13 @@ RESOURCE DLG_BUTTONS r_ok_cancel_buttons
     };
 }
 
-RESOURCE DIALOG r_yes_no_dialog
+RESOURCE DIALOG r_perlui_yes_no_dialog
 {
     title = "Yes / No ?";
-    buttons = r_yes_no_buttons;
+    buttons = r_perlui_yes_no_buttons;
 }
 
-RESOURCE DLG_BUTTONS r_yes_no_buttons
+RESOURCE DLG_BUTTONS r_perlui_yes_no_buttons
 {
     buttons = {
         DLG_BUTTON {
index 52436da..f2ed38d 100644 (file)
@@ -45,8 +45,6 @@
 
 - in S60 1.2 (at least in 3650 Nokia 3650 v3.11) setjmp/longjmp is
   fragile (see Symbian FAQ-0929), intensive debugging and fix needed
-- in S60 2.6 (at least in Nokia 6630 v4.03.11) launching scripts via
-  FExplorer does not open up the console
 
 =head2 Unicode
 
 =head2 Build
 
 - make xsbuild.pl much more robust (for building external extensions)
+  (see symbian\ext\README and symbian\ext\Moped\Msg\README)
+- now the .mmp functions both as input and as output - bad
 - MakeMaker?  Pure PM, PM + XS?
 - currently the PerlApp UID is in both config.pl (hardwired) and
   in makesis.pl (computed), this is quite error prone
-- Enable building also under Cygwin?
+- Enable building also under Cygwin? (could be really hard,
+  the Symbian SDKs pretty much assume cmd.exe)
 
 =head1 PACKAGING
 
 =head1 PerlApp
 
 - In "Run" see how one could show also the file extensions.
-- when autostarting also offer to display the file (via Notes?)
-  instead of installing/running it?
-- Allow passing command line options to scripts being run?
-- Add "OneLiner" menu item? (-e, -M) (requires a UI form)
-- Terminate/Pause menu entries?
+- How to allow passing command line options to scripts being run?
+- Terminate/Pause menu entries (to be used while the script is running)?
 - review for proper Symbian coding practices
 
-=head1 CORE LIBRARIES
+=head2 All UIs
 
-- Fix Devel::PPPort (worth it?) (Note that there is D::PPP 3.x out by now)
-- Fix Encode to not to have writeable data: seems to be tricky indeed
-  because of copious global non-const data.
-- Verify that the modified File::Spec::Win32 does work in Symbian.
-  (File::Spec::Epoc does not seem to be relevant?)
-- What does Cwd really do since the concept of cwd is a bit fuzzy in Symbian.
-- What should Sys::Hostname return?  GPRS? BT? WLAN?
-- ByteLoader problem: byterun.c does not see VERSION and XS_VERSION.
-- POSIX problem: STDLIB POSIX is not that POSIX.
+- Make it possible to call UI elements (or any other Symbianic
+  asynchronous services) from Perl.
 
-=head1 REGRESSION SUITE
+  There is now a sample of enabling calling CPerlUi::TextQueryDialogL()
+  from Perl as PerlApp::TextQuery(), see symbian_utils.c.  This, however,
+  does not work: calling the dialog code blocks so that the screen is not
+  redrawn at all.  Perl should do both: "yield" so that the GUI framework
+  can redraw, but in the meanwhile Perl should wait for the completion
+  (OK or Cancel) of the dialog.  Welcome to the wonderful world of cooperative
+  multitasking.  The right solution surely involves Active Objects.
+  The problem may require having a different Perl op dispatch
+  loop than the standard ones in run.c and debug.c.
 
-- how to run the standard test suite on a Symbian device?
+- menu/toolbar support
+- selection lists (single cf multi cf radio)
+- on/off (special case of two-item radio selection list)
+- forms (multicontrols)
+- "secret editor" (special case of text query)
+
+=head2 Series 60
+
+- in S60 2.6 (at least in Nokia 6630 v4.03.11) launching scripts via
+  FExplorer does not open up the console
+
+=head2 Series 80
+
+- On exit "PerlApp" gets Symbian USER Panic 44: "This panic is raised
+  by the Free() and FreeZ() member functions of an RHeap. It is caused
+  when the cell being freed overlaps the next cell on the free list
+  (i.e. the first cell on the free list with an address higher than the
+  one being freed)."  Reason unknown.
+- Hotkey Newline so that it functions as 'OK' in dialogs
+
+=head2 UIQ
+
+- UIQ 3.0? UIQ 2.0? (now only tried in UIQ 2.1)
+- UIQ, at least UIQ 2.1, does not have "file select dialogs" since
+  "files" are supposed to be hidden from the user.  Therefore, no
+  "Run" in PerlApp.  (For similar stylistic reasons there is no "Exit".)
+- Long notes (e.g. the EPerlAppCommandAbout) are shown badly truncated.
 
 =head1 CPAN LIBRARIES
 
    all of it, even after pm-stripping):
        - libnet
        - Bundle::CPAN
-               - Archive::Tar
+               - Archive::Tar (now included in 5.9.x)
                - Term::ReadKey (useless?)
                - Term::ReadLine (useless?)
        - Bundle::LWP
        - DBD::SQLite? (sqlite?)
        - SOAP? XML-RPC?
 
+=head1 CORE LIBRARIES
+
+- Fix Devel::PPPort (worth it?) (Note that there is D::PPP 3.x out by now)
+- Fix Encode to not to have writeable data: seems to be tricky indeed
+  because of copious global non-const data.
+- Verify that the modified File::Spec::Win32 does work in Symbian.
+  (File::Spec::Epoc does not seem to be relevant?)
+- What does Cwd really do since the concept of cwd is a bit fuzzy in Symbian.
+- What should Sys::Hostname return?  GPRS? BT? WLAN?
+- ByteLoader problem: byterun.c does not see VERSION and XS_VERSION.
+- POSIX problem: STDLIB POSIX is not that POSIX.
+
+=head1 REGRESSION SUITE
+
+- how to run the standard test suite on a Symbian device?
+
 =head1 FUTURE POSSIBILITIES
 
+- GUI support (problematic that the MVC model enforces an "application")
+  (name suggestion: Moped::Gui)
+  (see above for the need of sorting out the Active Objectedness)
+- Messaging support (sms:, mms:, mailto:, irdaobex:, btobex:,
+  cell location, WLAN)
+  (name suggestion: Moped::Msg)
+- PDA support (address book)
+  (name suggestion: Moped::Msg)
+- Device support (memory, camera)
+  (name suggestion: Moped::Dev)
 - Remote console (Bluetooth/IR)
-- S60 GUI support
-- S60 PDA support
-- Phone APIs
-- S80
-- UIQ
+- Phone APIs (how to catch an incoming call: BIO messaging)
+
index eb47909..e21b357 100644 (file)
@@ -113,6 +113,9 @@ SYSTEMINCLUDE       \\epoc32\\include\\libc
 SYSTEMINCLUDE  \\epoc32\\include
 LIBRARY                euser.lib
 LIBRARY                estlib.lib
+LIBRARY                eikcore.lib
+LIBRARY                cone.lib
+LIBRARY                efsrv.lib
 __EOF__
         if ( $miniperl || $perl || $type eq 'dll' ) {
             print $fh <<__EOF__;
@@ -126,6 +129,28 @@ __EOF__
 LIBRARY                commonengine.lib
 __EOF__
        }
+       if (defined $S60SDK) {
+           print $fh <<__EOF__;
+LIBRARY                avkon.lib
+LIBRARY                commondialogs.lib 
+__EOF__
+        }
+       if (defined $S80SDK) {
+           print $fh <<__EOF__;
+LIBRARY                eikctl.lib
+LIBRARY                eikcoctl.lib
+LIBRARY                eikdlg.lib
+LIBRARY                ckndlg.lib
+__EOF__
+        }
+       if (defined $UIQSDK) {
+           print $fh <<__EOF__;
+LIBRARY                eikctl.lib
+LIBRARY                eikcoctl.lib
+LIBRARY                eikdlg.lib
+LIBRARY                qikctl.lib
+__EOF__
+        }
         if ( $type eq 'exe' ) {
             print $fh <<__EOF__;
 STATICLIBRARY  ecrt0.lib
@@ -150,6 +175,7 @@ __EOF__
             print $fh <<__EOF__;
 MACRO          PERL_GLOBAL_STRUCT
 MACRO          PERL_GLOBAL_STRUCT_PRIVATE
+RESOURCE       symbian\\PerlUi.rss
 __EOF__
         }
         close $fh;
@@ -219,7 +245,7 @@ sub create_config_h {
 __EOF__
             while (<CONFIG_H_SH>) {
                 last if /!GROK!THIS/;
-                s/\$(\w+)/exists $config{$1} ? $config{$1} : ""/eg;
+                s/\$(\w+)/exists $config{$1} ? $config{$1} : (warn "$0: config.sh missing '$1'\n", "")/eg;
                 s/^#undef\s+(\S+).+/#undef $1/g;
                 s:\Q/**/::;
                 print CONFIG_H;
@@ -355,13 +381,16 @@ create_mmp(
     'miniperl',             'exe',
     'miniperlmain.c',       'symbian\symbian_stubs.c',
     'symbian\PerlBase.cpp',
+    'symbian\PerlUi.cpp',
     'symbian\PerlUtil.cpp',
     'symbian\symbian_utils.cpp',
 );
 create_mmp(
     "perl",                      'exe',
     'perlmain.c',                'symbian\symbian_stubs.c',
-    'symbian\symbian_utils.cpp', 'symbian\PerlBase.cpp',
+    'symbian\symbian_utils.cpp',
+    'symbian\PerlBase.cpp',
+    'symbian\PerlUi.cpp',
     'symbian\PerlUtil.cpp',
     'ext\DynaLoader\DynaLoader.cpp',
 );
@@ -369,7 +398,9 @@ create_mmp(
 create_mmp(
     "perl$VERSION",              'dll',
     'symbian\symbian_dll.cpp',   'symbian\symbian_stubs.c',
-    'symbian\symbian_utils.cpp', 'symbian\PerlBase.cpp',
+    'symbian\symbian_utils.cpp',
+    'symbian\PerlBase.cpp',
+    'symbian\PerlUi.cpp',
     'symbian\PerlUtil.cpp',
     'ext\DynaLoader\DynaLoader.cpp',
 );
@@ -384,6 +415,8 @@ create_PerlApp_pkg();
 if ( open( PERLAPP_MMP, ">symbian/PerlApp.mmp" ) ) {
     my @MACRO;
     my @LIB;
+    push @MACRO, 'PERL_IMPLICIT_CONTEXT';
+    push @MACRO, 'MULTIPLICITY';
     if (defined $S60SDK) {
         push @MACRO, '__SERIES60__';
         push @MACRO, '__SERIES60_1X__' if $S60SDK =~ /^1\./;
@@ -428,8 +461,6 @@ EXPORTUNFROZEN
 SOURCEPATH        .
 SOURCE            PerlApp.cpp 
 
-RESOURCE          PerlApp.rss
-
 USERINCLUDE       .
 USERINCLUDE       ..
 USERINCLUDE       \\symbian\\perl\\$R_V_SV\\include
@@ -440,14 +471,14 @@ SYSTEMINCLUDE     \\epoc32\\include\\libc
 LIBRARY           apparc.lib
 LIBRARY           bafl.lib
 LIBRARY           charconv.lib 
-LIBRARY           cone.lib 
+LIBRARY           cone.lib
 LIBRARY           efsrv.lib
-LIBRARY           eikcore.lib 
+LIBRARY           eikcore.lib
 LIBRARY           estlib.lib 
 LIBRARY           euser.lib
 LIBRARY           perl$VERSION.lib
 @LIB
-
+RESOURCE          perlapp.rss
 __EOF__
     if (@MACRO) {
        for my $macro (@MACRO) {
@@ -474,6 +505,7 @@ if ( open( MAKEFILE, ">Makefile" ) ) {
     my $windef2 = "..\\BWINS\\${perl}u.def";
     my $armdef1 = "$SYMBIAN_ROOT\\Epoc32\\Build$CWD\\$perl\\$ARM\\$perl.def";
     my $armdef2 = "..\\BMARM\\${perl}u.def";
+    my $MF = $WIN eq 'wins' ? 'vc6' : $WIN eq 'winscw' ? 'cw_ide' : "UNKNOWN";
     print "\tMakefile\n";
     print MAKEFILE <<__EOF__;
 help:
@@ -492,30 +524,30 @@ build:    rename_makedef build_${WIN} build_arm
 @unclean: symbian\\config.pl
        perl symbian\\config.pl
 
-build_${WIN}:  abld.bat ${WIN}_perl.mf ${WIN}_miniperl.mf ${WIN}_${VERSION}.mf perldll_${WIN}
+build_${WIN}:  abld.bat perldll_${WIN}
 
-build_vc6:     abld.bat ${WIN}_perl.mf ${WIN}_miniperl.mf ${WIN}_${VERSION}.mf vc6.mf perldll_wins
+build_vc6:     abld.bat perldll_wins
 
-build_vc7:     abld.bat ${WIN}_perl.mf ${WIN}_miniperl.mf ${WIN}_${VERSION}.mf vc7.mf perldll_wins
+build_vc7:     abld.bat perldll_wins
 
-build_cw:      abld.bat ${WIN}_perl.mf ${WIN}_miniperl.mf ${WIN}_${VERSION}.mf cw.mf perldll_winscw
+build_cw:      abld.bat perldll_winscw
 
-build_arm:     abld.bat perl_arm miniperl_arm arm_${VERSION}.mf perldll_arm
+build_arm:     abld.bat perl_arm miniperl_arm perldll_arm
 
-miniperl_win miniperl_${WIN}:  miniperl.mmp abld.bat ${WIN}_miniperl.mf rename_makedef
+miniperl_win miniperl_${WIN}:  miniperl.mmp abld.bat rename_makedef
        abld build ${WIN} udeb miniperl
 
-miniperl_arm:  miniperl.mmp abld.bat arm_miniperl.mf rename_makedef
+miniperl_arm:  miniperl.mmp abld.bat rename_makedef
        abld build \$(ARM) $UARM miniperl
 
 miniperl:      miniperl_${WIN} miniperl_arm
 
 perl:  perl_${WIN} perl_arm
 
-perl_win perl_${WIN}:  perl.mmp abld.bat ${WIN}_perl.mf rename_makedef
+perl_win perl_${WIN}:  perl.mmp abld.bat rename_makedef
        abld build ${WIN} perl
 
-perl_arm:      perl.mmp abld.bat arm_perl.mf rename_makedef
+perl_arm:      perl.mmp abld.bat rename_makedef
        abld build \$(ARM) $UARM perl
 
 perldll_win perldll_${WIN}: perl${VERSION}_${WIN} freeze_${WIN} perl${VERSION}_${WIN}
@@ -525,7 +557,7 @@ perl${VERSION}_win perl${VERSION}_${WIN}:   perl$VERSION.mmp abld.bat rename_maked
 
 perldll_arm: perl${VERSION}_arm freeze_arm perl${VERSION}_arm
 
-perl${VERSION}_arm:    perl$VERSION.mmp arm_${VERSION}.mf abld.bat rename_makedef
+perl${VERSION}_arm:    perl$VERSION.mmp abld.bat rename_makedef
        abld build \$(ARM) $UARM perl$VERSION
 
 perldll perl$VERSION:  perldll_${WIN} perldll_arm
@@ -542,10 +574,11 @@ rename_makedef:
 rerename_makedef:
        -ren nomakedef.pl makedef.pl
 
-abld.bat abld: bld.inf
-       bldmake bldfiles
+symbian\\PerlUi.rss: symbian\\PerlUi$SDK_VARIANT.rss
+       copy symbian\\PerlUi$SDK_VARIANT.rss symbian\\PerlUi.rss
 
-makefiles: win.mf arm.mf vc6 vc7.mf cw.mf
+abld.bat abld: bld.inf symbian\\PerlUi.rss
+       bldmake bldfiles
 
 vc6:   win.mf vc6.mf build_vc6
 
@@ -554,15 +587,15 @@ vc7:      win.mf vc7.mf build_vc7
 cw:    win.mf cw.mf build_cw
 
 ${WIN}_miniperl.mf: abld.bat symbian\\config.pl
-       abld makefile ${WIN} miniperl
+       abld makefile ${MF} miniperl
        echo > ${WIN}_miniperl.mf
 
 ${WIN}_perl.mf: abld.bat symbian\\config.pl
-       abld makefile ${WIN} perl
+       abld makefile ${MF} perl
        echo > ${WIN}_perl.mf
 
 ${WIN}_${VERSION}.mf: abld.bat symbian\\config.pl
-       abld makefile ${WIN} perl${VERSION}
+       abld makefile ${MF} perl${VERSION}
        echo > ${WIN}_${VERSION}.mf
 
 symbian\\${WIN}.mf:
@@ -571,15 +604,12 @@ symbian\\${WIN}.mf:
 ${WIN}.mf: ${WIN}_miniperl.mf ${WIN}_perl.mf ${WIN}_${VERSION}.mf symbian\\${WIN}.mf
 
 arm_miniperl.mf: abld.bat symbian\\config.pl
-       abld makefile \$(ARM) miniperl
        echo > arm_miniperl.mf
 
 arm_perl.mf: abld.bat symbian\\config.pl
-       abld makefile \$(ARM) perl
        echo > arm_perl.mf
 
 arm_${VERSION}.mf: abld.bat symbian\\config.pl
-       abld makefile \$(ARM) perl${VERSION}
        echo > arm_${VERSION}.mf
 
 arm.mf: arm_miniperl.mf arm_perl.mf arm_${VERSION}.mf
@@ -694,6 +724,7 @@ sdkinstall:
        copy /y symbian\\xsbuild.pl    \$(APIDIR)\\bin
        copy /y symbian\\sisify.pl     \$(APIDIR)\\bin
        copy /y symbian\\PerlBase.h    \$(APIDIR)\\include
+       copy /y symbian\\PerlUi.h      \$(APIDIR)\\include
        copy /y symbian\\PerlUtil.h    \$(APIDIR)\\include
        copy /y symbian\\symbian*.h    \$(APIDIR)\\include\\symbian
        copy /y symbian\\PerlBase.pod  \$(APIDIR)\\pod
@@ -782,8 +813,8 @@ clean:      clean_${WIN} clean_arm rerename_makedef
        -del /f abld.bat @unclean *.pkg *.sis *.zip
        -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 vc*.mf cw*.mf
+       -del symbian\\PerlUi.rss
        -del perlappmin.hex perlrscmin.hex
        -perl symbian\\xsbuild.pl \$(XSBOPT) --clean \$(EXT)
        -rmdir /s /q perl${VERSION}_Data
@@ -813,29 +844,32 @@ if ( open( MAKEFILE, ">symbian/Makefile")) {
     my $wrap = defined $S60SDK && $S60SDK eq '1.2' && $WIN ne '${WIN}cw';
     my $ABLD = $wrap ? 'perl b.pl': 'abld';
     print "\tsymbian/Makefile\n";
+    my $MF = $WIN eq 'wins' ? 'vc6' : $WIN eq 'winscw' ? 'cw_ide' : "UNKNOWN";
     print MAKEFILE <<__EOF__;
 WIN = $WIN
 ARM = $ARM
 ABLD = $ABLD
+MF = $MF
 
 abld.bat:
        bldmake bldfiles
 
 perlapp_${WIN}: abld.bat ..\\config.h PerlApp.h PerlApp.cpp
+       copy PerlUi$SDK_VARIANT.rss PerlApp.rss
        bldmake bldfiles
-       copy PerlApp$SDK_VARIANT.rss PerlApp.rss
        \$(ABLD) build ${WIN} udeb
 
 perlapp_arm: ..\\config.h PerlApp.h PerlApp.cpp
+       copy PerlUi$SDK_VARIANT.rss PerlApp.rss
        bldmake bldfiles
-       copy PerlApp$SDK_VARIANT.rss PerlApp.rss
        \$(ABLD) build ${ARM} $UARM
 
+$MF:
+       abld makefile $MF
+
 win.mf:
        bldmake bldfiles
-       abld makefile vc6
-       abld makefile vc7
-       abld makefile cw_ide
+       abld makefile $MF
 
 perlapp_demo_extract:
        perl demo_pl extract
@@ -849,6 +883,7 @@ clean:
        -perl demo_pl cleanup
        -del /f perlapp.sis
        -del /f b.pl
+       -del PerlApp.rss
        abld clean $WIN
        abld clean thumb
 
index 0d12989..725d024 100644 (file)
@@ -6,6 +6,7 @@ afs='false'
 afsroot='/afs'
 alignbytes='4'
 apiversion='5.005'
+aphostname='localhost'
 ar=':'
 archlib='\\system\\libs\\perl\\x.y.z\\thumb-symbian'
 archlibexp='\\system\\libs\\perl\\x.y.z\\thumb-symbian'
@@ -22,6 +23,7 @@ ccdlflags=''
 charsize='1'
 clocktype='clock_t'
 cpp_stuff='42'
+cpplast=''
 cppminus='-'
 cpprun='gcc -E'
 cppstdin='gcc -E'
@@ -140,6 +142,8 @@ d_fstatvfs='undef'
 d_fsync='undef'
 d_ftello='undef'
 d_ftime='undef'
+d_futimes='undef'
+d_futimesat='undef'
 d_getcwd='define'
 d_getespwnam='undef'
 d_getfsstat='undef'
@@ -217,6 +221,7 @@ d_ldbl_dig='undef'
 d_libm_lib_version='undef'
 d_link='undef'
 d_localtime_r='undef'
+d_localtime_r_needs_tzset='undef'
 d_locconv='undef'
 d_lockf='undef'
 d_longdbl='undef'
@@ -447,6 +452,9 @@ d_writev='undef'
 d_xenix='undef'
 db_hashtype='u_int32_t'
 db_prefixtype='size_t'
+db_version_major='0'
+db_version_minor='0'
+db_version_patch='0'
 defvoidused=1
 direntrytype='struct dirent'
 dlext='dll'
@@ -471,6 +479,8 @@ fpossize='4'
 fpostype=fpos_t
 freetype=void
 full_ar=':'
+full_csh=':'
+full_sed=':'
 getgrent_r_proto='0'
 getgrgid_r_proto='0'
 getgrnam_r_proto='0'
@@ -618,6 +628,7 @@ lseektype=int
 make='make'
 malloctype='int*'
 malloctype='void *'
+mmaptype='void *'
 modetype='mode_t'
 modetype=int
 multiarch='undef'
@@ -643,6 +654,7 @@ orderlib='false'
 osname='symbian'
 osvers='7.0s'
 otherlibdirs=''
+package=''
 path_sep=';';
 phostname='hostname'
 pidtype='int'
@@ -690,6 +702,7 @@ setprotoent_r_proto='0'
 setpwent_r_proto='0'
 setservent_r_proto='0'
 shmattype='void *'
+sh=':'
 shortsize=2
 sig_name_init='0'
 sig_num_init='0'
@@ -709,6 +722,7 @@ socksizetype='unsigned int'
 srand48_r_proto='0'
 srandom_r_proto='0'
 ssizetype=int
+startperl=''
 stdchar=char
 stdio_base='((fp)->_IO_read_base)'
 stdio_bufsiz='((fp)->_IO_read_end - (fp)->_IO_read_base)'
diff --git a/symbian/ext/Moped/Msg/Msg.mmp b/symbian/ext/Moped/Msg/Msg.mmp
new file mode 100644 (file)
index 0000000..7736d2a
--- /dev/null
@@ -0,0 +1 @@
+LIBRARY                etel.lib gsmbas.lib\r
diff --git a/symbian/ext/Moped/Msg/Msg.pkg b/symbian/ext/Moped/Msg/Msg.pkg
new file mode 100644 (file)
index 0000000..eb7aed0
--- /dev/null
@@ -0,0 +1,16 @@
+; MoDev::Msg installation script\r
+;\r
+; The supported languages\r
+&EN;\r
+;\r
+; The installation name and header data\r
+;\r
+#{"MoDev::Msg"},(0x0FFFFFFF),0,1,0\r
+;\r
+; Platform supported is Series 60\r
+;\r
+(0x101F6F88), 0, 0, 0, {"Series60ProductID"}\r
+; The files to install\r
+;\r
+"Msg.pm"-"!:\System\Libs\Perl\5.9.3\MoDev\Msg.pm"\r
+"\epoc32\release\thumb\urel\Msg.dll"-"!:\System\Libs\Perl\5.9.3\thumb-symbian\Msg.dll"\r
diff --git a/symbian/ext/Moped/Msg/Msg.pm b/symbian/ext/Moped/Msg/Msg.pm
new file mode 100644 (file)
index 0000000..e1aaef8
--- /dev/null
@@ -0,0 +1,9 @@
+package Moped::Msg;
+use strict;
+use vars qw(@ISA $VERSION);
+require DynaLoader;
+@ISA = qw(DynaLoader);
+$VERSION = '0.01';
+bootstrap Moped::Msg;
+1;
+
diff --git a/symbian/ext/Moped/Msg/Msg.xs b/symbian/ext/Moped/Msg/Msg.xs
new file mode 100644 (file)
index 0000000..ae47e0a
--- /dev/null
@@ -0,0 +1,51 @@
+#include <eikenv.h>
+#include <e32std.h>
+
+#include "etelbgsm.h" // From Symbian 6.1 SDK (the Communicator SDK)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "PerlBase.h"
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+#ifdef __cplusplus
+}
+#endif
+
+_LIT(KTsyName, "phonetsy.tsy");
+
+#define XS_SYMBIAN_OR_EMPTY(e, c) errno = (e) = (c); if ((e) != KErrNone) XSRETURN_EMPTY
+
+MODULE = Moped::Msg    PACKAGE = Moped::Msg
+
+PROTOTYPES: ENABLE
+
+extern "C" void
+get_gsm_network_info()
+    PREINIT:
+       TInt                    error;
+       TInt                    enumphone;
+       RTelServer              server;
+       RBasicGsmPhone          phone;
+       RTelServer::TPhoneInfo  info;
+       MBasicGsmPhoneNetwork::TCurrentNetworkInfo networkinfo;
+    PPCODE:
+       if (GIMME != G_ARRAY)
+           XSRETURN_UNDEF;
+       XS_SYMBIAN_OR_EMPTY(error, server.Connect());
+       XS_SYMBIAN_OR_EMPTY(error, server.LoadPhoneModule(KTsyName));
+       XS_SYMBIAN_OR_EMPTY(error, server.EnumeratePhones(enumphone));
+       if (enumphone < 1)
+           XSRETURN_EMPTY;
+       XS_SYMBIAN_OR_EMPTY(error, server.GetPhoneInfo(0, info));
+       XS_SYMBIAN_OR_EMPTY(error, phone.Open(server, info.iName));
+       XS_SYMBIAN_OR_EMPTY(error, phone.GetCurrentNetworkInfo(networkinfo));
+       EXTEND(SP, 4);
+       PUSHs(sv_2mortal(newSViv(networkinfo.iNetworkInfo.iId.iMCC)));
+       PUSHs(sv_2mortal(newSViv(networkinfo.iNetworkInfo.iId.iMNC)));
+       PUSHs(sv_2mortal(newSViv(networkinfo.iLocationAreaCode)));
+       PUSHs(sv_2mortal(newSViv(networkinfo.iCellId)));
+
+
diff --git a/symbian/ext/Moped/Msg/README b/symbian/ext/Moped/Msg/README
new file mode 100644 (file)
index 0000000..2d31c29
--- /dev/null
@@ -0,0 +1,49 @@
+NOTE: this is just a sample of how building Symbian specific
+extensions COULD work.  This is most probably far from the best
+or final way of doing things.
+
+The Moped::Msg currently defines just a single static method,
+get_gsm_network_info(), which returns the GSM network and cell id.
+
+The extension code is in Msg.xs (which gets translated by xsubpp into
+Msg.cpp), the Perl glue code is in Msg.pm.  To understand the .xs
+syntax studying perlxstut and perlxs is recommended.
+
+The prerequisites for compiling this extension are:
+
+(1) The Perl for Symbian SDK installed (either done "make sdkinstall",
+    or separately installed the perlXYZsdk.zip).
+
+(2) The etelbgsm.h header, which is available for example from
+    the Symbian 6.1 SDK (the Communicator SDK). This must be
+    copied to ...\epoc32\include.
+
+(3) The etel.lib and the gsmbas.lib, they should come both
+    with the 6.1 and 7.0s SDK.  The WINS udeb and THUMB urel
+    versions of these must be copied to the directories
+    ...\epoc32\release\wins\udeb and ...\epoc32\release\thumb\urel,
+    respectively.
+
+To compile (assuming Perl 5.9.3 and Series 60 SDK 2.6 for Visual C):
+
+  perl \symbian\perl\5.9.3\bin\xsbuild.pl --cpp --extversion=0.1 ext\symbian\Moped\Msg
+
+The --symbian indicates the Symbian and SDK version, the --cplusplus
+indicates that one should generate a .cpp file instead of a .c file.
+
+The xsbuild.pl both configures and builds the extension.
+To clean do "make clean" or "make distclean".
+
+The location.pl demonstrates using the extension.
+
+To create a SIS:
+
+  makesis -d%EPOCROOT% ext\Moped\Msg\Msg.pkg
+
+TODO: automate the determination of the EXTVERSION (from .pkg?)
+and of creation of .pkg (the location of the .dll in the build
+and in the target).
+
+
+
+
diff --git a/symbian/ext/Moped/Msg/bld.inf b/symbian/ext/Moped/Msg/bld.inf
new file mode 100644 (file)
index 0000000..121a66a
--- /dev/null
@@ -0,0 +1,4 @@
+PRJ_MMPFILES\r
+Msg.mmp\r
+PRJ_PLATFORMS\r
+wins thumb\r
diff --git a/symbian/ext/Moped/Msg/location.pl b/symbian/ext/Moped/Msg/location.pl
new file mode 100644 (file)
index 0000000..50df335
--- /dev/null
@@ -0,0 +1,8 @@
+use Moped::Msg;
+my ($MCC, $MNC, $LAC, $Cell) =
+  Moped::Msg::get_gsm_network_info();
+print "MCC  = $MCC\n";
+print "MNC  = $MNC\n";
+print "LAC  = $LAC\n";
+print "Cell = $Cell\n";
+
index 4d00ac0..6487c57 100644 (file)
@@ -3,21 +3,24 @@ use strict;
 if (exists $ENV{'!C:'}) {
   print "You are running this under Cygwin, aren't you? (found '!C' in %ENV)\n";
   print "Are you perhaps using Cygwin Perl? (\$^O is '$^O')\n" if $^O =~ /cygwin/;
-  print "I'm sorry but only cmd.exe will work.\n";
+  print "I'm sorry but only cmd.exe with e.g. the ActivePerl will work.\n";
   exit(1);
 }
 
-if (# S60 2.x or S80 2.x
-    $ENV{PATH} !~ m!\\program files\\common files\\symbian\\tools!i
-    &&
-    # S60 1.2
-    $ENV{PATH} !~ m!\\symbian\\6.1\\shared\\epoc32\\tools!i
-    &&
-    # UIQ
-    $ENV{PATH} !~ m!\\symbian\\uiq.+?\\epoc32!i
-    ) {
-  print "I do not think you have installed the Symbian SDK.\n";
-  exit(1);
+unless(# S60 2.x
+       $ENV{PATH} =~ m!\\program files\\common files\\symbian\\tools!i
+       ||
+       # S60 1.2
+       $ENV{PATH} =~ m!\\symbian\\6.1\\shared\\epoc32\\tools!i
+       ||
+       # S80
+       $ENV{PATH} =~ m!\\s80_.+?\\epoc32\\!i
+       ||
+       # UIQ
+       $ENV{PATH} =~ m!\\uiq_.+?\\epoc32\\!i
+       ) {
+    print "I do not think you have installed a Symbian SDK, your PATH is:\n$ENV{PATH}\n";
+    exit(1);
 }
 
 unless (-f "symbian/symbianish.h") {
index 6ba8d9b..02886e5 100644 (file)
@@ -77,26 +77,26 @@ $ENV{UARM} = $UARM;
 
 # The following is a cheat sheet for the right S60/S80 SDK settings.
 #
-# macro.bat:
+# symbiancommon.bat:
 # set EPOC_BIN=%EPOCROOT%Epoc32\gcc\bin;%EPOCROOT%Epoc32\Tools
 # set MWCW=C:\Program Files\Metrowerks\CodeWarrior for Symbian OEM v2.8
 # set MSVC=C:\Program Files\Microsoft Visual Studio
-# set MSVC_BIN=%MSVC%\VC98\Bin;%MSVC%\Common\MSDev98\Bin
+# set MSVC_BIN=%MSVC%\VC98\Bin;%MSVC%\Aux\MSDev98\Bin
 # set MSVC_INC=%MSVC%\VC98\atl\include;%MSVC%\mfc\include;%MSVC%\include
 # set MSVC_LIB=%MSVC%\mfc\lib;%MSVC%\lib
 #
 # s60-1.2-cw:
 #
 # set EPOCROOT=\Symbian\Series60_1_2_CW\
-# macro
-# set PATH=%EPOC_BIN%;%MSVC_BIN%;%MWCW%\Bin;%MWCW%\Symbian_Tools\Command_Line_Tools;%PATH%
+# symbiancommon
+# set PATH=%EPOC_BIN%;%MSVC_BIN%;%MWCW%\Bin;%MWCW%\Symbian_Tools\Command_Line_Tools;%MSVC_BIN%;C:\perl\bin;C:\winnt\system32
 # set USERDEFS=%USERDEFS% -D__SERIES60_12__ -D__SERIES60_MAJOR__=1 -D__SERIES60_MINOR__=2 -D__SERIES60_1X__
 #
 # s60-1.2-vc:
 #
 # set EPOCROOT=\Symbian\6.1\Series60\
-# macro
-# set PATH=\Symbian\6.1\Shared\Epoc32\gcc\bin;\Symbian\6.1\Shared\Epoc32\Tools;%MSVC_BIN%;%PATH%
+# symbiancommon
+# set PATH=\Symbian\6.1\Shared\Epoc32\gcc\bin;\Symbian\6.1\Shared\Epoc32\Tools;%MSVC_BIN%;C:\perl\bin;C:\winnt\system32
 # set INCLUDE=%MSVC_INC%
 # set LIB=%MSVC_LIB%
 # set USERDEFS=%USERDEFS% -D__SERIES60_12__ -D__SERIES60_MAJOR__=1 -D__SERIES60_MINOR__=2 -D__SERIES60_1X__
@@ -105,16 +105,16 @@ $ENV{UARM} = $UARM;
 #
 # set EPOCROOT=\Symbian\7.0s\Series60_v20_CW\
 # set EPOCDEVICE=Series60_2_0_CW:com.Nokia.Series60_2_0_CW
-# macro
-# set PATH=%EPOC_BIN%;%MWCW%\Bin;%MWCW%\Symbian_Tools\Command_Line_Tools;%PATH%
+# symbiancommon
+# set PATH=%EPOC_BIN%;%MWCW%\Bin;%MWCW%\Symbian_Tools\Command_Line_Tools;%MSVC_BIN%;C:\perl\bin;C:\winnt\system32
 # set USERDEFS=%USERDEFS% -D__SERIES60_20__ -D__SERIES60_MAJOR__=2 -D__SERIES60_MINOR__=0 -D__SERIES60_2X__
 # 
 # s60-2.0-vc:
 #
 # set EPOCROOT=\Symbian\7.0s\Series60_v20\
 # set EPOCDEVICE=Series60_v20:com.nokia.series60
-# macro
-# set PATH=%EPOC_BIN%;%MSVC_BIN%;%PATH%
+# symbiancommon
+# set PATH=%EPOC_BIN%;%MSVC_BIN%;C:\perl\bin;C:\winnt\system32
 # set INCLUDE=%MSVC_INC%
 # set LIB=%MSVC_LIB%
 # set USERDEFS=%USERDEFS% -D__SERIES60_20__ -D__SERIES60_MAJOR__=2 -D__SERIES60_MINOR__=0 -D__SERIES60_2X__
@@ -123,24 +123,24 @@ $ENV{UARM} = $UARM;
 #
 # set EPOCROOT=\Symbian\7.0s\Series60_v21_CW\
 # set EPOCDEVICE=Series60_v21_CW:com.Nokia.series60
-# macro
-# set PATH=%EPOC_BIN%;%MWCW%\Bin;%MWCW%\Symbian_Tools\Command_Line_Tools;%PATH%
+# symbiancommon
+# set PATH=%EPOC_BIN%;%MWCW%\Bin;%MWCW%\Symbian_Tools\Command_Line_Tools;%MSVC_BIN%;C:\perl\bin;C:\winnt\system32
 # set USERDEFS=%USERDEFS% -D__SERIES60_21__ -D__SERIES60_MAJOR__=2 -D__SERIES60_MINOR__=1 -D__SERIES60_2X__
 # 
 # s60-2.6-cw:
 #
 # set EPOCROOT=\Symbian\8.0a\S60_2nd_FP2_CW\
 # set EPOCDEVICE=S60_2nd_FP2_CW:com.nokia.series60
-# macro
-# set PATH=%EPOC_BIN%;%MWCW%\Bin;%MWCW%\Symbian_Tools\Command_Line_Tools;%PATH%
+# symbiancommon
+# set PATH=%EPOC_BIN%;%MWCW%\Bin;%MWCW%\Symbian_Tools\Command_Line_Tools;%MSVC_BIN%;C:\perl\bin;C:\winnt\system32
 # set USERDEFS=%USERDEFS% -D__SERIES60_26__ -D__SERIES60_MAJOR__=2 -D__SERIES60_MINOR__=6 -D__SERIES60_2X__ -D__BLUETOOTH_API_V2__
 # 
 # s60-2.6-vc:
 #
 # set EPOCROOT=\Symbian\8.0a\S60_2nd_FP2\
 # set EPOCDEVICE=S60_2nd_FP2:com.nokia.Series60
-# macro
-# set PATH=%EPOC_BIN%;%MSVC_BIN%;%PATH%
+# symbiancommon
+# set PATH=%EPOC_BIN%;%MSVC_BIN%;C:\perl\bin;C:\winnt\system32
 # set INCLUDE=%MSVC_INC%
 # set LIB=%MSVC_LIB%
 # set USERDEFS=%USERDEFS% -D__SERIES60_26__ -D__SERIES60_MAJOR__=2 -D__SERIES60_MINOR__=6 -D__SERIES60_2X__ -D__BLUETOOTH_API_V2__
@@ -149,25 +149,37 @@ $ENV{UARM} = $UARM;
 #
 # set EPOCROOT=\Symbian\8.1a\S60_2nd_FP3\
 # set EPOCDEVICE=S60_2nd_FP3:com.nokia.series60
-# macro
-# set PATH=%EPOC_BIN%;%MWCW%\Bin;%MWCW%\Symbian_Tools\Command_Line_Tools;%PATH%
+# symbiancommon
+# set PATH=%EPOC_BIN%;%MWCW%\Bin;%MWCW%\Symbian_Tools\Command_Line_Tools;%MSVC_BIN%;C:\perl\bin;C:\winnt\system32
 # set USERDEFS=%USERDEFS% -D__SERIES60_28__ -D__SERIES60_MAJOR__=2 -D__SERIES60_MINOR__=8 -D__SERIES60_2X__ -D__BLUETOOTH_API_V2__
 # 
 # s80-2.0-cw:
 #
 # set EPOCROOT=\Symbian\7.0s\S80_DP2_0_SDK_CW\
 # set EPOCDEVICE=Series80_DP2_0_SDK_CW:com.nokia.Series80
-# macro
-# set PATH=%EPOC_BIN%;%MWCW%\Bin;%MWCW%\Symbian_Tools\Command_Line_Tools;%PATH%
+# symbiancommon
+# set PATH=%EPOC_BIN%;%MWCW%\Bin;%MWCW%\Symbian_Tools\Command_Line_Tools;%MSVC_BIN%;C:\perl\bin;C:\winnt\system32
 # set USERDEFS=%USERDEFS% -D__SERIES80_20__ -D__SERIES80_MAJOR__=2 -D__SERIES80_MINOR__=0 -D__SERIES80_2X__
 #
 # s80-2.0-vc:
 #
 # set EPOCROOT=\Symbian\7.0s\S80_DP2_0_SDK\
 # set EPOCDEVICE=Series80_DP2_0_SDK:com.nokia.Series80
-# macro
-# set PATH=%EPOC_BIN%;%MWCW%\Bin;%MWCW%\Symbian_Tools\Command_Line_Tools;%PATH%
+# symbiancommon
+# set PATH=%EPOC_BIN%;%MWCW%\Bin;%MWCW%\Symbian_Tools\Command_Line_Tools;%MSVC_BIN%;C:\perl\bin;C:\winnt\system32
 # set USERDEFS=%USERDEFS% -D__SERIES80_20__ -D__SERIES80_MAJOR__=2 -D__SERIES80_MINOR__=0 -D__SERIES80_2X__
 #
+# UIQ-2.1-vc:
+# set EPOCROOT=\Symbian\UIQ_21\
+# set EPOCDEVICE=
+# set EPOC_BIN=%EPOCROOT%Epoc32\gcc\bin;%EPOCROOT%Epoc32\Tools
+# set MWCW=C:\APPS\codewarrior_3.0
+# set MSVC=C:\Program Files\Microsoft Visual Studio
+# set MSVC_BIN=%MSVC%;%MSVC%\Common\MSDev98\Bin
+# set MSVC_INC=%MSVC%\VC98\atl\include;%MSVC%\mfc\include;%MSVC%\include
+# set MSVC_LIB=%MSVC%\mfc\lib;%MSVC%\lib
+# set PATH=%EPOC_BIN%;%MWCW%\Bin;%MWCW%\Symbian_Tools\Command_Line_Tools;%MSVC_BIN%;C:\perl\bin;C:\winnt\system32
+# set USERDEFS=%USERDEFS% -D__UIQ_21__ -D__UIQ_MAJOR__=2 -D__UIQ_MINOR__=1 -D__UIQ_2X__
+#
 # EOF
 
index 67f6d32..3bd87fe 100644 (file)
@@ -342,10 +342,10 @@ 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.
+  # 'make sisify_hex' to create the perlappmin.hex for this hexdump.
   if ($Variant eq 'S60') {
       $APPHEX = <<__APP__;
-79000010ce390010f61520108581107645504f430020000017240aa7000000000100bf0000641e2823e2e000030000019011000000000000001000000000100000200000000000000100000000000010000000000700000008120000010000004c0f00007c000000000000000c1200000c150000000000005e01000000b500f0f7f902bc084700000148006870470000280c001000b5011c024800f0b3fc01bc00470000480c001030b585b00490002100f004fd6846049900f046fb684600f01bf9011c049cb4256d006019016004980022002300f002fab6256d0065190020286000f003fa012100f006fa05b030bc01bc0047f0b5071c0e1c1e4878611e48b8611e48f8611e48b8641e48f8641e483860b42464003d192968002910d0786800f018fb2968002905d008688268081c032100f0a3f9b4246400391900200860b62464003d192868002803d000f060fc00202860b96a002905d008688268081c032100f08bf9381c311c00f0adfcf0bc01bc0047d40e0010380f0010280f0010080f0010140f00106c0c001084b010b595b01790189119921a9301200021002200f07efc041c14a901a800f037fc002808d10090201c17a90222002300f076fc00f032fc00f036fc15b010bc08bc04b018470000f0b5474680b4324ca544071c8846022952d100f0bbfa011c0a687ea8126a00f043f98026f6006e44301c00f07dfa2949301c7eaa002300f07dfac425ed006d44281c00f07ffa244c6c440021224868440160201c042100f07bfa301c00f07efa011c201c2a1c00f07ffa002824d1301c00f074fa011c8420000168448022520000f0f4fb8521090169446846fc22520000f0f2fb84200001684400680f49694409680f4a6a4412680e4b6b441b68fff783ff381c00f070fa00204446002c00d10120094b9d4408bc9846f0bc02bc0847b4f5ffff2c0c0010480a000044080000480800004c0800004c0a000000b50120fff7e6fe01bc004700b5021c80204000814202d00348814206d1101c00f044fa05e00000c10b0000081cfff7e7ff01bc0047000010b500f007f8041c00f0aafb201c10bc02bc084730b5051c302000f0a7fb041c002c05d000f0f2f80748606007482060201c00f0a1fb201c291c00f009f8201c30bc02bc08470000e40c0010f40c001030b5041c0d1c00f0dff8201c291c00f0e1f82068016a201c00f08af830bc01bc0047000000b5044a4260044a026000f0d7f801bc00470000e40c0010f40c001030b584b0041c00f0d1f8051c6846211c00f0d2f82868b8300268281c694600f069f804b030bc01bc0047000030b5051c242000f053fb041c002c04d0291c00f085fb03482060201c30bc02bc08470000a40d001070b5b820400000f03ffb061c002e18d000f0c4f90d48b0640d48f0640d4d75610d4cb4610d4bf3610d4ab2640d49f1640d4830600d483060301c6030802100f02ffb301c70bc02bc084700003c0e0010480e0010d40e0010380f0010280f0010080f0010140f00105c0e00106c0c001010b58b20800000f019fb041c002c03d000f092f902482060201c10bc02bc0847000e0010002070470047704708477047104770471847704720477047284770473047704738477047404770474847704750477047584770476047704770477047014b1b681847c0464c0f0010014b1b681847c046540f0010014b1b681847c046580f0010014b1b681847c046500f001040b4024e3668b44640bc6047a00f0010014b1b681847c04620100010014b1b681847c0463c100010014b1b681847c0462c100010014b1b681847c046b00f0010014b1b681847c04618100010014b1b681847c04628100010014b1b681847c04624100010014b1b681847c046f80f0010014b1b681847c046ec0f0010014b1b681847c046e40f0010014b1b681847c04610100010014b1b681847c0460c100010014b1b681847c046a80f0010014b1b681847c0469c0f0010014b1b681847c046f40f0010014b1b681847c04638100010014b1b681847c04604100010014b1b681847c04614100010014b1b681847c046d40f0010014b1b681847c046e80f0010014b1b681847c046cc0f0010014b1b681847c046b80f0010014b1b681847c046bc0f0010014b1b681847c046dc0f0010014b1b681847c046c80f0010014b1b681847c046c40f0010014b1b681847c046b40f0010014b1b681847c0461c100010014b1b681847c046f00f0010014b1b681847c046ac0f0010014b1b681847c046a40f0010014b1b681847c046fc0f0010014b1b681847c04600100010014b1b681847c046e00f0010014b1b681847c046c00f0010014b1b681847c046d00f0010014b1b681847c04608100010014b1b681847c046d80f0010014b1b681847c04640100010014b1b681847c04644100010014b1b681847c04630100010014b1b681847c04634100010014b1b681847c0464c100010014b1b681847c04648100010014b1b681847c0466410001040b4024e3668b44640bc60475c100010014b1b681847c04660100010014b1b681847c04650100010014b1b681847c04658100010014b1b681847c04654100010014b1b681847c04678100010014b1b681847c046e8100010014b1b681847c04668100010014b1b681847c0469c100010014b1b681847c04634110010014b1b681847c04630110010014b1b681847c04648110010014b1b681847c046f8100010014b1b681847c046a8100010014b1b681847c046b8100010014b1b681847c04618110010014b1b681847c046e4100010014b1b681847c046d8100010014b1b681847c04688100010014b1b681847c046bc100010014b1b681847c04624110010014b1b681847c046fc100010014b1b681847c04600110010014b1b681847c04684100010014b1b681847c046d4100010014b1b681847c04670100010014b1b681847c046f0100010014b1b681847c046a4100010014b1b681847c0466c100010014b1b681847c04604110010014b1b681847c046cc100010014b1b681847c0468c100010014b1b681847c04698100010014b1b681847c046dc100010014b1b681847c04610110010014b1b681847c0461c110010014b1b681847c04608110010014b1b681847c046a0100010014b1b681847c046c8100010014b1b681847c046c4100010014b1b681847c046ec100010014b1b681847c046f4100010014b1b681847c04620110010014b1b681847c0463c11001040b4024e3668b44640bc6047c0100010014b1b681847c04614110010014b1b681847c04680100010014b1b681847c046ac100010014b1b681847c0467410001040b4024e3668b44640bc60470c110010014b1b681847c04694100010014b1b681847c04690100010014b1b681847c046d0100010014b1b681847c04638110010014b1b681847c0467c10001040b4024e3668b44640bc6047e0100010014b1b681847c046b0100010014b1b681847c04640110010014b1b681847c0464411001040b4024e3668b44640bc6047b4100010014b1b681847c0462c110010014b1b681847c04628110010014b1b681847c04654110010014b1b681847c04674110010014b1b681847c04664110010014b1b681847c04668110010014b1b681847c04658110010014b1b681847c0466c110010014b1b681847c0464c110010014b1b681847c0465c110010014b1b681847c04650110010014b1b681847c04660110010014b1b681847c04670110010014b1b681847c04678110010014b1b681847c0467c110010014b1b681847c0468011001040b4024e3668b44640bc604784110010014b1b681847c0465c0f0010014b1b681847c046940f0010014b1b681847c046980f0010014b1b681847c046740f0010014b1b681847c046840f0010014b1b681847c046640f0010014b1b681847c0466c0f001040b4024e3668b44640bc6047600f0010014b1b681847c046900f0010014b1b681847c0468c0f0010014b1b681847c046800f0010014b1b681847c0467c0f001040b4024e3668b44640bc6047780f0010014b1b681847c046680f0010014b1b681847c046700f0010014b1b681847c046880f00107047000000b5fff72fff01bc0047000000b5fff72fff01bc0047000000b5fff723ff01bc0047000010b581b0039c14380094fff7b1fe01b010bc01bc0047000000b51438fff7d6ff01bc004700b51438fff7aafe01bc004700b51838fff7fcfe02bc084700b51c38fff7f0fe02bc084700b51c38fff7e4fe02bc084700b50438fff774fd02bc084700b50438fff768fd02bc084700b54838fff7a0ff01bc004700b54c38fff7a0ff01bc0047ffffffff00000000ffffffff00000000280c0010480c0010d40e0010380f0010280f0010080f0010140f00106c0c00102c0c0010e40c0010f40c0010e40c0010f40c0010a40d00103c0e0010480e0010d40e0010380f0010280f0010080f0010140f00105c0e00106c0c0010680d0010000e0010f81520100a000000640065006600610075006c0074002e0070006c00000000000e0000005000650072006c004100700070004d0069006e0069006d0061006c0000000000000000000000000079000010650a0010710a00101507001021070010fd050010090600107d0a001015060010890a00102d070010210600102d0600102d00001039070010590100104507001051020010510700105d07001069070010950a001075070010810700108d07001099070010a50a0010b10a0010fcffffff00000000910b0010850b00100000000000000000f1020010d1040010dd040010e9040010f5040010010500100d0500101905001025050010310500103d0500104905001055050010610500106d0500107905001085050010910500109d050010a9050010b5050010c1050010cd050010d90500100d030010e5050010f105001000000000000000000d0b0010bd0a0010a5070010190a0010c90a0010b107001031040010bd070010c9070010d5070010e1070010ed070010190a00100000000000000000190b0010f9070010050800103d040010110800101d080010290800103508001041080010090b00104d08001059080010490400105504001065080010710800107d08001061030010d50a001089080010950800100000000000000000250b0010bd0a0010a50700100d000010c90a0010b107001031040010bd070010c9070010d5070010e1070010ed070010390300100000000000000000190a00100000000000000000190a0010390600104506001000000000000000004d0a0010650a0010710a00101507001021070010fd050010090600107d0a001015060010890a00102d070010210600102d06001021090010390700102d090010450700103d090010510700105d07001069070010950a001075070010810700108d07001099070010a50a0010b10a0010ecffffff00000000490b0010bd080010c9080010d5080010e1080010f1080010fd080010310b001009090010550b001015090010b8ffffff000000009d0b0010b4ffffff00000000a90b00103906001045060010e4ffffff00000000790b00106d0b0010e8ffffff00000000610b0010510600105d06001003000000060000001b000000470000003f000000ee020000f502000022030000230300002503000028030000b5040000b6040000d2040000e6040000f304000044050000480500000008000005080000030000000c0000001c0000001d000000210000002800000042000000480000004a000000520000005400000055000000570000005a0000005f0000006000000064000000650000008a0000008b0000008f0000009300000099000000a0000000ad000000b1000000b9000000bb000000c5000000c8000000d0000000d6000000dd000000df000000e2000000e8000000ec000000ff0000000001000014010000150100002401000025010000380100003a010000120000002700000033000000b7000000e3000000e600000011000000140000001e0000001f0000002000000028000000300000003100000033000000340000004000000041000000420000004300000044000000470000004a0000004b0000004c00000050000000510000005200000054000000560000006400000074000000790000007a0000007c0000008200000085000000860000008c0000008e0000008f00000092000000930000009500000096000000970000009b0000009d000000a1000000b3000000c6000000c8000000cc000000ce000000d5000000d6000000de000000e0000000e2000000fd000000080100002201000028010000020000000300000029030000380300003c0300005a0300007c0400008c0400000205000003050000e00500002e0600004b060000040000007805000000000000d103000000030000780200000400000003000000060000001b000000470000008d020000100000003f000000ee020000f502000022030000230300002503000028030000b5040000b6040000d2040000e6040000f304000044050000480500000008000005080000a10200002d000000030000000c0000001c0000001d000000210000002800000042000000480000004a000000520000005400000055000000570000005a0000005f0000006000000064000000650000008a0000008b0000008f0000009300000099000000a0000000ad000000b1000000b9000000bb000000c5000000c8000000d0000000d6000000dd000000df000000e2000000e8000000ec000000ff0000000001000014010000150100002401000025010000380100003a010000b402000006000000120000002700000033000000b7000000e3000000e6000000c80200003900000011000000140000001e0000001f0000002000000028000000300000003100000033000000340000004000000041000000420000004300000044000000470000004a0000004b0000004c00000050000000510000005200000054000000560000006400000074000000790000007a0000007c0000008200000085000000860000008c0000008e0000008f00000092000000930000009500000096000000970000009b0000009d000000a1000000b3000000c6000000c8000000cc000000ce000000d5000000d6000000de000000e0000000e2000000fd000000080100002201000028010000de0200000d000000020000000300000029030000380300003c0300005a0300007c0400008c0400000205000003050000e00500002e0600004b060000f20200000200000004000000780500004150504152435b31303030336133645d2e444c4c0041564b4f4e5b31303030353663365d2e444c4c00434f4e455b31303030336134315d2e444c4c0045465352565b31303030333965345d2e444c4c0045494b434f52455b31303030343839325d2e444c4c0045555345525b31303030333965355d2e444c4c005045524c3539332e444c4c000000c00200005c01000000000000c002000014302830f830fc300031043108310c312c32c432c832043308335c33ac33b033b433b833bc33c033c433c833cc33f0333834443450345c346c347834843490349c34a834b434c034cc34d834e434f034fc340835143520352c353835443550355c356835743580358c359835a435b035bc35c835d435e035ec35f835043610361c362836343640364c365836643670367c3688369836a436b036bc36c836d436e036ec36f836043710371c372837343740374c375837643770377c3788379437a037ac37b837c437d037dc37e837f43700380c381838243830383c384838543860386c387838843890389c38ac38b838c438d038dc38ec38f838043910391c3928393839443950395c396c397839843990399c39a839b439c039cc39d839e439f039fc39083a143a203a2c3a3c3a483a543a603a6c3a783a843a903aa03aac3ab83ac43ad03ae03aec3af83a043bc43bc83bcc3bd03bd43bd83bdc3be03be43be83bec3bf03bf43bf83bfc3b003c043c083c0c3c103c143c183c1c3c203c243c743c783c7c3c803c843c883c8c3c903c943c983c9c3ca03ca43ca83cac3cb03cb43cb83cbc3cc03cc43cc83ccc3cd03cd43cd83cdc3ce03cec3cf03cfc3c003d043d083d0c3d103d143d183d1c3d203d243d283d2c3d303d343d383d3c3d403d443d483d4c3d503d543d583d5c3d603d643d703d743d783d7c3d803d843d883d8c3d903d943d983d9c3da03dac3db03db43db83dbc3dc03dc43dc83dcc3dd03dd43dd83ddc3de03de43de83dec3df03df43df83dfc3d083e0c3e103e143e183e1c3e203e243e283e2c3e303e343e383e443e503e543e583e643e683e6c3e703e743e783e7c3e803e843e883e8c3e903e943e983e9c3ea03ea43ea83eac3eb03eb43eb83ebc3ec03ec43ec83ecc3ed03edc3ee03ee43ee83eec3ef03ef43ef83efc3e003f043f103f1c3f203f243f303f343f403f443f483f
+79000010ce390010f61520108581107645504f4300200000996c5ca0000000000100bf00000b5d19abe2e00003000001c40e00000000000000100000000010000020000000000000010000000000001000000000070000003c0f000001000000180d00007c00000000000000400f0000a8110000000000005e01000000b500f085f902bc084700000148006870470000bc09001000b5011c024800f061fb01bc00470000dc090010f0b5071c0e1c244878612448b8612448f8612448b8642448f86424483860b42464003d192968002910d0786800f0ecf92968002905d008688268081c032100f057f9b4246400391900200860b62464003d192868002803d000f034fb00202860b96a002905d008688268081c032100f03ff9094878610948b8610948f8610948b8640948f8640a483860381c311c00f06ffbf0bc01bc0047a00c0010040d0010f40c0010d40c0010e00c00107c0a0010000a001084b010b595b01790189119921a9301200021002200f038fb041c14a901a800f0fdfa002808d10090201c17a90222002300f030fb00f0f8fa00f0fcfa15b010bc08bc04b018470000f0b5474680b4324ca544071c8846022952d100f081f9011c0a687ea8126a00f0e9f88026f6006e44301c00f049f92949301c7eaa002300f049f9c425ed006d44281c00f04bf9244c6c440021224868440160201c042100f047f9301c00f04af9011c201c2a1c00f04bf9002824d1301c00f040f9011c8420000168448022520000f0bafa8521090169446846fc22520000f0b8fa84200001684400680f49694409680f4a6a4412680e4b6b441b68fff783ff381c00f036f900204446002c00d10120094b9d4408bc9846f0bc02bc0847b4f5ffffc0090010480a000044080000480800004c0800004c0a000000b50120fff7fefe01bc004730b5051c242000f087fa041c002c04d0291c00f0b9fa03482060201c30bc02bc08470000340b0010f0b54f464646c0b4b820400000f070fa071c002f2ad000f0fbf81848b8641848f864184ca1467c61174ca046bc61174efe61174dbd64174cfc64174838604c467c614446bc61134cfc6414483860381c6030802100f052fa4c467c614446bc61fe61bd640b4cfc640d483860381c18bc9846a146f0bc02bc08470000080c0010140c0010a00c0010040d0010f40c0010d40c0010e00c0010280c0010000a00107c0a001010b58b20800000f02dfa041c002c03d000f0b2f802482060201c10bc02bc0847cc0b0010002070470047704708477047104770471847704720477047284770473047704738477047404770474847704750477047584770476047704770477047014b1b681847c046180d0010014b1b681847c046200d0010014b1b681847c046240d0010014b1b681847c0461c0d0010014b1b681847c046700d0010014b1b681847c046640d0010014b1b681847c046680d0010014b1b681847c046740d0010014b1b681847c0466c0d0010014b1b681847c046800d0010014b1b681847c046840d0010014b1b681847c046780d0010014b1b681847c0467c0d0010014b1b681847c0469c0d001040b4024e3668b44640bc6047940d0010014b1b681847c046980d0010014b1b681847c046880d0010014b1b681847c046900d0010014b1b681847c0468c0d0010014b1b681847c0461c0e0010014b1b681847c046a00d0010014b1b681847c046d00d0010014b1b681847c046680e0010014b1b681847c046640e0010014b1b681847c0467c0e0010014b1b681847c0462c0e0010014b1b681847c046dc0d0010014b1b681847c046ec0d0010014b1b681847c0464c0e0010014b1b681847c046180e0010014b1b681847c0460c0e0010014b1b681847c046bc0d0010014b1b681847c046f00d0010014b1b681847c046580e0010014b1b681847c046300e0010014b1b681847c046340e0010014b1b681847c046b80d0010014b1b681847c046080e0010014b1b681847c046a80d0010014b1b681847c046240e0010014b1b681847c046d80d0010014b1b681847c046a40d0010014b1b681847c046380e0010014b1b681847c046000e0010014b1b681847c046c00d0010014b1b681847c046cc0d0010014b1b681847c046100e0010014b1b681847c046440e0010014b1b681847c046500e0010014b1b681847c0463c0e0010014b1b681847c046d40d0010014b1b681847c046fc0d0010014b1b681847c046f80d0010014b1b681847c046200e0010014b1b681847c046280e0010014b1b681847c046540e0010014b1b681847c046700e001040b4024e3668b44640bc6047140e001040b4024e3668b44640bc6047f40d0010014b1b681847c046480e0010014b1b681847c046b40d0010014b1b681847c046e00d0010014b1b681847c046ac0d001040b4024e3668b44640bc6047400e0010014b1b681847c046c80d0010014b1b681847c046c40d0010014b1b681847c046040e0010014b1b681847c0466c0e0010014b1b681847c046b00d0010014b1b681847c046e40d0010014b1b681847c046740e0010014b1b681847c046780e001040b4024e3668b44640bc6047e80d0010014b1b681847c046600e0010014b1b681847c0465c0e0010014b1b681847c046880e0010014b1b681847c046a00e0010014b1b681847c046900e0010014b1b681847c046940e0010014b1b681847c0468c0e0010014b1b681847c046980e0010014b1b681847c046800e0010014b1b681847c046840e0010014b1b681847c0469c0e0010014b1b681847c046a40e0010014b1b681847c046a80e0010014b1b681847c046b00e001040b4024e3668b44640bc6047b40e0010014b1b681847c046b80e0010014b1b681847c046ac0e0010014b1b681847c0465c0d0010014b1b681847c046600d0010014b1b681847c0463c0d0010014b1b681847c0464c0d0010014b1b681847c0462c0d0010014b1b681847c046340d001040b4024e3668b44640bc6047280d0010014b1b681847c046580d0010014b1b681847c046540d0010014b1b681847c046480d0010014b1b681847c046440d001040b4024e3668b44640bc6047400d0010014b1b681847c046300d0010014b1b681847c046380d0010014b1b681847c046500d00107047000000b5084a4261084a8261084ac261084a8264084ac264084a0260fff791ff01bc00470000a00c0010040d0010f40c0010d40c0010e00c0010000a001000b5fff717ff01bc0047000000b5fff717ff01bc0047000000b5fff70bff01bc0047000000b5fff705ff01bc0047000010b581b0039c14380094fff79bfe01b010bc01bc0047000000b51438fff7b2ff01bc004700b51438fff794fe01bc004700b51838fff7defe02bc084700b51c38fff7d2fe02bc084700b51c38fff7c6fe02bc084700b54838fff788ff01bc004700b54c38fff788ff01bc0047ffffffff00000000ffffffff00000000bc090010dc090010a00c0010040d0010f40c0010d40c0010e00c0010000a00107c0a0010c0090010340b0010080c0010140c0010a00c0010040d0010f40c0010d40c0010e00c0010280c0010000a00107c0a0010f80a0010900b0010cc0b0010a00c0010040d0010f40c0010d40c0010e00c0010000a0010f81520100a000000640065006600610075006c0074002e0070006c00000000000e0000005000650072006c004100700070004d0069006e0069006d0061006c000000000000000000000000005d080010b5070010c1070010710400107d0400107d03001089030010cd07001095030010d907001089040010a1030010ad0300108507001095040010fd050010a104001091070010ad040010b9040010c5040010e5070010d1040010dd040010e9040010f5040010f5070010010800105d07001000000000000000002d000010b5070010c1070010710400107d0400107d03001089030010cd07001095030010d907001089040010a1030010ad030010850700109504001029010010a104001091070010ad040010b9040010c5040010e5070010d1040010dd040010e9040010f5040010f507001001080010150200100000000000000000990800100d080010010500105d070010190800100d0500104d0300101905001025050010310500103d050010490500105d0700100000000000000000a50800105505001061050010590300106d0500107905001085050010910500109d05001059080010a9050010b50500106503001071030010c1050010cd050010d90500104902001025080010e5050010f10500100000000000000000b10800100d080010010500105d070010190800100d0500104d0300101905001025050010310500103d050010490500105d0700100000000000000000bd0800100d080010010500100d000010190800100d0500104d0300101905001025050010310500103d050010490500102102001000000000000000005d07001000000000000000005d070010b9030010c503001000000000000000009d070010b5070010c1070010710400107d0400107d03001089030010cd07001095030010d907001089040010a1030010ad0300108d06001095040010fd050010a104001099060010ad040010b9040010c5040010e5070010d1040010dd040010e9040010f5040010f507001001080010ecffffff00000000e10800102906001035060010410600104d0600105d06001069060010c908001075060010ed08001081060010b8ffffff000000001d090010b4ffffff0000000029090010b9030010c5030010e4ffffff000000001109001005090010e8ffffff00000000f9080010d1030010dd03001003000000060000001b00000047000000ee020000f502000022030000230300002503000028030000b5040000b6040000d2040000e6040000f304000044050000480500000008000005080000520000005a0000006000000065000000bb000000ff000000000100002401000025010000120000002700000033000000b7000000e3000000e600000011000000140000001e0000001f00000028000000300000003100000033000000340000004000000041000000420000004300000044000000470000004a0000004b0000004c00000050000000510000005200000054000000560000006400000074000000790000007a0000007c0000008200000085000000860000008c0000008e0000008f00000092000000930000009500000096000000970000009b0000009d000000a1000000b3000000c6000000c8000000cc000000ce000000d5000000d6000000de000000e0000000e2000000fd000000080100002201000028010000020000000300000029030000380300007c0400008c0400000205000003050000e00500002e0600004b06000006000000080000007f050000d005000000000000ed02000068020000e00100000400000003000000060000001b00000047000000f50100000f000000ee020000f502000022030000230300002503000028030000b5040000b6040000d2040000e6040000f3040000440500004805000000080000050800000902000009000000520000005a0000006000000065000000bb000000ff0000000001000024010000250100001c02000006000000120000002700000033000000b7000000e3000000e6000000300200003800000011000000140000001e0000001f00000028000000300000003100000033000000340000004000000041000000420000004300000044000000470000004a0000004b0000004c00000050000000510000005200000054000000560000006400000074000000790000007a0000007c0000008200000085000000860000008c0000008e0000008f00000092000000930000009500000096000000970000009b0000009d000000a1000000b3000000c6000000c8000000cc000000ce000000d5000000d6000000de000000e0000000e2000000fd000000080100002201000028010000460200000b000000020000000300000029030000380300007c0400008c0400000205000003050000e00500002e0600004b0600005a0200000400000006000000080000007f050000d00500004150504152435b31303030336133645d2e444c4c0041564b4f4e5b31303030353663365d2e444c4c00434f4e455b31303030336134315d2e444c4c0045465352565b31303030333965345d2e444c4c0045494b434f52455b31303030343839325d2e444c4c0045555345525b31303030333965355d2e444c4c005045524c3539332e444c4c000000a40200004d01000000000000a402000014302830c430c830cc30d030d430d830dc30fc314432c432c832cc32d032d432d832dc32e032e432e8320c33543360336c337833843390339c33a833b433c033cc33d833e433f03300340c341834243430343c344834543460346c347834843490349c34a834b434c034cc34d834e434f034fc340835143520352c353835443550355c356835743580358c359835a435b035bc35c835d435e035ec35f83508361836243630363c3648365836643670367c3688369436a036ac36b836c836d436e036ec36f836043710371c372837343740374c3758376437703780378c379837a437b037bc37c837d437e037f037fc3708381438203830383c38483854388038843888388c3890389438443948394c395039543958395c396039643968396c397039743978397c398039843988398c399039943998399c39a039a439a839ac39b039b439b839083a0c3a103a143a183a1c3a203a243a283a2c3a303a343a383a3c3a403a443a483a4c3a503a543a583a5c3a603a643a683a6c3a703a743a783a843a883a8c3a903a943a983a9c3aa03aa43aa83aac3ab03ab43ab83abc3ac03ac43ac83acc3ad03ad43ad83adc3ae03ae43ae83aec3af03af43a003b043b083b0c3b103b143b183b1c3b203b243b283b2c3b303b3c3b403b443b483b4c3b503b543b583b5c3b603b643b683b6c3b703b743b783b7c3b803b843b883b8c3b983b9c3ba03ba43ba83bac3bb03bb43bb83bbc3bc03bc43bc83bd43bd83bdc3be03be43be83bec3bf03bf43bf83bfc3b003c043c103c1c3c203c243c303c343c383c3c3c403c443c483c4c3c503c543c583c5c3c603c643c683c6c3c703c743c783c7c3c803c843c883c8c3c903c943c983c9c3ca83cac3cb03cb43cb83cbc3cc03cc43cc83ccc3cd03cdc3ce83cec3cf03cfc3c003d0c3d103d143d0000
 __APP__
   }
 
@@ -354,7 +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.
+  # 'make sisify_hex' to create the perlrscmin.hex for this hexdump.
   if ($Variant eq 'S60') {
     $RSCHEX = <<__RSC__;
 6b4a1f10000000005fde04001ca360de01b80010000400000001f0e54d0000000004f0e54d00000000000000001a00cc0800000000010005f0e54d000000000000ffffffff0000000000000000000f0500000400000000000000000000050541626f7574170000ffffffff00000000010400000000000000000000040454696d65170000ffffffff00000000020400000000000000000000030352756e170000ffffffff0000000003040000000000000000000008084f6e656c696e6572170000ffffffff000000000404000000000000000000000909436f707972696768740e0000ffffffff00000000000000000120000000000000001400cc0801006816000100000000000100000000ffffffff00ffffffff0000000000000000ffff000000000000000120000000000000002400cc0801006816000100000000000100000000ffffffff00ffffffff0000000000000000ffff000000000000004122000000000000001400cc08010069160000050000000001000000000000000001000000040007000800ff020100ffffffff00000000000000000000ffff000000000000004122000000000000001400cc08010074160007000000000054160000ffffffff000000000000ffff00000000000000000000000015001d001d0035004d00ef0026015d01a301d201d701
@@ -366,10 +366,10 @@ __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.
+  # 'make sisify_hex' to create the perlappmin.hex for this hexdump.
   if ($Variant eq 'S80') {
       $APPHEX = <<__APP__;
-79000010ce390010f61520108581107645504f430020000000756022000000000100bb0080ac4d1223e2e00003000001a80e0000000000000010000000001000002000000000000001000000000000100000000007000000200f000001000000a00c00007c00000000000000240f0000ec110000000000005e01000000b500f0cff902bc0847000001480068704700009c0a001000b5011c024800f075fc01bc00470000bc0a001030b585b00490002100f0e6fa6846049900f0e8fa684600f013f9011c049c9e256d006019016004980022002300f0daf9a0256d0065190020286000f0dbf9012100f0def905b030bc01bc0047f0b5071c0e1c1b4878611b48b8611b4838609e2464003d192968002910d0786800f0c0fa2968002905d008688268081c032100f081f99e246400391900200860a02464003d192868002803d000f028fc00202860796a002905d008688268081c032100f069f9381c311c00f0a1faf0bc01bc0047580c00108c0c0010e00a001084b010b595b01790189119921a9301200021002200f046fc041c14a901a800f005fc002808d10090201c17a90222002300f03efc00f000fc00f004fc15b010bc08bc04b018470000f0b5474680b4324ca544071c8846022952d100f06ffa011c0a687ea8126a00f027f98026f6006e44301c00f025fa2949301c7eaa002300f025fac425ed006d44281c00f027fa244c6c440021224868440160201c042100f023fa301c00f026fa011c201c2a1c00f027fa002824d1301c00f01cfa011c8420000168448022520000f0c2fb8521090169446846fc22520000f0c0fb84200001684400680f49694409680f4a6a4412680e4b6b441b68fff783ff381c00f024fa00204446002c00d10120094b9d4408bc9846f0bc02bc0847b4f5ffffa00a0010480a000044080000480800004c0800004c0a000000b50120fff7f2fe01bc004700b5081cfff7f6ff01bc004710b5021c80204000814203d1101c00f0f5f905e09e24640010190068fff7eaff10bc01bc0047000010b500f007f8041c00f074fb201c10bc02bc084730b5051c2c2000f071fb041c002c03d000f092fb06482060201c00f06dfb201c291c00f007f8201c30bc02bc084700004c0b001030b5041c0d1c00f0bdf8201c291c00f0bff82068016a201c00f06ef830bc01bc0047000000b5034a026000f0b7f801bc004700004c0b001030b584b0041c00f0b3f8051c6846211c00f0b4f82868b8300268281c694600f051f804b030bc01bc0047000030b5051c242000f025fb041c002c04d0291c00f08ff903482060201c30bc02bc08470000c00b001010b5a220400000f011fb041c002c0cd000f082f9074860610748a06107482060201c3430802100f00dfb201c10bc02bc08470000580c00108c0c0010e00a001010b58b20800000f003fb041c002c03d000f068f902482060201c10bc02bc08471c0c0010002070470047704708477047104770471847704720477047284770473047704738477047404770474847704750477047584770476047704770477047014b1b681847c046a00c0010014b1b681847c046a80c0010014b1b681847c046ac0c0010014b1b681847c046a40c001040b4024e3668b44640bc6047b40c0010014b1b681847c046200d0010014b1b681847c046380d0010014b1b681847c046c40c0010014b1b681847c046180d0010014b1b681847c046280d0010014b1b681847c046240d0010014b1b681847c046000d0010014b1b681847c046f40c0010014b1b681847c046ec0c0010014b1b681847c046100d0010014b1b681847c0460c0d0010014b1b681847c046bc0c0010014b1b681847c046b00c0010014b1b681847c046fc0c0010014b1b681847c046340d0010014b1b681847c046140d0010014b1b681847c046f00c0010014b1b681847c046cc0c0010014b1b681847c046e40c0010014b1b681847c046d80c0010014b1b681847c046d40c0010014b1b681847c046c80c0010014b1b681847c0461c0d0010014b1b681847c046f80c0010014b1b681847c046c00c0010014b1b681847c046b80c0010014b1b681847c046040d0010014b1b681847c046e80c0010014b1b681847c046d00c0010014b1b681847c046dc0c0010014b1b681847c046080d0010014b1b681847c046e00c0010014b1b681847c0462c0d0010014b1b681847c046300d0010014b1b681847c046500d001040b4024e3668b44640bc6047480d0010014b1b681847c0464c0d0010014b1b681847c0463c0d0010014b1b681847c046440d0010014b1b681847c046400d0010014b1b681847c046640e0010014b1b681847c0467c0d0010014b1b681847c046f80d0010014b1b681847c046400e0010014b1b681847c0466c0d0010014b1b681847c0469c0d0010014b1b681847c046440e0010014b1b681847c0464c0e0010014b1b681847c046480e0010014b1b681847c046580e0010014b1b681847c046600e0010014b1b681847c046040e0010014b1b681847c0460c0e0010014b1b681847c046540e0010014b1b681847c046c40d0010014b1b681847c046a80d0010014b1b681847c046b80d0010014b1b681847c046f40d0010014b1b681847c046e00d0010014b1b681847c046880d001040b4024e3668b44640bc6047b00d0010014b1b681847c046bc0d0010014b1b681847c046340e0010014b1b681847c046100e0010014b1b681847c046140e0010014b1b681847c046e80d0010014b1b681847c046840d0010014b1b681847c046e40d0010014b1b681847c046d80d0010014b1b681847c046740d0010014b1b681847c046000e0010014b1b681847c046a40d0010014b1b681847c046700d0010014b1b681847c046180e0010014b1b681847c046d00d0010014b1b681847c0468c0d0010014b1b681847c046980d0010014b1b681847c046ec0d0010014b1b681847c046240e0010014b1b681847c0462c0e0010014b1b681847c0461c0e0010014b1b681847c046a00d0010014b1b681847c046cc0d0010014b1b681847c046c80d0010014b1b681847c046fc0d0010014b1b681847c046080e001040b4024e3668b44640bc6047dc0d0010014b1b681847c046300e0010014b1b681847c0465c0e001040b4024e3668b44640bc6047b40d0010014b1b681847c046f00d001040b4024e3668b44640bc6047c00d0010014b1b681847c046280e0010014b1b681847c046800d0010014b1b681847c046ac0d0010014b1b681847c046780d001040b4024e3668b44640bc6047200e0010014b1b681847c046940d0010014b1b681847c046900d0010014b1b681847c046d40d0010014b1b681847c046500e0010014b1b681847c0463c0e0010014b1b681847c046380e0010014b1b681847c046700e0010014b1b681847c046900e0010014b1b681847c046800e0010014b1b681847c046840e0010014b1b681847c046740e0010014b1b681847c046880e0010014b1b681847c046680e0010014b1b681847c046780e0010014b1b681847c0466c0e0010014b1b681847c0467c0e0010014b1b681847c0468c0e0010014b1b681847c046940e0010014b1b681847c046980e001040b4024e3668b44640bc60479c0e0010014b1b681847c046640d0010014b1b681847c046600d0010014b1b681847c0465c0d0010014b1b681847c046580d0010014b1b681847c046540d0010014b1b681847c046680d00107047000000b5fff77bff01bc0047000000b5fff76fff01bc0047000010b581b0039c14380094fff725ff01b010bc01bc0047000000b51438fff716ff01bc004700b51438fff71eff01bc004700b51838fff702ff02bc0847ffffffff00000000ffffffff000000009c0a0010bc0a0010580c00108c0c0010e00a0010a00a00104c0b00104c0b0010c00b0010580c00108c0c0010e00a00101c0c0010f81520100a000000640065006600610075006c0074002e0070006c00000000000e0000005000650072006c004100700070004d0069006e0069006d0061006c0000000000000000000000000079000010710600107d06001089060010950600106505001071050010a10600107d050010ad060010b906001089050010950500102d000010c50600104101001045020010d1060010dd060010e9060010f506001005070010110700101d070010290700100000000000000000d902001075040010810400108d04001099040010a5040010b1040010bd040010c9040010c5090010d5040010d1090010e1040010dd090010e9090010ed040010f904001005050010110500101d0500102905001035050010410500104d050010ed020010f5090010590500100000000000000000050a0010a1070010ad070010ed030010b9070010c5070010d1070010dd070010e9070010010a0010f507001001080010f9030010050400100d08001019080010250800104103001031080010410800104d0800100000000000000000110a001035070010410700100d0000104d07001059070010e103001065070010710700107d070010890700109507001019030010ecffffff00000000350a0010910800109d080010a9080010b5080010c5080010d10800101d0a0010dd080010410a0010e9080010e8ffffff000000004d0a0010a1050010ad05001003000000060000001b00000047000000030000000c0000001c0000001d0000002100000028000000420000004a0000005200000054000000550000005a0000006000000064000000650000008a0000008b0000008f0000009300000099000000a0000000b1000000bb000000c5000000c8000000d0000000d6000000dd000000df000000e2000000e8000000ff000000000100001401000015010000120000002700000033000000b7000000e3000000e6000000260100005601000065010000800200000a040000af04000011000000140000001e0000001f00000020000000300000003100000033000000340000004000000041000000420000004300000044000000470000004a0000004b0000004e0000005000000051000000520000005400000055000000560000006400000074000000790000007a0000007b0000007c0000007d0000007f0000008200000083000000860000008c0000008e0000008f0000009000000092000000930000009500000096000000970000009b0000009d000000a1000000b3000000c8000000cc000000ce000000d5000000d6000000d9000000db000000de000000e0000000e2000000e5000000fb000000fd000000fe0000002f010000020000000300000029030000380300003c0300005a0300007c0400008c0400000205000003050000e00500002e06000004000000780500000000000081030000c80200003c0200000400000003000000060000001b000000470000005102000023000000030000000c0000001c0000001d0000002100000028000000420000004a0000005200000054000000550000005a0000006000000064000000650000008a0000008b0000008f0000009300000099000000a0000000b1000000bb000000c5000000c8000000d0000000d6000000dd000000df000000e2000000e8000000ff0000000001000014010000150100006402000006000000120000002700000033000000b7000000e3000000e60000007802000006000000260100005601000065010000800200000a040000af0400008f0200003f00000011000000140000001e0000001f00000020000000300000003100000033000000340000004000000041000000420000004300000044000000470000004a0000004b0000004e0000005000000051000000520000005400000055000000560000006400000074000000790000007a0000007b0000007c0000007d0000007f0000008200000083000000860000008c0000008e0000008f0000009000000092000000930000009500000096000000970000009b0000009d000000a1000000b3000000c8000000cc000000ce000000d5000000d6000000d9000000db000000de000000e0000000e2000000e5000000fb000000fd000000fe0000002f010000a50200000c000000020000000300000029030000380300003c0300005a0300007c0400008c0400000205000003050000e00500002e060000b90200000200000004000000780500004150504152435b31303030336133645d2e444c4c00434f4e455b31303030336134315d2e444c4c0045465352565b31303030333965345d2e444c4c0045494b434f43544c5b31303030343839655d2e444c4c0045494b434f52455b31303030343839325d2e444c4c0045555345525b31303030333965355d2e444c4c005045524c3539332e444c4c0000000004020000fe000000000000000402000014302830ec30f030f4301432b032e8323c33743378337c33a033e833f43300340c341c342834343440344c345834643470347c3488349434a034ac34b834c434d034dc34e834f43400350c351835243530353c354835543560356c357835843590359c35a835b435c035d035dc35e835f43500360c361836243630363c364836543660366c367836843690369c36a836b436c036cc36d836e436f03600370c371837243730373c374837543760376c377837843790379c37a837b437c037cc37d837e437f037fc370838143820382c383c38483854386438703880388c389838a438b038c038cc38d838e438f038fc380839143920392c393839443950395c396839743980398c399839a439b439c039cc39d839e439f039fc39683a6c3a703a743a783a7c3a803a843a883a8c3a903a943a983ae83aec3af03af43af83afc3a003b043b083b0c3b103b143b183b1c3b203b243b283b2c3b303b343b383b3c3b403b443b483b543b583b5c3b603b643b683b6c3b703b743b783b7c3b803b843b883b8c3b903b943b983b9c3ba03ba43ba83bac3bb03bb43bb83bbc3bc83bcc3bd03bd43bd83bdc3be03be43be83bec3bf03bf43bf83bfc3b003c043c083c0c3c103c143c183c243c283c2c3c303c343c383c3c3c403c443c483c4c3c503c543c603c643c683c6c3c703c743c783c7c3c803c843c883c943c983c9c3c
+79000010ce390010f61520108581107645504f430020000087d7d3fc000000000100bb00804eab39abe2e00003000001f40b00000000000000100000000010000020000000000000010000000000001000000000060000006c0c000001000000740a00007c00000000000000700c0000900e0000000000005e01000000b500f047f902bc0847000001480068704700003408001000b5011c024800f03ffb01bc0047000054080010f0b5071c0e1c1e4878611e48b8611e4838609e2464003d192968002910d0786800f0a8f92968002905d008688268081c032100f01ff99e246400391900200860a02464003d192868002803d000f018fb00202860796a002905d008688268081c032100f007f9064878610648b86107483860381c311c00f083f9f0bc01bc00472c0a0010600a0010e80800107808001084b010b595b01790189119921a9301200021002200f028fb041c14a901a800f0edfa002808d10090201c17a90222002300f020fb00f0e8fa00f0ecfa15b010bc08bc04b018470000f0b5474680b4324ca544071c8846022952d100f04ff9011c0a687ea8126a00f0bdf88026f6006e44301c00f011f92949301c7eaa002300f011f9c425ed006d44281c00f013f9244c6c440021224868440160201c042100f00ff9301c00f012f9011c201c2a1c00f013f9002824d1301c00f008f9011c8420000168448022520000f0aafa8521090169446846fc22520000f0a8fa84200001684400680f49694409680f4a6a4412680e4b6b441b68fff783ff381c00f004f900204446002c00d10120094b9d4408bc9846f0bc02bc0847b4f5ffff38080010480a000044080000480800004c0800004c0a000000b50120fff710ff01bc004730b5051c242000f077fa041c002c04d0291c00f0dff803482060201c30bc02bc084700005809001070b5a220400000f063fa061c002e10d000f0d2f8094d7561094cb46109483060301c3430802100f059fa7561b46106483060301c70bc02bc084700002c0a0010600a001078080010e808001010b58b20800000f049fa041c002c03d000f0b2f802482060201c10bc02bc0847f0090010002070470047704708477047104770471847704720477047284770473047704738477047404770474847704750477047584770476047704770477047014b1b681847c046740a0010014b1b681847c0467c0a0010014b1b681847c046800a0010014b1b681847c046780a0010014b1b681847c046900a0010014b1b681847c046840a0010014b1b681847c046880a0010014b1b681847c046940a0010014b1b681847c0468c0a0010014b1b681847c046980a0010014b1b681847c0469c0a0010014b1b681847c046b40a001040b4024e3668b44640bc6047ac0a0010014b1b681847c046b00a0010014b1b681847c046a00a0010014b1b681847c046a80a0010014b1b681847c046a40a0010014b1b681847c046440b0010014b1b681847c0468c0b0010014b1b681847c046b80a0010014b1b681847c046e40a0010014b1b681847c046900b0010014b1b681847c046980b0010014b1b681847c046940b0010014b1b681847c046a40b0010014b1b681847c046ac0b0010014b1b681847c046500b0010014b1b681847c046580b0010014b1b681847c046a00b0010014b1b681847c0460c0b0010014b1b681847c046f00a0010014b1b681847c046000b0010014b1b681847c046400b0010014b1b681847c046280b0010014b1b681847c046d00a001040b4024e3668b44640bc6047f80a0010014b1b681847c046040b0010014b1b681847c046800b0010014b1b681847c0465c0b0010014b1b681847c046600b0010014b1b681847c046300b0010014b1b681847c046cc0a0010014b1b681847c0462c0b0010014b1b681847c046200b0010014b1b681847c046c00a0010014b1b681847c0464c0b0010014b1b681847c046ec0a0010014b1b681847c046bc0a0010014b1b681847c046640b0010014b1b681847c046180b0010014b1b681847c046d40a0010014b1b681847c046e00a0010014b1b681847c046340b0010014b1b681847c046700b0010014b1b681847c046780b0010014b1b681847c046680b0010014b1b681847c046e80a0010014b1b681847c046140b0010014b1b681847c046100b0010014b1b681847c046480b0010014b1b681847c046540b001040b4024e3668b44640bc6047240b0010014b1b681847c0467c0b0010014b1b681847c046a80b001040b4024e3668b44640bc60473c0b001040b4024e3668b44640bc6047fc0a0010014b1b681847c046380b001040b4024e3668b44640bc6047080b0010014b1b681847c046740b0010014b1b681847c046c80a0010014b1b681847c046f40a0010014b1b681847c046c40a001040b4024e3668b44640bc60476c0b0010014b1b681847c046dc0a0010014b1b681847c046d80a0010014b1b681847c0461c0b0010014b1b681847c0469c0b0010014b1b681847c046880b0010014b1b681847c046840b0010014b1b681847c046b80b0010014b1b681847c046d00b0010014b1b681847c046c00b0010014b1b681847c046c40b0010014b1b681847c046bc0b0010014b1b681847c046c80b0010014b1b681847c046b00b0010014b1b681847c046b40b0010014b1b681847c046cc0b0010014b1b681847c046d40b0010014b1b681847c046d80b0010014b1b681847c046e00b001040b4024e3668b44640bc6047e40b0010014b1b681847c046e80b0010014b1b681847c046dc0b00107047000000b5054a4261054a8261054a0260fff71ffe01bc004700002c0a0010600a00107808001000b5fff787ff01bc0047000000b5fff77bff01bc0047000000b5fff775ff01bc0047000010b581b0039c14380094fff72bff01b010bc01bc0047000000b51438fff71cff01bc004700b51438fff724ff01bc004700b51838fff708ff02bc0847ffffffff00000000ffffffff0000000034080010540800102c0a0010600a001078080010e808001038080010580900102c0a0010600a001078080010e8080010b4090010f00900102c0a0010600a001078080010f81520100a000000640065006600610075006c0074002e0070006c00000000000e0000005000650072006c004100700070004d0069006e0069006d0061006c000000000000000000000000005d070010f5030010010400100d04001019040010010300100d0300102504001019030010310400103d04001025030010310300104107001049040010dd0500104d07001055040010610400106d040010790400108904001095040010a1040010ad0400101907001000000000000000002d000010f5030010010400100d04001019040010010300100d0300102504001019030010310400103d04001025030010310300104107001049040010050100104d07001055040010610400106d040010790400108904001095040010a1040010ad040010f10100100000000000000000810700102505001031050010dd0200103d0500104905001055050010610500106d050010590700107905001085050010e9020010f5020010910500109d050010a905001025020010b5050010c5050010d105001000000000000000008d070010b9040010c504001019070010d1040010dd040010d1020010e9040010f5040010010500100d0500101905001019070010000000000000000099070010b9040010c50400100d000010d1040010dd040010d1020010e9040010f5040010010500100d05001019050010fd010010ecffffff00000000bd07001025060010310600103d060010490600105906001065060010a507001071060010c90700107d060010e8ffffff00000000d50700103d0300104903001003000000060000001b00000047000000520000005a0000006000000065000000bb000000ff00000000010000120000002700000033000000b7000000e3000000e600000011000000140000001e0000001f000000300000003100000033000000340000004000000041000000420000004300000044000000470000004a0000004b0000004e0000005000000051000000520000005400000055000000560000006400000074000000790000007a0000007b0000007c0000007d0000007f000000820000008300000085000000860000008c0000008e0000008f0000009000000092000000930000009500000096000000970000009b0000009d000000a1000000b3000000c8000000cc000000ce000000d5000000d6000000d9000000db000000de000000e0000000e2000000e5000000fb000000fd000000fe000000020000000300000029030000380300007c0400008c0400000205000003050000e00500002e0600004b060000060000000900000080050000d1050000000000007102000020020000ac0100000400000003000000060000001b00000047000000c101000007000000520000005a0000006000000065000000bb000000ff00000000010000d401000006000000120000002700000033000000b7000000e3000000e6000000e80100003e00000011000000140000001e0000001f000000300000003100000033000000340000004000000041000000420000004300000044000000470000004a0000004b0000004e0000005000000051000000520000005400000055000000560000006400000074000000790000007a0000007b0000007c0000007d0000007f000000820000008300000085000000860000008c0000008e0000008f0000009000000092000000930000009500000096000000970000009b0000009d000000a1000000b3000000c8000000cc000000ce000000d5000000d6000000d9000000db000000de000000e0000000e2000000e5000000fb000000fd000000fe000000fe0100000b000000020000000300000029030000380300007c0400008c0400000205000003050000e00500002e0600004b0600001202000004000000060000000900000080050000d10500004150504152435b31303030336133645d2e444c4c00434f4e455b31303030336134315d2e444c4c0045465352565b31303030333965345d2e444c4c0045494b434f52455b31303030343839325d2e444c4c0045555345525b31303030333965355d2e444c4c005045524c3539332e444c4c000000e8010000f000000000000000e801000014302830ac30b030b430b830d83120326032643268326c329032d832e432f032fc320833143320332c333833443350335c336c337833843390339c33a833b433c033cc33d833e433f033fc330834143420342c343834443450345c3468347434843490349c34a834b434c034cc34d834e434f034fc340835143520352c353835443550355c356835743580358c359835a435b035c035cc35d835e835f8350436143620362c3638364436543660366c367836843690369c36a836b436c036cc36d836e436f036fc360837143720372c373c3748375437743778377c37f037f437f837fc370038043808380c381038143818381c382038243828382c3830388038843888388c389038943898389c38a038a438a838ac38b038b438b838bc38c038c438c838cc38d038d438d838dc38e038e438f038f438f838fc380039043908390c391039143918391c392039243928392c393039343938393c394039443948394c39503954396039643968396c397039743978397c398039843988398c399039943998399c39a039a439a839ac39b039bc39c039c439c839cc39d039d439d839dc39e039e439e839ec39f839fc39003a043a083a0c3a103a143a183a1c3a203a243a283a343a383a3c3a403a443a483a4c3a503a543a583a5c3a683a6c3a703a
 __APP__
   }
 
@@ -378,10 +378,10 @@ __APP__
   # 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.
+  # 'make sisify_hex' to create the perlrscmin.hex for this hexdump.
   if ($Variant eq 'S80') {
     $RSCHEX = <<__RSC__;
-6b4a1f10000000005fde04001ca360de01b800780400000001f0e54d0000000005f0e54d000000000000000004f0e54d000000000010010000005000000000000400000204030352756e0900ffffffff00030408084f6e656c696e65720900ffffffff000504050541626f75740900ffffffff0000010404457869740500ffffffff0007010006f0e54d07074f7074696f6e73110000000000ffffffff0000000000000000000f0500000400000000000000000000050541626f7574170000ffffffff00000000010400000000000000000000040454696d65170000ffffffff00000000020400000000000000000000030352756e170000ffffffff0000000003040000000000000000000008084f6e656c696e6572170000ffffffff000000000404000000000000000000000909436f707972696768740e0000ffffffff00000000000000000003010005055469746c65110000000064b0f3000000000001000200060650726f6d70740f06040000000000000a00010080000014001c001c0034008200a50047017b01
+6b4a1f10000000005fde04001ca360de01b800780400000001f0e54d0000000005f0e54d000000000000000004f0e54d000000000010010000005000000000000400000204030352756e0900ffffffff00030408084f6e656c696e65720900ffffffff000504050541626f75740900ffffffff0000010404457869740500ffffffff0007010006f0e54d07074f7074696f6e73110000000000ffffffff0000000000000000000f0500000400000000000000000000050541626f7574170000ffffffff00000000010400000000000000000000040454696d65170000ffffffff00000000020400000000000000000000030352756e170000ffffffff0000000003040000000000000000000008084f6e656c696e6572170000ffffffff000000000404000000000000000000000909436f707972696768740e0000ffffffff00000000000000000003010005055469746c65110000000064b0f3000000000001000200060650726f6d70740f00080000000000000a00010080000014001c001c0034008200a50047017b01
 __RSC__
   }
 
@@ -390,22 +390,22 @@ __RSC__
   # by compiling the PerlApp.cpp with PerlMinSample defined in PerlApp.h.
   # The following executable has been compiled using the UIQ SDK 2.1
   # for CodeWarrior.
-  # Use symbian\hexdump.pl to create the perlappmin.hex for this hexdump.
+  # 'make sisify_hex' to create the perlappmin.hex for this hexdump.
   if ($Variant eq 'UIQ') {
       $APPHEX = <<__APP__;
-79000010ce390010f61520108581107645504f43002000001c2ae529000000000100af00c0f9bef022e2e00003000000ac2e000000000000001000000000100000200000000000000100000000000010000000000c000000242f000001000000442b00007c00000000000000282f0000e0330000000000005e01000000b501f0cbfb02bc0847000001480068704700009c26001000b5011c024801f039fe01bc00470000bc26001030b585b00490002102f016f86846049901f048fd684601f0f7fa011c049ca4256d006019016004980022002301f0e4fba6256d0065190020286001f0e5fb012101f0e8fb05b030bc01bc0047f0b5071c0e1c1b4878611b48b8611b483860a42464003d192968002910d0786801f020fd2968002905d008688268081c032101f07dfba4246400391900200860a62464003d192868002803d001f0ecfd00202860796a002905d008688268081c032101f065fb381c311c01f0c5fff0bc01bc0047fc2a0010302b00109c28001000b5682001f0d6fd002801d001f0d6fe054901f0d9fe00220221c84200d10122101c02bc0847000007f0e54d00b5682001f0c0fd002801d001f0c0fe054901f0c3fe00220221c84200d10122101c02bc0847000009f0e54d10b5041c01f06efb211c01f0c5fc10bc01bc004710b5041c01f064fb211c01f0c1fc012010bc02bc0847000030b5041c0d1c01f097fe0b48e0620b4820630b4860630b48a0630b482060a566201c6c3001f08afd201c743001f086fd201c30bc02bc0847742800108028001060280010d82a00103c2a001010b5041c054901f07dfe01f057fea16e0860012010bc02bc084700000604000010b5041c211c6c3101f072fe0549201c01f074fe7434211c01f046fe10bc01bc0047000006040000f0b5474680b481b0051c0e1c90461f1c00200090802001f041fd041c002c03d06946fff7a3ff041c201c6c30002802d0291c01f03ffd201c7430002802d0311c01f038fde7670449201c01f031fe002804d1002007e0000006f0e54d0099404601f02efd012001b008bc9846f0bc02bc084700000020704784b030b50390049105920693204903a801f020fd041c0025002c06d103a8002101f01efd00885c282bd0022c2ad103a8002101f015fd0088402806d903a8002101f00efd00885a280dd903a8002101f007fd0088602815d903a8002101f000fd00887a280ed803a8012101f0f9fc00883a2807d103a8022101f0f2fc00885c2800d10125281c30bc08bc04b0184700002428001084b030b50390049105920693204903a801f0d6fc041c0025002c06d103a8002101f0d4fc00885c282bd0022c2ad103a8002101f0cbfc0088402806d903a8002101f0c4fc00885a280dd903a8002101f0bdfc0088602815d903a8002101f0b6fc00887a280ed803a8012101f0affc00883a2807d103a8022101f0a8fc00885c2800d10125281c30bc08bc04b0184700000428001030b584b001f02efb009001916d4602ac0849201c01f096fc281c211c01f098fc0021002800d10121081c04b030bc02bc084700007423001030b584b001f012fb009001916d4602ac0849201c01f07afc281c211c01f07cfc0021002800d10121081c04b030bc02bc0847000080230010f0b52c4ca54486ab18600f1c151c012668468021490001f069fc82ac2649201c01f058fc6846211c2a1c01f065fc6846fff752fe002855d084ac2049201c01f049fc6846211c2a1c01f056fc6846fff743fe002846d086a8291c01f0bff900280fd087ac1649201c01f034fc6846211c2a1c01f041fc6846fff72efe002800d10026002e2ed086a8391c2a1c012301f0abf9061c002e17d189ac0a49201c01f019fc6846211c2a1c01f026fc6846fff73ffe17e0ccfdffff8c230010f823001018240010382400108bac0949201c01f001fc6846211c321c2b1c01f00dfc6846fff730fe8d239b009d44f0bc01bc00475424001084b0f0b557464e464546e0b484b00c900d910e920f934ea800684e904fa80068814601f0f7fb4c466468a0460c980001070900264e9c0294484601f0ebfbbc4200dbc1e10ca8029901f0eafb007820281cd00ca8029901f0e3fb0078092815d00ca8029901f0dcfb00780a280ed00ca8029901f0d5fb00780d2807d00ca8029901f0cefb00780c2800d09de1029cbc4200db99e10ca8211c01f0c2fb007820281bd00ca8029901f0bbfb0078092814d00ca8029901f0b4fb00780a280dd00ca8029901f0adfb00780d2806d00ca8029901f0a6fb00780c2803d1029c01340294d4e7029cbc4200db6ee10ca8211c01f097fb0078402806d90ca8029901f090fb00785a280fd90ca8029901f089fb0078602800d858e10ca8029901f081fb00787a2800d950e1029cbc4200db04e10ca8211c01f075fb0078402806d90ca8029901f06efb00785a2823d90ca8029901f067fb0078602806d90ca8029901f060fb00787a2815d90ca8029901f059fb00782f2806d90ca8029901f052fb0078392807d90ca8029901f04bfb00785f2800d0d2e0029cbc4243da0ca8211c01f040fb0078402806d90ca8029901f039fb00785a2822d90ca8029901f032fb0078602806d90ca8029901f02bfb00787a2814d90ca8029901f024fb00782f2806d90ca8029901f01dfb0078392806d90ca8029901f016fb00785f2812d1464510da311c0136484601f0e6fa039002990c1c013402940ca801f004fb0078039c2080b8e7029c0134a246ba4500db7ce70ca8029901f0f6fa00783a2800d074e70ca8514601f0eefa00783a2800d06ce7464500db69e7311c0136484601f0bcfa5c210180029c02340294bc4266da0ca8211c01f0d7fa0078402806d90ca8029901f0d0fa00785a280fd90ca8029901f0c9fa0078602800d847e70ca8029901f0c1fa00787a2800d93fe7029cbc4245da0ca8211c01f0b6fa0078402806d90ca8029901f0affa00785a2823d90ca8029901f0a8fa0078602806d90ca8029901f0a1fa00787a2815d90ca8029901f09afa00782f2806d90ca8029901f093fa0078392807d90ca8029901f08cfa00785f2800d00ae7464500db07e7311c0136484601f05afa039002990c1c013402940ca801f078fa0078039c2080b6e7029cbc4244da0ca8211c01f06dfa007820281bd00ca8029901f066fa0078092814d00ca8029901f05ffa00780a280dd00ca8029901f058fa00780d2806d00ca8029901f051fa00780c2803d1029c01340294d5e7029cbc421ada0ca8211c01f043fa00783b2813d1f01c404510da4846311c01f03ffa6c460449201c01f014fa4846211c01f03cfa012002e074230010002004b038bc9846a146aa46f0bc08bc04b0184783b0f0b54f464646c0b44d4ca544071c8824e4006c4421604a4c6c4422608924e4006c442360a920c000684406688225ed006d448424e4006c4425604249206801f012fa8820c00068448424e4006c44216801f00ffa814601204c46c44200d1a1e040a88021490001f0d8f9c224a4006c44a0468422520040468821c900694401f0fef9484607303e9040ac3f94c6a96846f82201f0f4f944462068c3a90968c4aa1268c5ab1b68fff7bcfd00287ad040468021490001f0e9f9301c01f038f88322d2006a44106051608321c9006944404601f0e1f91d49404601f0e3f9381c01f0aaf9216809010909409800010009013009187868814251da0026b146c224a4006c44a046444620680001000981451eda311c0136381c01f06ef98424e4006c442060c2a8494601f08cf900788424e4006c44256828800124a144e3e70000dcfbffff44040000a024001038280010311c0136381c01f04ff95c2101800024a146409800010009814515da311c0136381c01f041f98424e4006c44206040a8494601f039f900888424e4006c44256828800124a144e4e7381c311c01e0381c002101f055f9044b9d4418bc9846a146f0bc08bc03b018472404000084b070b586b00a900b910c920d9300260aa8022101f06ef9009001916d4602ac0e49201c01f042f9281c211c01f068f900280cd104ac0a49201c01f037f90aa8211c01f039f90121c84200d00126301c06b070bc08bc04b018470000b0240010b424001081b0f0b54f464646c0b4644ca54480460e1ccd24e4006c442260d124e4006c442360f220c0006844076840a88021490001f0e4f8301c00f06bffcb22d2006a4410605160cd24e4006c44206800f066ffcc22d2006a4410605160ca25ed006d44cd24e4006c4425604d49206801f0baf84c4bcd24e4006c442568cb22d2006a44cc20c0006844009040a8216801f0bcf80024a146c225ad006d44cd24e4006c442560206840a900f03fffcd24e4006c442068fff711fc00281ad1caac84225200201cd121c900694401f0caf8cea96846f82201f0c5f82068cba90968ccaa1268cdab1b68fff75aff002801d10124a1464c46200600284ad040a8002101f098f8c2ac201c40a900f00fff201cfff7c8fb00283cd08623db006b4423485861321c01ca1860214c6c44a446032101246442a14601ca64460434a446043c206001394945f6d11a485861311c18318920c00068448222920001f083f8c2ac84225200201cd121c900694401f07af88620c00068443f90c5a96846fc2201f071f82168c3a80268c4a8036840a8fff729fe4098000100280ed1002012e0000094f9ffffc4240010242800101829001034040000ec2a0010381c414640aafff7a9fb0120044b9d4418bc9846a146f0bc08bc01b0184700006c06000083b0f0b5474680b4354ca544051ceb24e4006c442160334c6c442260ec24e4006c44236000260027822292007ea8291c01f02af882a96846fc22520001f024f87e987f99809a819bfff7aafa002838d08024e4006c44a0464046291c00f078fe4046fff74dfb00282ad14046291c00f06ffe4046fff728fb061c002e20d18424e4006c4484225200201ceb21c900694400f0faff8621c90069446846f82200f0f3ff20681049694409688522d2006a4412680e4b6b441b68fff784fe002800d00127380600284dd07ea88021490000f0a9ff002e0ed0e624e4006c4404490de0c0f8ffff5c070000240400002c040000e4240010e724e4006c441749201c00f085ff7ea8211c2a1c00f092ff7ea8fff795f900281dd0a524e4006c4482229200201c291c00f0b0ffa721c90069446846fc22520000f0a8ff2068084969440968a622d2006a441268054b6b441b6800f0c5f9012007e00000102500102c050000340500000020e823db009d4408bc9846f0bc08bc03b01847f0b5474680b4244ca54480460f1c7ea800f0e8fd8320c000684400f0e3fdc720c00068448021490000f040ff7ea8391c0022002300f0dcfd381c002100f024ff0088402806d9381c002100f01dff00885a280dd9381c002100f016ff008860281cd9381c002100f00fff00887a2815d8381c012100f008ff00883a280ed1381c022100f001ff00885c2807d18320c0006844391c14e0000048eeffff842424016c4400f097fc806900f0fafd011c0a68201c126a00f048fc8320c0006844211c0022002300f094fda6256d0045442868002803d100f07efc1c302860574d6d4400215648684401606960a620400040440168281c3a1c002300f082fd061c002e00d0fde08420000168448021490000f005ff842109016944281c00f079fd061c281c00f07bfd002e00d0dde0444c6c4482229200201c391c00f0eafe414969446846fc22520000f0e3fe20683e4969440968a52212016a4412683c4b6b441b68fff7acf9002800d184e0c52212016a448320c00068443649516100681060354e6e440321344b6b4401256d4201cb01c60139a942fad131485061314868448621c90069448222920000f0b2fee7231b016b447ea9264858617e981860294d6d440322fe2464006c44a4460126764264460434a446043c206801c5013ab242f6d11e4858611831204868448222920000f08ffec5252d016d44e72636016e44842109016944194c6c4484225200201c00f07ffea620400040440068006841901449694468468222520000f072fe2368381c291c321cfff73cfd37e0000098110000480a0000580a00004c0a0000540a000018290010540c00001c040000ec2a0010680c0000740e0000880e00009010000094100000842109016944c52424016c4484225200201c00f043fe134969446846fc2200f03dfe2168104868440268104868440368381cfff7effd0021002800d101210806002835d0c724e4006c448d256d016d440749281c00f0e4fd201c291c3a1c00f0f1fd22e05c0c0000540c0000580c000028250010c724e4006c44024d6d4402490ae00000a811000050250010c724e4006c440f4d6d440f49281c00f0c1fd201c291c321c3b1c00f0cdfd201cfef7f0ff4446606a00280fd000f052fb816900290dd008688268081c032100f003fb06e0b011000078250010404600f0adfc034b9d4408bc9846f0bc01bc0047b811000084b030b51d4ca5449c909d919e929f9301200021002200f03dfe041c96a901a800f0e8fd002808d10090201c9ca90222002300f035fe00f0e3fd96a80068002813d014a88021490000f07efd14ad97ac0b49201c00f06cfd96a80268281c211c00f078fd281cfef77bff00f0cffd99239b009d4430bc08bc04b018479cfdffffb425001010b5094ca544041c68468022520000f0c1fd201c6946fff7fffd82239b009d4410bc01bc00470000f8fdfffff0b5474680b4324ca544071c8846022952d100f03bfc011c0a687ea8126a00f089fa8026f6006e44301c00f0d1fb2949301c7eaa002300f0d1fbc425ed006d44281c00f0e7fb244c6c440021224868440160201c042100f0e3fb301c00f0e6fb011c201c2a1c00f0e7fb002824d1301c00f0dcfb011c8420000168448022520000f072fd8521090169446846fc22520000f034fd84200001684400680f49694409680f4a6a4412680e4b6b441b68fff74fff381c00f0f0fb00204446002c00d10120094b9d4408bc9846f0bc02bc0847b4f5ffffa0260010480a000044080000480800004c0800004c0a000010b5a62464000019016010bc01bc0047f0b50b4ca5440b4c6c4420607ea88021490000f0c3fc074c6c442468064d6019052800d92ae180000449401800688746c8f7ffff3408000000fcffffb0130010c8130010f813001024140010a8140010601500107415001009490a4b032000900020019002220292039004930592012006907ea80522092300f096fcbce00000dc260010d026001001200021002200f02bfd8022d2006a44131c054970c970c30321002300f02efd00f0dafce9e00000082600101a4868448021490000f06efc174f6f44174c6c441749201c00f05afc381c211c00f044fc381cfef71bff002800d1cee0114c6c4482229200201c391c00f086fc0e4969446846fc22520000f07ffc2068c321c90069440968094a6a441268c423db006b441b68fff79bfeb0e00c0400001c0800001426001014060000240600001c06000000f0c4f98569254c6c442549201c00f01dfc24492f1c4037201c3a1c8023fef7a3fe002800d190e08020c0006844c021490000f04ffc8025ed006d44281c391c00f096f901200021002200f0b1fc061c0c2000f0c5fb041c00f072fc124a6a44124911486844016054600f4868444168006800f06bfc0e4820600e486060281c00f06cfca060301c0321221c002300f09dfc022000f068fc57e00000240800002c2600101c2600102c0800007d1c0010b4240010d025001003497ea800f0d8fb7ea8fef7f1fd40e05c2700108020c00068448021490000f0c5fbc120c00068448021490000f0befb1249134b8024e4006c4403200090002001900222029203900493059201200690201c0522092300f0affb201cfef7c8fd084800f02bfcc124e4006c440649201c00f0a2fb201cfef7bbfd0ae0dc260010d026001040420f005c2700100120fef713fd024b9d44f0bc01bc00473808000000b5081cfff7b4fe01bc004710b5021c80204000814203d1101c00f077fa05e0a424640010190068fff7eaff10bc01bc0047000010b500f007f8041c00f0f4fb201c10bc02bc084730b5051c282000f02dfb041c002c03d000f0f8f806482060201c00f0e7fb201c291c00f007f8201c30bc02bc084700002829001030b5041c0d1c00f0e9f8201c291c00f0ebf82068016a201c00f086f830bc01bc0047000000b5034a026000f0e3f801bc004700002829001030b584b0041c00f0dff8051c6846211c00f0e0f82868b8300268281c694600f069f804b030bc01bc0047000030b5051c242000f0e1fa041c002c04d0291c00f011fa03482060201c30bc02bc084700009c29001010b5a820400000f0cdfa041c002c0cd000f0b0fc074860610748a06107482060201c4030802100f0edfa201c10bc02bc08470000fc2a0010302b00109c280010f0b50d1c171c1c1c00f070f88669301c211cfff701fe002d05d03068026d301c391c00f01df80020f0bc02bc0847000010b58c20800000f05ffb041c002c03d000f07efc02482060201c10bc02bc0847f8290010002070470047704708477047104770471847704720477047284770473047704738477047404770474847704750477047584770476047704770477047014b1b681847c046482b0010014b1b681847c0464c2b0010014b1b681847c046442b0010014b1b681847c046542b001040b4024e3668b44640bc6047502b0010014b1b681847c046582b001040b4024e3668b44640bc6047602b0010014b1b681847c046dc2b0010014b1b681847c046fc2b0010014b1b681847c046e82b0010014b1b681847c046702b0010014b1b681847c046d42b0010014b1b681847c046e42b0010014b1b681847c046e02b0010014b1b681847c046b42b0010014b1b681847c046a02b0010014b1b681847c046cc2b0010014b1b681847c046c82b0010014b1b681847c0465c2b0010014b1b681847c046b02b0010014b1b681847c046f82b0010014b1b681847c046d02b0010014b1b681847c046882b0010014b1b681847c046842b0010014b1b681847c046742b0010014b1b681847c046ac2b0010014b1b681847c046a82b0010014b1b681847c046682b0010014b1b681847c046c42b0010014b1b681847c046902b0010014b1b681847c046a42b0010014b1b681847c0468c2b0010014b1b681847c046782b0010014b1b681847c0467c2b0010014b1b681847c046982b0010014b1b681847c046d82b0010014b1b681847c0466c2b0010014b1b681847c046642b0010014b1b681847c046b82b0010014b1b681847c046bc2b0010014b1b681847c0469c2b0010014b1b681847c046802b0010014b1b681847c046942b0010014b1b681847c046ec2b0010014b1b681847c046c02b0010014b1b681847c046f02b0010014b1b681847c046f42b0010014b1b681847c046102c0010014b1b681847c046082c0010014b1b681847c046182c0010014b1b681847c046302c0010014b1b681847c046382c001040b4024e3668b44640bc60472c2c001040b4024e3668b44640bc6047242c0010014b1b681847c046282c0010014b1b681847c046002c0010014b1b681847c046342c0010014b1b681847c046042c0010014b1b681847c046142c0010014b1b681847c0460c2c0010014b1b681847c046202c0010014b1b681847c0461c2c0010014b1b681847c046582c0010014b1b681847c046a02c0010014b1b681847c0468c2c0010014b1b681847c0464c2c0010014b1b681847c046502c0010014b1b681847c046742c0010014b1b681847c046cc2c0010014b1b681847c046802c0010014b1b681847c046602c0010014b1b681847c046c42c0010014b1b681847c046942c0010014b1b681847c046642c0010014b1b681847c046702c0010014b1b681847c0469c2c0010014b1b681847c046b42c0010014b1b681847c046bc2c0010014b1b681847c046ac2c0010014b1b681847c046782c0010014b1b681847c046902c0010014b1b681847c046882c0010014b1b681847c046a42c0010014b1b681847c046a82c0010014b1b681847c046c02c0010014b1b681847c046d42c001040b4024e3668b44640bc6047842c0010014b1b681847c046b82c0010014b1b681847c0465c2c0010014b1b681847c0467c2c0010014b1b681847c046542c001040b4024e3668b44640bc6047b02c0010014b1b681847c0466c2c0010014b1b681847c046682c0010014b1b681847c046982c0010014b1b681847c046d02c0010014b1b681847c046c82c0010014b1b681847c0466c2d0010014b1b681847c046682d0010014b1b681847c046b02d0010014b1b681847c046f82d0010014b1b681847c046742d0010014b1b681847c046e82d0010014b1b681847c046f02d0010014b1b681847c046982d0010014b1b681847c0469c2d0010014b1b681847c046882d0010014b1b681847c046ec2d0010014b1b681847c0468c2d0010014b1b681847c046e02d001040b4024e3668b44640bc6047a42d0010014b1b681847c046d02d0010014b1b681847c046842d0010014b1b681847c046cc2d0010014b1b681847c046802d0010014b1b681847c046e42d0010014b1b681847c046a02d0010014b1b681847c046702d0010014b1b681847c046f42d0010014b1b681847c046942d0010014b1b681847c0467c2d0010014b1b681847c046ac2d0010014b1b681847c046902d0010014b1b681847c046d42d0010014b1b681847c046d82d0010014b1b681847c046b42d0010014b1b681847c046dc2d0010014b1b681847c046a82d001040b4024e3668b44640bc6047c42d0010014b1b681847c046c02d0010014b1b681847c046b82d0010014b1b681847c046782d0010014b1b681847c046bc2d0010014b1b681847c046c82d0010014b1b681847c046fc2d0010014b1b681847c046002e0010014b1b681847c046042e001040b4024e3668b44640bc60470c2e001040b4024e3668b44640bc6047082e0010014b1b681847c0463c2c0010014b1b681847c046482c0010014b1b681847c046442c0010014b1b681847c046402c0010014b1b681847c046582d0010014b1b681847c046f42c0010014b1b681847c046e42c0010014b1b681847c0464c2d0010014b1b681847c046e02c0010014b1b681847c0465c2d0010014b1b681847c046602d0010014b1b681847c0461c2d0010014b1b681847c046dc2c0010014b1b681847c046182d0010014b1b681847c0460c2d0010014b1b681847c046f82c0010014b1b681847c046fc2c0010014b1b681847c046102d0010014b1b681847c046502d0010014b1b681847c046e82c0010014b1b681847c046d82c0010014b1b681847c046f02c0010014b1b681847c046342d0010014b1b681847c046382d0010014b1b681847c046302d0010014b1b681847c046242d0010014b1b681847c046442d0010014b1b681847c046042d0010014b1b681847c046082d0010014b1b681847c046482d0010014b1b681847c0463c2d0010014b1b681847c046402d0010014b1b681847c046002d0010014b1b681847c046282d0010014b1b681847c0462c2d0010014b1b681847c046202d0010014b1b681847c046142d0010014b1b681847c046ec2c0010014b1b681847c046642d0010014b1b681847c046542d0010014b1b681847c046a02e0010014b1b681847c046682e0010014b1b681847c046102e0010014b1b681847c046202e0010014b1b681847c046442e0010014b1b681847c046502e0010014b1b681847c046582e0010014b1b681847c0465c2e0010014b1b681847c046342e0010014b1b681847c046242e0010014b1b681847c046402e0010014b1b681847c0462c2e0010014b1b681847c0464c2e0010014b1b681847c046482e001040b4024e3668b44640bc60473c2e0010014b1b681847c046382e0010014b1b681847c046602e0010014b1b681847c046642e0010014b1b681847c046302e0010014b1b681847c046142e0010014b1b681847c046182e0010014b1b681847c0461c2e0010014b1b681847c046902e0010014b1b681847c046802e0010014b1b681847c0468c2e0010014b1b681847c046882e0010014b1b681847c0466c2e0010014b1b681847c0467c2e0010014b1b681847c046942e0010014b1b681847c046842e0010014b1b681847c046702e0010014b1b681847c046982e0010014b1b681847c046742e0010014b1b681847c046782e0010014b1b681847c046542e001040b4024e3668b44640bc6047282e0010014b1b681847c0469c2e00107047000000b5fff71ffd01bc0047000000b5fff7efff01bc0047000000b5074ac262074a0263074a4263074a8263074a0260fff7fdfe01bc00470000742800108028001060280010d82a00103c2a001010b581b0039c14380094fff7b5fc01b010bc01bc0047000000b51438fff7b4ff01bc004700b51438fff7aefc01bc004700b51838fff7aeff02bc084700b52c38fff7a4fe01bc004710b5041c3039fff7bbfe201c10bc02bc0847000000b53038fff7acfe01bc004700b53038fff7a0fe01bc004700b53038fff794fe01bc004700b53038fff7a6fe01bc004700b53438fff782fe01bc004700b53838fff7f2fd02bc084700b53838fff7e6fd02bc084700b53838fff78aff01bc0047ffffffff00000000ffffffff000000009c260010bc260010fc2a0010302b00109c280010742800108028001060280010d82a00103c2a001024280010042800102e0070006d000000742300102e0070006c0000008023001025005300200069007300200075006e0074007200750073007400650064002e00200049006e007300740061006c006c0020006f006e006c007900200069006600200079006f0075002000740072007500730074002000700072006f00760069006400650072002e000000000049006e007300740061006c006c002000610073002000250053003f00000000005200650070006c0061006300650020006f006c0064002000250053003f00000049006e007300740061006c006c0065006400200025005300000000004600610069006c00750072006500200025006400200069006e007300740061006c006c0069006e006700200025005300000000008c230010f8230010182400103824001054240010742300107061636b61676500a024001038280010232100007065726c00000000b0240010b424001025005300250053002500530000000000c42400102428001018290010ec2a00105200650061006c006c0079002000720075006e0020006d006f00640075006c0065002000250053003f000000520075006e002000250053003f000000e4240010102500104600610069006c0065006400200066006f0072002000660069006c006500200025005300000000004500720072006f0072002000250064002000720065006100640069006e00670020002500530000004500720072006f00720020002500640020006f00700065006e0069006e006700200025005300000018290010ec2a00102825001050250010782500104500720072006f00720020002500640000000000b4250010a02600102d6c65007072696e74202752756e6e696e6720696e20272c20245e4f2c20225c6e222c207363616c6172206c6f63616c74696d6500000000b4240010d0250010d425001043003a005c0000000500000043006f00640065003a0000004f006e0065006c0069006e006500720000000000dc260010d026001008260010142600102c2600101c2600107d1c0010b4240010d02500105c270010b013001028290010282900109c290010fc2a0010302b00109c280010f8290010742800108028001060280010d82a00103c2a0010f61520100a000000640065006600610075006c0074002e0070006c0000000000070000005000650072006c0041007000700000000300000055004900510000003c0000005000650072006c002000250064002e00250064002e00250064002c002000530079006d006200690061006e00200070006f00720074002000250064002e00250064002e00250064002c0020006200750069006c007400200066006f0072002000250053002000530044004b002000250064002e0025006400000000005100000043006f007000790072006900670068007400200031003900380037002d00320030003000350020004c0061007200720079002000570061006c006c00200061006e00640020006f00740068006500720073002c002000530079006d006200690061006e00200070006f0072007400200043006f00700079007200690067006800740020004e006f006b0069006100200032003000300034002d00320030003000350000000d0000005c00530079007300740065006d005c004d00610069006c005c000000060000005c005000650072006c005c0000000000200000005c73797374656d5c6c6962735c7065726c5c736974657065726c5c352e392e3300000000ccffffff00000000e5190010f119001005230010d4ffffff00000000b5220010d0ffffff00000000ed220010e1220010d5220010c1220010f922001000000000000000007900001095200010a1200010ad200010b9200010c1190010cd190010c5200010d1200010dd200010e9200010f5200010d91900102d000010251b0010751200100d1600100121001049120010311b00100d2100101d2100103d1b00102921001035210010412100104d210010592100106521001000000000000000004d1e00104d1e00100000000000000000a11600101919001095180010a1180010ad18001025190010b9180010c5180010d118001031190010dd1800103d1900104919001055190010611900106d19001079190010e9180010f518001001190010851900100d190010911900109d190010b5160010a9190010b519001000000000000000002d220010491b0010551b0010d9170010611b00106d1b0010791b0010851b0010911b0010292200109d1b0010a91b0010e5170010f1170010b51b0010c11b0010cd1b00100917001049170010d91b0010e51b0010000000000000000039220010712100107d2100100d0000108921001095210010a1210010ad210010b9210010c5210010d1210010dd210010e1160010e9210010f5210010000000000000000045220010091f001095180010a1180010ad180010151f0010b9180010c5180010d11800109d1e0010dd180010a91e0010211f00102d1f0010391f0010451f0010511f0010e9180010f5180010011900105d1f00100d190010691f0010751f0010811f00108d1f0010991f0010c9010010a51f0010e9010010b11f0010bd1f0010c91f0010d51f0010e11f0010ed1f0010f91f0010c8ffffff00000000292300101d230010112300100000000000000000b91a0010c51a0010ecffffff00000000912200100d1c0010191c0010251c0010311c0010411c00104d1c001079220010591c00109d220010651c0010e8ffffff00000000a9220010fd190010091a0010060000001b00000047000000110000002900000004000000030000000c0000001c0000001d000000210000002800000042000000480000004a000000520000005400000055000000570000005f0000006000000064000000650000008a0000008b0000008f0000009300000099000000a0000000ad000000b1000000b5000000b9000000c5000000c8000000d0000000d6000000dd000000df000000e2000000e8000000ec000000f4000000ff0000000001000014010000150100000f00000012000000250000002700000029000000330000005c0000005e000000610000007900000088000000b7000000d2000000e3000000e60000002e01000065010000800200004d03000009000000110000001f0000002000000030000000330000003400000040000000410000004200000043000000440000004b0000005100000054000000560000005c000000640000007400000079000000820000008c0000008e000000920000009b0000009d000000a1000000b3000000c8000000cc000000ce000000d5000000db000000e2000000fd0000000a0000000e0000001400000017000000180000001b00000022000000250000002b0000002e0000002f000000310000003200000035000000390000003f000000470000004c0000004f00000050000000530000005500000056000000580000005b0000005e0000005f000000730000007c00000081000000860000008f000000930000009500000096000000970000000300000006000000020000000300000015000000570000005b0000006200000063000000c9000000cd000000f7000000fb000000ae010000c1010000d301000074020000770200002903000038030000390300003c03000053030000590300005a030000e7030000ea0300007c0400008c0400000205000003050000690500007e0500007f0500008105000097050000e00500002e0600004b060000040000004600000078050000010000000d0000000e0000000f00000010000000750000007a0000008600000087000000900000009d000000a6000000b2000000b3000000bd000000d4000000e3000000e4000000020100001701000021010000220100008d0100009c0100009d0100009e0100009f010000a0010000a1010000a2010000a3010000a4010000a5010000a6010000a7010000a8010000ad0100000000000079170000b8040000c403000003000000060000001b00000047000000d9030000020000001100000029000000ec03000001000000040000000304000029000000030000000c0000001c0000001d000000210000002800000042000000480000004a000000520000005400000055000000570000005f0000006000000064000000650000008a0000008b0000008f0000009300000099000000a0000000ad000000b1000000b5000000b9000000c5000000c8000000d0000000d6000000dd000000df000000e2000000e8000000ec000000f4000000ff000000000100001401000015010000160400000f0000000f00000012000000250000002700000029000000330000005c0000005e000000610000007900000088000000b7000000d2000000e3000000e60000002a040000040000002e01000065010000800200004d030000410400002300000009000000110000001f0000002000000030000000330000003400000040000000410000004200000043000000440000004b0000005100000054000000560000005c000000640000007400000079000000820000008c0000008e000000920000009b0000009d000000a1000000b3000000c8000000cc000000ce000000d5000000db000000e2000000fd00000057040000240000000a0000000e0000001400000017000000180000001b00000022000000250000002b0000002e0000002f000000310000003200000035000000390000003f000000470000004c0000004f00000050000000530000005500000056000000580000005b0000005e0000005f000000730000007c00000081000000860000008f000000930000009500000096000000970000006c0400000200000003000000060000008104000025000000020000000300000015000000570000005b0000006200000063000000c9000000cd000000f7000000fb000000ae010000c1010000d301000074020000770200002903000038030000390300003c03000053030000590300005a030000e7030000ea0300007c0400008c0400000205000003050000690500007e0500007f0500008105000097050000e00500002e0600004b0600009504000003000000040000004600000078050000a104000025000000010000000d0000000e0000000f00000010000000750000007a0000008600000087000000900000009d000000a6000000b2000000b3000000bd000000d4000000e3000000e4000000020100001701000021010000220100008d0100009c0100009d0100009e0100009f010000a0010000a1010000a2010000a3010000a4010000a5010000a6010000a7010000a8010000ad0100004150504152435b31303030336133645d2e444c4c004241464c5b31303030336130665d2e444c4c0043484152434f4e565b31303030336231315d2e444c4c00434f4e455b31303030336134315d2e444c4c0045465352565b31303030333965345d2e444c4c0045494b434f43544c5b31303030343839655d2e444c4c0045494b434f52455b31303030343839325d2e444c4c0045494b444c475b31303030343839385d2e444c4c004553544c49425b31303030336230625d2e444c4c0045555345525b31303030333965355d2e444c4c005045524c3539332e444c4c0051494b43544c5b31303030356663395d2e444c4c00000010040000fb010000000000004400000014302830ec30f030f430b431b831bc31c031c4311833ac33e4331c34d834dc34e034e4341035d838383a3c3a083b0c3bb03cb43cb83cc03cd83d403e00100000a0010000b030bc3044315c31a83144324833ac33b033b433b833bc33c033c433f033f4332034983448354c35543558355c357035dc35e035e8357836b03604373c37403744379837e037ec37f83704381438203830383c384838543860386c387838843890389c38a838b438c038cc38d838e438f038fc380839143920392c393839443950395c396839743980398c399839a439b039bc39c839d439e039ec39f839043a103a1c3a283a343a403a4c3a5c3a6c3a783a843a903a9c3aa83ab43ac03acc3ad83ae43af03afc3a083b143b203b2c3b383b443b503b5c3b683b743b803b8c3b983ba43bb03bbc3bc83bd43be03bec3bfc3b083c143c203c2c3c3c3c483c543c603c6c3c783c843c903c9c3ca83cb43cc03ccc3cd83ce43cf03cfc3c083d143d243d303d3c3d483d543d603d6c3d783d843d903d9c3da83db43dc03dcc3dd83de43df03d003e0c3e183e243e303e3c3e483e543e603e703e803e8c3e983ea43eb03ebc3ec83ed43ee03eec3ef83e043f103f1c3f283f343f403f4c3f583f643f703f7c3f883f943fa03fac3fb83fc43fd03fdc3fe83ff43f002000002c02000000300c301830243030303c304830543060306c307830843090309c30a830b430c030cc30d830e430f030fc3008311831243130313c314831543160316c317831843190319c31a831b431c031cc31d831e431f031fc31083218322432643268326c3270327432443348334c335033543358335c336033643368336c3370337c33883388348c349034943498349c34a834ac34bc34c034d434d834dc34e03420352435a035a435a835ac35b035c835cc3508360c3610364036443648364c365036543658365c366036643668366c367036743678367c368036843688368c3690369436983668386c3870387c3888388c38903894389838a438a838ac38b038b438b838bc38c038c438c838cc38d038d438d838dc38e038e438e838ec38f038f438f838fc380039043908390c3910391439203924393039343938393c394039443948394c395039543958395c396039643968396c397039743978397c398039843988398c39903994399839a439a839ac39b039b439b839bc39c039c439c839cc39d039d439d839dc39e039e439e839ec39f039f439003a043a083a0c3a103a143a183a1c3a203a243a283a2c3a303a343a383a443a483a4c3a503a543a583a5c3a603a643a683a6c3a703a743a783a7c3a803a843a883a8c3a903a943a983a9c3aa03aa43aa83aac3ab03ab43ab83abc3ac03ac43ac83acc3ad03ad43ae03ae43ae83af43af83a043b083b0c3b103b143b183b1c3b203b243b283b2c3b383b3c3b403b0000
+79000010ce390010f61520108581107645504f4300200000c26d4733000000000100af004056bb93abe2e00003000000840c0000000000000010000000001000002000000000000001000000000000100000000007000000fc0c000001000000ec0a00007c00000000000000000d0000540f0000000000005e01000000b500f047f902bc0847000001480068704700007c08001000b5011c024800f087fa01bc004700009c080010f0b5071c0e1c1e4878611e48b8611e483860a42464003d192968002910d0786800f096f92968002905d008688268081c032100f01ff9a4246400391900200860a62464003d192868002803d000f060fa00202860796a002905d008688268081c032100f007f9064878610648b86107483860381c311c00f0a1faf0bc01bc0047a40a0010d80a001040090010c008001084b010b595b01790189119921a9301200021002200f070fa041c14a901a800f035fa002808d10090201c17a90222002300f068fa00f030fa00f034fa15b010bc08bc04b018470000f0b5474680b4324ca544071c8846022952d100f037f9011c0a687ea8126a00f0bdf88026f6006e44301c00f0fff82949301c7eaa002300f0fff8c425ed006d44281c00f001f9244c6c440021224868440160201c042100f0fdf8301c00f000f9011c201c2a1c00f001f9002824d1301c00f0f6f8011c8420000168448022520000f0f2f98521090169446846fc22520000f0f0f984200001684400680f49694409680f4a6a4412680e4b6b441b68fff783ff381c00f0ecf800204446002c00d10120094b9d4408bc9846f0bc02bc0847b4f5ffff80080010480a000044080000480800004c0800004c0a000000b50120fff710ff01bc004730b5051c242000f0bff9041c002c04d0291c00f0c7f803482060201c30bc02bc08470000c009001070b5a820400000f0abf9061c002e10d000f0def9094d7561094cb46109483060301c4030802100f0a1f97561b46106483060301c70bc02bc08470000a40a0010d80a0010c00800104009001010b58c20800000f091f9041c002c03d000f0bef902482060201c10bc02bc0847600a0010002070470047704708477047104770471847704720477047284770473047704738477047404770474847704750477047584770476047704770477047014b1b681847c046f00a0010014b1b681847c046f40a0010014b1b681847c046ec0a0010014b1b681847c046000b0010014b1b681847c046f80a0010014b1b681847c046fc0a0010014b1b681847c046040b0010014b1b681847c046080b0010014b1b681847c046200b001040b4024e3668b44640bc6047180b0010014b1b681847c0461c0b0010014b1b681847c0460c0b0010014b1b681847c046140b0010014b1b681847c046100b0010014b1b681847c046780b0010014b1b681847c046240b0010014b1b681847c046440b0010014b1b681847c046a40b0010014b1b681847c046500b0010014b1b681847c0466c0b0010014b1b681847c046300b0010014b1b681847c0469c0b0010014b1b681847c046600b0010014b1b681847c046340b0010014b1b681847c046400b0010014b1b681847c046700b0010014b1b681847c0468c0b0010014b1b681847c046940b0010014b1b681847c046840b0010014b1b681847c046480b0010014b1b681847c0465c0b0010014b1b681847c046580b0010014b1b681847c0467c0b0010014b1b681847c046800b001040b4024e3668b44640bc6047680b0010014b1b681847c046980b0010014b1b681847c046ac0b001040b4024e3668b44640bc6047740b001040b4024e3668b44640bc6047540b0010014b1b681847c046900b0010014b1b681847c0462c0b0010014b1b681847c0464c0b0010014b1b681847c046280b001040b4024e3668b44640bc6047880b0010014b1b681847c0463c0b0010014b1b681847c046380b0010014b1b681847c046640b0010014b1b681847c046a80b0010014b1b681847c046a00b0010014b1b681847c046b80b0010014b1b681847c046d00b0010014b1b681847c046c00b0010014b1b681847c046c40b0010014b1b681847c046bc0b0010014b1b681847c046c80b0010014b1b681847c046b00b0010014b1b681847c046b40b0010014b1b681847c046cc0b0010014b1b681847c046d40b0010014b1b681847c046d80b0010014b1b681847c046e00b001040b4024e3668b44640bc6047e40b0010014b1b681847c046e80b0010014b1b681847c046dc0b0010014b1b681847c046440c0010014b1b681847c046ec0b0010014b1b681847c046fc0b0010014b1b681847c046200c0010014b1b681847c0462c0c0010014b1b681847c046340c0010014b1b681847c046380c0010014b1b681847c046100c0010014b1b681847c046000c0010014b1b681847c0461c0c0010014b1b681847c046080c0010014b1b681847c046280c0010014b1b681847c046240c001040b4024e3668b44640bc6047180c0010014b1b681847c046140c0010014b1b681847c0463c0c0010014b1b681847c046400c0010014b1b681847c0460c0c0010014b1b681847c046f00b0010014b1b681847c046f40b0010014b1b681847c046f80b0010014b1b681847c0466c0c0010014b1b681847c0465c0c0010014b1b681847c046680c0010014b1b681847c046640c0010014b1b681847c046480c0010014b1b681847c046580c0010014b1b681847c046700c0010014b1b681847c046600c0010014b1b681847c0464c0c0010014b1b681847c046740c0010014b1b681847c046500c0010014b1b681847c046540c0010014b1b681847c046300c001040b4024e3668b44640bc6047040c0010014b1b681847c046780c00107047000000b5054a4261054a8261054a0260fff719ff01bc00470000a40a0010d80a0010c008001000b5fff7abfe01bc0047000000b5fff7ddff01bc0047000000b5fff7d7ff01bc0047000010b581b0039c14380094fff755fe01b010bc01bc0047000000b51438fff7b6ff01bc004700b51438fff74efe01bc004700b51838fff7b0ff02bc0847ffffffff00000000ffffffff000000007c0800109c080010a40a0010d80a0010c00800104009001080080010c0090010a40a0010d80a0010c0080010400900101c0a0010600a0010a40a0010d80a0010c0080010f81520100a000000640065006600610075006c0074002e0070006c00000000000e0000005000650072006c004100700070004d0069006e0069006d0061006c00000000000000000000000000a50700100d060010190600102506001031060010f5020010010300103d0600104906001055060010610600106d0600100d030010d1050010ad03001095040010dd05001079060010b9030010c50300108506001095060010d1030010a1060010ad060010b9060010c5060010d1060010dd060010a905001000000000000000002d0000100d060010190600102506001031060010f5020010010300103d0600104906001055060010610600106d0600100d030010d1050010ad03001005010010dd05001079060010b9030010c50300108506001095060010d1030010a1060010ad060010b9060010c5060010d1060010dd060010f10100100000000000000000c9070010dd030010e9030010d1020010f5030010010400100d0400101904001025040010a1070010310400103d040010dd020010e9020010490400105504001061040010250200106d0400107d040010890400100000000000000000d5070010e9060010f5060010a9050010010700100d0700101907001025070010310700103d0700104907001055070010a9050010610700106d0700100000000000000000e1070010e9060010f50600100d000010010700100d0700101907001025070010310700103d0700104907001055070010fd010010610700106d070010ecffffff0000000005080010c1040010cd040010d9040010e5040010f504001001050010ed0700100d0500101108001019050010e8ffffff000000001d0800101903001025030010060000001b00000047000000520000006000000065000000ff00000000010000120000002700000033000000b7000000e3000000e6000000110000001f00000030000000330000003400000040000000410000004200000043000000440000004b0000005100000054000000560000006400000074000000790000007b0000007c00000082000000850000008c0000008e000000920000009b0000009d000000a1000000b3000000c8000000cc000000ce000000d5000000db000000e2000000fd000000020000000300000029030000380300007c0400008c0400000205000003050000e00500002e0600004b060000060000000900000080050000d1050000010000000d0000000e0000000f00000010000000750000007a0000008600000087000000900000009d000000a6000000b2000000b3000000bd000000d4000000e3000000e4000000020100001701000021010000220100008d0100009c0100009d0100009e0100009f010000a0010000a1010000a2010000a3010000a4010000a5010000a6010000a7010000a8010000000000007102000054020000cc01000003000000060000001b00000047000000e101000005000000520000006000000065000000ff00000000010000f401000006000000120000002700000033000000b7000000e3000000e60000000802000023000000110000001f00000030000000330000003400000040000000410000004200000043000000440000004b0000005100000054000000560000006400000074000000790000007b0000007c00000082000000850000008c0000008e000000920000009b0000009d000000a1000000b3000000c8000000cc000000ce000000d5000000db000000e2000000fd0000001e0200000b000000020000000300000029030000380300007c0400008c0400000205000003050000e00500002e0600004b0600003202000004000000060000000900000080050000d10500003e02000024000000010000000d0000000e0000000f00000010000000750000007a0000008600000087000000900000009d000000a6000000b2000000b3000000bd000000d4000000e3000000e4000000020100001701000021010000220100008d0100009c0100009d0100009e0100009f010000a0010000a1010000a2010000a3010000a4010000a5010000a6010000a7010000a80100004150504152435b31303030336133645d2e444c4c00434f4e455b31303030336134315d2e444c4c0045465352565b31303030333965345d2e444c4c0045494b434f52455b31303030343839325d2e444c4c0045555345525b31303030333965355d2e444c4c005045524c3539332e444c4c0051494b43544c5b31303030356663395d2e444c4c00000c02000002010000000000000c02000014302830ac30b030b430b830d83120326032643268326c329032d832e432f032fc320833143320332c3338334833543360336c337833843390339c33a833b433c033cc33d833e433f033fc330834143420342c343834443450345c346834783484349034a034b034bc34c834d434e034f034fc340835143520352c353835443550355c356835743580358c359835a435b035bc35cc35d835e435f035fc350836143620362c363836443650365c3668367436803690369c36a836b436c036cc36d836e436f036fc360837143720372c373837443750375c3768377437803790379c37bc37c037c43738383c384038443848384c385038543858385c386038643868386c38703874387838c838cc38d038d438d838dc38e038e438e838ec38f038f438f838fc380039043908390c391039143918391c392039243928392c393039343938393c3948394c395039543958395c396039643968396c397039743978397c398039843988398c399039943998399c39a039a439a839ac39b039b439b839bc39c839cc39d039d439d839dc39e039e439e839ec39f039f439f839fc39003a043a083a0c3a103a143a183a243a283a2c3a303a343a383a3c3a403a443a483a4c3a503a543a583a5c3a683a6c3a703a743a783a7c3a803a843a883a8c3a903a943a983a9c3aa03aac3ab03ab43ab83abc3ac03ac43ac83acc3ad03ad43ae03ae43ae83a
 __APP__
   }
 
   # This is Symbian application resource skeleton.
   # You can create the ...\epoc32\data\z\system\apps\PerlApp\PerlApp.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.
+  # The following resource has been compiled using the UIQ 2.1 SDK
+  # for CodeWarrior.
+  # 'make sisify_hex' to create the perlrscmin.hex for this hexdump.
   if ($Variant eq 'UIQ') {
     $RSCHEX = <<__RSC__;
-6b4a1f10000000005fde04001ca360de01b800f8030400000001f0e54d0000000004f0e54d04f0e54d0000000000000000000000000007010005f0e54d07074f7074696f6e73110000000000ffffffff0000000000000000000f0500000400000000000000000000050541626f7574170000ffffffff00000000010400000000000000000000040454696d65170000ffffffff00000000020400000000000000000000030352756e170000ffffffff0000000003040000000000000000000008084f6e656c696e6572170000ffffffff000000000404000000000000000000000909436f707972696768740e0000ffffffff000000000000000000050100000005055469746c6511460014000000000064b0f30001000200060650726f6d707411060400000000000000000a0001008000000005000000000d0d4f4b202f2043616e63656c203f0e460014000000000008f0e54d00000015010000000200feff00000000000000000000000002024f6b1a00ffffffff000000000101ffff000000000000000000000000060643616e63656c0b00ffffffff0000000001010005000000000a0a596573202f204e6f203f0e46001400000000000af0e54d00000015010000000200feff00000000000000000000000003035965732900ffffffff000000000101ffff000000000000000000000000024e006f0000ffffffff00000000010115001d001d0035005800fa00320156019e01bf010402
+6b4a1f10000000005fde04001ca360de019a00f8030400000001f0e54d0000000004f0e54d04f0e54d0000000000000000000000000007010005f0e54d07074f7074696f6e73110000000000ffffffff0000000000000000000f0400000400000000000000000000050541626f7574170000ffffffff00000000010400000000000000000000040454696d65170000ffffffff0000000003040000000000000000000008084f6e656c696e6572170000ffffffff000000000404000000000000000000000909436f707972696768740e0000ffffffff000000000000000000050100000005055469746c6511460014000000000064b0f30001000200060650726f6d707411000800000000000000000a0001008000000005000000000d0d4f4b202f2043616e63656c203f0e460014000000000008f0e54d00000015010000000200feff00000000000000000000000002024f6b1a00ffffffff000000000101ffff000000000000000000000000060643616e63656c0b00ffffffff0000000001010005000000000a0a596573202f204e6f203f0e46001400000000000af0e54d00000015010000000200feff00000000000000000000000003035965732900ffffffff000000000101ffff000000000000000000000000024e006f0000ffffffff00000000010115001d001d0035005800de0016013a018201a301e801
 __RSC__
   }
 }
index 2a51f3a..d289fb4 100644 (file)
@@ -43,29 +43,30 @@ extern char*  strncpy(char *dst, const char *src, size_t n);
 
 #if defined(SYMBIAN_DLL_CPP) || defined(SYMBIAN_UTILS_CPP) || defined(PERLBASE_CPP) || defined(PERLUTIL_CPP)
 #  define PERL_SYMBIAN_START_EXTERN_C extern "C" {
-#  define PERL_SYMBIAN_EXPORT_C       EXPORT_C
+#  define PERL_SYMBIAN_IMPORT_C       IMPORT_C /* Declarations have IMPORT_C, definitions have EXPORT_C. */
 #  define PERL_SYMBIAN_END_EXTERN_C   }
 #else
 #  define PERL_SYMBIAN_START_EXTERN_C
-#  define PERL_SYMBIAN_EXPORT_C
+#  define PERL_SYMBIAN_IMPORT_C
 #  define PERL_SYMBIAN_END_EXTERN_C
 #endif
 
 PERL_SYMBIAN_START_EXTERN_C
-PERL_SYMBIAN_EXPORT_C int   symbian_sys_init(int *argcp, char ***argvp);
-PERL_SYMBIAN_EXPORT_C void* symbian_get_vars(void);
-PERL_SYMBIAN_EXPORT_C void  symbian_set_vars(const void *);
-PERL_SYMBIAN_EXPORT_C void  symbian_unset_vars(void);
-PERL_SYMBIAN_EXPORT_C SSize_t symbian_read_stdin(const int fd, char *b, int n);
-PERL_SYMBIAN_EXPORT_C SSize_t symbian_write_stdout(const int fd, const char *b, int n);
-PERL_SYMBIAN_EXPORT_C char* symbian_get_error_string(const int error);
-PERL_SYMBIAN_EXPORT_C void symbian_sleep_usec(const long usec);
-PERL_SYMBIAN_EXPORT_C int symbian_get_cpu_time(long* sec, long* usec);
-PERL_SYMBIAN_EXPORT_C clock_t symbian_times(struct tms* buf);
-PERL_SYMBIAN_EXPORT_C int symbian_usleep(unsigned int usec);
-PERL_SYMBIAN_EXPORT_C int symbian_do_aspawn(void* vreally, void *vmark, void* sp);
-PERL_SYMBIAN_EXPORT_C int symbian_do_spawn(const char* command);
-PERL_SYMBIAN_EXPORT_C int symbian_do_spawn_nowait(const char* command);
+PERL_SYMBIAN_IMPORT_C int   symbian_sys_init(int *argcp, char ***argvp);
+PERL_SYMBIAN_IMPORT_C void  init_os_extras(void);
+PERL_SYMBIAN_IMPORT_C void* symbian_get_vars(void);
+PERL_SYMBIAN_IMPORT_C void  symbian_set_vars(const void *);
+PERL_SYMBIAN_IMPORT_C void  symbian_unset_vars(void);
+PERL_SYMBIAN_IMPORT_C SSize_t symbian_read_stdin(const int fd, char *b, int n);
+PERL_SYMBIAN_IMPORT_C SSize_t symbian_write_stdout(const int fd, const char *b, int n);
+PERL_SYMBIAN_IMPORT_C char* symbian_get_error_string(const int error);
+PERL_SYMBIAN_IMPORT_C void symbian_sleep_usec(const long usec);
+PERL_SYMBIAN_IMPORT_C int symbian_get_cpu_time(long* sec, long* usec);
+PERL_SYMBIAN_IMPORT_C clock_t symbian_times(struct tms* buf);
+PERL_SYMBIAN_IMPORT_C int symbian_usleep(unsigned int usec);
+PERL_SYMBIAN_IMPORT_C int symbian_do_aspawn(void* vreally, void *vmark, void* sp);
+PERL_SYMBIAN_IMPORT_C int symbian_do_spawn(const char* command);
+PERL_SYMBIAN_IMPORT_C int symbian_do_spawn_nowait(const char* command);
 PERL_SYMBIAN_END_EXTERN_C
 
 #endif /* !SYMBIAN_PROTO_H */
index 4fb13ac..b3eee0b 100644 (file)
@@ -9,14 +9,21 @@
 #define SYMBIAN_UTILS_CPP
 #include <e32base.h>
 #include <e32std.h>
-// #include <textresolver.h> // textresolver not used since seems not to work
 #include <utf.h>
 #include <hal.h>
 
+#include <eikenv.h>
+
 #include <string.h>
 #include <ctype.h>
 
+#include "PerlUi.h"
 #include "PerlBase.h"
+#include "PerlUtil.h"
+
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
 
 extern "C" {
     EXPORT_C int symbian_sys_init(int *argcp, char ***argvp)
@@ -27,6 +34,43 @@ extern "C" {
         (void)times(&PL_timesbase);
         return 0;
     }
+    XS(XS_PerlApp_TextQuery) // Can't be made static because of XS().
+    {
+        dXSARGS;
+       if (items != 0)
+           Perl_croak(aTHX_ "PerlApp::TextQuery: no arguments, please");
+       SP -= items;
+       // TODO: parse arguments for title, prompt, and maxsize.
+       // Suggested syntax:
+       // TextQuery(title => ..., prompt => ..., maxsize => ...)
+       // For an example see e.g. universal.c:XS_PerlIO_get_layers().
+       _LIT(KTitle,  "Title");
+       _LIT(KPrompt, "Prompt");
+        HBufC* cData = HBufC::New(KPerlUiOneLinerSize);
+       TBool cSuccess = EFalse;
+       if (cData) {
+           TPtr cPtr(cData->Des());
+           if (CPerlUi::TextQueryDialogL(KTitle,
+                                         KPrompt,
+                                         cPtr,
+                                         KPerlUiOneLinerSize)) {
+               ST(0) = sv_2mortal(PerlUtil::newSvPVfromTDesC16(*cData));
+               cSuccess = ETrue;
+           }
+           delete cData;
+       }
+       if (cSuccess)
+           XSRETURN(1);
+       else
+           XSRETURN_UNDEF;
+    }
+    EXPORT_C void init_os_extras(void)
+    {
+        dTHX;
+       char *file = __FILE__;
+       dXSUB_SYS;
+       newXS("PerlApp::TextQuery", XS_PerlApp_TextQuery, file);
+    }
     EXPORT_C SSize_t symbian_read_stdin(const int fd, char *b, int n)
     {
 #ifdef PERL_GLOBAL_STRUCT /* Avoid unused variable warning. */
@@ -185,10 +229,10 @@ extern "C" {
             return tmsbuf->tms_utime;
         }
     }
-    class CE32ProcessWait : public CActive
+    class CProcessWait : public CActive
     {
     public:
-        CE32ProcessWait() : CActive(EPriorityStandard) {
+        CProcessWait() : CActive(EPriorityStandard) {
           CActiveScheduler::Add(this);
         }
 #ifdef __WINS__
@@ -208,7 +252,6 @@ extern "C" {
       void RunL() {
           CActiveScheduler::Stop();
       }
-      CActiveSchedulerWait iWait;
     };
     class CSpawnIoRedirect : public CBase
     {
@@ -262,7 +305,7 @@ extern "C" {
 #endif
         if (error == KErrNone) {
             if ((TInt)aFlag & (TInt)ESpawnWait) {
-              CE32ProcessWait* w = new CE32ProcessWait();
+              CProcessWait* w = new CProcessWait();
               if (w) {
                   error = w->Wait(proc);
                   delete w;
index 4f06e0a..a3f795f 100644 (file)
@@ -143,7 +143,7 @@ pid_t wait(int *status);
 
 #undef PERL_EXPORT_C
 #define PERL_EXPORT_C EXPORT_C /* for perlio.h */
-#define PERL_CALLCONV EXPORT_C /* for prototype.h */
+#define PERL_CALLCONV EXPORT_C /* for proto.h */
 #undef PERL_XS_EXPORT_C
 #define PERL_XS_EXPORT_C EXPORT_C
 
index adde60e..b98b4af 100644 (file)
@@ -35,8 +35,9 @@ my $Sis;
 sub usage {
     die <<__EOF__;
 $0: Usage: $0 [--symbian=version] [--perl=version]
-              [--csuffix=csuffix] [--cplusplus]
-             [--win=win] [--arm=arm]
+              [--extversion=x.y]
+              [--csuffix=csuffix] [--cplusplus|--cpp]
+              [--win=win] [--arm=arm]
               [--config|--build|--clean|--distclean|--sis] ext
 __EOF__
 }
@@ -73,19 +74,22 @@ if ($CoreBuild) {
     $PerlVersion    = $R_V_SV;
 }
 
+my %CONF;
+
 usage()
   unless GetOptions(
-    'symbian=s' => \$SymbianVersion,
-    'perl=s'    => \$PerlVersion,
-    'csuffix=s' => \$CSuffix,
-    'cplusplus' => \$CPlusPlus,
-    'win=s'     => \$WIN,
-    'arm=s'     => \$ARM,
-    'config'    => \$Config,
-    'build'     => \$Build,
-    'clean'     => \$Clean,
-    'distclean' => \$DistClean,
-    'sis'       => \$Sis
+    'symbian=s'     => \$SymbianVersion,
+    'perl=s'        => \$PerlVersion,
+    'extversion=s'  => \$CONF{EXTVERSION},
+    'csuffix=s'     => \$CSuffix,
+    'cplusplus|cpp' => \$CPlusPlus,
+    'win=s'         => \$WIN,
+    'arm=s'         => \$ARM,
+    'config'        => \$Config,
+    'build'         => \$Build,
+    'clean'         => \$Clean,
+    'distclean'     => \$DistClean,
+    'sis'           => \$Sis
   );
 
 usage() unless @ARGV;
@@ -128,7 +132,6 @@ if (exists $ENV{UREL}) {
     $SRCDBG = $UARM eq 'udeb' ? "SRCDBG" : "";
 }
 
-my %CONF;
 my %EXTCFG;
 
 sub write_bld_inf {
@@ -689,7 +692,7 @@ sub update_cwd {
 for my $ext (@ARGV) {
 
     $ext =~ s!::!\\!g;
-    my $extdash = "ext\\$ext"; $extdash =~ s!\\!-!g;
+    my $extdash = $ext =~ /ext\\/ ? $ext : "ext\\$ext"; $extdash =~ s!\\!-!g;
     $ext =~ s!/!\\!g;
 
     my $cfg;