in main/cpputools/source/registercomponent/registercomponent.cxx [195:503]
sal_Bool parseOptions(int ac, char* av[], Options& rOptions, sal_Bool bCmdFile)
throw( IllegalArgument )
{
sal_Bool ret = sal_True;
sal_uInt16 i=0;
sal_Bool bLoaderExplicitlyGiven = sal_False;
rOptions.sProgramName = OUString::createFromAscii(av[i++]);
if (!bCmdFile)
{
bCmdFile = sal_True;
if (ac < 2)
{
usingRegisterImpl();
ret = sal_False;
}
}
for (; i < ac; i++)
{
if (av[i][0] == '-')
{
switch (av[i][1])
{
case 'r':
if (strcmp(av[i], "-register") == 0)
{
rOptions.bRegister = sal_True;
} else
if (strcmp(av[i], "-revoke") == 0)
{
rOptions.bRevoke = sal_True;
} else
if (av[i][2] == '\0')
{
if (i < ac - 1 && av[i+1][0] != '-')
{
i++;
rOptions.sRegName = OStringToOUString(av[i], osl_getThreadTextEncoding());
} else
{
OString tmp("'-r', please check");
if (i <= ac - 1)
{
tmp += " your input '" + OString(av[i+1]) + "'";
}
throw IllegalArgument(tmp);
}
} else
{
rOptions.sRegName = OStringToOUString(av[i]+2, osl_getThreadTextEncoding());
}
break;
case 'b':
if (av[i][2] != 'r')
{
OString tmp("'-b', invalid option!");
throw IllegalArgument(tmp);
}
if (av[i][3] == '\0')
{
if (i < ac - 1 && av[i+1][0] != '-')
{
i++;
OUString regName = OStringToOUString(av[i], osl_getThreadTextEncoding());
if( ! rOptions.sBootRegName.getLength() )
{
rOptions.sBootRegName = regName;
}
else
{
rOptions.sBootRegName2 = regName;
}
} else
{
OString tmp("'-br', please check");
if (i <= ac - 1)
{
tmp += " your input '" + OString(av[i+1]) + "'";
}
throw IllegalArgument(tmp);
}
} else
{
rOptions.sBootRegName = OStringToOUString(av[i]+3, osl_getThreadTextEncoding());
}
break;
case 'c':
{
OUString sUrls;
if (av[i][2] == '\0')
{
if (i < ac - 1 && av[i+1][0] != '-')
{
i++;
sUrls = OStringToOUString(av[i], osl_getThreadTextEncoding());
} else
{
OString tmp("'-c', please check");
if (i <= ac - 1)
{
tmp += " your input '" + OString(av[i+1]) + "'";
}
throw IllegalArgument(tmp);
}
}
else if( 0 == strncmp( av[i] , "-classpath" ,10 ) )
{
i++;
if( i < ac )
{
rtl::OUString envVar(RTL_CONSTASCII_USTRINGPARAM("CLASSPATH"));
rtl::OUString envValue(av[i], strlen(av[i]), osl_getThreadTextEncoding());
osl_setEnvironment(envVar.pData, envValue.pData);
}
break;
}
else
{
sUrls = OStringToOUString(av[i]+2, osl_getThreadTextEncoding());
}
if (rOptions.sComponentUrls.getLength())
{
OUString tmp(rOptions.sComponentUrls + OUString(";", 1, osl_getThreadTextEncoding()) + sUrls);
rOptions.sComponentUrls = tmp;
} else
{
rOptions.sComponentUrls = sUrls;
}
break;
}
case 'l':
{
if (av[i][2] == '\0')
{
if (i < ac - 1 && av[i+1][0] != '-')
{
i++;
rOptions.sLoaderName = OUString::createFromAscii(av[i]);
bLoaderExplicitlyGiven = sal_True;
} else
{
OString tmp("'-l', please check");
if (i <= ac - 1)
{
tmp += " your input '" + OString(av[i+1]) + "'";
}
throw IllegalArgument(tmp);
}
} else
{
bLoaderExplicitlyGiven = sal_True;
rOptions.sLoaderName = OUString::createFromAscii(av[i]+2);
}
break;
}
case 's':
{
if( av[i][2] == 0 )
{
rOptions.bSilent = sal_True;
}
else
{
rtl::OStringBuffer buf;
buf.append( "Unknown error " );
buf.append( av[i] );
throw IllegalArgument( av[i] );
}
break;
}
case 'e':
{
if( av[i][2] == 'n' && av[i][3] == 'v' && av[i][4] == ':' )
{
// bootstrap variable, ignore it
break;
}
}
case 'w':
{
if (strcmp(av[i], "-wop") == 0)
{
rOptions.bPrefix = sal_True;
rOptions.sPrefix = OUString();
// in case there are multiple -wops
break;
}
else if (
strncmp(av[i], "-wop=", RTL_CONSTASCII_LENGTH("-wop="))
== 0)
{
rOptions.bPrefix = sal_True;
rOptions.sPrefix = OStringToOUString(
av[i] + RTL_CONSTASCII_LENGTH("-wop="),
osl_getThreadTextEncoding());
break;
}
}
default:
{
OString tmp( "unknown option " );
tmp += av[i];
throw IllegalArgument( tmp );
}
}
} else
{
if (av[i][0] == '@')
{
FILE* cmdFile = fopen(av[i]+1, "r");
if( cmdFile == NULL )
{
usingRegisterImpl();
ret = sal_False;
} else
{
fseek( cmdFile , 0 , SEEK_END );
sal_Int32 nLen = ftell( cmdFile);
fseek( cmdFile, 0, SEEK_SET );
// 2 chars per string is a upper limit for the number of
// substrings ( at least one separator char needed for fscanf).
char ** rargv = (char **)rtl_allocateMemory( nLen * sizeof( char* ) /2);
if( ! rargv )
{
OStringBuffer buf;
buf.append( "Not enough memory for reading command file " );
buf.append( av[i] +1 );
buf.append( " with length " );
buf.append( nLen );
buf.append( "." );
throw IllegalArgument( buf.makeStringAndClear() );
}
char *buffer = ( char * )rtl_allocateMemory( nLen +1 );
if( ! buffer )
{
OStringBuffer buf;
buf.append( "Not enough memory for reading command file " );
buf.append( av[i] +1 );
buf.append( " with length " );
buf.append( nLen );
buf.append( "." );
throw IllegalArgument( buf.makeStringAndClear() );
}
// we start at one to omit argv[0]
sal_Int32 rargc = 1;
rargv[0] = av[0];
while ( fscanf(cmdFile, "%s", buffer) != EOF )
{
rargv[rargc]= (char * )rtl_allocateMemory( strlen( buffer ) +1 );
if( ! rargv[rargc] )
{
OStringBuffer buf;
buf.append( "Not enough memory for reading command file " );
buf.append( av[i] +1 );
buf.append( " with length " );
buf.append( nLen );
buf.append( "." );
throw IllegalArgument( buf.makeStringAndClear() );
}
strcpy( rargv[rargc] , buffer ); // #100211# - checked
rargc++;
}
fclose(cmdFile);
parseOptions(rargc, rargv, rOptions, bCmdFile);
for (long j=1; j < rargc; j++)
{
rtl_freeMemory(rargv[j]);
}
rtl_freeMemory( buffer );
rtl_freeMemory( rargv );
}
} else
{
usingRegisterImpl();
ret = sal_False;
}
}
}
if( ! bLoaderExplicitlyGiven )
{
if ( rOptions.sComponentUrls.getLength() > 4 &&
rOptions.sComponentUrls.matchAsciiL(
".jar" , 4 , rOptions.sComponentUrls.getLength() - 4 ) )
{
if( ! rOptions.bSilent )
{
printf( "using loader com.sun.star.loader.Java2\n" );
}
rOptions.sLoaderName = OUString(
RTL_CONSTASCII_USTRINGPARAM("com.sun.star.loader.Java2"));
}
else
{
rOptions.sLoaderName = OUString(
RTL_CONSTASCII_USTRINGPARAM("com.sun.star.loader.SharedLibrary") );
}
}
return ret;
}