зеркало из https://github.com/mozilla/pjs.git
bug 465874 - WinCE Environment Variables Have To Be Passed On Command Line r=bsmedberg
This commit is contained in:
Родитель
5dbd18df59
Коммит
5ae7fa36dc
|
@ -103,6 +103,8 @@ MOZCE_SHUNT_API int _unlink(const char *filename );
|
|||
*/
|
||||
|
||||
|
||||
MOZCE_SHUNT_API unsigned short* mozce_GetEnvironmentCL();
|
||||
|
||||
#ifdef __cplusplus
|
||||
};
|
||||
#endif
|
||||
|
|
|
@ -36,9 +36,8 @@
|
|||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
|
||||
#include "stdlib.h"
|
||||
#include "Windows.h"
|
||||
#include "stdlib.h"
|
||||
#include "Windows.h"
|
||||
|
||||
#include "mozce_shunt.h"
|
||||
#include "time_conversions.h"
|
||||
|
@ -65,14 +64,11 @@ static mapping initial_map[] = {
|
|||
{"NS_TIMELINE_LOG_FILE","\\bin\\timeline.log",initial_map + (init_i++)},
|
||||
{"NS_TIMELINE_ENABLE", "1",initial_map + (init_i++)},
|
||||
#endif
|
||||
{"tmp", "/Temp",initial_map + (init_i++)},
|
||||
{"GRE_HOME",".",initial_map + (init_i++)},
|
||||
{"NSS_DEFAULT_DB_TYPE", "sql",initial_map + (init_i++)},
|
||||
{"NSPR_FD_CACHE_SIZE_LOW", "10",initial_map + (init_i++)},
|
||||
{"NSPR_FD_CACHE_SIZE_HIGH", "30",initial_map + (init_i++)},
|
||||
{"XRE_PROFILE_PATH", "\\Application Data\\Mozilla\\Profiles",initial_map + (init_i++)},
|
||||
{"XRE_PROFILE_LOCAL_PATH","./profile",initial_map + (init_i++)},
|
||||
{"XRE_PROFILE_NAME","default",0}
|
||||
{"XRE_PROFILE_NAME","default",initial_map + (init_i++)},
|
||||
{"tmp", "/Temp", 0 }
|
||||
};
|
||||
|
||||
static mapping* head = initial_map;
|
||||
|
@ -146,22 +142,21 @@ MOZCE_SHUNT_API char GetEnvironmentVariableW(const unsigned short * lpName, unsi
|
|||
256,
|
||||
NULL,
|
||||
NULL);
|
||||
if(rv < 0)
|
||||
return rv;
|
||||
if(rv <= 0)
|
||||
return 0;
|
||||
|
||||
char* val = map_get(key);
|
||||
|
||||
if(val)
|
||||
{
|
||||
MultiByteToWideChar(CP_ACP,
|
||||
0,
|
||||
val,
|
||||
strlen(val)+1,
|
||||
lpBuffer,
|
||||
nSize );
|
||||
return ERROR_SUCCESS;
|
||||
return MultiByteToWideChar(CP_ACP,
|
||||
0,
|
||||
val,
|
||||
strlen(val)+1,
|
||||
lpBuffer,
|
||||
nSize);
|
||||
}
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
MOZCE_SHUNT_API char SetEnvironmentVariableW( const unsigned short * name, const unsigned short * value )
|
||||
|
@ -584,8 +579,37 @@ MOZCE_SHUNT_API struct lconv * localeconv(void)
|
|||
{
|
||||
return &s_locale_conv;
|
||||
}
|
||||
|
||||
|
||||
MOZCE_SHUNT_API
|
||||
unsigned short* mozce_GetEnvironmentCL()
|
||||
{
|
||||
mapping* cur = head;
|
||||
int len = 0;
|
||||
while(cur != NULL){
|
||||
len+=strlen(cur->key);
|
||||
len+=strlen(cur->value);
|
||||
len+=15;
|
||||
cur = cur->next;
|
||||
}
|
||||
|
||||
unsigned short* env = (unsigned short*)malloc(sizeof(wchar_t)*(len +1));
|
||||
cur = head;
|
||||
int pos = 0;
|
||||
while(cur != NULL){
|
||||
wcscpy(env+pos, L" --environ:\"");
|
||||
pos+=12;
|
||||
pos+=MultiByteToWideChar( CP_ACP, 0, cur->key, -1, env+pos, len-pos );
|
||||
env[pos-1] = '=';
|
||||
pos+=MultiByteToWideChar( CP_ACP, 0, cur->value, -1, env+pos, len-pos );
|
||||
env[pos-1]='\"';
|
||||
|
||||
cur = cur->next;
|
||||
}
|
||||
|
||||
env[pos] = '\0';
|
||||
return env;
|
||||
|
||||
}
|
||||
|
||||
BOOL WINAPI DllMain(HANDLE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
|
||||
{
|
||||
|
|
|
@ -172,6 +172,11 @@ MakeCommandLine(int argc, PRUnichar **argv)
|
|||
for (i = 0; i < argc; ++i)
|
||||
len += ArgStrLen(argv[i]) + 1;
|
||||
|
||||
#ifdef WINCE
|
||||
wchar_t *env = mozce_GetEnvironmentCL();
|
||||
len += (wcslen(env));
|
||||
#endif
|
||||
|
||||
// Protect against callers that pass 0 arguments
|
||||
if (len == 0)
|
||||
len = 1;
|
||||
|
@ -191,6 +196,9 @@ MakeCommandLine(int argc, PRUnichar **argv)
|
|||
|
||||
*c = '\0';
|
||||
|
||||
#ifdef WINCE
|
||||
wcscat(s, env);
|
||||
#endif
|
||||
return s;
|
||||
}
|
||||
|
||||
|
@ -257,6 +265,19 @@ WinLaunchChild(const PRUnichar *exePath, int argc, PRUnichar **argv)
|
|||
{
|
||||
PRUnichar *cl;
|
||||
BOOL ok;
|
||||
|
||||
#ifdef WINCE
|
||||
// Windows Mobile Issue:
|
||||
// When passing both an image name and a command line to
|
||||
// CreateProcessW, you need to make sure that the image name
|
||||
// identially matches the first argument of the command line. If
|
||||
// they do not match, Windows Mobile will send two "argv[0]" values.
|
||||
// To avoid this problem, we will strip off the argv here, and
|
||||
// depend only on the exePath.
|
||||
argv = argv + 1;
|
||||
argc--;
|
||||
#endif
|
||||
|
||||
cl = MakeCommandLine(argc, argv);
|
||||
if (!cl)
|
||||
return FALSE;
|
||||
|
@ -278,6 +299,19 @@ WinLaunchChild(const PRUnichar *exePath, int argc, PRUnichar **argv)
|
|||
if (ok) {
|
||||
CloseHandle(pi.hProcess);
|
||||
CloseHandle(pi.hThread);
|
||||
} else {
|
||||
LPVOID lpMsgBuf;
|
||||
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
||||
FORMAT_MESSAGE_FROM_SYSTEM |
|
||||
FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||
NULL,
|
||||
GetLastError(),
|
||||
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
||||
(LPTSTR) &lpMsgBuf,
|
||||
0,
|
||||
NULL
|
||||
);
|
||||
wprintf(L"Error restarting: %s\n", lpMsgBuf);
|
||||
}
|
||||
|
||||
free(cl);
|
||||
|
|
|
@ -62,8 +62,28 @@ FreeAllocStrings(int argc, char **argv)
|
|||
delete [] argv;
|
||||
}
|
||||
|
||||
#ifdef WINCE
|
||||
/** argc/argv are in/out parameters */
|
||||
void ExtractEnvironmentFromCL(int &argc, WCHAR **&argv)
|
||||
{
|
||||
for (int x = 0; x < argc; ++x) {
|
||||
if (!wcsncmp(argv[x], L"--environ:",10)) {
|
||||
char* key_val = AllocConvertUTF16toUTF8(argv[x]+10);
|
||||
putenv(key_val);
|
||||
free(key_val);
|
||||
argc -= 1;
|
||||
memcpy(&argv[x], &argv[x+1], (argc - x) * sizeof(WCHAR*));
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
int wmain(int argc, WCHAR **argv)
|
||||
{
|
||||
#ifdef WINCE
|
||||
ExtractEnvironmentFromCL(argc, argv);
|
||||
#endif
|
||||
char **argvConverted = new char*[argc + 1];
|
||||
if (!argvConverted)
|
||||
return 127;
|
||||
|
|
Загрузка…
Ссылка в новой задаче