xref: /aoo41x/main/vos/source/process.cxx (revision e8c8fa4b)
1*e8c8fa4bSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*e8c8fa4bSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*e8c8fa4bSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*e8c8fa4bSAndrew Rist  * distributed with this work for additional information
6*e8c8fa4bSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*e8c8fa4bSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*e8c8fa4bSAndrew Rist  * "License"); you may not use this file except in compliance
9*e8c8fa4bSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*e8c8fa4bSAndrew Rist  *
11*e8c8fa4bSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*e8c8fa4bSAndrew Rist  *
13*e8c8fa4bSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*e8c8fa4bSAndrew Rist  * software distributed under the License is distributed on an
15*e8c8fa4bSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*e8c8fa4bSAndrew Rist  * KIND, either express or implied.  See the License for the
17*e8c8fa4bSAndrew Rist  * specific language governing permissions and limitations
18*e8c8fa4bSAndrew Rist  * under the License.
19*e8c8fa4bSAndrew Rist  *
20*e8c8fa4bSAndrew Rist  *************************************************************/
21*e8c8fa4bSAndrew Rist 
22*e8c8fa4bSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir 
25cdf0e10cSrcweir #include <cstdarg>
26cdf0e10cSrcweir #include <vector>
27cdf0e10cSrcweir #include <rtl/ustring.hxx>
28cdf0e10cSrcweir #include <rtl/instance.hxx>
29cdf0e10cSrcweir 
30cdf0e10cSrcweir #include "vos/process.hxx"
31cdf0e10cSrcweir #include "vos/diagnose.hxx"
32cdf0e10cSrcweir #include <osl/file.hxx>
33cdf0e10cSrcweir 
34cdf0e10cSrcweir #define MAX_RESOURCES	100
35cdf0e10cSrcweir #define MAX_ARGS		100
36cdf0e10cSrcweir #define MAX_ENVIROMENTS 100
37cdf0e10cSrcweir 
38cdf0e10cSrcweir using namespace vos;
39cdf0e10cSrcweir 
40cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////////////
41cdf0e10cSrcweir /// Argument
42cdf0e10cSrcweir 
OArgumentList()43cdf0e10cSrcweir OArgumentList::OArgumentList() :
44cdf0e10cSrcweir 	n_Args(0),
45cdf0e10cSrcweir 	m_aVec(0)
46cdf0e10cSrcweir {
47cdf0e10cSrcweir 	// empty
48cdf0e10cSrcweir }
49cdf0e10cSrcweir 
OArgumentList(sal_uInt32 nArgs,const::rtl::OUString * aArgument1,...)50cdf0e10cSrcweir OArgumentList::OArgumentList( sal_uInt32 nArgs, const ::rtl::OUString* aArgument1, ... ) :
51cdf0e10cSrcweir 	n_Args( nArgs )
52cdf0e10cSrcweir {
53cdf0e10cSrcweir 	m_aVec = new rtl_uString* [nArgs];
54cdf0e10cSrcweir 	std::va_list pArgs;
55cdf0e10cSrcweir 	sal_uInt32 i = 0;
56cdf0e10cSrcweir 	const rtl::OUString* aArgument;
57cdf0e10cSrcweir 
58cdf0e10cSrcweir 	va_start ( pArgs, aArgument1 );
59cdf0e10cSrcweir 	aArgument = aArgument1;
60cdf0e10cSrcweir 
61cdf0e10cSrcweir     while( true ) {
62cdf0e10cSrcweir 		m_aVec[i] = aArgument->pData;
63cdf0e10cSrcweir 		rtl_uString_acquire( m_aVec[i++] );
64cdf0e10cSrcweir 		if( i < n_Args )
65cdf0e10cSrcweir 			aArgument = va_arg( pArgs,rtl::OUString* );
66cdf0e10cSrcweir 		else
67cdf0e10cSrcweir 			break;
68cdf0e10cSrcweir 	}
69cdf0e10cSrcweir 	va_end( pArgs );
70cdf0e10cSrcweir }
71cdf0e10cSrcweir 
72cdf0e10cSrcweir 
OArgumentList(const rtl::OUString aArgumentList[],sal_uInt32 nArgs)73cdf0e10cSrcweir OArgumentList::OArgumentList( const rtl::OUString aArgumentList[], sal_uInt32 nArgs ) :
74cdf0e10cSrcweir 	n_Args( nArgs )
75cdf0e10cSrcweir {
76cdf0e10cSrcweir 	m_aVec = new rtl_uString* [n_Args];
77cdf0e10cSrcweir 	for( sal_uInt32 i = 0; i < n_Args; ++ i )  {
78cdf0e10cSrcweir 		m_aVec[i] = aArgumentList[i].pData;
79cdf0e10cSrcweir 		rtl_uString_acquire( m_aVec[i] );
80cdf0e10cSrcweir 	}
81cdf0e10cSrcweir }
82cdf0e10cSrcweir 
OArgumentList(const OArgumentList & rOther)83cdf0e10cSrcweir OArgumentList::OArgumentList( const OArgumentList& rOther ) : n_Args( rOther.n_Args )
84cdf0e10cSrcweir {
85cdf0e10cSrcweir 	m_aVec = new rtl_uString* [n_Args];
86cdf0e10cSrcweir 
87cdf0e10cSrcweir 	sal_uInt32 i;
88cdf0e10cSrcweir 	for ( i = 0; i < n_Args; ++i )
89cdf0e10cSrcweir 	{
90cdf0e10cSrcweir 		m_aVec[i] = rOther.m_aVec[i];
91cdf0e10cSrcweir 		rtl_uString_acquire( m_aVec[i] );
92cdf0e10cSrcweir 	}
93cdf0e10cSrcweir }
94cdf0e10cSrcweir 
operator =(const OArgumentList & rOther)95cdf0e10cSrcweir OArgumentList& OArgumentList::operator=( const OArgumentList& rOther )
96cdf0e10cSrcweir {
97cdf0e10cSrcweir 	if ( this != &rOther )
98cdf0e10cSrcweir 	{
99cdf0e10cSrcweir 
100cdf0e10cSrcweir 		// delete the old one
101cdf0e10cSrcweir 		sal_uInt32 i;
102cdf0e10cSrcweir 		for ( i = 0; i < n_Args; ++i )
103cdf0e10cSrcweir 			rtl_uString_release( m_aVec[i] );
104cdf0e10cSrcweir 
105cdf0e10cSrcweir 		delete [] m_aVec;
106cdf0e10cSrcweir 
107cdf0e10cSrcweir 
108cdf0e10cSrcweir 		n_Args = rOther.n_Args;
109cdf0e10cSrcweir 		m_aVec = new rtl_uString* [n_Args];
110cdf0e10cSrcweir 		for( i = 0; i < n_Args; ++i )
111cdf0e10cSrcweir 		{
112cdf0e10cSrcweir 			m_aVec[i] = rOther.m_aVec[i];
113cdf0e10cSrcweir 			rtl_uString_acquire( m_aVec[i] );
114cdf0e10cSrcweir 		}
115cdf0e10cSrcweir 	}
116cdf0e10cSrcweir 
117cdf0e10cSrcweir 	return *this;
118cdf0e10cSrcweir }
119cdf0e10cSrcweir 
~OArgumentList()120cdf0e10cSrcweir OArgumentList::~OArgumentList( )
121cdf0e10cSrcweir {
122cdf0e10cSrcweir 	for( sal_uInt32 i = 0; i < n_Args; ++i ) rtl_uString_release( m_aVec[i] );
123cdf0e10cSrcweir 	delete[] m_aVec;
124cdf0e10cSrcweir }
125cdf0e10cSrcweir 
126cdf0e10cSrcweir 
127cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////
128cdf0e10cSrcweir /// Environment
129cdf0e10cSrcweir 
OEnvironment()130cdf0e10cSrcweir OEnvironment::OEnvironment() :
131cdf0e10cSrcweir 	n_Vars( 0 ),
132cdf0e10cSrcweir 	m_aVec( 0 )
133cdf0e10cSrcweir {
134cdf0e10cSrcweir }
135cdf0e10cSrcweir 
OEnvironment(sal_Int32 nVars,const::rtl::OUString * aArgument1,...)136cdf0e10cSrcweir OEnvironment::OEnvironment( sal_Int32 nVars, const ::rtl::OUString* aArgument1, ... ) :
137cdf0e10cSrcweir 	n_Vars( nVars )
138cdf0e10cSrcweir {
139cdf0e10cSrcweir 	m_aVec = new rtl_uString* [nVars];
140cdf0e10cSrcweir 	std::va_list pArgs;
141cdf0e10cSrcweir 	sal_Int32 i = 0;
142cdf0e10cSrcweir 	const rtl::OUString* aArgument;
143cdf0e10cSrcweir 
144cdf0e10cSrcweir 	va_start ( pArgs, aArgument1 );
145cdf0e10cSrcweir 	aArgument = aArgument1;
146cdf0e10cSrcweir 
147cdf0e10cSrcweir     while( true ) {
148cdf0e10cSrcweir 		m_aVec[i] = aArgument->pData;
149cdf0e10cSrcweir 		rtl_uString_acquire( m_aVec[i++] );
150cdf0e10cSrcweir 		if( i < n_Vars )
151cdf0e10cSrcweir 			aArgument = va_arg( pArgs,rtl::OUString* );
152cdf0e10cSrcweir 		else
153cdf0e10cSrcweir 			break;
154cdf0e10cSrcweir 	}
155cdf0e10cSrcweir 	va_end( pArgs );
156cdf0e10cSrcweir }
157cdf0e10cSrcweir 
158cdf0e10cSrcweir 
OEnvironment(const::rtl::OUString aVariableList[],sal_Int32 nVars)159cdf0e10cSrcweir OEnvironment::OEnvironment( const ::rtl::OUString aVariableList[], sal_Int32 nVars ) :
160cdf0e10cSrcweir 	n_Vars( nVars )
161cdf0e10cSrcweir {
162cdf0e10cSrcweir 	m_aVec = new rtl_uString* [n_Vars];
163cdf0e10cSrcweir 	for( sal_Int32 i = 0; i < n_Vars; ++ i )  {
164cdf0e10cSrcweir 		m_aVec[i] = aVariableList[i].pData;
165cdf0e10cSrcweir 		rtl_uString_acquire( m_aVec[i] );
166cdf0e10cSrcweir 	}
167cdf0e10cSrcweir }
168cdf0e10cSrcweir 
OEnvironment(const OEnvironment & rOther)169cdf0e10cSrcweir OEnvironment::OEnvironment( const OEnvironment& rOther ) : n_Vars( rOther.n_Vars )
170cdf0e10cSrcweir {
171cdf0e10cSrcweir 	m_aVec = new rtl_uString* [n_Vars];
172cdf0e10cSrcweir 
173cdf0e10cSrcweir 	sal_Int32 i;
174cdf0e10cSrcweir 	for ( i = 0; i < n_Vars; ++i )
175cdf0e10cSrcweir 	{
176cdf0e10cSrcweir 		m_aVec[i] = rOther.m_aVec[i];
177cdf0e10cSrcweir 		rtl_uString_acquire( m_aVec[i] );
178cdf0e10cSrcweir 	}
179cdf0e10cSrcweir }
180cdf0e10cSrcweir 
operator =(const OEnvironment & rOther)181cdf0e10cSrcweir OEnvironment& OEnvironment::operator=( const OEnvironment& rOther )
182cdf0e10cSrcweir {
183cdf0e10cSrcweir 	if ( this != &rOther )
184cdf0e10cSrcweir 	{
185cdf0e10cSrcweir 		sal_Int32 i;
186cdf0e10cSrcweir 		for ( i = 0; i < n_Vars; ++i )
187cdf0e10cSrcweir 			rtl_uString_release( m_aVec[i] );
188cdf0e10cSrcweir 
189cdf0e10cSrcweir 		delete [] m_aVec;
190cdf0e10cSrcweir 
191cdf0e10cSrcweir 		n_Vars = rOther.n_Vars;
192cdf0e10cSrcweir 		m_aVec = new rtl_uString* [n_Vars];
193cdf0e10cSrcweir 		for ( i = 0; i < n_Vars; ++i )
194cdf0e10cSrcweir 		{
195cdf0e10cSrcweir 			m_aVec[i] = rOther.m_aVec[i];
196cdf0e10cSrcweir 			rtl_uString_acquire( m_aVec[i] );
197cdf0e10cSrcweir 		}
198cdf0e10cSrcweir 	}
199cdf0e10cSrcweir 
200cdf0e10cSrcweir 	return *this;
201cdf0e10cSrcweir }
202cdf0e10cSrcweir 
~OEnvironment()203cdf0e10cSrcweir OEnvironment::~OEnvironment()
204cdf0e10cSrcweir {
205cdf0e10cSrcweir 	for( sal_Int32 i = 0; i < n_Vars; ++i ) rtl_uString_release( m_aVec[i] );
206cdf0e10cSrcweir 	delete[] m_aVec;
207cdf0e10cSrcweir }
208cdf0e10cSrcweir 
209cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////////////
210cdf0e10cSrcweir // Process
211cdf0e10cSrcweir 
212cdf0e10cSrcweir 
213cdf0e10cSrcweir VOS_IMPLEMENT_CLASSINFO(
214cdf0e10cSrcweir 	VOS_CLASSNAME(OProcess, vos),
215cdf0e10cSrcweir 	VOS_NAMESPACE(OProcess, vos),
216cdf0e10cSrcweir 	VOS_NAMESPACE(OObject, vos), 0);
217cdf0e10cSrcweir 
218cdf0e10cSrcweir 
OProcess()219cdf0e10cSrcweir OProcess::OProcess( ) :
220cdf0e10cSrcweir 	m_strImageName( ),
221cdf0e10cSrcweir 	m_strDirectory(),
222cdf0e10cSrcweir 	m_Process(0)
223cdf0e10cSrcweir {
224cdf0e10cSrcweir }
225cdf0e10cSrcweir 
226cdf0e10cSrcweir 
OProcess(const rtl::OUString & strImageName)227cdf0e10cSrcweir OProcess::OProcess( const rtl::OUString& strImageName ) :
228cdf0e10cSrcweir 	m_strImageName( strImageName ),
229cdf0e10cSrcweir 	m_strDirectory(),
230cdf0e10cSrcweir 	m_Process(0)
231cdf0e10cSrcweir {
232cdf0e10cSrcweir 	// empty
233cdf0e10cSrcweir }
234cdf0e10cSrcweir 
235cdf0e10cSrcweir 
OProcess(const rtl::OUString & strImageName,const rtl::OUString & strWorkingDirectory)236cdf0e10cSrcweir OProcess::OProcess(const rtl::OUString& strImageName, const rtl::OUString& strWorkingDirectory) :
237cdf0e10cSrcweir 	m_strImageName( strImageName ),
238cdf0e10cSrcweir 	m_strDirectory( strWorkingDirectory ),
239cdf0e10cSrcweir 	m_Process(0)
240cdf0e10cSrcweir {
241cdf0e10cSrcweir 	// empty
242cdf0e10cSrcweir }
243cdf0e10cSrcweir 
244cdf0e10cSrcweir 
~OProcess()245cdf0e10cSrcweir OProcess::~OProcess()
246cdf0e10cSrcweir {
247cdf0e10cSrcweir 	osl_freeProcessHandle(m_Process);
248cdf0e10cSrcweir }
249cdf0e10cSrcweir 
getProcess(TProcessIdentifier Identifier)250cdf0e10cSrcweir OProcess* OProcess::getProcess(TProcessIdentifier Identifier)
251cdf0e10cSrcweir {
252cdf0e10cSrcweir 	oslProcess hProcess = osl_getProcess(Identifier);
253cdf0e10cSrcweir 
254cdf0e10cSrcweir 	if (hProcess)
255cdf0e10cSrcweir 	{
256cdf0e10cSrcweir 		OProcess* pProcess = new OProcess( );
257cdf0e10cSrcweir 
258cdf0e10cSrcweir 		pProcess->m_Process = hProcess;
259cdf0e10cSrcweir 
260cdf0e10cSrcweir 		return pProcess;
261cdf0e10cSrcweir 	}
262cdf0e10cSrcweir 
263cdf0e10cSrcweir 	return 0;
264cdf0e10cSrcweir }
265cdf0e10cSrcweir 
266cdf0e10cSrcweir 
execute(TProcessOption Options,const OArgumentList & aArgumentList,const OEnvironment & aEnvironment)267cdf0e10cSrcweir OProcess::TProcessError OProcess::execute(TProcessOption Options,
268cdf0e10cSrcweir 										  const OArgumentList& aArgumentList,
269cdf0e10cSrcweir 										  const OEnvironment&  aEnvironment )
270cdf0e10cSrcweir {
271cdf0e10cSrcweir 	return ((TProcessError)osl_executeProcess(m_strImageName.pData,
272cdf0e10cSrcweir 								              aArgumentList.m_aVec,
273cdf0e10cSrcweir 											  aArgumentList.n_Args,
274cdf0e10cSrcweir 											  Options,
275cdf0e10cSrcweir 								              0,
276cdf0e10cSrcweir 								              m_strDirectory.pData,
277cdf0e10cSrcweir 								              aEnvironment.m_aVec,
278cdf0e10cSrcweir 											  aEnvironment.n_Vars,
279cdf0e10cSrcweir 											  &m_Process));
280cdf0e10cSrcweir }
281cdf0e10cSrcweir 
282cdf0e10cSrcweir 
execute(TProcessOption Options,const OSecurity & Security,const OArgumentList & aArgumentList,const OEnvironment & aEnvironment)283cdf0e10cSrcweir OProcess::TProcessError OProcess::execute( TProcessOption Options,
284cdf0e10cSrcweir 										   const OSecurity &Security,
285cdf0e10cSrcweir 										   const OArgumentList& aArgumentList,
286cdf0e10cSrcweir 										   const OEnvironment&  aEnvironment )
287cdf0e10cSrcweir {
288cdf0e10cSrcweir 	return ((TProcessError)osl_executeProcess(m_strImageName.pData,
289cdf0e10cSrcweir 								              aArgumentList.m_aVec,
290cdf0e10cSrcweir 											  aArgumentList.n_Args,
291cdf0e10cSrcweir 											  Options,
292cdf0e10cSrcweir 								              Security,
293cdf0e10cSrcweir 								              m_strDirectory.pData,
294cdf0e10cSrcweir 								              aEnvironment.m_aVec,
295cdf0e10cSrcweir 											  aEnvironment.n_Vars,
296cdf0e10cSrcweir 											  &m_Process));
297cdf0e10cSrcweir }
298cdf0e10cSrcweir 
299cdf0e10cSrcweir 
terminate()300cdf0e10cSrcweir OProcess::TProcessError OProcess::terminate()
301cdf0e10cSrcweir {
302cdf0e10cSrcweir    return (TProcessError)osl_terminateProcess(m_Process);
303cdf0e10cSrcweir }
304cdf0e10cSrcweir 
getInfo(TProcessData Data,TProcessInfo * pInfo) const305cdf0e10cSrcweir OProcess::TProcessError OProcess::getInfo(TProcessData Data, TProcessInfo* pInfo) const
306cdf0e10cSrcweir {
307cdf0e10cSrcweir    return (TProcessError)osl_getProcessInfo(m_Process, Data, pInfo);
308cdf0e10cSrcweir }
309cdf0e10cSrcweir 
getCurrentInfo(TProcessData Data,TProcessInfo * pInfo)310cdf0e10cSrcweir OProcess::TProcessError OProcess::getCurrentInfo(TProcessData Data, TProcessInfo* pInfo)
311cdf0e10cSrcweir {
312cdf0e10cSrcweir    return (TProcessError)osl_getProcessInfo(0, Data, pInfo);
313cdf0e10cSrcweir }
314cdf0e10cSrcweir 
join()315cdf0e10cSrcweir OProcess::TProcessError OProcess::join()
316cdf0e10cSrcweir {
317cdf0e10cSrcweir 	return (TProcessError)osl_joinProcess(m_Process);
318cdf0e10cSrcweir }
319cdf0e10cSrcweir 
320cdf0e10cSrcweir 
321cdf0e10cSrcweir /*
322cdf0e10cSrcweir OProcess::TProcessError OProcess::searchPath(const sal_Char* Name, sal_Char *Buffer, sal_uInt32 Max,
323cdf0e10cSrcweir                                              const sal_Char* Path, sal_Char Separator)
324cdf0e10cSrcweir {
325cdf0e10cSrcweir 	return (TProcessError)osl_searchPath(Name, Path, Separator, Buffer, Max);
326cdf0e10cSrcweir }
327cdf0e10cSrcweir */
328cdf0e10cSrcweir 
329cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////////////
330cdf0e10cSrcweir // StartupInfo
331cdf0e10cSrcweir 
332cdf0e10cSrcweir VOS_IMPLEMENT_CLASSINFO(
333cdf0e10cSrcweir 	VOS_CLASSNAME(OStartupInfo, vos),
334cdf0e10cSrcweir 	VOS_NAMESPACE(OStartupInfo, vos),
335cdf0e10cSrcweir 	VOS_NAMESPACE(OObject, vos), 0);
336cdf0e10cSrcweir 
OStartupInfo()337cdf0e10cSrcweir OStartupInfo::OStartupInfo()
338cdf0e10cSrcweir {
339cdf0e10cSrcweir }
340cdf0e10cSrcweir 
~OStartupInfo()341cdf0e10cSrcweir OStartupInfo::~OStartupInfo()
342cdf0e10cSrcweir {
343cdf0e10cSrcweir }
344cdf0e10cSrcweir 
getExecutableFile(rtl::OUString & strImageName) const345cdf0e10cSrcweir OStartupInfo::TStartupError OStartupInfo::getExecutableFile(
346cdf0e10cSrcweir     rtl::OUString& strImageName ) const
347cdf0e10cSrcweir {
348cdf0e10cSrcweir 	return (TStartupError) osl_getExecutableFile( &strImageName.pData );
349cdf0e10cSrcweir }
350cdf0e10cSrcweir 
351cdf0e10cSrcweir 
getCommandArg(sal_uInt32 nArg,rtl::OUString & strCommandArg)352cdf0e10cSrcweir OStartupInfo::TStartupError OStartupInfo::getCommandArg(sal_uInt32 nArg, rtl::OUString& strCommandArg)
353cdf0e10cSrcweir {
354cdf0e10cSrcweir 	return ( TStartupError ) osl_getCommandArg( nArg,&strCommandArg.pData );
355cdf0e10cSrcweir }
356cdf0e10cSrcweir 
getCommandArgCount()357cdf0e10cSrcweir sal_uInt32 OStartupInfo::getCommandArgCount()
358cdf0e10cSrcweir {
359cdf0e10cSrcweir 	return osl_getCommandArgCount();
360cdf0e10cSrcweir }
361cdf0e10cSrcweir 
getEnvironment(const rtl::OUString & strVar,rtl::OUString & strValue)362cdf0e10cSrcweir OStartupInfo::TStartupError OStartupInfo::getEnvironment(const rtl::OUString& strVar,
363cdf0e10cSrcweir 														 rtl::OUString& strValue)
364cdf0e10cSrcweir {
365cdf0e10cSrcweir 	return ( TStartupError ) osl_getEnvironment( strVar.pData, &strValue.pData );
366cdf0e10cSrcweir }
367cdf0e10cSrcweir 
368cdf0e10cSrcweir 
369cdf0e10cSrcweir 
370cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////////////
371cdf0e10cSrcweir //
372cdf0e10cSrcweir // OExtCommandLineImpl
373cdf0e10cSrcweir //
374cdf0e10cSrcweir 
375cdf0e10cSrcweir namespace vos
376cdf0e10cSrcweir {
377cdf0e10cSrcweir 
378cdf0e10cSrcweir class OExtCommandLineImpl
379cdf0e10cSrcweir {
380cdf0e10cSrcweir     void init();
381cdf0e10cSrcweir 
382cdf0e10cSrcweir     ::std::vector< ::rtl::OUString > aExtArgVector;
383cdf0e10cSrcweir     sal_uInt32 m_nArgCount;
384cdf0e10cSrcweir 
385cdf0e10cSrcweir public:
386cdf0e10cSrcweir 
387cdf0e10cSrcweir     OExtCommandLineImpl();
388cdf0e10cSrcweir     ~OExtCommandLineImpl();
389cdf0e10cSrcweir 
390cdf0e10cSrcweir     sal_uInt32 SAL_CALL getCommandArgCount();
391cdf0e10cSrcweir 
392cdf0e10cSrcweir     sal_Bool SAL_CALL getCommandArg(sal_uInt32 nArg, ::rtl::OUString& strCommandArg);
393cdf0e10cSrcweir };
394cdf0e10cSrcweir 
395cdf0e10cSrcweir }
396cdf0e10cSrcweir 
OExtCommandLineImpl()397cdf0e10cSrcweir OExtCommandLineImpl::OExtCommandLineImpl()
398cdf0e10cSrcweir     : m_nArgCount(0)
399cdf0e10cSrcweir {
400cdf0e10cSrcweir     init();
401cdf0e10cSrcweir }
402cdf0e10cSrcweir 
~OExtCommandLineImpl()403cdf0e10cSrcweir OExtCommandLineImpl::~OExtCommandLineImpl()
404cdf0e10cSrcweir {
405cdf0e10cSrcweir 
406cdf0e10cSrcweir }
407cdf0e10cSrcweir 
408cdf0e10cSrcweir 
getCommandArgCount()409cdf0e10cSrcweir sal_uInt32 SAL_CALL OExtCommandLineImpl::getCommandArgCount()
410cdf0e10cSrcweir {
411cdf0e10cSrcweir     return m_nArgCount;
412cdf0e10cSrcweir }
413cdf0e10cSrcweir 
414cdf0e10cSrcweir 
getCommandArg(sal_uInt32 nArg,::rtl::OUString & strCommandArg)415cdf0e10cSrcweir sal_Bool SAL_CALL OExtCommandLineImpl::getCommandArg(sal_uInt32 nArg, ::rtl::OUString& strCommandArg)
416cdf0e10cSrcweir {
417cdf0e10cSrcweir     if ( nArg >= m_nArgCount )
418cdf0e10cSrcweir     {
419cdf0e10cSrcweir         return sal_False;
420cdf0e10cSrcweir     }
421cdf0e10cSrcweir 
422cdf0e10cSrcweir     strCommandArg = aExtArgVector[nArg];
423cdf0e10cSrcweir 
424cdf0e10cSrcweir     return sal_True;
425cdf0e10cSrcweir }
426cdf0e10cSrcweir 
427cdf0e10cSrcweir 
init()428cdf0e10cSrcweir void OExtCommandLineImpl::init()
429cdf0e10cSrcweir {
430cdf0e10cSrcweir     OStartupInfo aStartInfo;
431cdf0e10cSrcweir     sal_uInt32 nIndex=0;
432cdf0e10cSrcweir     sal_uInt32 nArgs = aStartInfo.getCommandArgCount();
433cdf0e10cSrcweir 
434cdf0e10cSrcweir     for ( nIndex = 0 ; nIndex < nArgs ; ++nIndex )
435cdf0e10cSrcweir     {
436cdf0e10cSrcweir         ::rtl::OUString aString;
437cdf0e10cSrcweir         aStartInfo.getCommandArg(nIndex,aString);
438cdf0e10cSrcweir 
439cdf0e10cSrcweir         if ( aString[0] == (sal_Unicode) '@' )
440cdf0e10cSrcweir         {
441cdf0e10cSrcweir             ::rtl::OUString aFileName = aString.copy(1);
442cdf0e10cSrcweir             ::osl::File aFile(aFileName);
443cdf0e10cSrcweir             ::rtl::ByteSequence aSeq;
444cdf0e10cSrcweir 
445cdf0e10cSrcweir             ::osl::FileBase::RC aErr = aFile.open(OpenFlag_Read);
446cdf0e10cSrcweir 
447cdf0e10cSrcweir             if ( aErr != ::osl::FileBase::E_None )
448cdf0e10cSrcweir             {
449cdf0e10cSrcweir                 break;
450cdf0e10cSrcweir             }
451cdf0e10cSrcweir 
452cdf0e10cSrcweir             do
453cdf0e10cSrcweir             {
454cdf0e10cSrcweir                 aErr = aFile.readLine(aSeq);
455cdf0e10cSrcweir                 if ( aSeq.getLength() != 0 )
456cdf0e10cSrcweir                 {
457cdf0e10cSrcweir                     ::rtl::OUString newString((sal_Char*)aSeq.getArray(), aSeq.getLength(), RTL_TEXTENCODING_ASCII_US);
458cdf0e10cSrcweir                     aExtArgVector.push_back( newString );
459cdf0e10cSrcweir                     m_nArgCount++;
460cdf0e10cSrcweir                 }
461cdf0e10cSrcweir             }
462cdf0e10cSrcweir             while ( aErr == ::osl::FileBase::E_None && aSeq.getLength() > 0 );
463cdf0e10cSrcweir 
464cdf0e10cSrcweir 			aFile.close();
465cdf0e10cSrcweir 			aFile.remove(aFileName);
466cdf0e10cSrcweir         }
467cdf0e10cSrcweir         else
468cdf0e10cSrcweir         {
469cdf0e10cSrcweir             aExtArgVector.push_back( aString );
470cdf0e10cSrcweir             m_nArgCount++;
471cdf0e10cSrcweir         }
472cdf0e10cSrcweir     }
473cdf0e10cSrcweir }
474cdf0e10cSrcweir 
475cdf0e10cSrcweir 
476cdf0e10cSrcweir 
477cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////////////
478cdf0e10cSrcweir //
479cdf0e10cSrcweir // OExtCommandLine
480cdf0e10cSrcweir //
481cdf0e10cSrcweir 
482cdf0e10cSrcweir namespace
483cdf0e10cSrcweir {
484cdf0e10cSrcweir     struct lclMutex : public rtl::Static< vos::OMutex, lclMutex > {};
485cdf0e10cSrcweir }
486cdf0e10cSrcweir 
487cdf0e10cSrcweir OExtCommandLineImpl* OExtCommandLine::pExtImpl=0;
488cdf0e10cSrcweir 
489cdf0e10cSrcweir 
490cdf0e10cSrcweir VOS_IMPLEMENT_CLASSINFO(
491cdf0e10cSrcweir 	VOS_CLASSNAME(OExtCommandLine, vos),
492cdf0e10cSrcweir 	VOS_NAMESPACE(OExtCommandLine, vos),
493cdf0e10cSrcweir 	VOS_NAMESPACE(OObject, vos), 0);
494cdf0e10cSrcweir 
OExtCommandLine()495cdf0e10cSrcweir OExtCommandLine::OExtCommandLine()
496cdf0e10cSrcweir {
497cdf0e10cSrcweir     OGuard Guard(lclMutex::get());
498cdf0e10cSrcweir 
499cdf0e10cSrcweir     if ( pExtImpl == NULL )
500cdf0e10cSrcweir     {
501cdf0e10cSrcweir         pExtImpl = new OExtCommandLineImpl;
502cdf0e10cSrcweir     }
503cdf0e10cSrcweir }
504cdf0e10cSrcweir 
~OExtCommandLine()505cdf0e10cSrcweir OExtCommandLine::~OExtCommandLine()
506cdf0e10cSrcweir {
507cdf0e10cSrcweir 
508cdf0e10cSrcweir 
509cdf0e10cSrcweir }
510cdf0e10cSrcweir 
getCommandArgCount()511cdf0e10cSrcweir sal_uInt32 SAL_CALL OExtCommandLine::getCommandArgCount()
512cdf0e10cSrcweir {
513cdf0e10cSrcweir     return pExtImpl->getCommandArgCount();
514cdf0e10cSrcweir }
515cdf0e10cSrcweir 
516cdf0e10cSrcweir 
getCommandArg(sal_uInt32 nArg,::rtl::OUString & strCommandArg)517cdf0e10cSrcweir sal_Bool SAL_CALL OExtCommandLine::getCommandArg(sal_uInt32 nArg, ::rtl::OUString& strCommandArg)
518cdf0e10cSrcweir {
519cdf0e10cSrcweir     return pExtImpl->getCommandArg(nArg,strCommandArg);
520cdf0e10cSrcweir }
521cdf0e10cSrcweir 
522