tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

exdll.h (6502B)


      1 // Unicode support added by Jim Park -- 07/27/2007
      2 // Unicode support requires that all plugins take TCHARs instead as well. This
      3 // means existing plugins will not work for the Unicode version of NSIS unless
      4 // recompiled.  You have been warned.
      5 
      6 #ifndef _EXDLL_H_
      7 #define _EXDLL_H_
      8 
      9 #include <windows.h>
     10 #include "tchar.h"
     11 
     12 #if defined(__GNUC__)
     13 #define UNUSED __attribute__((unused))
     14 #else
     15 #define UNUSED
     16 #endif
     17 
     18 // only include this file from one place in your DLL.
     19 // (it is all static, if you use it in two places it will fail)
     20 
     21 #define EXDLL_INIT()           {  \
     22        g_stringsize=string_size; \
     23        g_stacktop=stacktop;      \
     24        g_variables=variables; }
     25 
     26 // For page showing plug-ins
     27 #define WM_NOTIFY_OUTER_NEXT (WM_USER+0x8)
     28 #define WM_NOTIFY_CUSTOM_READY (WM_USER+0xd)
     29 
     30 /* Jim Park: This char is compared as an int value and therefore
     31   it's fine as an ASCII.  Do not need to change to wchar_t since
     32   it will get the same integer value. */
     33 #define NOTIFY_BYE_BYE _T('x')
     34 
     35 typedef struct _stack_t {
     36  struct _stack_t *next;
     37  TCHAR text[1]; // this should be the length of string_size
     38 } stack_t;
     39 
     40 
     41 static unsigned int g_stringsize;
     42 static stack_t **g_stacktop;
     43 static TCHAR *g_variables;
     44 
     45 static int __stdcall popstring(TCHAR *str) UNUSED; // 0 on success, 1 on empty stack
     46 static void __stdcall pushstring(const TCHAR *str) UNUSED;
     47 static TCHAR * __stdcall getuservariable(const int varnum) UNUSED;
     48 static void __stdcall setuservariable(const int varnum, const TCHAR *var) UNUSED;
     49 
     50 enum
     51 {
     52 INST_0,         // $0
     53 INST_1,         // $1
     54 INST_2,         // $2
     55 INST_3,         // $3
     56 INST_4,         // $4
     57 INST_5,         // $5
     58 INST_6,         // $6
     59 INST_7,         // $7
     60 INST_8,         // $8
     61 INST_9,         // $9
     62 INST_R0,        // $R0
     63 INST_R1,        // $R1
     64 INST_R2,        // $R2
     65 INST_R3,        // $R3
     66 INST_R4,        // $R4
     67 INST_R5,        // $R5
     68 INST_R6,        // $R6
     69 INST_R7,        // $R7
     70 INST_R8,        // $R8
     71 INST_R9,        // $R9
     72 INST_CMDLINE,   // $CMDLINE
     73 INST_INSTDIR,   // $INSTDIR
     74 INST_OUTDIR,    // $OUTDIR
     75 INST_EXEDIR,    // $EXEDIR
     76 INST_LANG,      // $LANGUAGE
     77 __INST_LAST
     78 };
     79 
     80 typedef struct {
     81  int autoclose;
     82  int all_user_var;
     83  int exec_error;
     84  int abort;
     85  int exec_reboot;
     86  int reboot_called;
     87  int XXX_cur_insttype; // deprecated
     88  int XXX_insttype_changed; // deprecated
     89  int silent;
     90  int instdir_error;
     91  int rtl;
     92  int errlvl;
     93  int alter_reg_view;
     94  int status_update;
     95 } exec_flags_type;
     96 
     97 typedef struct {
     98  exec_flags_type *exec_flags;
     99  int (__stdcall *ExecuteCodeSegment)(int, HWND);
    100  void (__stdcall *validate_filename)(TCHAR *);
    101 } extra_parameters;
    102 
    103 // utility functions (not required but often useful)
    104 static int __stdcall popstring(TCHAR *str)
    105 {
    106  stack_t *th;
    107  if (!g_stacktop || !*g_stacktop) return 1;
    108  th=(*g_stacktop);
    109  lstrcpy(str,th->text);
    110  *g_stacktop = th->next;
    111  GlobalFree((HGLOBAL)th);
    112  return 0;
    113 }
    114 
    115 static void __stdcall pushstring(const TCHAR *str)
    116 {
    117  stack_t *th;
    118  if (!g_stacktop) return;
    119  th=(stack_t*)GlobalAlloc(GPTR,(sizeof(stack_t)+(g_stringsize)*sizeof(TCHAR)));
    120  lstrcpyn(th->text,str,g_stringsize);
    121  th->next=*g_stacktop;
    122  *g_stacktop=th;
    123 }
    124 
    125 static TCHAR * __stdcall getuservariable(const int varnum)
    126 {
    127  if (varnum < 0 || varnum >= __INST_LAST) return NULL;
    128  return g_variables+varnum*g_stringsize;
    129 }
    130 
    131 static void __stdcall setuservariable(const int varnum, const TCHAR *var)
    132 {
    133 if (var != NULL && varnum >= 0 && varnum < __INST_LAST) 
    134 	lstrcpy(g_variables + varnum*g_stringsize, var);
    135 }
    136 
    137 #ifdef _UNICODE
    138 #define PopStringW(x) popstring(x)
    139 #define PushStringW(x) pushstring(x)
    140 #define SetUserVariableW(x,y) setuservariable(x,y)
    141 
    142 static int __stdcall PopStringA(char* ansiStr)
    143 {
    144   wchar_t* wideStr = (wchar_t*) GlobalAlloc(GPTR, g_stringsize*sizeof(wchar_t));
    145   int rval = popstring(wideStr);
    146   WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL);
    147   GlobalFree((HGLOBAL)wideStr);
    148   return rval;
    149 }
    150 
    151 static void __stdcall PushStringA(const char* ansiStr)
    152 {
    153   wchar_t* wideStr = (wchar_t*) GlobalAlloc(GPTR, g_stringsize*sizeof(wchar_t));
    154   MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize);
    155   pushstring(wideStr);
    156   GlobalFree((HGLOBAL)wideStr);
    157   return;
    158 }
    159 
    160 static void __stdcall GetUserVariableW(const int varnum, wchar_t* wideStr)
    161 {
    162   lstrcpyW(wideStr, getuservariable(varnum));
    163 }
    164 
    165 static void __stdcall GetUserVariableA(const int varnum, char* ansiStr)
    166 {
    167   wchar_t* wideStr = getuservariable(varnum);
    168   WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL);
    169 }
    170 
    171 static void __stdcall SetUserVariableA(const int varnum, const char* ansiStr)
    172 {
    173   if (ansiStr != NULL && varnum >= 0 && varnum < __INST_LAST)
    174   {
    175      wchar_t* wideStr = g_variables + varnum * g_stringsize;
    176      MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize);
    177   }
    178 }
    179 
    180 #else
    181 // ANSI defs
    182 
    183 #define PopStringA(x) popstring(x)
    184 #define PushStringA(x) pushstring(x)
    185 #define SetUserVariableA(x,y) setuservariable(x,y)
    186 
    187 static int __stdcall PopStringW(wchar_t* wideStr)
    188 {
    189   char* ansiStr = (char*) GlobalAlloc(GPTR, g_stringsize);
    190   int rval = popstring(ansiStr);
    191   MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize);
    192   GlobalFree((HGLOBAL)ansiStr);
    193   return rval;
    194 }
    195 
    196 static void __stdcall PushStringW(wchar_t* wideStr)
    197 {
    198   char* ansiStr = (char*) GlobalAlloc(GPTR, g_stringsize);
    199   WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL);
    200   pushstring(ansiStr);
    201   GlobalFree((HGLOBAL)ansiStr);
    202 }
    203 
    204 static void __stdcall GetUserVariableW(const int varnum, wchar_t* wideStr)
    205 {
    206   char* ansiStr = getuservariable(varnum);
    207   MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize);
    208 }
    209 
    210 static void __stdcall GetUserVariableA(const int varnum, char* ansiStr)
    211 {
    212   lstrcpyA(ansiStr, getuservariable(varnum));
    213 }
    214 
    215 static void __stdcall SetUserVariableW(const int varnum, const wchar_t* wideStr)
    216 {
    217   if (wideStr != NULL && varnum >= 0 && varnum < __INST_LAST)
    218   {
    219      char* ansiStr = g_variables + varnum * g_stringsize;
    220      WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL);
    221   }
    222 }
    223 #endif
    224 
    225 static BOOL __stdcall IsUnicode(void)
    226 {
    227 #ifdef _UNICODE
    228   return TRUE;
    229 #else
    230   return FALSE;
    231 #endif
    232 }
    233 
    234 #endif//_EXDLL_H_