xref: /aoo42x/main/sal/osl/os2/file_path_helper.cxx (revision 87d2adbc)
1*87d2adbcSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*87d2adbcSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*87d2adbcSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*87d2adbcSAndrew Rist  * distributed with this work for additional information
6*87d2adbcSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*87d2adbcSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*87d2adbcSAndrew Rist  * "License"); you may not use this file except in compliance
9*87d2adbcSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*87d2adbcSAndrew Rist  *
11*87d2adbcSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*87d2adbcSAndrew Rist  *
13*87d2adbcSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*87d2adbcSAndrew Rist  * software distributed under the License is distributed on an
15*87d2adbcSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*87d2adbcSAndrew Rist  * KIND, either express or implied.  See the License for the
17*87d2adbcSAndrew Rist  * specific language governing permissions and limitations
18*87d2adbcSAndrew Rist  * under the License.
19*87d2adbcSAndrew Rist  *
20*87d2adbcSAndrew Rist  *************************************************************/
21*87d2adbcSAndrew Rist 
22*87d2adbcSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir  /*******************************************
25cdf0e10cSrcweir  	Includes
26cdf0e10cSrcweir   ******************************************/
27cdf0e10cSrcweir 
28cdf0e10cSrcweir  #ifndef _OSL_THREAD_H_
29cdf0e10cSrcweir  #include "osl/thread.h"
30cdf0e10cSrcweir  #endif
31cdf0e10cSrcweir 
32cdf0e10cSrcweir  #ifndef _OSL_FILE_PATH_HELPER_H_
33cdf0e10cSrcweir  #include "file_path_helper.h"
34cdf0e10cSrcweir  #endif
35cdf0e10cSrcweir 
36cdf0e10cSrcweir  #ifndef _OSL_FILE_PATH_HELPER_HXX_
37cdf0e10cSrcweir  #include "file_path_helper.hxx"
38cdf0e10cSrcweir  #endif
39cdf0e10cSrcweir 
40cdf0e10cSrcweir  #ifndef _OSL_UUNXAPI_HXX_
41cdf0e10cSrcweir  #include "uunxapi.hxx"
42cdf0e10cSrcweir  #endif
43cdf0e10cSrcweir 
44cdf0e10cSrcweir  #ifndef _OSL_DIAGNOSE_H_
45cdf0e10cSrcweir  #include <osl/diagnose.h>
46cdf0e10cSrcweir  #endif
47cdf0e10cSrcweir 
48cdf0e10cSrcweir  #ifndef _RTL_USTRING_HXX_
49cdf0e10cSrcweir  #include <rtl/ustring.hxx>
50cdf0e10cSrcweir  #endif
51cdf0e10cSrcweir 
52cdf0e10cSrcweir  /*******************************************
53cdf0e10cSrcweir  	Constants
54cdf0e10cSrcweir   ******************************************/
55cdf0e10cSrcweir 
56cdf0e10cSrcweir   const sal_Unicode FPH_CHAR_PATH_SEPARATOR = (sal_Unicode)'\\';
57cdf0e10cSrcweir   const sal_Unicode FPH_CHAR_DOT            = (sal_Unicode)'.';
58cdf0e10cSrcweir   const sal_Unicode FPH_CHAR_COLON          = (sal_Unicode)':';
59cdf0e10cSrcweir 
FPH_PATH_SEPARATOR()60cdf0e10cSrcweir   inline const rtl::OUString FPH_PATH_SEPARATOR()
61cdf0e10cSrcweir       { return rtl::OUString::createFromAscii("\\"); }
FPH_LOCAL_DIR_ENTRY()62cdf0e10cSrcweir   inline const rtl::OUString FPH_LOCAL_DIR_ENTRY()
63cdf0e10cSrcweir       { return rtl::OUString::createFromAscii("."); }
FPH_PARENT_DIR_ENTRY()64cdf0e10cSrcweir   inline const rtl::OUString FPH_PARENT_DIR_ENTRY()
65cdf0e10cSrcweir       { return rtl::OUString::createFromAscii(".."); }
66cdf0e10cSrcweir 
67cdf0e10cSrcweir  /*******************************************
68cdf0e10cSrcweir   *  osl_systemPathRemoveSeparator
69cdf0e10cSrcweir   ******************************************/
70cdf0e10cSrcweir 
osl_systemPathRemoveSeparator(rtl_uString * pustrPath)71cdf0e10cSrcweir  void SAL_CALL osl_systemPathRemoveSeparator(rtl_uString* pustrPath)
72cdf0e10cSrcweir  {
73cdf0e10cSrcweir  	OSL_PRECOND(pustrPath, "osl_systemPathRemoveSeparator: Invalid parameter");
74cdf0e10cSrcweir 
75cdf0e10cSrcweir 	// maybe there are more than one separator at end
76cdf0e10cSrcweir 	// so we run in a loop
77cdf0e10cSrcweir 	while ((pustrPath->length > 1) && (FPH_CHAR_PATH_SEPARATOR == pustrPath->buffer[pustrPath->length - 1]))
78cdf0e10cSrcweir 	{
79cdf0e10cSrcweir 		pustrPath->length--;
80cdf0e10cSrcweir 		pustrPath->buffer[pustrPath->length] = (sal_Unicode)'\0';
81cdf0e10cSrcweir 	}
82cdf0e10cSrcweir 
83cdf0e10cSrcweir 	OSL_POSTCOND((0 == pustrPath->length) || (1 == pustrPath->length) || \
84cdf0e10cSrcweir 				 (pustrPath->length > 1 && pustrPath->buffer[pustrPath->length - 1] != FPH_CHAR_PATH_SEPARATOR), \
85cdf0e10cSrcweir 				 "osl_systemPathRemoveSeparator: Post condition failed");
86cdf0e10cSrcweir  }
87cdf0e10cSrcweir 
88cdf0e10cSrcweir  /*******************************************
89cdf0e10cSrcweir     osl_systemPathEnsureSeparator
90cdf0e10cSrcweir   ******************************************/
91cdf0e10cSrcweir 
osl_systemPathEnsureSeparator(rtl_uString ** ppustrPath)92cdf0e10cSrcweir  void SAL_CALL osl_systemPathEnsureSeparator(rtl_uString** ppustrPath)
93cdf0e10cSrcweir  {
94cdf0e10cSrcweir  	OSL_PRECOND(ppustrPath && (NULL != *ppustrPath), \
95cdf0e10cSrcweir 				"osl_systemPathEnsureSeparator: Invalid parameter");
96cdf0e10cSrcweir 
97cdf0e10cSrcweir  	rtl::OUString path(*ppustrPath);
98cdf0e10cSrcweir 	sal_Int32	  lp = path.getLength();
99cdf0e10cSrcweir 	sal_Int32     i  = path.lastIndexOf(FPH_CHAR_PATH_SEPARATOR);
100cdf0e10cSrcweir 
101cdf0e10cSrcweir 	if ((lp > 1 && i != (lp - 1)) || ((lp < 2) && i < 0))
102cdf0e10cSrcweir 	{
103cdf0e10cSrcweir 		path += FPH_PATH_SEPARATOR();
104cdf0e10cSrcweir 		rtl_uString_assign(ppustrPath, path.pData);
105cdf0e10cSrcweir 	}
106cdf0e10cSrcweir 
107cdf0e10cSrcweir 	OSL_POSTCOND(path.lastIndexOf(FPH_CHAR_PATH_SEPARATOR) == (path.getLength() - 1), \
108cdf0e10cSrcweir 				 "osl_systemPathEnsureSeparator: Post condition failed");
109cdf0e10cSrcweir  }
110cdf0e10cSrcweir 
111cdf0e10cSrcweir  /*******************************************
112cdf0e10cSrcweir   *  osl_systemPathIsRelativePath
113cdf0e10cSrcweir   ******************************************/
114cdf0e10cSrcweir 
osl_systemPathIsRelativePath(const rtl_uString * pustrPath)115cdf0e10cSrcweir  sal_Bool SAL_CALL osl_systemPathIsRelativePath(const rtl_uString* pustrPath)
116cdf0e10cSrcweir  {
117cdf0e10cSrcweir  	OSL_PRECOND(pustrPath, "osl_systemPathIsRelativePath: Invalid parameter");
118cdf0e10cSrcweir  	return (!osl_systemPathIsAbsolutePath(pustrPath));
119cdf0e10cSrcweir  }
120cdf0e10cSrcweir 
121cdf0e10cSrcweir  /******************************************
122cdf0e10cSrcweir   *  osl_systemPathIsAbsolutePath
123cdf0e10cSrcweir   *****************************************/
124cdf0e10cSrcweir 
osl_systemPathIsAbsolutePath(const rtl_uString * pustrPath)125cdf0e10cSrcweir  sal_Bool SAL_CALL osl_systemPathIsAbsolutePath(const rtl_uString* pustrPath)
126cdf0e10cSrcweir  {
127cdf0e10cSrcweir  	OSL_PRECOND(pustrPath, "osl_systemPathIsAbsolutePath: Invalid parameter");
128cdf0e10cSrcweir 	if (pustrPath->length == 0)
129cdf0e10cSrcweir 		return sal_False;
130cdf0e10cSrcweir 	if (pustrPath->buffer[0] == FPH_CHAR_PATH_SEPARATOR)
131cdf0e10cSrcweir 		return sal_True;
132cdf0e10cSrcweir 	if (pustrPath->buffer[1] == FPH_CHAR_COLON
133cdf0e10cSrcweir 		    && pustrPath->buffer[2] == FPH_CHAR_PATH_SEPARATOR)
134cdf0e10cSrcweir 		return sal_True;
135cdf0e10cSrcweir 	return sal_False;
136cdf0e10cSrcweir  }
137cdf0e10cSrcweir 
138cdf0e10cSrcweir  /******************************************
139cdf0e10cSrcweir     osl_systemPathMakeAbsolutePath
140cdf0e10cSrcweir   *****************************************/
141cdf0e10cSrcweir 
osl_systemPathMakeAbsolutePath(const rtl_uString * pustrBasePath,const rtl_uString * pustrRelPath,rtl_uString ** ppustrAbsolutePath)142cdf0e10cSrcweir  void SAL_CALL osl_systemPathMakeAbsolutePath(
143cdf0e10cSrcweir  	const rtl_uString* pustrBasePath,
144cdf0e10cSrcweir 	const rtl_uString* pustrRelPath,
145cdf0e10cSrcweir 	rtl_uString** 	   ppustrAbsolutePath)
146cdf0e10cSrcweir {
147cdf0e10cSrcweir 	rtl::OUString base(rtl_uString_getStr(const_cast<rtl_uString*>(pustrBasePath)));
148cdf0e10cSrcweir 	rtl::OUString rel(const_cast<rtl_uString*>(pustrRelPath));
149cdf0e10cSrcweir 
150cdf0e10cSrcweir 	if (base.getLength() > 0)
151cdf0e10cSrcweir 		osl_systemPathEnsureSeparator(&base.pData);
152cdf0e10cSrcweir 
153cdf0e10cSrcweir 	base += rel;
154cdf0e10cSrcweir 
155cdf0e10cSrcweir 	rtl_uString_acquire(base.pData);
156cdf0e10cSrcweir 	*ppustrAbsolutePath = base.pData;
157cdf0e10cSrcweir }
158cdf0e10cSrcweir 
159cdf0e10cSrcweir 
160cdf0e10cSrcweir  /*****************************************
161cdf0e10cSrcweir 	osl_systemPathGetParent
162cdf0e10cSrcweir   ****************************************/
163cdf0e10cSrcweir 
osl_systemPathGetParent(rtl_uString * pustrPath)164cdf0e10cSrcweir  sal_Int32 SAL_CALL osl_systemPathGetParent(rtl_uString* pustrPath)
165cdf0e10cSrcweir  {
166cdf0e10cSrcweir  	return 0;
167cdf0e10cSrcweir  }
168cdf0e10cSrcweir 
169cdf0e10cSrcweir  /*******************************************
170cdf0e10cSrcweir  	osl_systemPathGetFileOrLastDirectoryPart
171cdf0e10cSrcweir   ******************************************/
172cdf0e10cSrcweir 
osl_systemPathGetFileNameOrLastDirectoryPart(const rtl_uString * pustrPath,rtl_uString ** ppustrFileNameOrLastDirPart)173cdf0e10cSrcweir  void SAL_CALL osl_systemPathGetFileNameOrLastDirectoryPart(
174cdf0e10cSrcweir  	const rtl_uString* 	pustrPath,
175cdf0e10cSrcweir 	rtl_uString** 		ppustrFileNameOrLastDirPart)
176cdf0e10cSrcweir {
177cdf0e10cSrcweir 	OSL_PRECOND(pustrPath && ppustrFileNameOrLastDirPart, \
178cdf0e10cSrcweir 			    "osl_systemPathGetFileNameOrLastDirectoryPart: Invalid parameter");
179cdf0e10cSrcweir 
180cdf0e10cSrcweir 	rtl::OUString path(const_cast<rtl_uString*>(pustrPath));
181cdf0e10cSrcweir 
182cdf0e10cSrcweir 	osl_systemPathRemoveSeparator(path.pData);
183cdf0e10cSrcweir 
184cdf0e10cSrcweir 	rtl::OUString last_part;
185cdf0e10cSrcweir 
186cdf0e10cSrcweir 	if (path.getLength() > 1 || (1 == path.getLength() && *path.getStr() != FPH_CHAR_PATH_SEPARATOR))
187cdf0e10cSrcweir 	{
188cdf0e10cSrcweir 		sal_Int32 idx_ps = path.lastIndexOf(FPH_CHAR_PATH_SEPARATOR);
189cdf0e10cSrcweir 		idx_ps++; // always right to increment by one even if idx_ps == -1!
190cdf0e10cSrcweir 		last_part = rtl::OUString(path.getStr() + idx_ps);
191cdf0e10cSrcweir 	}
192cdf0e10cSrcweir 	rtl_uString_assign(ppustrFileNameOrLastDirPart, last_part.pData);
193cdf0e10cSrcweir }
194cdf0e10cSrcweir 
195cdf0e10cSrcweir 
196cdf0e10cSrcweir  /********************************************
197cdf0e10cSrcweir  	osl_systemPathIsHiddenFileOrDirectoryEntry
198cdf0e10cSrcweir  *********************************************/
199cdf0e10cSrcweir 
osl_systemPathIsHiddenFileOrDirectoryEntry(const rtl_uString * pustrPath)200cdf0e10cSrcweir  sal_Bool SAL_CALL osl_systemPathIsHiddenFileOrDirectoryEntry(
201cdf0e10cSrcweir  	const rtl_uString* pustrPath)
202cdf0e10cSrcweir {
203cdf0e10cSrcweir 	OSL_PRECOND(pustrPath, "osl_systemPathIsHiddenFileOrDirectoryEntry: Invalid parameter");
204cdf0e10cSrcweir 
205cdf0e10cSrcweir 	sal_Bool is_hidden = sal_False;
206cdf0e10cSrcweir 
207cdf0e10cSrcweir 	if (pustrPath->length > 0)
208cdf0e10cSrcweir 	{
209cdf0e10cSrcweir 		rtl::OUString fdp;
210cdf0e10cSrcweir 
211cdf0e10cSrcweir 		osl_systemPathGetFileNameOrLastDirectoryPart(pustrPath, &fdp.pData);
212cdf0e10cSrcweir 
213cdf0e10cSrcweir 		is_hidden = ((fdp.pData->length > 0) && (fdp.pData->buffer[0] == FPH_CHAR_DOT) &&
214cdf0e10cSrcweir 					 !osl_systemPathIsLocalOrParentDirectoryEntry(fdp.pData));
215cdf0e10cSrcweir  	}
216cdf0e10cSrcweir 
217cdf0e10cSrcweir 	return is_hidden;
218cdf0e10cSrcweir }
219cdf0e10cSrcweir 
220cdf0e10cSrcweir 
221cdf0e10cSrcweir  /************************************************
222cdf0e10cSrcweir  	osl_systemPathIsLocalOrParentDirectoryEntry
223cdf0e10cSrcweir  ************************************************/
224cdf0e10cSrcweir 
osl_systemPathIsLocalOrParentDirectoryEntry(const rtl_uString * pustrPath)225cdf0e10cSrcweir sal_Bool SAL_CALL osl_systemPathIsLocalOrParentDirectoryEntry(
226cdf0e10cSrcweir 	const rtl_uString* pustrPath)
227cdf0e10cSrcweir {
228cdf0e10cSrcweir 	OSL_PRECOND(pustrPath, "osl_systemPathIsLocalOrParentDirectoryEntry: Invalid parameter");
229cdf0e10cSrcweir 
230cdf0e10cSrcweir 	rtl::OUString dirent;
231cdf0e10cSrcweir 
232cdf0e10cSrcweir 	osl_systemPathGetFileNameOrLastDirectoryPart(pustrPath, &dirent.pData);
233cdf0e10cSrcweir 
234cdf0e10cSrcweir 	return (
235cdf0e10cSrcweir 	        (dirent == FPH_LOCAL_DIR_ENTRY()) ||
236cdf0e10cSrcweir 	        (dirent == FPH_PARENT_DIR_ENTRY())
237cdf0e10cSrcweir 	       );
238cdf0e10cSrcweir }
239cdf0e10cSrcweir 
240cdf0e10cSrcweir /***********************************************
241cdf0e10cSrcweir  Simple iterator for a path list separated by
242cdf0e10cSrcweir  the specified character
243cdf0e10cSrcweir  **********************************************/
244cdf0e10cSrcweir 
245cdf0e10cSrcweir class path_list_iterator
246cdf0e10cSrcweir {
247cdf0e10cSrcweir public:
248cdf0e10cSrcweir 
249cdf0e10cSrcweir 	/******************************************
250cdf0e10cSrcweir  	 constructor
251cdf0e10cSrcweir 
252cdf0e10cSrcweir 	 after construction get_current_item
253cdf0e10cSrcweir 	 returns the first path in list, no need
254cdf0e10cSrcweir 	 to call reset first
255cdf0e10cSrcweir 	 *****************************************/
path_list_iterator(const rtl::OUString & path_list,sal_Unicode list_separator=FPH_CHAR_COLON)256cdf0e10cSrcweir 	path_list_iterator(const rtl::OUString& path_list, sal_Unicode list_separator = FPH_CHAR_COLON) :
257cdf0e10cSrcweir 		m_path_list(path_list),
258cdf0e10cSrcweir 		m_end(m_path_list.getStr() + m_path_list.getLength() + 1),
259cdf0e10cSrcweir 		m_separator(list_separator)
260cdf0e10cSrcweir 	{
261cdf0e10cSrcweir 		reset();
262cdf0e10cSrcweir 	}
263cdf0e10cSrcweir 
264cdf0e10cSrcweir 	/******************************************
265cdf0e10cSrcweir 	 reset the iterator
266cdf0e10cSrcweir 	 *****************************************/
reset()267cdf0e10cSrcweir 	void reset()
268cdf0e10cSrcweir 	{
269cdf0e10cSrcweir 		m_path_segment_begin = m_path_segment_end = m_path_list.getStr();
270cdf0e10cSrcweir 		advance();
271cdf0e10cSrcweir 	}
272cdf0e10cSrcweir 
273cdf0e10cSrcweir 	/******************************************
274cdf0e10cSrcweir 	 move the iterator to the next position
275cdf0e10cSrcweir 	 *****************************************/
next()276cdf0e10cSrcweir 	void next()
277cdf0e10cSrcweir 	{
278cdf0e10cSrcweir 		OSL_PRECOND(!done(), "path_list_iterator: Already done!");
279cdf0e10cSrcweir 
280cdf0e10cSrcweir 		m_path_segment_begin = ++m_path_segment_end;
281cdf0e10cSrcweir 		advance();
282cdf0e10cSrcweir 	}
283cdf0e10cSrcweir 
284cdf0e10cSrcweir 	/******************************************
285cdf0e10cSrcweir 	 check if done
286cdf0e10cSrcweir 	 *****************************************/
done() const287cdf0e10cSrcweir 	bool done() const
288cdf0e10cSrcweir 	{
289cdf0e10cSrcweir 		return (m_path_segment_end >= m_end);
290cdf0e10cSrcweir 	}
291cdf0e10cSrcweir 
292cdf0e10cSrcweir 	/******************************************
293cdf0e10cSrcweir 	 return the current item
294cdf0e10cSrcweir 	 *****************************************/
get_current_item() const295cdf0e10cSrcweir 	rtl::OUString get_current_item() const
296cdf0e10cSrcweir 	{
297cdf0e10cSrcweir 		return rtl::OUString(
298cdf0e10cSrcweir 			m_path_segment_begin,
299cdf0e10cSrcweir 			(m_path_segment_end - m_path_segment_begin));
300cdf0e10cSrcweir 	}
301cdf0e10cSrcweir 
302cdf0e10cSrcweir private:
303cdf0e10cSrcweir 
304cdf0e10cSrcweir 	/******************************************
305cdf0e10cSrcweir 	 move m_path_end to the next separator or
306cdf0e10cSrcweir 	 to the edn of the string
307cdf0e10cSrcweir 	 *****************************************/
advance()308cdf0e10cSrcweir 	void advance()
309cdf0e10cSrcweir 	{
310cdf0e10cSrcweir 		while (!done() && *m_path_segment_end && (*m_path_segment_end != m_separator))
311cdf0e10cSrcweir 			++m_path_segment_end;
312cdf0e10cSrcweir 
313cdf0e10cSrcweir 		OSL_ASSERT(m_path_segment_end <= m_end);
314cdf0e10cSrcweir 	}
315cdf0e10cSrcweir 
316cdf0e10cSrcweir private:
317cdf0e10cSrcweir 	rtl::OUString 		m_path_list;
318cdf0e10cSrcweir 	const sal_Unicode*  m_end;
319cdf0e10cSrcweir 	const sal_Unicode 	m_separator;
320cdf0e10cSrcweir 	const sal_Unicode*  m_path_segment_begin;
321cdf0e10cSrcweir 	const sal_Unicode*  m_path_segment_end;
322cdf0e10cSrcweir 
323cdf0e10cSrcweir // prevent copy and assignment
324cdf0e10cSrcweir private:
325cdf0e10cSrcweir 	/******************************************
326cdf0e10cSrcweir 	 copy constructor
327cdf0e10cSrcweir 	 remember: do not simply copy m_path_begin
328cdf0e10cSrcweir 	 and m_path_end because they point to
329cdf0e10cSrcweir 	 the memory of other.m_path_list!
330cdf0e10cSrcweir 	 *****************************************/
331cdf0e10cSrcweir 	path_list_iterator(const path_list_iterator& other);
332cdf0e10cSrcweir 
333cdf0e10cSrcweir 	/******************************************
334cdf0e10cSrcweir 	 assignment operator
335cdf0e10cSrcweir  	 remember: do not simply copy m_path_begin
336cdf0e10cSrcweir 	 and m_path_end because they point to
337cdf0e10cSrcweir 	 the memory of other.m_path_list!
338cdf0e10cSrcweir 	 *****************************************/
339cdf0e10cSrcweir 	path_list_iterator& operator=(const path_list_iterator& other);
340cdf0e10cSrcweir };
341cdf0e10cSrcweir 
342cdf0e10cSrcweir  /************************************************
343cdf0e10cSrcweir   	osl_searchPath
344cdf0e10cSrcweir   ***********************************************/
345cdf0e10cSrcweir 
osl_searchPath(const rtl_uString * pustrFilePath,const rtl_uString * pustrSearchPathList,rtl_uString ** ppustrPathFound)346cdf0e10cSrcweir sal_Bool SAL_CALL osl_searchPath(
347cdf0e10cSrcweir  	const rtl_uString* pustrFilePath,
348cdf0e10cSrcweir 	const rtl_uString* pustrSearchPathList,
349cdf0e10cSrcweir 	rtl_uString**      ppustrPathFound)
350cdf0e10cSrcweir {
351cdf0e10cSrcweir 	OSL_PRECOND(pustrFilePath && pustrSearchPathList && ppustrPathFound, "osl_searchPath: Invalid parameter");
352cdf0e10cSrcweir 
353cdf0e10cSrcweir 	bool               bfound = false;
354cdf0e10cSrcweir 	rtl::OUString      fp(const_cast<rtl_uString*>(pustrFilePath));
355cdf0e10cSrcweir 	rtl::OUString      pl = rtl::OUString(const_cast<rtl_uString*>(pustrSearchPathList));
356cdf0e10cSrcweir 	path_list_iterator pli(pl);
357cdf0e10cSrcweir 
358cdf0e10cSrcweir 	while (!pli.done())
359cdf0e10cSrcweir 	{
360cdf0e10cSrcweir 		rtl::OUString p = pli.get_current_item();
361cdf0e10cSrcweir 		osl::systemPathEnsureSeparator(p);
362cdf0e10cSrcweir 		p += fp;
363cdf0e10cSrcweir 
364cdf0e10cSrcweir 		if (osl::access(p, F_OK) > -1)
365cdf0e10cSrcweir 		{
366cdf0e10cSrcweir 			bfound = true;
367cdf0e10cSrcweir 			rtl_uString_assign(ppustrPathFound, p.pData);
368cdf0e10cSrcweir 			break;
369cdf0e10cSrcweir 		}
370cdf0e10cSrcweir 		pli.next();
371cdf0e10cSrcweir 	}
372cdf0e10cSrcweir 	return bfound;
373cdf0e10cSrcweir }
374