sal: add special handling of argc==0 to osl_setCommandArgs()
... to set up a fake command line. This is used from pyuno, when invoked from the "python" executable as "import uno". On WNT there is an API to get the actual command line, so just use that even in the "fake" case; on UNX just fake something up. Just for the record the whole osl_setCommandArgs() is called exactly once assumption should work out _unless_ there is a program that uses SAL_MAIN _and_ does a python-level "import uno" _before_ it wants to create a python-based UNO service (via pyuno_loader::CreateInstance), since pyuno already takes care to call Runtime::initialize() at most once. Change-Id: Ifd23de733ea3e6b694d46ab039b6aa4fd3e7fc1b Signed-off-by: Stephan Bergmann <sbergman@redhat.com>
This commit is contained in:
committed by
Stephan Bergmann
parent
efbf0b412b
commit
1acaa577b6
@@ -263,10 +263,7 @@ static PyObject* getComponentContext(
|
||||
{
|
||||
// cppu::defaultBootstrap_InitialComponentContext expects
|
||||
// command line arguments to be present
|
||||
static char * argv [1];
|
||||
argv[0] = strdup(
|
||||
"this is just a fake and cheap imitation of a command line");
|
||||
osl_setCommandArgs(1, argv);
|
||||
osl_setCommandArgs(0, 0); // fake it
|
||||
|
||||
OUString iniFile;
|
||||
if( path.isEmpty() )
|
||||
|
||||
@@ -208,13 +208,26 @@ oslProcessError SAL_CALL osl_getCommandArg (sal_uInt32 nArg, rtl_uString ** strC
|
||||
**************************************/
|
||||
void SAL_CALL osl_setCommandArgs (int argc, char ** argv)
|
||||
{
|
||||
OSL_ASSERT(argc > 0);
|
||||
// special case for argc == 0: set up fake command line
|
||||
int nArgs(argc ? argc : 1);
|
||||
pthread_mutex_lock (&(g_command_args.m_mutex));
|
||||
assert (g_command_args.m_nCount == 0);
|
||||
if (g_command_args.m_nCount == 0)
|
||||
{
|
||||
rtl_uString** ppArgs = (rtl_uString**)rtl_allocateZeroMemory (argc * sizeof(rtl_uString*));
|
||||
if (ppArgs != 0)
|
||||
rtl_uString** ppArgs =
|
||||
(rtl_uString**)rtl_allocateZeroMemory(nArgs * sizeof(rtl_uString*));
|
||||
if (ppArgs != 0 && argc == 0)
|
||||
{
|
||||
// special case: set up fake command line
|
||||
char const*const arg =
|
||||
"this is just a fake and cheap imitation of a command line";
|
||||
rtl_string2UString(&ppArgs[0],
|
||||
arg, rtl_str_getLength(arg), RTL_TEXTENCODING_ASCII_US,
|
||||
OSTRING_TO_OUSTRING_CVTFLAGS);
|
||||
g_command_args.m_nCount = nArgs;
|
||||
g_command_args.m_ppArgs = ppArgs;
|
||||
}
|
||||
else if (ppArgs != 0)
|
||||
{
|
||||
rtl_TextEncoding encoding = osl_getThreadTextEncoding();
|
||||
for (int i = 0; i < argc; i++)
|
||||
|
||||
@@ -261,14 +261,14 @@ static struct CommandArgs_Impl g_command_args =
|
||||
#endif
|
||||
static rtl_uString ** osl_createCommandArgs_Impl (int argc, char **)
|
||||
{
|
||||
int nArgs(0);
|
||||
LPWSTR *wargv = CommandLineToArgvW( GetCommandLineW(), &nArgs );
|
||||
assert(argc == nArgs || argc == 0 /* special case - faked */);
|
||||
rtl_uString ** ppArgs =
|
||||
(rtl_uString**)rtl_allocateZeroMemory (argc * sizeof(rtl_uString*));
|
||||
(rtl_uString**)rtl_allocateZeroMemory(nArgs * sizeof(rtl_uString*));
|
||||
if (ppArgs != 0)
|
||||
{
|
||||
int i;
|
||||
int nArgs;
|
||||
LPWSTR *wargv = CommandLineToArgvW( GetCommandLineW(), &nArgs );
|
||||
OSL_ASSERT( nArgs == argc );
|
||||
for (i = 0; i < nArgs; i++)
|
||||
{
|
||||
/* Convert to unicode */
|
||||
|
||||
Reference in New Issue
Block a user