sal_Bool parseOptions()

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;
}