2008-01-24 Marcus Brinkmann <marcus@g10code.de>
authorMarcus Brinkmann <mb@g10code.com>
Wed, 23 Jan 2008 23:40:08 +0000 (23:40 +0000)
committerMarcus Brinkmann <mb@g10code.com>
Wed, 23 Jan 2008 23:40:08 +0000 (23:40 +0000)
* src/Memento.nsh: New file from nsis 2.28.

ChangeLog
src/Memento.nsh [new file with mode: 0644]

index 5e94c74..41395a1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2008-01-24  Marcus Brinkmann  <marcus@g10code.de>
+
+       * src/Memento.nsh: New file from nsis 2.28.
+
 2008-01-21  Marcus Brinkmann  <marcus@g10code.de>
 
        * src/installer.nsi: Include Memento.nsh, define
diff --git a/src/Memento.nsh b/src/Memento.nsh
new file mode 100644 (file)
index 0000000..b4f9108
--- /dev/null
@@ -0,0 +1,526 @@
+/* FIXME: Taken from nsis 2.28.  Remove when bumping version requirement.  */\r
+\r
+!verbose push\r
+!verbose 3\r
+\r
+!include LogicLib.nsh\r
+!include Sections.nsh\r
+\r
+!ifndef ___MEMENTO_NSH___\r
+!define ___MEMENTO_NSH___\r
+\r
+#####################################\r
+### Memento                       ###\r
+#####################################\r
+\r
+/*\r
+\r
+Memento is a set of macros that allow installers to remember user selection\r
+across separate runs of the installer. Currently, it can remember the state\r
+of sections and mark new sections as bold. In the future, it'll integrate\r
+InstallOptions and maybe even the Modern UI.\r
+\r
+A usage example can be found in `Examples\Memento.nsi`.\r
+\r
+*/\r
+\r
+#####################################\r
+### Usage Instructions            ###\r
+#####################################\r
+\r
+/*\r
+\r
+1. Declare usage of Memento by including Memento.nsh at the top of the script.\r
+\r
+      !include Memento.nsh\r
+\r
+2. Define MEMENTO_REGISTRY_ROOT and MEMENTO_REGISTRY_KEY with the a registry key\r
+   where sections' state should be saved.\r
+\r
+      !define MEMENTO_REGISTRY_ROOT HKLM\r
+      !define MEMENTO_REGISTRY_KEY \\r
+                Software\Microsoft\Windows\CurrentVersion\Uninstall\MyProgram\r
+\r
+3. Replace Section with ${MementoSection} and SectionEnd with ${MementoSectionEnd}\r
+   for sections that whose state should be remembered by Memento.\r
+\r
+   For sections that should be unselected by default, use ${MementoSection}'s\r
+   brother - ${MementoUnselectedSection}.\r
+\r
+   Sections that don't already have an identifier must be assigned one.\r
+\r
+   Section identifiers must stay the same across different versions of the\r
+   installer or their state will be forgotten.\r
+\r
+4. Add a call to ${MementoSectionRestore} to .onInit to restore the state\r
+   of all sections from the registry.\r
+\r
+      Function .onInit\r
+\r
+        ${MementoSectionRestore}\r
+\r
+      FunctionEnd\r
+\r
+5. Add a call to ${MementoSectionSave} to .onInstSuccess to save the state\r
+   of all sections to the registry.\r
+\r
+      Function .onInstSuccess\r
+\r
+        ${MementoSectionSave}\r
+\r
+      FunctionEnd\r
+\r
+6. Tattoo the location of the chosen registry key on your arm.\r
+\r
+*/\r
+\r
+#####################################\r
+### User API                      ###\r
+#####################################\r
+\r
+;\r
+; ${MementoSection}\r
+;\r
+;   Defines a section whose state is remembered by Memento.\r
+;\r
+;   Usage is similar to Section.\r
+;\r
+;     ${MementoSection} "name" "some_id"\r
+;\r
+\r
+!define MementoSection "!insertmacro MementoSection"\r
+\r
+;\r
+; ${MementoSectionEnd}\r
+;\r
+;   Ends a section previously opened using ${MementoSection}.\r
+;\r
+;   Usage is similar to SectionEnd.\r
+;\r
+;     ${MementoSection} "name" "some_id"\r
+;        # some code...\r
+;     ${MementoSectionEnd}\r
+;\r
+\r
+;\r
+; ${MementoUnselectedSection}\r
+;\r
+;   Defines a section whose state is remembered by Memento and is\r
+;   unselected by default.\r
+;\r
+;   Usage is similar to Section with the /o switch.\r
+;\r
+;     ${MementoUnselectedSection} "name" "some_id"\r
+;\r
+\r
+!define MementoUnselectedSection "!insertmacro MementoUnselectedSection"\r
+\r
+;\r
+; ${MementoSectionEnd}\r
+;\r
+;   Ends a section previously opened using ${MementoSection}.\r
+;\r
+;   Usage is similar to SectionEnd.\r
+;\r
+;     ${MementoSection} "name" "some_id"\r
+;        # some code...\r
+;     ${MementoSectionEnd}\r
+;\r
+\r
+!define MementoSectionEnd "!insertmacro MementoSectionEnd"\r
+\r
+;\r
+; ${MementoSectionDone}\r
+;\r
+;   Used after all ${MementoSection} have been set.\r
+;\r
+;     ${MementoSection} "name1" "some_id1"\r
+;        # some code...\r
+;     ${MementoSectionEnd}\r
+;\r
+;     ${MementoSection} "name2" "some_id2"\r
+;        # some code...\r
+;     ${MementoSectionEnd}\r
+;\r
+;     ${MementoSection} "name3" "some_id3"\r
+;        # some code...\r
+;     ${MementoSectionEnd}\r
+;\r
+;     ${MementoSectionDone}\r
+;\r
+\r
+!define MementoSectionDone "!insertmacro MementoSectionDone"\r
+\r
+;\r
+; ${MementoSectionRestore}\r
+;\r
+;   Restores the state of all Memento sections from the registry.\r
+;\r
+;   Commonly used in .onInit.\r
+;\r
+;     Function .onInit\r
+;\r
+;       ${MementoSectionRestore}\r
+;\r
+;     FunctionEnd\r
+;\r
+\r
+!define MementoSectionRestore "!insertmacro MementoSectionRestore"\r
+\r
+;\r
+; ${MementoSectionSave}\r
+;\r
+;   Saves the state of all Memento sections to the registry.\r
+;\r
+;   Commonly used in .onInstSuccess.\r
+;\r
+;     Function .onInstSuccess\r
+;\r
+;       ${MementoSectionSave}\r
+;\r
+;     FunctionEnd\r
+;\r
+\r
+!define MementoSectionSave "!insertmacro MementoSectionSave"\r
+\r
+\r
+#####################################\r
+### Internal Defines              ###\r
+#####################################\r
+\r
+!define __MementoSectionIndex 1\r
+\r
+#####################################\r
+### Internal Macros               ###\r
+#####################################\r
+\r
+!macro __MementoCheckSettings\r
+\r
+  !ifndef MEMENTO_REGISTRY_ROOT | MEMENTO_REGISTRY_KEY\r
+\r
+    !error "MEMENTO_REGISTRY_ROOT and MEMENTO_REGISTRY_KEY must be defined before using any of Memento's macros"\r
+\r
+  !endif\r
+\r
+!macroend\r
+\r
+!macro __MementoSection flags name id\r
+\r
+  !insertmacro __MementoCheckSettings\r
+\r
+  !ifndef __MementoSectionIndex\r
+\r
+    !error "MementoSectionDone already used!"\r
+\r
+  !endif\r
+\r
+  !define __MementoSectionLastSectionId `${id}`\r
+\r
+  !verbose pop\r
+\r
+  Section ${flags} `${name}` `${id}`\r
+\r
+  !verbose push\r
+  !verbose 3\r
+\r
+!macroend\r
+\r
+#####################################\r
+### User Macros                   ###\r
+#####################################\r
+\r
+!macro MementoSection name id\r
+\r
+  !verbose push\r
+  !verbose 3\r
+\r
+  !insertmacro __MementoSection "" `${name}` `${id}`\r
+\r
+  !verbose pop\r
+\r
+!macroend\r
+\r
+!macro MementoUnselectedSection name id\r
+\r
+  !verbose push\r
+  !verbose 3\r
+\r
+  !insertmacro __MementoSection /o `${name}` `${id}`\r
+\r
+  !define __MementoSectionUnselected\r
+\r
+  !verbose pop\r
+\r
+!macroend\r
+\r
+!macro MementoSectionEnd\r
+\r
+  SectionEnd\r
+\r
+  !verbose push\r
+  !verbose 3\r
+\r
+  !insertmacro __MementoCheckSettings\r
+\r
+  !ifndef __MementoSectionIndex\r
+\r
+    !error "MementoSectionDone already used!"\r
+\r
+  !endif\r
+\r
+  !define /MATH __MementoSectionIndexNext \\r
+      ${__MementoSectionIndex} + 1\r
+\r
+  Function __MementoSectionMarkNew${__MementoSectionIndex}\r
+\r
+    ClearErrors\r
+    ReadRegDWORD $0 ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` `MementoSection_${__MementoSectionLastSectionId}`\r
+\r
+    ${If} ${Errors}\r
+\r
+      !insertmacro SetSectionFlag `${${__MementoSectionLastSectionId}}` ${SF_BOLD}\r
+\r
+    ${EndIf}\r
+\r
+    GetFunctionAddress $0 __MementoSectionMarkNew${__MementoSectionIndexNext}\r
+    Goto $0\r
+\r
+  FunctionEnd\r
+\r
+  Function __MementoSectionRestoreStatus${__MementoSectionIndex}\r
+\r
+    ClearErrors\r
+    ReadRegDWORD $0 ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` `MementoSection_${__MementoSectionLastSectionId}`\r
+\r
+    !ifndef __MementoSectionUnselected\r
+\r
+      ${If} ${Errors}\r
+      ${OrIf} $0 != 0\r
+\r
+        !insertmacro SelectSection `${${__MementoSectionLastSectionId}}`\r
+\r
+      ${Else}\r
+\r
+        !insertmacro UnselectSection `${${__MementoSectionLastSectionId}}`\r
+\r
+      ${EndIf}\r
+\r
+    !else\r
+\r
+      !undef __MementoSectionUnselected\r
+\r
+      ${If} ${Errors}\r
+      ${OrIf} $0 == 0\r
+\r
+        !insertmacro UnselectSection `${${__MementoSectionLastSectionId}}`\r
+\r
+      ${Else}\r
+\r
+        !insertmacro SelectSection `${${__MementoSectionLastSectionId}}`\r
+\r
+      ${EndIf}\r
+\r
+    !endif\r
+\r
+    GetFunctionAddress $0 __MementoSectionRestoreStatus${__MementoSectionIndexNext}\r
+    Goto $0\r
+\r
+  FunctionEnd\r
+\r
+  Function __MementoSectionSaveStatus${__MementoSectionIndex}\r
+\r
+    ${If} ${SectionIsSelected} `${${__MementoSectionLastSectionId}}`\r
+\r
+      WriteRegDWORD ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` `MementoSection_${__MementoSectionLastSectionId}` 1\r
+\r
+    ${Else}\r
+\r
+      WriteRegDWORD ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` `MementoSection_${__MementoSectionLastSectionId}` 0\r
+\r
+    ${EndIf}\r
+\r
+    GetFunctionAddress $0 __MementoSectionSaveStatus${__MementoSectionIndexNext}\r
+    Goto $0\r
+\r
+  FunctionEnd\r
+\r
+  !undef __MementoSectionIndex\r
+  !define __MementoSectionIndex ${__MementoSectionIndexNext}\r
+  !undef __MementoSectionIndexNext\r
+\r
+  !undef __MementoSectionLastSectionId\r
+\r
+  !verbose pop\r
+\r
+!macroend\r
+\r
+!macro MementoSectionDone\r
+\r
+  !verbose push\r
+  !verbose 3\r
+\r
+  !insertmacro __MementoCheckSettings\r
+\r
+  Function __MementoSectionMarkNew${__MementoSectionIndex}\r
+  FunctionEnd\r
+\r
+  Function __MementoSectionRestoreStatus${__MementoSectionIndex}\r
+  FunctionEnd\r
+\r
+  Function __MementoSectionSaveStatus${__MementoSectionIndex}\r
+  FunctionEnd\r
+\r
+  !undef __MementoSectionIndex\r
+\r
+  !verbose pop\r
+\r
+!macroend\r
+\r
+!macro MementoSectionRestore\r
+\r
+  !verbose push\r
+  !verbose 3\r
+\r
+  !insertmacro __MementoCheckSettings\r
+\r
+  Push $0\r
+  Push $1\r
+  Push $2\r
+  Push $3\r
+\r
+    # check for first usage\r
+\r
+    ClearErrors\r
+\r
+    ReadRegStr $0 ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` MementoSectionUsed\r
+\r
+    ${If} ${Errors}\r
+\r
+      # use script defaults on first run\r
+      Goto done\r
+\r
+    ${EndIf}\r
+\r
+    # mark new components in bold\r
+    \r
+    Call __MementoSectionMarkNew1\r
+\r
+    # mark section groups in bold\r
+\r
+    StrCpy $0 0\r
+    StrCpy $1 ""\r
+    StrCpy $2 ""\r
+    StrCpy $3 ""\r
+\r
+    loop:\r
+\r
+      ClearErrors\r
+\r
+      ${If} ${SectionIsBold} $0\r
+\r
+        ${If} $1 != ""\r
+\r
+          !insertmacro SetSectionFlag $1 ${SF_BOLD}\r
+\r
+        ${EndIf}\r
+\r
+        ${If} $2 != ""\r
+\r
+          !insertmacro SetSectionFlag $2 ${SF_BOLD}\r
+\r
+        ${EndIf}\r
+\r
+        ${If} $3 != ""\r
+\r
+          !insertmacro SetSectionFlag $3 ${SF_BOLD}\r
+\r
+        ${EndIf}\r
+\r
+      ${ElseIf} ${Errors}\r
+\r
+        Goto loop_end\r
+\r
+      ${EndIf}\r
+\r
+      ${If} ${SectionIsSectionGroup} $0\r
+\r
+        ${If} $1 == ""\r
+\r
+          StrCpy $1 $0\r
+\r
+        ${ElseIf} $2 == ""\r
+\r
+          StrCpy $2 $0\r
+\r
+        ${ElseIf} $3 == ""\r
+\r
+          StrCpy $3 $0\r
+\r
+        ${EndIf}\r
+\r
+      ${EndIf}\r
+\r
+      ${If} ${SectionIsSectionGroupEnd} $0\r
+\r
+        ${If} $3 != ""\r
+\r
+          StrCpy $3 ""\r
+\r
+        ${ElseIf} $2 != ""\r
+\r
+          StrCpy $2 ""\r
+\r
+        ${ElseIf} $1 != ""\r
+\r
+          StrCpy $1 ""\r
+\r
+        ${EndIf}\r
+\r
+      ${EndIf}\r
+\r
+      IntOp $0 $0 + 1\r
+\r
+    Goto loop\r
+    loop_end:\r
+\r
+    # restore sections' status\r
+\r
+    Call __MementoSectionRestoreStatus1\r
+\r
+  # all done\r
+\r
+  done:\r
+\r
+  Pop $3\r
+  Pop $2\r
+  Pop $1\r
+  Pop $0\r
+\r
+  !verbose pop\r
+\r
+!macroend\r
+\r
+!macro MementoSectionSave\r
+\r
+  !verbose push\r
+  !verbose 3\r
+\r
+  !insertmacro __MementoCheckSettings\r
+\r
+  Push $0\r
+\r
+    WriteRegStr ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` MementoSectionUsed ""\r
+  \r
+    Call __MementoSectionSaveStatus1\r
+\r
+  Pop $0\r
+\r
+  !verbose pop\r
+\r
+!macroend\r
+\r
+\r
+\r
+!endif # ___MEMENTO_NSH___\r
+\r
+!verbose pop\r