From 660bbf5e2d260ce650f6e95e5036f8583b294ae5 Mon Sep 17 00:00:00 2001 From: ramon18 Date: Mon, 22 Dec 2003 14:02:15 +0000 Subject: [PATCH] Added ShConstants.h to makenssi project Size optimization on ui.c Some fixes in Shell Folders code git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@3297 212acab6-be3b-0410-9dea-997c60f758d6 --- Source/ShConstants.h | 91 +++++++++++++++++++++++++++++++++++++++++++ Source/build.h | 2 +- Source/exehead/Ui.c | 2 +- Source/exehead/util.c | 13 +++---- Source/exehead/util.h | 2 +- Source/makenssi.dsp | 4 ++ 6 files changed, 104 insertions(+), 10 deletions(-) create mode 100644 Source/ShConstants.h diff --git a/Source/ShConstants.h b/Source/ShConstants.h new file mode 100644 index 00000000..fce874ae --- /dev/null +++ b/Source/ShConstants.h @@ -0,0 +1,91 @@ +// constants.h by Ramon 18 Nov 2003 + +#ifndef ___CONSTANTS___H_____ +#define ___CONSTANTS___H_____ + +#include "Lang.h" + +struct constantstring { + int name; + int index; + int pos; + int value1; + int value2; +}; + +class ConstantsStringList : public SortedStringListND +{ + public: + ConstantsStringList() + { + index = 0; + } + ~ConstantsStringList() { } + + int add(const char *name, int value1, int value2) + { + int pos=SortedStringListND::add(name); + if (pos == -1) return -1; + + ((struct constantstring*)gr.get())[pos].index = index; + ((struct constantstring*)gr.get())[pos].pos = pos; + ((struct constantstring*)gr.get())[pos].value1 = value1; + ((struct constantstring*)gr.get())[pos].value2 = value2; + + int temp = index; + index++; + + return temp; + } + + int get(char *name, size_t n_chars = -1) + { + int v=SortedStringListND::find(name, n_chars); + if (v==-1) return -1; + return (((struct constantstring*)gr.get())[v].index); + } + + int getnum() + { + return index; + } + + int get_value1(int idx) + { + int pos=get_internal_idx(idx); + if (pos==-1) return -1; + return (((struct constantstring*)gr.get())[pos].value1); + } + + int get_value2(int idx) + { + int pos=get_internal_idx(idx); + if (pos==-1) return -1; + return (((struct constantstring*)gr.get())[pos].value2); + } + + char *idx2name(int idx) + { + int pos=get_internal_idx(idx); + if (pos==-1) return NULL; + struct constantstring *data=(struct constantstring *)gr.get(); + return ((char*)strings.get() + data[pos].name); + } + + private: + int index; + int get_internal_idx(int idx) + { + struct constantstring *data=(struct constantstring *)gr.get(); + for (int i = 0; i < index; i++) + { + if (data[i].index == idx) + { + return i; + } + } + return -1; + } +}; + +#endif diff --git a/Source/build.h b/Source/build.h index ba5711ab..7aaacdc7 100644 --- a/Source/build.h +++ b/Source/build.h @@ -11,7 +11,7 @@ using namespace std; #include "ResourceEditor.h" #include "ResourceVersionInfo.h" #include "uservars.h" -#include "constants.h" +#include "ShConstants.h" #include "exehead/fileform.h" #include "exehead/config.h" diff --git a/Source/exehead/Ui.c b/Source/exehead/Ui.c index dec52086..1a107329 100644 --- a/Source/exehead/Ui.c +++ b/Source/exehead/Ui.c @@ -353,7 +353,7 @@ static int CALLBACK WINAPI BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lPara hwnd, BFFM_ENABLEOK, 0, - my_PIDL2Path((char*)lpData, (LPITEMIDLIST)lParam, 0) + SHGetPathFromIDList((LPITEMIDLIST)lParam,(char*)lpData) #ifdef NSIS_SUPPORT_CODECALLBACKS && !ExecuteCodeSegment(g_header->code_onVerifyInstDir,NULL) #endif diff --git a/Source/exehead/util.c b/Source/exehead/util.c index 78b47789..3ca43012 100644 --- a/Source/exehead/util.c +++ b/Source/exehead/util.c @@ -31,7 +31,7 @@ NSIS_STRING g_usrvars[TOTAL_COMPATIBLE_STATIC_VARS_COUNT]; #define INVALID_FILE_ATTRIBUTES ((DWORD)-1) #endif -int my_PIDL2Path(char *out, LPITEMIDLIST idl, int bFree) +int NSISCALL my_PIDL2Path(char *out, LPITEMIDLIST idl, int bFree) { int Res; IMalloc *m; @@ -39,7 +39,6 @@ int my_PIDL2Path(char *out, LPITEMIDLIST idl, int bFree) Res = SHGetPathFromIDList(idl, out); if (m && bFree) { - m->lpVtbl->Free(m,idl); m->lpVtbl->Release(m); } return Res; @@ -491,12 +490,12 @@ char * NSISCALL GetNSISString(char *outbuf, int strtab) // NOTE 3: the code CSIDL_CONTROLS is used for PROGRAMFILES LPITEMIDLIST idl; int qLaunch=0; + int nCreateFlag = CSIDL_FLAG_CREATE; nVarIdx = (*(WORD*)in & 0x0FFF)-1; in+=sizeof(WORD); // Read code for current user if ( g_exec_flags.all_user_var ) nVarIdx = (*(WORD*)in & 0x0FFF)-1; in+=sizeof(WORD); // Use code for All users instead - nVarIdx |= CSIDL_FLAG_CREATE; *out=0; while (TRUE) @@ -512,12 +511,12 @@ char * NSISCALL GetNSISString(char *outbuf, int strtab) mystrcpy(out, "C:\\Program Files"); break; case CSIDL_DESKTOP: // QUICKLAUNCH - nVarIdx = CSIDL_APPDATA; + nVarIdx |= CSIDL_APPDATA; qLaunch = 1; // dont break default: // Get and force path creation - if ( !SHGetSpecialFolderLocation(g_hwnd, nVarIdx, &idl) ) + if ( !SHGetSpecialFolderLocation(g_hwnd, nVarIdx | nCreateFlag, &idl) ) { if (my_PIDL2Path(out, idl, 1)) { @@ -530,10 +529,10 @@ char * NSISCALL GetNSISString(char *outbuf, int strtab) break; } - if ( *out || ((nVarIdx & CSIDL_FLAG_CREATE) != CSIDL_FLAG_CREATE) ) + if ( *out || nCreateFlag == 0 ) break; else - nVarIdx &= ~CSIDL_FLAG_CREATE; + nCreateFlag = 0; // remove create flag if it fails } validate_filename(out); diff --git a/Source/exehead/util.h b/Source/exehead/util.h index 4ed6fb77..ab1ba335 100644 --- a/Source/exehead/util.h +++ b/Source/exehead/util.h @@ -14,7 +14,7 @@ int NSISCALL mystrlen(const char *in); char * NSISCALL mystrstr(char *a, char *b); WIN32_FIND_DATA * NSISCALL file_exists(char *buf); char * NSISCALL my_GetTempFileName(char *buf, const char *dir); -int my_PIDL2Path(char *out, LPITEMIDLIST idl, int bFree); +int NSISCALL my_PIDL2Path(char *out, LPITEMIDLIST idl, int bFree); //BOOL NSISCALL my_SetWindowText(HWND hWnd, const char *val); #define my_SetWindowText SetWindowText diff --git a/Source/makenssi.dsp b/Source/makenssi.dsp index cb3dfe8f..9d6586d5 100644 --- a/Source/makenssi.dsp +++ b/Source/makenssi.dsp @@ -297,6 +297,10 @@ SOURCE=.\ResourceVersionInfo.h # End Source File # Begin Source File +SOURCE=.\ShConstants.h +# End Source File +# Begin Source File + SOURCE=.\strlist.h # End Source File # Begin Source File