xref: /aoo4110/main/sal/osl/os2/profile.c (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #include "system.h"
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski // YD #define min(a,b) (((a) < (b)) ? (a) : (b))
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski #include <osl/security.h>
29*b1cdbd2cSJim Jagielski #include <osl/diagnose.h>
30*b1cdbd2cSJim Jagielski #include <osl/profile.h>
31*b1cdbd2cSJim Jagielski #include <osl/process.h>
32*b1cdbd2cSJim Jagielski #include <osl/thread.h>
33*b1cdbd2cSJim Jagielski #include <osl/file.h>
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski #define LINES_INI       32
36*b1cdbd2cSJim Jagielski #define LINES_ADD       10
37*b1cdbd2cSJim Jagielski #define SECTIONS_INI    5
38*b1cdbd2cSJim Jagielski #define SECTIONS_ADD    3
39*b1cdbd2cSJim Jagielski #define ENTRIES_INI     5
40*b1cdbd2cSJim Jagielski #define ENTRIES_ADD     3
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski #define STR_INI_EXTENSION   ".ini"
44*b1cdbd2cSJim Jagielski #define STR_INI_METAHOME    "?~"
45*b1cdbd2cSJim Jagielski #define STR_INI_METASYS	    "?$"
46*b1cdbd2cSJim Jagielski #define STR_INI_METACFG	    "?^"
47*b1cdbd2cSJim Jagielski #define STR_INI_METAINS		"?#"
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski #define STR_INI_BOOLYES     "yes"
50*b1cdbd2cSJim Jagielski #define STR_INI_BOOLON      "on"
51*b1cdbd2cSJim Jagielski #define STR_INI_BOOLONE     "1"
52*b1cdbd2cSJim Jagielski #define STR_INI_BOOLNO      "no"
53*b1cdbd2cSJim Jagielski #define STR_INI_BOOLOFF     "off"
54*b1cdbd2cSJim Jagielski #define STR_INI_BOOLZERO    "0"
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski #define FLG_USER            0x00FF
57*b1cdbd2cSJim Jagielski #define FLG_AUTOOPEN        0x0100
58*b1cdbd2cSJim Jagielski #define FLG_MODIFIED        0x0200
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski #define SVERSION_LOCATION   STR_INI_METACFG
61*b1cdbd2cSJim Jagielski #define SVERSION_FALLBACK   STR_INI_METASYS
62*b1cdbd2cSJim Jagielski #define SVERSION_NAME   	"sversion"
63*b1cdbd2cSJim Jagielski #define SVERSION_SECTION    "Versions"
64*b1cdbd2cSJim Jagielski #define SVERSION_SOFFICE    "StarOffice"
65*b1cdbd2cSJim Jagielski #define SVERSION_PROFILE    "soffice.ini"
66*b1cdbd2cSJim Jagielski #define SVERSION_OPTION     "userid:"
67*b1cdbd2cSJim Jagielski #define SVERSION_DIRS		{ "bin", "program" }
68*b1cdbd2cSJim Jagielski #define SVERSION_USER       "user"
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski #define _BUILD_STR_(n)	# n
71*b1cdbd2cSJim Jagielski #define BUILD_STR(n)	_BUILD_STR_(n)
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski /* implemented in file.c */
74*b1cdbd2cSJim Jagielski extern oslFileError FileURLToPath( char *, size_t, rtl_uString* );
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski /*****************************************************************************/
77*b1cdbd2cSJim Jagielski /* Data Type Definition */
78*b1cdbd2cSJim Jagielski /*****************************************************************************/
79*b1cdbd2cSJim Jagielski 
80*b1cdbd2cSJim Jagielski typedef struct _osl_TStamp
81*b1cdbd2cSJim Jagielski {
82*b1cdbd2cSJim Jagielski 	FDATE  m_Date;
83*b1cdbd2cSJim Jagielski 	FTIME  m_Time;
84*b1cdbd2cSJim Jagielski } osl_TStamp;
85*b1cdbd2cSJim Jagielski 
86*b1cdbd2cSJim Jagielski typedef enum _osl_TLockMode
87*b1cdbd2cSJim Jagielski {
88*b1cdbd2cSJim Jagielski 	un_lock, read_lock, write_lock
89*b1cdbd2cSJim Jagielski } osl_TLockMode;
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski typedef struct _osl_TFile
92*b1cdbd2cSJim Jagielski {
93*b1cdbd2cSJim Jagielski 	HFILE   m_Handle;
94*b1cdbd2cSJim Jagielski /*
95*b1cdbd2cSJim Jagielski 	sal_Char*   m_pReadPtr;
96*b1cdbd2cSJim Jagielski 	sal_Char    m_ReadBuf[512];
97*b1cdbd2cSJim Jagielski 	sal_Char*   m_pWritePtr;
98*b1cdbd2cSJim Jagielski 	sal_Char    m_WriteBuf[512];
99*b1cdbd2cSJim Jagielski */
100*b1cdbd2cSJim Jagielski 	sal_Char*   m_pReadPtr;
101*b1cdbd2cSJim Jagielski 	sal_Char    m_ReadBuf[512];
102*b1cdbd2cSJim Jagielski /*  	sal_Char*   m_pWritePtr; */
103*b1cdbd2cSJim Jagielski /*  	sal_Char    m_WriteBuf[512]; */
104*b1cdbd2cSJim Jagielski     sal_Char*   m_pWriteBuf;
105*b1cdbd2cSJim Jagielski     sal_uInt32  m_nWriteBufLen;
106*b1cdbd2cSJim Jagielski     sal_uInt32  m_nWriteBufFree;
107*b1cdbd2cSJim Jagielski } osl_TFile;
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski typedef struct _osl_TProfileEntry
110*b1cdbd2cSJim Jagielski {
111*b1cdbd2cSJim Jagielski 	sal_uInt32    m_Line;
112*b1cdbd2cSJim Jagielski 	sal_uInt32    m_Offset;
113*b1cdbd2cSJim Jagielski 	sal_uInt32    m_Len;
114*b1cdbd2cSJim Jagielski } osl_TProfileEntry;
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski typedef struct _osl_TProfileSection
117*b1cdbd2cSJim Jagielski {
118*b1cdbd2cSJim Jagielski 	sal_uInt32            m_Line;
119*b1cdbd2cSJim Jagielski 	sal_uInt32            m_Offset;
120*b1cdbd2cSJim Jagielski 	sal_uInt32            m_Len;
121*b1cdbd2cSJim Jagielski 	sal_uInt32            m_NoEntries;
122*b1cdbd2cSJim Jagielski 	sal_uInt32            m_MaxEntries;
123*b1cdbd2cSJim Jagielski 	osl_TProfileEntry*  m_Entries;
124*b1cdbd2cSJim Jagielski } osl_TProfileSection;
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski 
127*b1cdbd2cSJim Jagielski /*
128*b1cdbd2cSJim Jagielski 	Profile-data structure hidden behind oslProfile:
129*b1cdbd2cSJim Jagielski */
130*b1cdbd2cSJim Jagielski typedef struct _osl_TProfileImpl
131*b1cdbd2cSJim Jagielski {
132*b1cdbd2cSJim Jagielski 	sal_uInt32	m_Flags;
133*b1cdbd2cSJim Jagielski 	osl_TFile*	m_pFile;
134*b1cdbd2cSJim Jagielski 	osl_TStamp  m_Stamp;
135*b1cdbd2cSJim Jagielski 	//sal_Char    m_Filename[_MAX_PATH + 1];
136*b1cdbd2cSJim Jagielski 	sal_uInt32  m_NoLines;
137*b1cdbd2cSJim Jagielski 	sal_uInt32  m_MaxLines;
138*b1cdbd2cSJim Jagielski 	sal_uInt32  m_NoSections;
139*b1cdbd2cSJim Jagielski 	sal_uInt32  m_MaxSections;
140*b1cdbd2cSJim Jagielski 	sal_Char**  m_Lines;
141*b1cdbd2cSJim Jagielski 	rtl_uString *m_strFileName;
142*b1cdbd2cSJim Jagielski 	osl_TProfileSection*	m_Sections;
143*b1cdbd2cSJim Jagielski 	HINI        			m_hIni;
144*b1cdbd2cSJim Jagielski } osl_TProfileImpl;
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski 
147*b1cdbd2cSJim Jagielski /*****************************************************************************/
148*b1cdbd2cSJim Jagielski /* Static Module Function Declarations */
149*b1cdbd2cSJim Jagielski /*****************************************************************************/
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski //static osl_TFile* openFile(rtl_uString* pszFilename, sal_Bool bWriteable);
152*b1cdbd2cSJim Jagielski //static osl_TStamp closeFile(osl_TFile* pFile);
153*b1cdbd2cSJim Jagielski static osl_TFile*           openFileImpl(rtl_uString * strFileName, oslProfileOption ProfileFlags  );
154*b1cdbd2cSJim Jagielski static osl_TStamp           closeFileImpl(osl_TFile* pFile);
155*b1cdbd2cSJim Jagielski static sal_Bool   lockFile(const osl_TFile* pFile, osl_TLockMode eMode);
156*b1cdbd2cSJim Jagielski static sal_Bool   rewindFile(osl_TFile* pFile, sal_Bool bTruncate);
157*b1cdbd2cSJim Jagielski static osl_TStamp getFileStamp(osl_TFile* pFile);
158*b1cdbd2cSJim Jagielski 
159*b1cdbd2cSJim Jagielski static sal_Bool getLine(osl_TFile* pFile, const sal_Char *pszLine, int MaxLen);
160*b1cdbd2cSJim Jagielski static sal_Bool putLine(osl_TFile* pFile, const sal_Char *pszLine);
161*b1cdbd2cSJim Jagielski static const sal_Char* stripBlanks(const sal_Char* String, sal_uInt32* pLen);
162*b1cdbd2cSJim Jagielski static const sal_Char* addLine(osl_TProfileImpl* pProfile, const sal_Char* Line);
163*b1cdbd2cSJim Jagielski static const sal_Char* insertLine(osl_TProfileImpl* pProfile, const sal_Char* Line, sal_uInt32 LineNo);
164*b1cdbd2cSJim Jagielski static void removeLine(osl_TProfileImpl* pProfile, sal_uInt32 LineNo);
165*b1cdbd2cSJim Jagielski static void setEntry(osl_TProfileImpl* pProfile, osl_TProfileSection* pSection,
166*b1cdbd2cSJim Jagielski                      sal_uInt32 NoEntry, sal_uInt32 Line,
167*b1cdbd2cSJim Jagielski                      const sal_Char* Entry, sal_uInt32 Len);
168*b1cdbd2cSJim Jagielski static sal_Bool addEntry(osl_TProfileImpl* pProfile, osl_TProfileSection *pSection,
169*b1cdbd2cSJim Jagielski                          int Line, const sal_Char* Entry, sal_uInt32 Len);
170*b1cdbd2cSJim Jagielski static void removeEntry(osl_TProfileSection *pSection, sal_uInt32 NoEntry);
171*b1cdbd2cSJim Jagielski static sal_Bool addSection(osl_TProfileImpl* pProfile, int Line, const sal_Char* Section, sal_uInt32 Len);
172*b1cdbd2cSJim Jagielski static void removeSection(osl_TProfileImpl* pProfile, osl_TProfileSection *pSection);
173*b1cdbd2cSJim Jagielski static osl_TProfileSection* findEntry(osl_TProfileImpl* pProfile, const sal_Char* Section,
174*b1cdbd2cSJim Jagielski                                       const sal_Char* Entry, sal_uInt32 *pNoEntry);
175*b1cdbd2cSJim Jagielski static sal_Bool loadProfile(osl_TFile* pFile, osl_TProfileImpl* pProfile);
176*b1cdbd2cSJim Jagielski static sal_Bool storeProfile(osl_TFile* pFile, osl_TProfileImpl* pProfile, sal_Bool bCleanup);
177*b1cdbd2cSJim Jagielski static osl_TProfileImpl* acquireProfile(oslProfile Profile, sal_Bool bWriteable);
178*b1cdbd2cSJim Jagielski static sal_Bool releaseProfile(osl_TProfileImpl* pProfile);
179*b1cdbd2cSJim Jagielski static sal_Bool lookupProfile(const sal_Char *pszPath, const sal_Char *pszFile, sal_Char *pPath);
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski static sal_Bool SAL_CALL osl_getProfileName(rtl_uString* strPath, rtl_uString* strName, rtl_uString** strProfileName);
183*b1cdbd2cSJim Jagielski 
osl_getFullPath(rtl_uString * pszFilename,sal_Char * pszPath,sal_uInt32 MaxLen)184*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL osl_getFullPath(rtl_uString* pszFilename, sal_Char* pszPath, sal_uInt32 MaxLen)
185*b1cdbd2cSJim Jagielski {
186*b1cdbd2cSJim Jagielski 	return NO_ERROR == DosQueryPathInfo( (PCSZ)pszFilename, FIL_QUERYFULLNAME, pszPath, MaxLen);
187*b1cdbd2cSJim Jagielski }
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski 
191*b1cdbd2cSJim Jagielski /*****************************************************************************/
192*b1cdbd2cSJim Jagielski /* Exported Module Functions */
193*b1cdbd2cSJim Jagielski /*****************************************************************************/
194*b1cdbd2cSJim Jagielski 
osl_openProfile(rtl_uString * strProfileName,sal_uInt32 Flags)195*b1cdbd2cSJim Jagielski oslProfile SAL_CALL osl_openProfile(rtl_uString *strProfileName, sal_uInt32 Flags)
196*b1cdbd2cSJim Jagielski {
197*b1cdbd2cSJim Jagielski 	osl_TFile*        pFile;
198*b1cdbd2cSJim Jagielski 	osl_TProfileImpl* pProfile;
199*b1cdbd2cSJim Jagielski 	rtl_uString		  *FileName=NULL;
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
202*b1cdbd2cSJim Jagielski     OSL_TRACE("In  osl_openProfile\n");
203*b1cdbd2cSJim Jagielski #endif
204*b1cdbd2cSJim Jagielski 	OSL_VERIFY(strProfileName);
205*b1cdbd2cSJim Jagielski 
206*b1cdbd2cSJim Jagielski /*	if (rtl_uString_getLength(strProfileName) == 0 )
207*b1cdbd2cSJim Jagielski 	{
208*b1cdbd2cSJim Jagielski 		OSL_VERIFY(osl_getProfileName(NULL, NULL, &FileName));
209*b1cdbd2cSJim Jagielski 	}
210*b1cdbd2cSJim Jagielski 	else
211*b1cdbd2cSJim Jagielski */
212*b1cdbd2cSJim Jagielski 	{
213*b1cdbd2cSJim Jagielski 		rtl_uString_assign(&FileName, strProfileName);
214*b1cdbd2cSJim Jagielski 	}
215*b1cdbd2cSJim Jagielski 
216*b1cdbd2cSJim Jagielski 	osl_getSystemPathFromFileURL(FileName, &FileName);
217*b1cdbd2cSJim Jagielski 
218*b1cdbd2cSJim Jagielski #ifdef DEBUG_OSL_PROFILE
219*b1cdbd2cSJim Jagielski     Flags=osl_Profile_FLUSHWRITE;
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski     // OSL_TRACE("opening '%s'\n",FileName);
222*b1cdbd2cSJim Jagielski     if ( Flags == osl_Profile_DEFAULT )
223*b1cdbd2cSJim Jagielski     {
224*b1cdbd2cSJim Jagielski         OSL_TRACE("with osl_Profile_DEFAULT \n");
225*b1cdbd2cSJim Jagielski     }
226*b1cdbd2cSJim Jagielski     if ( Flags & osl_Profile_SYSTEM )
227*b1cdbd2cSJim Jagielski     {
228*b1cdbd2cSJim Jagielski         OSL_TRACE("with osl_Profile_SYSTEM \n");
229*b1cdbd2cSJim Jagielski     }
230*b1cdbd2cSJim Jagielski     if ( Flags & osl_Profile_READLOCK )
231*b1cdbd2cSJim Jagielski     {
232*b1cdbd2cSJim Jagielski         OSL_TRACE("with osl_Profile_READLOCK \n");
233*b1cdbd2cSJim Jagielski     }
234*b1cdbd2cSJim Jagielski     if ( Flags & osl_Profile_WRITELOCK )
235*b1cdbd2cSJim Jagielski     {
236*b1cdbd2cSJim Jagielski         OSL_TRACE("with osl_Profile_WRITELOCK \n");
237*b1cdbd2cSJim Jagielski     }
238*b1cdbd2cSJim Jagielski /*      if ( Flags & osl_Profile_READWRITE ) */
239*b1cdbd2cSJim Jagielski /*      { */
240*b1cdbd2cSJim Jagielski /*          OSL_TRACE("with osl_Profile_READWRITE \n"); */
241*b1cdbd2cSJim Jagielski /*      } */
242*b1cdbd2cSJim Jagielski     if ( Flags & osl_Profile_FLUSHWRITE )
243*b1cdbd2cSJim Jagielski     {
244*b1cdbd2cSJim Jagielski         OSL_TRACE("with osl_Profile_FLUSHWRITE \n");
245*b1cdbd2cSJim Jagielski     }
246*b1cdbd2cSJim Jagielski #endif
247*b1cdbd2cSJim Jagielski 
248*b1cdbd2cSJim Jagielski 	if ((! (Flags & osl_Profile_SYSTEM)) &&
249*b1cdbd2cSJim Jagielski 		((pFile = openFileImpl(FileName, (Flags & osl_Profile_WRITELOCK) ? sal_True : sal_False)) == NULL))
250*b1cdbd2cSJim Jagielski     {
251*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
252*b1cdbd2cSJim Jagielski 	    OSL_TRACE("Out osl_openProfile [not opened]\n");
253*b1cdbd2cSJim Jagielski #endif
254*b1cdbd2cSJim Jagielski 		if( FileName)
255*b1cdbd2cSJim Jagielski 			rtl_uString_release( FileName);
256*b1cdbd2cSJim Jagielski 
257*b1cdbd2cSJim Jagielski         return (NULL);
258*b1cdbd2cSJim Jagielski     }
259*b1cdbd2cSJim Jagielski 
260*b1cdbd2cSJim Jagielski 	pProfile = (osl_TProfileImpl*)calloc(1, sizeof(osl_TProfileImpl));
261*b1cdbd2cSJim Jagielski 
262*b1cdbd2cSJim Jagielski 	pProfile->m_Flags = Flags & FLG_USER;
263*b1cdbd2cSJim Jagielski 	osl_getSystemPathFromFileURL(strProfileName, &pProfile->m_strFileName);
264*b1cdbd2cSJim Jagielski //	rtl_uString_assign(&pProfile->m_strFileName, strProfileName);
265*b1cdbd2cSJim Jagielski 
266*b1cdbd2cSJim Jagielski 	if (Flags & (osl_Profile_READLOCK | osl_Profile_WRITELOCK))
267*b1cdbd2cSJim Jagielski 		pProfile->m_pFile = pFile;
268*b1cdbd2cSJim Jagielski 
269*b1cdbd2cSJim Jagielski 	pProfile->m_Stamp = getFileStamp(pFile);
270*b1cdbd2cSJim Jagielski 
271*b1cdbd2cSJim Jagielski 	loadProfile(pFile, pProfile);
272*b1cdbd2cSJim Jagielski 
273*b1cdbd2cSJim Jagielski 	if (pProfile->m_pFile == NULL)
274*b1cdbd2cSJim Jagielski 		closeFileImpl(pFile);
275*b1cdbd2cSJim Jagielski 
276*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
277*b1cdbd2cSJim Jagielski     OSL_TRACE("Out osl_openProfile [ok]\n");
278*b1cdbd2cSJim Jagielski #endif
279*b1cdbd2cSJim Jagielski 	if( FileName)
280*b1cdbd2cSJim Jagielski 		rtl_uString_release( FileName);
281*b1cdbd2cSJim Jagielski 
282*b1cdbd2cSJim Jagielski 	return pProfile;
283*b1cdbd2cSJim Jagielski }
284*b1cdbd2cSJim Jagielski 
osl_closeProfile(oslProfile Profile)285*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL osl_closeProfile(oslProfile Profile)
286*b1cdbd2cSJim Jagielski {
287*b1cdbd2cSJim Jagielski 	osl_TProfileImpl* pProfile = (osl_TProfileImpl*)Profile;
288*b1cdbd2cSJim Jagielski 
289*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
290*b1cdbd2cSJim Jagielski     OSL_TRACE("In  osl_closeProfile\n");
291*b1cdbd2cSJim Jagielski #endif
292*b1cdbd2cSJim Jagielski 
293*b1cdbd2cSJim Jagielski     if ( pProfile == 0 )
294*b1cdbd2cSJim Jagielski     {
295*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
296*b1cdbd2cSJim Jagielski         OSL_TRACE("Out osl_closeProfile [profile==0]\n");
297*b1cdbd2cSJim Jagielski #endif
298*b1cdbd2cSJim Jagielski         return sal_False;
299*b1cdbd2cSJim Jagielski     }
300*b1cdbd2cSJim Jagielski 
301*b1cdbd2cSJim Jagielski 	if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
302*b1cdbd2cSJim Jagielski 	{
303*b1cdbd2cSJim Jagielski         pProfile = acquireProfile(Profile,sal_True);
304*b1cdbd2cSJim Jagielski 
305*b1cdbd2cSJim Jagielski         if ( pProfile != 0 )
306*b1cdbd2cSJim Jagielski         {
307*b1cdbd2cSJim Jagielski 			if ( !( pProfile->m_Flags & osl_Profile_READLOCK )  && ( pProfile->m_Flags & FLG_MODIFIED ) )
308*b1cdbd2cSJim Jagielski 			{
309*b1cdbd2cSJim Jagielski /*  				if (pProfile->m_pFile == NULL) */
310*b1cdbd2cSJim Jagielski /*  					pProfile->m_pFile = openFileImpl(pProfile->m_Filename, sal_True); */
311*b1cdbd2cSJim Jagielski 
312*b1cdbd2cSJim Jagielski 				storeProfile(pProfile->m_pFile, pProfile, sal_False);
313*b1cdbd2cSJim Jagielski 			}
314*b1cdbd2cSJim Jagielski 		}
315*b1cdbd2cSJim Jagielski 		else
316*b1cdbd2cSJim Jagielski 		{
317*b1cdbd2cSJim Jagielski 			pProfile = acquireProfile(Profile,sal_False);
318*b1cdbd2cSJim Jagielski 		}
319*b1cdbd2cSJim Jagielski 
320*b1cdbd2cSJim Jagielski 		if ( pProfile == 0 )
321*b1cdbd2cSJim Jagielski 		{
322*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
323*b1cdbd2cSJim Jagielski 			OSL_TRACE("Out osl_closeProfile [pProfile==0]\n");
324*b1cdbd2cSJim Jagielski #endif
325*b1cdbd2cSJim Jagielski 			return sal_False;
326*b1cdbd2cSJim Jagielski 		}
327*b1cdbd2cSJim Jagielski 
328*b1cdbd2cSJim Jagielski 		if (pProfile->m_pFile != NULL)
329*b1cdbd2cSJim Jagielski 			closeFileImpl(pProfile->m_pFile);
330*b1cdbd2cSJim Jagielski 	}
331*b1cdbd2cSJim Jagielski 
332*b1cdbd2cSJim Jagielski 	pProfile->m_pFile = NULL;
333*b1cdbd2cSJim Jagielski 	rtl_uString_release(pProfile->m_strFileName);
334*b1cdbd2cSJim Jagielski 	pProfile->m_strFileName = NULL;
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski 	/* release whole profile data types memory */
337*b1cdbd2cSJim Jagielski 	if ( pProfile->m_NoLines > 0)
338*b1cdbd2cSJim Jagielski 	{
339*b1cdbd2cSJim Jagielski 		unsigned int index=0;
340*b1cdbd2cSJim Jagielski 		if ( pProfile->m_Lines != 0 )
341*b1cdbd2cSJim Jagielski 		{
342*b1cdbd2cSJim Jagielski 			for ( index = 0 ; index < pProfile->m_NoLines ; ++index)
343*b1cdbd2cSJim Jagielski 			{
344*b1cdbd2cSJim Jagielski 				if ( pProfile->m_Lines[index] != 0 )
345*b1cdbd2cSJim Jagielski 				{
346*b1cdbd2cSJim Jagielski 					free(pProfile->m_Lines[index]);
347*b1cdbd2cSJim Jagielski 				}
348*b1cdbd2cSJim Jagielski 			}
349*b1cdbd2cSJim Jagielski 			free(pProfile->m_Lines);
350*b1cdbd2cSJim Jagielski 		}
351*b1cdbd2cSJim Jagielski 		if ( pProfile->m_Sections != 0 )
352*b1cdbd2cSJim Jagielski 		{
353*b1cdbd2cSJim Jagielski 			/*osl_TProfileSection* pSections=pProfile->m_Sections;*/
354*b1cdbd2cSJim Jagielski 			for ( index = 0 ; index < pProfile->m_NoSections ; ++index )
355*b1cdbd2cSJim Jagielski 			{
356*b1cdbd2cSJim Jagielski 				if ( pProfile->m_Sections[index].m_Entries != 0 )
357*b1cdbd2cSJim Jagielski 				{
358*b1cdbd2cSJim Jagielski 					free(pProfile->m_Sections[index].m_Entries);
359*b1cdbd2cSJim Jagielski 				}
360*b1cdbd2cSJim Jagielski 			}
361*b1cdbd2cSJim Jagielski 			free(pProfile->m_Sections);
362*b1cdbd2cSJim Jagielski 		}
363*b1cdbd2cSJim Jagielski 
364*b1cdbd2cSJim Jagielski 	}
365*b1cdbd2cSJim Jagielski 	free(pProfile);
366*b1cdbd2cSJim Jagielski 
367*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
368*b1cdbd2cSJim Jagielski     OSL_TRACE("Out osl_closeProfile [ok]\n");
369*b1cdbd2cSJim Jagielski #endif
370*b1cdbd2cSJim Jagielski 	return (sal_True);
371*b1cdbd2cSJim Jagielski }
372*b1cdbd2cSJim Jagielski 
osl_flushProfile(oslProfile Profile)373*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL osl_flushProfile(oslProfile Profile)
374*b1cdbd2cSJim Jagielski {
375*b1cdbd2cSJim Jagielski 	osl_TProfileImpl* pProfile = (osl_TProfileImpl*) Profile;
376*b1cdbd2cSJim Jagielski 	osl_TFile* pFile;
377*b1cdbd2cSJim Jagielski 	sal_Bool bRet = sal_False;
378*b1cdbd2cSJim Jagielski 
379*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
380*b1cdbd2cSJim Jagielski     OSL_TRACE("In  osl_flushProfile()\n");
381*b1cdbd2cSJim Jagielski #endif
382*b1cdbd2cSJim Jagielski 
383*b1cdbd2cSJim Jagielski     if ( pProfile == 0 )
384*b1cdbd2cSJim Jagielski     {
385*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
386*b1cdbd2cSJim Jagielski         OSL_TRACE("Out osl_flushProfile() [pProfile == 0]\n");
387*b1cdbd2cSJim Jagielski #endif
388*b1cdbd2cSJim Jagielski         return sal_False;
389*b1cdbd2cSJim Jagielski     }
390*b1cdbd2cSJim Jagielski 
391*b1cdbd2cSJim Jagielski 	pFile = pProfile->m_pFile;
392*b1cdbd2cSJim Jagielski     if ( !( pFile != 0 && pFile->m_Handle >= 0 ) )
393*b1cdbd2cSJim Jagielski     {
394*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
395*b1cdbd2cSJim Jagielski         OSL_TRACE("Out osl_flushProfile() [invalid file]\n");
396*b1cdbd2cSJim Jagielski #endif
397*b1cdbd2cSJim Jagielski         return sal_False;
398*b1cdbd2cSJim Jagielski     }
399*b1cdbd2cSJim Jagielski 
400*b1cdbd2cSJim Jagielski 	if ( pProfile->m_Flags & FLG_MODIFIED )
401*b1cdbd2cSJim Jagielski 	{
402*b1cdbd2cSJim Jagielski #ifdef DEBUG_OSL_PROFILE
403*b1cdbd2cSJim Jagielski         OSL_TRACE("swapping to storeprofile\n");
404*b1cdbd2cSJim Jagielski #endif
405*b1cdbd2cSJim Jagielski 		bRet = storeProfile(pFile,pProfile,sal_False);
406*b1cdbd2cSJim Jagielski 	}
407*b1cdbd2cSJim Jagielski 
408*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
409*b1cdbd2cSJim Jagielski     OSL_TRACE("Out osl_flushProfile() [ok]\n");
410*b1cdbd2cSJim Jagielski #endif
411*b1cdbd2cSJim Jagielski     return bRet;
412*b1cdbd2cSJim Jagielski }
413*b1cdbd2cSJim Jagielski 
osl_readProfileString(oslProfile Profile,const sal_Char * pszSection,const sal_Char * pszEntry,sal_Char * pszString,sal_uInt32 MaxLen,const sal_Char * pszDefault)414*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL osl_readProfileString(oslProfile Profile,
415*b1cdbd2cSJim Jagielski                                         const sal_Char* pszSection, const sal_Char* pszEntry,
416*b1cdbd2cSJim Jagielski                                         sal_Char* pszString, sal_uInt32 MaxLen,
417*b1cdbd2cSJim Jagielski                                         const sal_Char* pszDefault)
418*b1cdbd2cSJim Jagielski {
419*b1cdbd2cSJim Jagielski 	sal_uInt32    NoEntry;
420*b1cdbd2cSJim Jagielski 	const sal_Char* pStr = 0;
421*b1cdbd2cSJim Jagielski 	osl_TProfileSection* pSec;
422*b1cdbd2cSJim Jagielski 	osl_TProfileImpl*    pProfile = 0;
423*b1cdbd2cSJim Jagielski 
424*b1cdbd2cSJim Jagielski 
425*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
426*b1cdbd2cSJim Jagielski     OSL_TRACE("In  osl_readProfileString\n");
427*b1cdbd2cSJim Jagielski #endif
428*b1cdbd2cSJim Jagielski 
429*b1cdbd2cSJim Jagielski     pProfile = acquireProfile(Profile, sal_False);
430*b1cdbd2cSJim Jagielski 
431*b1cdbd2cSJim Jagielski 	if (pProfile == NULL)
432*b1cdbd2cSJim Jagielski     {
433*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
434*b1cdbd2cSJim Jagielski         OSL_TRACE("Out osl_readProfileString [pProfile==0]\n");
435*b1cdbd2cSJim Jagielski #endif
436*b1cdbd2cSJim Jagielski 
437*b1cdbd2cSJim Jagielski 
438*b1cdbd2cSJim Jagielski 		return (sal_False);
439*b1cdbd2cSJim Jagielski     }
440*b1cdbd2cSJim Jagielski 
441*b1cdbd2cSJim Jagielski 
442*b1cdbd2cSJim Jagielski 	if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
443*b1cdbd2cSJim Jagielski 	{
444*b1cdbd2cSJim Jagielski 		if (((pSec = findEntry(pProfile, pszSection, pszEntry, &NoEntry)) != NULL) &&
445*b1cdbd2cSJim Jagielski 			(NoEntry < pSec->m_NoEntries) &&
446*b1cdbd2cSJim Jagielski 			((pStr = strchr(pProfile->m_Lines[pSec->m_Entries[NoEntry].m_Line],
447*b1cdbd2cSJim Jagielski 							'=')) != NULL))
448*b1cdbd2cSJim Jagielski 			pStr++;
449*b1cdbd2cSJim Jagielski 		else
450*b1cdbd2cSJim Jagielski 			pStr = pszDefault;
451*b1cdbd2cSJim Jagielski 
452*b1cdbd2cSJim Jagielski 		if ( pStr != 0 )
453*b1cdbd2cSJim Jagielski 		{
454*b1cdbd2cSJim Jagielski 			pStr = stripBlanks(pStr, NULL);
455*b1cdbd2cSJim Jagielski 			MaxLen = (MaxLen - 1 < strlen(pStr)) ? (MaxLen - 1) : strlen(pStr);
456*b1cdbd2cSJim Jagielski 			pStr = stripBlanks(pStr, &MaxLen);
457*b1cdbd2cSJim Jagielski 			strncpy(pszString, pStr, MaxLen);
458*b1cdbd2cSJim Jagielski 			pszString[MaxLen] = '\0';
459*b1cdbd2cSJim Jagielski 		}
460*b1cdbd2cSJim Jagielski 	}
461*b1cdbd2cSJim Jagielski 	else
462*b1cdbd2cSJim Jagielski     	PrfQueryProfileString(pProfile->m_hIni, (PCSZ)pszSection,
463*b1cdbd2cSJim Jagielski     	                      (PCSZ)pszEntry, (PCSZ)pszDefault,
464*b1cdbd2cSJim Jagielski 	    					  pszString, MaxLen);
465*b1cdbd2cSJim Jagielski 
466*b1cdbd2cSJim Jagielski 	releaseProfile(pProfile);
467*b1cdbd2cSJim Jagielski 
468*b1cdbd2cSJim Jagielski 	if ( pStr == 0 )
469*b1cdbd2cSJim Jagielski     {
470*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
471*b1cdbd2cSJim Jagielski         OSL_TRACE("Out osl_readProfileString [pStr==0]\n");
472*b1cdbd2cSJim Jagielski #endif
473*b1cdbd2cSJim Jagielski 
474*b1cdbd2cSJim Jagielski 
475*b1cdbd2cSJim Jagielski 		return (sal_False);
476*b1cdbd2cSJim Jagielski     }
477*b1cdbd2cSJim Jagielski 
478*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
479*b1cdbd2cSJim Jagielski     OSL_TRACE("Out osl_readProfileString [ok]\n");
480*b1cdbd2cSJim Jagielski #endif
481*b1cdbd2cSJim Jagielski 
482*b1cdbd2cSJim Jagielski 	return (sal_True);
483*b1cdbd2cSJim Jagielski }
484*b1cdbd2cSJim Jagielski 
485*b1cdbd2cSJim Jagielski 
osl_readProfileBool(oslProfile Profile,const sal_Char * pszSection,const sal_Char * pszEntry,sal_Bool Default)486*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL osl_readProfileBool(oslProfile Profile,
487*b1cdbd2cSJim Jagielski 							const sal_Char* pszSection, const sal_Char* pszEntry,
488*b1cdbd2cSJim Jagielski 							sal_Bool Default)
489*b1cdbd2cSJim Jagielski {
490*b1cdbd2cSJim Jagielski 	sal_Char Line[32];
491*b1cdbd2cSJim Jagielski 
492*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
493*b1cdbd2cSJim Jagielski     OSL_TRACE("In  osl_readProfileBool\n");
494*b1cdbd2cSJim Jagielski #endif
495*b1cdbd2cSJim Jagielski 
496*b1cdbd2cSJim Jagielski 	if (osl_readProfileString(Profile, pszSection, pszEntry, Line, sizeof(Line), ""))
497*b1cdbd2cSJim Jagielski 	{
498*b1cdbd2cSJim Jagielski 		if ((stricmp(Line, STR_INI_BOOLYES) == 0) ||
499*b1cdbd2cSJim Jagielski 			(stricmp(Line, STR_INI_BOOLON)  == 0) ||
500*b1cdbd2cSJim Jagielski 			(stricmp(Line, STR_INI_BOOLONE) == 0))
501*b1cdbd2cSJim Jagielski 			Default = sal_True;
502*b1cdbd2cSJim Jagielski 		else
503*b1cdbd2cSJim Jagielski 			if ((stricmp(Line, STR_INI_BOOLNO)   == 0) ||
504*b1cdbd2cSJim Jagielski 				(stricmp(Line, STR_INI_BOOLOFF)  == 0) ||
505*b1cdbd2cSJim Jagielski 				(stricmp(Line, STR_INI_BOOLZERO) == 0))
506*b1cdbd2cSJim Jagielski 				Default = sal_False;
507*b1cdbd2cSJim Jagielski 	}
508*b1cdbd2cSJim Jagielski 
509*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
510*b1cdbd2cSJim Jagielski     OSL_TRACE("Out osl_readProfileBool [ok]\n");
511*b1cdbd2cSJim Jagielski #endif
512*b1cdbd2cSJim Jagielski 
513*b1cdbd2cSJim Jagielski 	return (Default);
514*b1cdbd2cSJim Jagielski }
515*b1cdbd2cSJim Jagielski 
516*b1cdbd2cSJim Jagielski 
osl_readProfileIdent(oslProfile Profile,const sal_Char * pszSection,const sal_Char * pszEntry,sal_uInt32 FirstId,const sal_Char * Strings[],sal_uInt32 Default)517*b1cdbd2cSJim Jagielski sal_uInt32 SAL_CALL osl_readProfileIdent(oslProfile Profile,
518*b1cdbd2cSJim Jagielski 							  const sal_Char* pszSection, const sal_Char* pszEntry,
519*b1cdbd2cSJim Jagielski 							  sal_uInt32 FirstId, const sal_Char* Strings[],
520*b1cdbd2cSJim Jagielski 							  sal_uInt32 Default)
521*b1cdbd2cSJim Jagielski {
522*b1cdbd2cSJim Jagielski 	sal_uInt32    i;
523*b1cdbd2cSJim Jagielski 	sal_Char        Line[256];
524*b1cdbd2cSJim Jagielski 
525*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
526*b1cdbd2cSJim Jagielski     OSL_TRACE("In  osl_readProfileIdent\n");
527*b1cdbd2cSJim Jagielski #endif
528*b1cdbd2cSJim Jagielski 
529*b1cdbd2cSJim Jagielski 	if (osl_readProfileString(Profile, pszSection, pszEntry, Line, sizeof(Line), ""))
530*b1cdbd2cSJim Jagielski 	{
531*b1cdbd2cSJim Jagielski 		i = 0;
532*b1cdbd2cSJim Jagielski 		while (Strings[i] != NULL)
533*b1cdbd2cSJim Jagielski 		{
534*b1cdbd2cSJim Jagielski 			if (stricmp(Line, Strings[i]) == 0)
535*b1cdbd2cSJim Jagielski 			{
536*b1cdbd2cSJim Jagielski 				Default = i + FirstId;
537*b1cdbd2cSJim Jagielski 				break;
538*b1cdbd2cSJim Jagielski 			}
539*b1cdbd2cSJim Jagielski 			i++;
540*b1cdbd2cSJim Jagielski 		}
541*b1cdbd2cSJim Jagielski 	}
542*b1cdbd2cSJim Jagielski 
543*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
544*b1cdbd2cSJim Jagielski     OSL_TRACE("Out osl_readProfileIdent [ok]\n");
545*b1cdbd2cSJim Jagielski #endif
546*b1cdbd2cSJim Jagielski 	return (Default);
547*b1cdbd2cSJim Jagielski }
548*b1cdbd2cSJim Jagielski 
549*b1cdbd2cSJim Jagielski 
osl_writeProfileString(oslProfile Profile,const sal_Char * pszSection,const sal_Char * pszEntry,const sal_Char * pszString)550*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL osl_writeProfileString(oslProfile Profile,
551*b1cdbd2cSJim Jagielski 							   const sal_Char* pszSection, const sal_Char* pszEntry,
552*b1cdbd2cSJim Jagielski 							   const sal_Char* pszString)
553*b1cdbd2cSJim Jagielski {
554*b1cdbd2cSJim Jagielski 	sal_uInt32    i;
555*b1cdbd2cSJim Jagielski     sal_Bool bRet = sal_False;
556*b1cdbd2cSJim Jagielski 	sal_uInt32    NoEntry;
557*b1cdbd2cSJim Jagielski 	const sal_Char* pStr;
558*b1cdbd2cSJim Jagielski 	sal_Char        Line[4096];
559*b1cdbd2cSJim Jagielski 	osl_TProfileSection* pSec;
560*b1cdbd2cSJim Jagielski 	osl_TProfileImpl*    pProfile = 0;
561*b1cdbd2cSJim Jagielski 
562*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
563*b1cdbd2cSJim Jagielski     OSL_TRACE("In  osl_writeProfileString\n");
564*b1cdbd2cSJim Jagielski #endif
565*b1cdbd2cSJim Jagielski 
566*b1cdbd2cSJim Jagielski     pProfile = acquireProfile(Profile, sal_True);
567*b1cdbd2cSJim Jagielski 
568*b1cdbd2cSJim Jagielski 	if (pProfile == NULL)
569*b1cdbd2cSJim Jagielski     {
570*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
571*b1cdbd2cSJim Jagielski         OSL_TRACE("Out osl_writeProfileString [pProfile==0]\n");
572*b1cdbd2cSJim Jagielski #endif
573*b1cdbd2cSJim Jagielski 		return (sal_False);
574*b1cdbd2cSJim Jagielski     }
575*b1cdbd2cSJim Jagielski 
576*b1cdbd2cSJim Jagielski 
577*b1cdbd2cSJim Jagielski 	if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
578*b1cdbd2cSJim Jagielski 	{
579*b1cdbd2cSJim Jagielski 		if ((pSec = findEntry(pProfile, pszSection, pszEntry, &NoEntry)) == NULL)
580*b1cdbd2cSJim Jagielski 		{
581*b1cdbd2cSJim Jagielski 			Line[0] = '\0';
582*b1cdbd2cSJim Jagielski 			addLine(pProfile, Line);
583*b1cdbd2cSJim Jagielski 
584*b1cdbd2cSJim Jagielski 			Line[0] = '[';
585*b1cdbd2cSJim Jagielski 			strcpy(&Line[1], pszSection);
586*b1cdbd2cSJim Jagielski 			Line[1 + strlen(pszSection)] = ']';
587*b1cdbd2cSJim Jagielski 			Line[2 + strlen(pszSection)] = '\0';
588*b1cdbd2cSJim Jagielski 
589*b1cdbd2cSJim Jagielski 			if (((pStr = addLine(pProfile, Line)) == NULL) ||
590*b1cdbd2cSJim Jagielski 				(! addSection(pProfile, pProfile->m_NoLines - 1, &pStr[1], strlen(pszSection))))
591*b1cdbd2cSJim Jagielski 			{
592*b1cdbd2cSJim Jagielski 				releaseProfile(pProfile);
593*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
594*b1cdbd2cSJim Jagielski                 OSL_TRACE("Out osl_writeProfileString [not added]\n");
595*b1cdbd2cSJim Jagielski #endif
596*b1cdbd2cSJim Jagielski 				return (sal_False);
597*b1cdbd2cSJim Jagielski 			}
598*b1cdbd2cSJim Jagielski 
599*b1cdbd2cSJim Jagielski 			pSec = &pProfile->m_Sections[pProfile->m_NoSections - 1];
600*b1cdbd2cSJim Jagielski 			NoEntry = pSec->m_NoEntries;
601*b1cdbd2cSJim Jagielski 		}
602*b1cdbd2cSJim Jagielski 
603*b1cdbd2cSJim Jagielski 		Line[0] = '\0';
604*b1cdbd2cSJim Jagielski 		strcpy(&Line[0], pszEntry);
605*b1cdbd2cSJim Jagielski 		Line[0 + strlen(pszEntry)] = '=';
606*b1cdbd2cSJim Jagielski 		strcpy(&Line[1 + strlen(pszEntry)], pszString);
607*b1cdbd2cSJim Jagielski 
608*b1cdbd2cSJim Jagielski 		if (NoEntry >= pSec->m_NoEntries)
609*b1cdbd2cSJim Jagielski 		{
610*b1cdbd2cSJim Jagielski 			if (pSec->m_NoEntries > 0)
611*b1cdbd2cSJim Jagielski 				i = pSec->m_Entries[pSec->m_NoEntries - 1].m_Line + 1;
612*b1cdbd2cSJim Jagielski 			else
613*b1cdbd2cSJim Jagielski 				i = pSec->m_Line + 1;
614*b1cdbd2cSJim Jagielski 
615*b1cdbd2cSJim Jagielski 			if (((pStr = insertLine(pProfile, Line, i)) == NULL) ||
616*b1cdbd2cSJim Jagielski 				(! addEntry(pProfile, pSec, i, pStr, strlen(pszEntry))))
617*b1cdbd2cSJim Jagielski 			{
618*b1cdbd2cSJim Jagielski 				releaseProfile(pProfile);
619*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
620*b1cdbd2cSJim Jagielski                 OSL_TRACE("Out osl_writeProfileString [not inserted]\n");
621*b1cdbd2cSJim Jagielski #endif
622*b1cdbd2cSJim Jagielski 				return (sal_False);
623*b1cdbd2cSJim Jagielski 			}
624*b1cdbd2cSJim Jagielski 
625*b1cdbd2cSJim Jagielski 			pProfile->m_Flags |= FLG_MODIFIED;
626*b1cdbd2cSJim Jagielski 		}
627*b1cdbd2cSJim Jagielski 		else
628*b1cdbd2cSJim Jagielski 		{
629*b1cdbd2cSJim Jagielski 			i = pSec->m_Entries[NoEntry].m_Line;
630*b1cdbd2cSJim Jagielski 			free(pProfile->m_Lines[i]);
631*b1cdbd2cSJim Jagielski 			pProfile->m_Lines[i] = strdup(Line);
632*b1cdbd2cSJim Jagielski 			setEntry(pProfile, pSec, NoEntry, i, pProfile->m_Lines[i], strlen(pszEntry));
633*b1cdbd2cSJim Jagielski 
634*b1cdbd2cSJim Jagielski 			pProfile->m_Flags |= FLG_MODIFIED;
635*b1cdbd2cSJim Jagielski 		}
636*b1cdbd2cSJim Jagielski 	}
637*b1cdbd2cSJim Jagielski 	else
638*b1cdbd2cSJim Jagielski 	    PrfWriteProfileString(pProfile->m_hIni, (PCSZ)pszSection,
639*b1cdbd2cSJim Jagielski 	                          (PCSZ)pszEntry, (PCSZ)pszString);
640*b1cdbd2cSJim Jagielski 
641*b1cdbd2cSJim Jagielski     bRet = releaseProfile(pProfile);
642*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
643*b1cdbd2cSJim Jagielski     OSL_TRACE("Out osl_writeProfileString [ok]\n");
644*b1cdbd2cSJim Jagielski #endif
645*b1cdbd2cSJim Jagielski 	return bRet;
646*b1cdbd2cSJim Jagielski }
647*b1cdbd2cSJim Jagielski 
648*b1cdbd2cSJim Jagielski 
osl_writeProfileBool(oslProfile Profile,const sal_Char * pszSection,const sal_Char * pszEntry,sal_Bool Value)649*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL osl_writeProfileBool(oslProfile Profile,
650*b1cdbd2cSJim Jagielski 							 const sal_Char* pszSection, const sal_Char* pszEntry,
651*b1cdbd2cSJim Jagielski 							 sal_Bool Value)
652*b1cdbd2cSJim Jagielski {
653*b1cdbd2cSJim Jagielski     sal_Bool bRet = sal_False;
654*b1cdbd2cSJim Jagielski 
655*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
656*b1cdbd2cSJim Jagielski     OSL_TRACE("In  osl_writeProfileBool\n");
657*b1cdbd2cSJim Jagielski #endif
658*b1cdbd2cSJim Jagielski 
659*b1cdbd2cSJim Jagielski 	if (Value)
660*b1cdbd2cSJim Jagielski 		bRet=osl_writeProfileString(Profile, pszSection, pszEntry, STR_INI_BOOLONE);
661*b1cdbd2cSJim Jagielski 	else
662*b1cdbd2cSJim Jagielski 		bRet=osl_writeProfileString(Profile, pszSection, pszEntry, STR_INI_BOOLZERO);
663*b1cdbd2cSJim Jagielski 
664*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
665*b1cdbd2cSJim Jagielski     OSL_TRACE("Out osl_writeProfileBool [ok]\n");
666*b1cdbd2cSJim Jagielski #endif
667*b1cdbd2cSJim Jagielski 
668*b1cdbd2cSJim Jagielski     return bRet;
669*b1cdbd2cSJim Jagielski }
670*b1cdbd2cSJim Jagielski 
671*b1cdbd2cSJim Jagielski 
osl_writeProfileIdent(oslProfile Profile,const sal_Char * pszSection,const sal_Char * pszEntry,sal_uInt32 FirstId,const sal_Char * Strings[],sal_uInt32 Value)672*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL osl_writeProfileIdent(oslProfile Profile,
673*b1cdbd2cSJim Jagielski 							  const sal_Char* pszSection, const sal_Char* pszEntry,
674*b1cdbd2cSJim Jagielski 							  sal_uInt32 FirstId, const sal_Char* Strings[],
675*b1cdbd2cSJim Jagielski 							  sal_uInt32 Value)
676*b1cdbd2cSJim Jagielski {
677*b1cdbd2cSJim Jagielski 	int i, n;
678*b1cdbd2cSJim Jagielski     sal_Bool bRet = sal_False;
679*b1cdbd2cSJim Jagielski 
680*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
681*b1cdbd2cSJim Jagielski     OSL_TRACE("In  osl_writeProfileIdent\n");
682*b1cdbd2cSJim Jagielski #endif
683*b1cdbd2cSJim Jagielski 
684*b1cdbd2cSJim Jagielski 	for (n = 0; Strings[n] != NULL; n++);
685*b1cdbd2cSJim Jagielski 
686*b1cdbd2cSJim Jagielski 	if ((i = Value - FirstId) >= n)
687*b1cdbd2cSJim Jagielski 		bRet=sal_False;
688*b1cdbd2cSJim Jagielski 	else
689*b1cdbd2cSJim Jagielski 		bRet=osl_writeProfileString(Profile, pszSection, pszEntry, Strings[i]);
690*b1cdbd2cSJim Jagielski 
691*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
692*b1cdbd2cSJim Jagielski     OSL_TRACE("Out osl_writeProfileIdent\n");
693*b1cdbd2cSJim Jagielski #endif
694*b1cdbd2cSJim Jagielski     return bRet;
695*b1cdbd2cSJim Jagielski }
696*b1cdbd2cSJim Jagielski 
697*b1cdbd2cSJim Jagielski 
osl_removeProfileEntry(oslProfile Profile,const sal_Char * pszSection,const sal_Char * pszEntry)698*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL osl_removeProfileEntry(oslProfile Profile,
699*b1cdbd2cSJim Jagielski 							   const sal_Char *pszSection, const sal_Char *pszEntry)
700*b1cdbd2cSJim Jagielski {
701*b1cdbd2cSJim Jagielski 	sal_uInt32    NoEntry;
702*b1cdbd2cSJim Jagielski 	osl_TProfileSection* pSec;
703*b1cdbd2cSJim Jagielski 	osl_TProfileImpl*    pProfile = 0;
704*b1cdbd2cSJim Jagielski     sal_Bool bRet = sal_False;
705*b1cdbd2cSJim Jagielski 
706*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
707*b1cdbd2cSJim Jagielski     OSL_TRACE("In  osl_removeProfileEntry\n");
708*b1cdbd2cSJim Jagielski #endif
709*b1cdbd2cSJim Jagielski 
710*b1cdbd2cSJim Jagielski     pProfile = acquireProfile(Profile, sal_True);
711*b1cdbd2cSJim Jagielski 
712*b1cdbd2cSJim Jagielski 	if (pProfile == NULL)
713*b1cdbd2cSJim Jagielski     {
714*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
715*b1cdbd2cSJim Jagielski         OSL_TRACE("Out osl_removeProfileEntry [pProfile==0]\n");
716*b1cdbd2cSJim Jagielski #endif
717*b1cdbd2cSJim Jagielski 
718*b1cdbd2cSJim Jagielski 
719*b1cdbd2cSJim Jagielski 		return (sal_False);
720*b1cdbd2cSJim Jagielski     }
721*b1cdbd2cSJim Jagielski 
722*b1cdbd2cSJim Jagielski 
723*b1cdbd2cSJim Jagielski 	if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
724*b1cdbd2cSJim Jagielski 	{
725*b1cdbd2cSJim Jagielski 		if (((pSec = findEntry(pProfile, pszSection, pszEntry, &NoEntry)) != NULL) &&
726*b1cdbd2cSJim Jagielski 			(NoEntry < pSec->m_NoEntries))
727*b1cdbd2cSJim Jagielski 		{
728*b1cdbd2cSJim Jagielski 			removeLine(pProfile, pSec->m_Entries[NoEntry].m_Line);
729*b1cdbd2cSJim Jagielski 			removeEntry(pSec, NoEntry);
730*b1cdbd2cSJim Jagielski 			if (pSec->m_NoEntries == 0)
731*b1cdbd2cSJim Jagielski 			{
732*b1cdbd2cSJim Jagielski 				removeLine(pProfile, pSec->m_Line);
733*b1cdbd2cSJim Jagielski 
734*b1cdbd2cSJim Jagielski 				/* remove any empty separation line */
735*b1cdbd2cSJim Jagielski 				if ((pSec->m_Line > 0) && (pProfile->m_Lines[pSec->m_Line - 1][0] == '\0'))
736*b1cdbd2cSJim Jagielski 		            removeLine(pProfile, pSec->m_Line - 1);
737*b1cdbd2cSJim Jagielski 
738*b1cdbd2cSJim Jagielski 				removeSection(pProfile, pSec);
739*b1cdbd2cSJim Jagielski 			}
740*b1cdbd2cSJim Jagielski 
741*b1cdbd2cSJim Jagielski 			pProfile->m_Flags |= FLG_MODIFIED;
742*b1cdbd2cSJim Jagielski 		}
743*b1cdbd2cSJim Jagielski 	}
744*b1cdbd2cSJim Jagielski 	else
745*b1cdbd2cSJim Jagielski 	    PrfWriteProfileString(pProfile->m_hIni, (PCSZ)pszSection, (PCSZ)pszEntry, NULL);
746*b1cdbd2cSJim Jagielski 
747*b1cdbd2cSJim Jagielski     bRet = releaseProfile(pProfile);
748*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
749*b1cdbd2cSJim Jagielski     OSL_TRACE("Out osl_removeProfileEntry [ok]\n");
750*b1cdbd2cSJim Jagielski #endif
751*b1cdbd2cSJim Jagielski 	return bRet;
752*b1cdbd2cSJim Jagielski }
753*b1cdbd2cSJim Jagielski 
754*b1cdbd2cSJim Jagielski 
osl_getProfileSectionEntries(oslProfile Profile,const sal_Char * pszSection,sal_Char * pszBuffer,sal_uInt32 MaxLen)755*b1cdbd2cSJim Jagielski sal_uInt32 SAL_CALL osl_getProfileSectionEntries(oslProfile Profile, const sal_Char *pszSection,
756*b1cdbd2cSJim Jagielski 									  sal_Char* pszBuffer, sal_uInt32 MaxLen)
757*b1cdbd2cSJim Jagielski {
758*b1cdbd2cSJim Jagielski 	sal_uInt32    i, n = 0;
759*b1cdbd2cSJim Jagielski 	sal_uInt32    NoEntry;
760*b1cdbd2cSJim Jagielski 	osl_TProfileSection* pSec;
761*b1cdbd2cSJim Jagielski 	osl_TProfileImpl*    pProfile = 0;
762*b1cdbd2cSJim Jagielski 
763*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
764*b1cdbd2cSJim Jagielski     OSL_TRACE("In  osl_getProfileSectionEntries\n");
765*b1cdbd2cSJim Jagielski #endif
766*b1cdbd2cSJim Jagielski 
767*b1cdbd2cSJim Jagielski     pProfile = acquireProfile(Profile, sal_False);
768*b1cdbd2cSJim Jagielski 
769*b1cdbd2cSJim Jagielski     if (pProfile == NULL)
770*b1cdbd2cSJim Jagielski     {
771*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
772*b1cdbd2cSJim Jagielski         OSL_TRACE("Out osl_getProfileSectionEntries [pProfile=0]\n");
773*b1cdbd2cSJim Jagielski #endif
774*b1cdbd2cSJim Jagielski 
775*b1cdbd2cSJim Jagielski 
776*b1cdbd2cSJim Jagielski 		return (0);
777*b1cdbd2cSJim Jagielski     }
778*b1cdbd2cSJim Jagielski 
779*b1cdbd2cSJim Jagielski 
780*b1cdbd2cSJim Jagielski 	if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
781*b1cdbd2cSJim Jagielski 	{
782*b1cdbd2cSJim Jagielski 		if ((pSec = findEntry(pProfile, pszSection, "", &NoEntry)) != NULL)
783*b1cdbd2cSJim Jagielski 		{
784*b1cdbd2cSJim Jagielski 			if (MaxLen != 0)
785*b1cdbd2cSJim Jagielski 			{
786*b1cdbd2cSJim Jagielski 				for (i = 0; i < pSec->m_NoEntries; i++)
787*b1cdbd2cSJim Jagielski 				{
788*b1cdbd2cSJim Jagielski 					if ((n + pSec->m_Entries[i].m_Len + 1) < MaxLen)
789*b1cdbd2cSJim Jagielski 					{
790*b1cdbd2cSJim Jagielski 						strncpy(&pszBuffer[n], &pProfile->m_Lines[pSec->m_Entries[i].m_Line]
791*b1cdbd2cSJim Jagielski 								[pSec->m_Entries[i].m_Offset], pSec->m_Entries[i].m_Len);
792*b1cdbd2cSJim Jagielski 						n += pSec->m_Entries[i].m_Len;
793*b1cdbd2cSJim Jagielski 						pszBuffer[n++] = '\0';
794*b1cdbd2cSJim Jagielski 					}
795*b1cdbd2cSJim Jagielski 					else
796*b1cdbd2cSJim Jagielski 						break;
797*b1cdbd2cSJim Jagielski 
798*b1cdbd2cSJim Jagielski 				}
799*b1cdbd2cSJim Jagielski 
800*b1cdbd2cSJim Jagielski 				pszBuffer[n++] = '\0';
801*b1cdbd2cSJim Jagielski 			}
802*b1cdbd2cSJim Jagielski 			else
803*b1cdbd2cSJim Jagielski 			{
804*b1cdbd2cSJim Jagielski 				for (i = 0; i < pSec->m_NoEntries; i++)
805*b1cdbd2cSJim Jagielski 					n += pSec->m_Entries[i].m_Len + 1;
806*b1cdbd2cSJim Jagielski 
807*b1cdbd2cSJim Jagielski 				n += 1;
808*b1cdbd2cSJim Jagielski 			}
809*b1cdbd2cSJim Jagielski 		}
810*b1cdbd2cSJim Jagielski 		else
811*b1cdbd2cSJim Jagielski 			n = 0;
812*b1cdbd2cSJim Jagielski 	}
813*b1cdbd2cSJim Jagielski 	else
814*b1cdbd2cSJim Jagielski     	n = PrfQueryProfileString(pProfile->m_hIni, (PCSZ)pszSection, NULL, NULL,
815*b1cdbd2cSJim Jagielski 	    	  				      pszBuffer, MaxLen );
816*b1cdbd2cSJim Jagielski 
817*b1cdbd2cSJim Jagielski 	releaseProfile(pProfile);
818*b1cdbd2cSJim Jagielski 
819*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
820*b1cdbd2cSJim Jagielski     OSL_TRACE("Out osl_getProfileSectionEntries [ok]\n");
821*b1cdbd2cSJim Jagielski #endif
822*b1cdbd2cSJim Jagielski 
823*b1cdbd2cSJim Jagielski 	return (n);
824*b1cdbd2cSJim Jagielski }
825*b1cdbd2cSJim Jagielski 
osl_getProfileSections(oslProfile Profile,sal_Char * pszBuffer,sal_uInt32 MaxLen)826*b1cdbd2cSJim Jagielski sal_uInt32 SAL_CALL osl_getProfileSections(oslProfile Profile, sal_Char* pszBuffer, sal_uInt32 MaxLen)
827*b1cdbd2cSJim Jagielski {
828*b1cdbd2cSJim Jagielski 	sal_uInt32    i, n = 0;
829*b1cdbd2cSJim Jagielski 	osl_TProfileSection* pSec;
830*b1cdbd2cSJim Jagielski 	osl_TProfileImpl*    pProfile = acquireProfile(Profile, sal_False);
831*b1cdbd2cSJim Jagielski 
832*b1cdbd2cSJim Jagielski 	if (pProfile == NULL)
833*b1cdbd2cSJim Jagielski 		return (0);
834*b1cdbd2cSJim Jagielski 
835*b1cdbd2cSJim Jagielski 	if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
836*b1cdbd2cSJim Jagielski 	{
837*b1cdbd2cSJim Jagielski 		if (MaxLen != 0)
838*b1cdbd2cSJim Jagielski 		{
839*b1cdbd2cSJim Jagielski  			for (i = 0; i < pProfile->m_NoSections; i++)
840*b1cdbd2cSJim Jagielski 			{
841*b1cdbd2cSJim Jagielski 				pSec = &pProfile->m_Sections[i];
842*b1cdbd2cSJim Jagielski 
843*b1cdbd2cSJim Jagielski 				if ((n + pSec->m_Len + 1) < MaxLen)
844*b1cdbd2cSJim Jagielski 				{
845*b1cdbd2cSJim Jagielski 					strncpy(&pszBuffer[n], &pProfile->m_Lines[pSec->m_Line][pSec->m_Offset],
846*b1cdbd2cSJim Jagielski 					        pSec->m_Len);
847*b1cdbd2cSJim Jagielski 					n += pSec->m_Len;
848*b1cdbd2cSJim Jagielski 					pszBuffer[n++] = '\0';
849*b1cdbd2cSJim Jagielski 				}
850*b1cdbd2cSJim Jagielski 				else
851*b1cdbd2cSJim Jagielski 					break;
852*b1cdbd2cSJim Jagielski 			}
853*b1cdbd2cSJim Jagielski 
854*b1cdbd2cSJim Jagielski 			pszBuffer[n++] = '\0';
855*b1cdbd2cSJim Jagielski 		}
856*b1cdbd2cSJim Jagielski 		else
857*b1cdbd2cSJim Jagielski 		{
858*b1cdbd2cSJim Jagielski  			for (i = 0; i < pProfile->m_NoSections; i++)
859*b1cdbd2cSJim Jagielski 				n += pProfile->m_Sections[i].m_Len + 1;
860*b1cdbd2cSJim Jagielski 
861*b1cdbd2cSJim Jagielski 			n += 1;
862*b1cdbd2cSJim Jagielski 		}
863*b1cdbd2cSJim Jagielski 	}
864*b1cdbd2cSJim Jagielski 	else
865*b1cdbd2cSJim Jagielski     	n = PrfQueryProfileString(pProfile->m_hIni, NULL, NULL, NULL,
866*b1cdbd2cSJim Jagielski 	    	  				      pszBuffer, MaxLen );
867*b1cdbd2cSJim Jagielski 
868*b1cdbd2cSJim Jagielski 	releaseProfile(pProfile);
869*b1cdbd2cSJim Jagielski 
870*b1cdbd2cSJim Jagielski 	return (n);
871*b1cdbd2cSJim Jagielski }
872*b1cdbd2cSJim Jagielski 
873*b1cdbd2cSJim Jagielski #if 0 // YD
874*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL osl_getProfileName(rtl_uString* strPath, rtl_uString* strName, rtl_uString** strProfileName)
875*b1cdbd2cSJim Jagielski {
876*b1cdbd2cSJim Jagielski 	sal_Bool bFailed;
877*b1cdbd2cSJim Jagielski 	sal_Char File[_MAX_PATH];
878*b1cdbd2cSJim Jagielski 	sal_Char Path[_MAX_PATH];
879*b1cdbd2cSJim Jagielski 	sal_uInt32  nFileLen;
880*b1cdbd2cSJim Jagielski 	sal_uInt32  nPathLen = 0;
881*b1cdbd2cSJim Jagielski 
882*b1cdbd2cSJim Jagielski 	rtl_uString * strTmp = NULL;
883*b1cdbd2cSJim Jagielski 	oslFileError nError;
884*b1cdbd2cSJim Jagielski 
885*b1cdbd2cSJim Jagielski 	/* build file name */
886*b1cdbd2cSJim Jagielski 	if (strName && strName->length)
887*b1cdbd2cSJim Jagielski 	{
888*b1cdbd2cSJim Jagielski 		if(strName->length >= _MAX_PATH)
889*b1cdbd2cSJim Jagielski 			return sal_False;
890*b1cdbd2cSJim Jagielski 
891*b1cdbd2cSJim Jagielski 		strcpy(File, (char*)strName->buffer);
892*b1cdbd2cSJim Jagielski 		nFileLen = strName->length;
893*b1cdbd2cSJim Jagielski 
894*b1cdbd2cSJim Jagielski 		if (rtl_ustr_indexOfChar( File, L'.' ) == -1)
895*b1cdbd2cSJim Jagielski 		{
896*b1cdbd2cSJim Jagielski 			if (nFileLen + strlen(STR_INI_EXTENSION) >= _MAX_PATH)
897*b1cdbd2cSJim Jagielski 				return sal_False;
898*b1cdbd2cSJim Jagielski 
899*b1cdbd2cSJim Jagielski 			/* add default extension */
900*b1cdbd2cSJim Jagielski 			strcpy(File + nFileLen, STR_INI_EXTENSION);
901*b1cdbd2cSJim Jagielski 			nFileLen += strlen(STR_INI_EXTENSION);
902*b1cdbd2cSJim Jagielski 		}
903*b1cdbd2cSJim Jagielski 	}
904*b1cdbd2cSJim Jagielski 	else
905*b1cdbd2cSJim Jagielski 	{
906*b1cdbd2cSJim Jagielski 		rtl_uString *strProgName = NULL;
907*b1cdbd2cSJim Jagielski 		sal_Unicode *pProgName;
908*b1cdbd2cSJim Jagielski 		sal_Int32 nOffset = 0;
909*b1cdbd2cSJim Jagielski 		sal_Int32 nLen;
910*b1cdbd2cSJim Jagielski 		sal_Int32 nPos;
911*b1cdbd2cSJim Jagielski 
912*b1cdbd2cSJim Jagielski 		if (osl_getExecutableFile(&strProgName) != osl_Process_E_None)
913*b1cdbd2cSJim Jagielski 			return sal_False;
914*b1cdbd2cSJim Jagielski 
915*b1cdbd2cSJim Jagielski 		/* remove path and extension from filename */
916*b1cdbd2cSJim Jagielski 		pProgName = strProgName->buffer;
917*b1cdbd2cSJim Jagielski 		nLen = strProgName->length ;
918*b1cdbd2cSJim Jagielski 
919*b1cdbd2cSJim Jagielski 		if ((nPos = rtl_ustr_lastIndexOfChar( pProgName, L'/' )) != -1)
920*b1cdbd2cSJim Jagielski 			nOffset = nPos + 1;
921*b1cdbd2cSJim Jagielski 		else if ((nPos = rtl_ustr_lastIndexOfChar( pProgName, L':' )) != -1)
922*b1cdbd2cSJim Jagielski 			nOffset = nPos + 1;
923*b1cdbd2cSJim Jagielski 
924*b1cdbd2cSJim Jagielski 		if ((nPos = rtl_ustr_lastIndexOfChar( pProgName, L'.' )) != -1 )
925*b1cdbd2cSJim Jagielski 			nLen -= 4;
926*b1cdbd2cSJim Jagielski 
927*b1cdbd2cSJim Jagielski 		if ((nFileLen = nLen - nOffset) >= _MAX_PATH)
928*b1cdbd2cSJim Jagielski 			return sal_False;
929*b1cdbd2cSJim Jagielski 
930*b1cdbd2cSJim Jagielski 		strncpy(File, pProgName + nOffset, nFileLen);
931*b1cdbd2cSJim Jagielski 
932*b1cdbd2cSJim Jagielski 		if (nFileLen + strlen(STR_INI_EXTENSION) >= _MAX_PATH)
933*b1cdbd2cSJim Jagielski 			return sal_False;
934*b1cdbd2cSJim Jagielski 
935*b1cdbd2cSJim Jagielski 		/* add default extension */
936*b1cdbd2cSJim Jagielski 		strcpy(File + nFileLen, STR_INI_EXTENSION);
937*b1cdbd2cSJim Jagielski 		nFileLen += strlen(STR_INI_EXTENSION);
938*b1cdbd2cSJim Jagielski 
939*b1cdbd2cSJim Jagielski 		rtl_uString_release( strProgName );
940*b1cdbd2cSJim Jagielski 	}
941*b1cdbd2cSJim Jagielski 
942*b1cdbd2cSJim Jagielski 	if (File[0] == 0)
943*b1cdbd2cSJim Jagielski 		return sal_False;
944*b1cdbd2cSJim Jagielski 
945*b1cdbd2cSJim Jagielski 	/* build directory path */
946*b1cdbd2cSJim Jagielski 	if (strPath && strPath->length)
947*b1cdbd2cSJim Jagielski 	{
948*b1cdbd2cSJim Jagielski 		sal_Unicode *pPath = rtl_uString_getStr(strPath);
949*b1cdbd2cSJim Jagielski 		sal_Int32 nLen = rtl_uString_getLength(strPath);
950*b1cdbd2cSJim Jagielski 
951*b1cdbd2cSJim Jagielski 		if ((rtl_ustr_ascii_compare_WithLength(pPath, RTL_CONSTASCII_LENGTH(STR_INI_METAHOME) , STR_INI_METAHOME) == 0) &&
952*b1cdbd2cSJim Jagielski             ((nLen == RTL_CONSTASCII_LENGTH(STR_INI_METAHOME)) || (pPath[RTL_CONSTASCII_LENGTH(STR_INI_METAHOME)] == '/')))
953*b1cdbd2cSJim Jagielski 		{
954*b1cdbd2cSJim Jagielski 			rtl_uString * strHome = NULL;
955*b1cdbd2cSJim Jagielski 			oslSecurity security = osl_getCurrentSecurity();
956*b1cdbd2cSJim Jagielski 
957*b1cdbd2cSJim Jagielski 			bFailed = ! osl_getHomeDir(security, &strHome);
958*b1cdbd2cSJim Jagielski 			osl_freeSecurityHandle(security);
959*b1cdbd2cSJim Jagielski 
960*b1cdbd2cSJim Jagielski 			if (bFailed) return (sal_False);
961*b1cdbd2cSJim Jagielski 
962*b1cdbd2cSJim Jagielski 			if (strHome->length >= _MAX_PATH)
963*b1cdbd2cSJim Jagielski 				return sal_False;
964*b1cdbd2cSJim Jagielski 
965*b1cdbd2cSJim Jagielski 			strcpy( Path, strHome->buffer);
966*b1cdbd2cSJim Jagielski 			nPathLen = strHome->length;
967*b1cdbd2cSJim Jagielski 
968*b1cdbd2cSJim Jagielski 			if (nLen > RTL_CONSTASCII_LENGTH(STR_INI_METAHOME))
969*b1cdbd2cSJim Jagielski 			{
970*b1cdbd2cSJim Jagielski 				pPath += RTL_CONSTASCII_LENGTH(STR_INI_METAHOME);
971*b1cdbd2cSJim Jagielski 				nLen -= RTL_CONSTASCII_LENGTH(STR_INI_METAHOME);
972*b1cdbd2cSJim Jagielski 
973*b1cdbd2cSJim Jagielski 				if (nLen + nPathLen >= _MAX_PATH)
974*b1cdbd2cSJim Jagielski 					return sal_False;
975*b1cdbd2cSJim Jagielski 
976*b1cdbd2cSJim Jagielski 				strcpy(Path + nPathLen, pPath);
977*b1cdbd2cSJim Jagielski 				nPathLen += nLen;
978*b1cdbd2cSJim Jagielski 			}
979*b1cdbd2cSJim Jagielski 
980*b1cdbd2cSJim Jagielski 			rtl_uString_release(strHome);
981*b1cdbd2cSJim Jagielski 		}
982*b1cdbd2cSJim Jagielski 
983*b1cdbd2cSJim Jagielski 		else if ((rtl_ustr_ascii_compare_WithLength(pPath, RTL_CONSTASCII_LENGTH(STR_INI_METACFG), STR_INI_METACFG) == 0) &&
984*b1cdbd2cSJim Jagielski 			((nLen == RTL_CONSTASCII_LENGTH(STR_INI_METACFG)) || (pPath[RTL_CONSTASCII_LENGTH(STR_INI_METACFG)] == '/')))
985*b1cdbd2cSJim Jagielski 		{
986*b1cdbd2cSJim Jagielski 			rtl_uString * strConfig = NULL;
987*b1cdbd2cSJim Jagielski 			oslSecurity security = osl_getCurrentSecurity();
988*b1cdbd2cSJim Jagielski 
989*b1cdbd2cSJim Jagielski 			bFailed = ! osl_getConfigDir(security, &strConfig);
990*b1cdbd2cSJim Jagielski 			osl_freeSecurityHandle(security);
991*b1cdbd2cSJim Jagielski 
992*b1cdbd2cSJim Jagielski 			if (bFailed) return (sal_False);
993*b1cdbd2cSJim Jagielski 
994*b1cdbd2cSJim Jagielski 			if (strConfig->length >= _MAX_PATH)
995*b1cdbd2cSJim Jagielski 				return sal_False;
996*b1cdbd2cSJim Jagielski 
997*b1cdbd2cSJim Jagielski 			strcpy( Path, strConfig->buffer);
998*b1cdbd2cSJim Jagielski 			nPathLen = strConfig->length;
999*b1cdbd2cSJim Jagielski 
1000*b1cdbd2cSJim Jagielski 			if (nLen > RTL_CONSTASCII_LENGTH(STR_INI_METACFG))
1001*b1cdbd2cSJim Jagielski 			{
1002*b1cdbd2cSJim Jagielski 				pPath += RTL_CONSTASCII_LENGTH(STR_INI_METACFG);
1003*b1cdbd2cSJim Jagielski 				nLen -= RTL_CONSTASCII_LENGTH(STR_INI_METACFG);
1004*b1cdbd2cSJim Jagielski 
1005*b1cdbd2cSJim Jagielski 				if (nLen + nPathLen >= _MAX_PATH)
1006*b1cdbd2cSJim Jagielski 					return sal_False;
1007*b1cdbd2cSJim Jagielski 
1008*b1cdbd2cSJim Jagielski 				strcpy(Path + nPathLen, pPath);
1009*b1cdbd2cSJim Jagielski 				nPathLen += nLen;
1010*b1cdbd2cSJim Jagielski 			}
1011*b1cdbd2cSJim Jagielski 
1012*b1cdbd2cSJim Jagielski 			rtl_uString_release(strConfig);
1013*b1cdbd2cSJim Jagielski 		}
1014*b1cdbd2cSJim Jagielski 
1015*b1cdbd2cSJim Jagielski 		else if ((rtl_ustr_ascii_compare_WithLength(pPath, RTL_CONSTASCII_LENGTH(STR_INI_METASYS), STR_INI_METASYS) == 0) &&
1016*b1cdbd2cSJim Jagielski 			((nLen == RTL_CONSTASCII_LENGTH(STR_INI_METASYS)) || (pPath[RTL_CONSTASCII_LENGTH(STR_INI_METASYS)] == '/')))
1017*b1cdbd2cSJim Jagielski 		{
1018*b1cdbd2cSJim Jagielski 			if (((nPathLen = GetWindowsDirectoryW(Path, _MAX_PATH)) == 0) || (nPathLen >= _MAX_PATH))
1019*b1cdbd2cSJim Jagielski 				return (sal_False);
1020*b1cdbd2cSJim Jagielski 
1021*b1cdbd2cSJim Jagielski 			if (nLen > RTL_CONSTASCII_LENGTH(STR_INI_METASYS))
1022*b1cdbd2cSJim Jagielski 			{
1023*b1cdbd2cSJim Jagielski 				pPath += RTL_CONSTASCII_LENGTH(STR_INI_METASYS);
1024*b1cdbd2cSJim Jagielski 				nLen -= RTL_CONSTASCII_LENGTH(STR_INI_METASYS);
1025*b1cdbd2cSJim Jagielski 
1026*b1cdbd2cSJim Jagielski 				if (nLen + nPathLen >= MAX_PATH)
1027*b1cdbd2cSJim Jagielski 					return sal_False;
1028*b1cdbd2cSJim Jagielski 
1029*b1cdbd2cSJim Jagielski 				strcpy(Path + nPathLen, pPath);
1030*b1cdbd2cSJim Jagielski 				nPathLen += nLen;
1031*b1cdbd2cSJim Jagielski 			}
1032*b1cdbd2cSJim Jagielski 		}
1033*b1cdbd2cSJim Jagielski 
1034*b1cdbd2cSJim Jagielski 		else if ((rtl_ustr_ascii_compare_WithLength(pPath, RTL_CONSTASCII_LENGTH(STR_INI_METAINS), STR_INI_METAINS) == 0) &&
1035*b1cdbd2cSJim Jagielski             ((nLen == RTL_CONSTASCII_LENGTH(STR_INI_METAINS)) || (pPath[RTL_CONSTASCII_LENGTH(STR_INI_METAINS)] == '/') ||
1036*b1cdbd2cSJim Jagielski                 (pPath[RTL_CONSTASCII_LENGTH(STR_INI_METAINS)] == '"') ) )
1037*b1cdbd2cSJim Jagielski 		{
1038*b1cdbd2cSJim Jagielski 			if (! lookupProfile(pPath + RTL_CONSTASCII_LENGTH(STR_INI_METAINS), File, Path))
1039*b1cdbd2cSJim Jagielski 				return (sal_False);
1040*b1cdbd2cSJim Jagielski 
1041*b1cdbd2cSJim Jagielski 			nPathLen = strlen(Path);
1042*b1cdbd2cSJim Jagielski 		}
1043*b1cdbd2cSJim Jagielski 
1044*b1cdbd2cSJim Jagielski 		else if(nLen < MAX_PATH)
1045*b1cdbd2cSJim Jagielski 		{
1046*b1cdbd2cSJim Jagielski 			strcpy(Path, pPath);
1047*b1cdbd2cSJim Jagielski 			nPathLen = strlen(Path);
1048*b1cdbd2cSJim Jagielski 		}
1049*b1cdbd2cSJim Jagielski 		else
1050*b1cdbd2cSJim Jagielski 			return sal_False;
1051*b1cdbd2cSJim Jagielski 	}
1052*b1cdbd2cSJim Jagielski 	else
1053*b1cdbd2cSJim Jagielski 	{
1054*b1cdbd2cSJim Jagielski 		rtl_uString * strConfigDir = NULL;
1055*b1cdbd2cSJim Jagielski 		oslSecurity security = osl_getCurrentSecurity();
1056*b1cdbd2cSJim Jagielski 
1057*b1cdbd2cSJim Jagielski 		bFailed = ! osl_getConfigDir(security, &strConfigDir);
1058*b1cdbd2cSJim Jagielski 		osl_freeSecurityHandle(security);
1059*b1cdbd2cSJim Jagielski 
1060*b1cdbd2cSJim Jagielski 		if (bFailed) return (sal_False);
1061*b1cdbd2cSJim Jagielski 		if (strConfigDir->length >= MAX_PATH)
1062*b1cdbd2cSJim Jagielski 			return sal_False;
1063*b1cdbd2cSJim Jagielski 
1064*b1cdbd2cSJim Jagielski 		strcpy(Path, strConfigDir->buffer);
1065*b1cdbd2cSJim Jagielski 		nPathLen = strConfigDir->length;
1066*b1cdbd2cSJim Jagielski 	}
1067*b1cdbd2cSJim Jagielski 
1068*b1cdbd2cSJim Jagielski 	if (nPathLen && (Path[nPathLen - 1] != L'/') && (Path[nPathLen - 1] != L'\\'))
1069*b1cdbd2cSJim Jagielski 	{
1070*b1cdbd2cSJim Jagielski 		Path[nPathLen++] = L'\\';
1071*b1cdbd2cSJim Jagielski 		Path[nPathLen] = 0;
1072*b1cdbd2cSJim Jagielski 	}
1073*b1cdbd2cSJim Jagielski 
1074*b1cdbd2cSJim Jagielski 	if (nPathLen + nFileLen >= MAX_PATH)
1075*b1cdbd2cSJim Jagielski 		return sal_False;
1076*b1cdbd2cSJim Jagielski 
1077*b1cdbd2cSJim Jagielski 	/* append file name */
1078*b1cdbd2cSJim Jagielski 	strcpy(Path + nPathLen, File);
1079*b1cdbd2cSJim Jagielski 	nPathLen += nFileLen;
1080*b1cdbd2cSJim Jagielski 
1081*b1cdbd2cSJim Jagielski 	/* copy filename */
1082*b1cdbd2cSJim Jagielski 	rtl_uString_newFromStr_WithLength(&strTmp, Path, nPathLen);
1083*b1cdbd2cSJim Jagielski 	nError = osl_getFileURLFromSystemPath(strTmp, strProfileName);
1084*b1cdbd2cSJim Jagielski 	rtl_uString_release(strTmp);
1085*b1cdbd2cSJim Jagielski 
1086*b1cdbd2cSJim Jagielski 	return nError == osl_File_E_None;
1087*b1cdbd2cSJim Jagielski }
1088*b1cdbd2cSJim Jagielski #endif // 0 // YD
1089*b1cdbd2cSJim Jagielski 
1090*b1cdbd2cSJim Jagielski 
1091*b1cdbd2cSJim Jagielski /*****************************************************************************/
1092*b1cdbd2cSJim Jagielski /* Static Module Functions */
1093*b1cdbd2cSJim Jagielski /*****************************************************************************/
1094*b1cdbd2cSJim Jagielski 
getFileStamp(osl_TFile * pFile)1095*b1cdbd2cSJim Jagielski static osl_TStamp getFileStamp(osl_TFile* pFile)
1096*b1cdbd2cSJim Jagielski {
1097*b1cdbd2cSJim Jagielski 	osl_TStamp  FileTime;
1098*b1cdbd2cSJim Jagielski 	FILESTATUS3	FileStatus;
1099*b1cdbd2cSJim Jagielski 	sal_uInt32  Bytes;
1100*b1cdbd2cSJim Jagielski 
1101*b1cdbd2cSJim Jagielski 	Bytes = sizeof( FILESTATUS3 );
1102*b1cdbd2cSJim Jagielski 	if ( (!pFile->m_Handle) ||
1103*b1cdbd2cSJim Jagielski 		DosQueryFileInfo(pFile->m_Handle, FIL_STANDARD, &FileStatus, Bytes))
1104*b1cdbd2cSJim Jagielski 		memset(&FileTime, 0, sizeof(FileTime));
1105*b1cdbd2cSJim Jagielski     else
1106*b1cdbd2cSJim Jagielski     {
1107*b1cdbd2cSJim Jagielski 		FileTime.m_Date = FileStatus.fdateLastWrite;
1108*b1cdbd2cSJim Jagielski 		FileTime.m_Time = FileStatus.ftimeLastWrite;
1109*b1cdbd2cSJim Jagielski     }
1110*b1cdbd2cSJim Jagielski 
1111*b1cdbd2cSJim Jagielski 	return (FileTime);
1112*b1cdbd2cSJim Jagielski }
1113*b1cdbd2cSJim Jagielski 
lockFile(const osl_TFile * pFile,osl_TLockMode eMode)1114*b1cdbd2cSJim Jagielski static sal_Bool lockFile(const osl_TFile* pFile, osl_TLockMode eMode)
1115*b1cdbd2cSJim Jagielski {
1116*b1cdbd2cSJim Jagielski 	sal_uInt32  status = 1;
1117*b1cdbd2cSJim Jagielski 	FILELOCK 	Lock;
1118*b1cdbd2cSJim Jagielski 
1119*b1cdbd2cSJim Jagielski 	if (!pFile->m_Handle)
1120*b1cdbd2cSJim Jagielski 		return (sal_False);
1121*b1cdbd2cSJim Jagielski 
1122*b1cdbd2cSJim Jagielski 	Lock.lOffset = 0;
1123*b1cdbd2cSJim Jagielski 	Lock.lRange  = 0xFFFFFFFF;
1124*b1cdbd2cSJim Jagielski 
1125*b1cdbd2cSJim Jagielski 	switch (eMode)
1126*b1cdbd2cSJim Jagielski 	{
1127*b1cdbd2cSJim Jagielski 		case un_lock:
1128*b1cdbd2cSJim Jagielski 			status = DosSetFileLocks(pFile->m_Handle, &Lock, NULL, 1000, 0);
1129*b1cdbd2cSJim Jagielski 			break;
1130*b1cdbd2cSJim Jagielski 
1131*b1cdbd2cSJim Jagielski 		case read_lock:
1132*b1cdbd2cSJim Jagielski 			status = DosSetFileLocks(pFile->m_Handle, NULL, &Lock, 1000, 1);
1133*b1cdbd2cSJim Jagielski 			break;
1134*b1cdbd2cSJim Jagielski 
1135*b1cdbd2cSJim Jagielski 		case write_lock:
1136*b1cdbd2cSJim Jagielski 			status = DosSetFileLocks(pFile->m_Handle, NULL, &Lock, 1000, 0);
1137*b1cdbd2cSJim Jagielski 			break;
1138*b1cdbd2cSJim Jagielski 	}
1139*b1cdbd2cSJim Jagielski 
1140*b1cdbd2cSJim Jagielski 	return (status == 0);
1141*b1cdbd2cSJim Jagielski }
1142*b1cdbd2cSJim Jagielski 
1143*b1cdbd2cSJim Jagielski //static osl_TFile* openFile(rtl_uString* pszFilename, sal_Bool bWriteable)
openFileImpl(rtl_uString * ustrFileName,oslProfileOption ProfileFlags)1144*b1cdbd2cSJim Jagielski static osl_TFile* openFileImpl(rtl_uString *ustrFileName, oslProfileOption ProfileFlags )
1145*b1cdbd2cSJim Jagielski {
1146*b1cdbd2cSJim Jagielski     sal_uInt32 	action;
1147*b1cdbd2cSJim Jagielski     APIRET 		rc;
1148*b1cdbd2cSJim Jagielski 	osl_TFile* 	pFile = (osl_TFile*)calloc(1, sizeof(osl_TFile));
1149*b1cdbd2cSJim Jagielski 
1150*b1cdbd2cSJim Jagielski         ULONG attributes;
1151*b1cdbd2cSJim Jagielski         ULONG flags;
1152*b1cdbd2cSJim Jagielski         ULONG mode;
1153*b1cdbd2cSJim Jagielski 	sal_Bool bWriteable = sal_False;
1154*b1cdbd2cSJim Jagielski 	rtl_String* strFileName=0;
1155*b1cdbd2cSJim Jagielski 	sal_Char* pszFileName=0;
1156*b1cdbd2cSJim Jagielski 
1157*b1cdbd2cSJim Jagielski     /* check parameters */
1158*b1cdbd2cSJim Jagielski     OSL_ASSERT( ustrFileName );
1159*b1cdbd2cSJim Jagielski 
1160*b1cdbd2cSJim Jagielski 	rtl_uString2String( &strFileName,
1161*b1cdbd2cSJim Jagielski                             rtl_uString_getStr(ustrFileName),
1162*b1cdbd2cSJim Jagielski                             rtl_uString_getLength(ustrFileName),
1163*b1cdbd2cSJim Jagielski                             osl_getThreadTextEncoding(),
1164*b1cdbd2cSJim Jagielski                             OUSTRING_TO_OSTRING_CVTFLAGS );
1165*b1cdbd2cSJim Jagielski 	pszFileName = rtl_string_getStr(strFileName);
1166*b1cdbd2cSJim Jagielski 
1167*b1cdbd2cSJim Jagielski /*    if ( ProfileFlags & ( osl_Profile_WRITELOCK | osl_Profile_FLUSHWRITE | osl_Profile_READWRITE ) )*/
1168*b1cdbd2cSJim Jagielski     if ( ProfileFlags & ( osl_Profile_WRITELOCK | osl_Profile_FLUSHWRITE ) )
1169*b1cdbd2cSJim Jagielski     {
1170*b1cdbd2cSJim Jagielski #ifdef DEBUG_OSL_PROFILE
1171*b1cdbd2cSJim Jagielski         OSL_TRACE("setting bWriteable to TRUE\n");
1172*b1cdbd2cSJim Jagielski #endif
1173*b1cdbd2cSJim Jagielski         bWriteable=sal_True;
1174*b1cdbd2cSJim Jagielski     }
1175*b1cdbd2cSJim Jagielski 
1176*b1cdbd2cSJim Jagielski         if (bWriteable)
1177*b1cdbd2cSJim Jagielski         {
1178*b1cdbd2cSJim Jagielski             flags = FILE_NORMAL | FILE_ARCHIVED;
1179*b1cdbd2cSJim Jagielski             attributes = OPEN_ACTION_CREATE_IF_NEW | OPEN_ACTION_OPEN_IF_EXISTS;
1180*b1cdbd2cSJim Jagielski             mode = OPEN_SHARE_DENYNONE | OPEN_ACCESS_READWRITE;
1181*b1cdbd2cSJim Jagielski         }
1182*b1cdbd2cSJim Jagielski         else
1183*b1cdbd2cSJim Jagielski         {
1184*b1cdbd2cSJim Jagielski             flags = FILE_NORMAL;
1185*b1cdbd2cSJim Jagielski             attributes = OPEN_ACTION_FAIL_IF_NEW | OPEN_ACTION_OPEN_IF_EXISTS;
1186*b1cdbd2cSJim Jagielski        	    mode = OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY;
1187*b1cdbd2cSJim Jagielski         }
1188*b1cdbd2cSJim Jagielski 
1189*b1cdbd2cSJim Jagielski         if (rc = DosOpen((PCSZ)pszFileName, &pFile->m_Handle, &action, 0, flags, attributes, mode, NULL))
1190*b1cdbd2cSJim Jagielski         {
1191*b1cdbd2cSJim Jagielski             if (rc == ERROR_TOO_MANY_OPEN_FILES)
1192*b1cdbd2cSJim Jagielski             {
1193*b1cdbd2cSJim Jagielski                 LONG fhToAdd = 10;
1194*b1cdbd2cSJim Jagielski                 ULONG fhOld = 0;
1195*b1cdbd2cSJim Jagielski                 rc = DosSetRelMaxFH(&fhToAdd, &fhOld);
1196*b1cdbd2cSJim Jagielski                 rc = DosOpen((PCSZ)pszFileName, &pFile->m_Handle, &action, 0, flags, attributes, mode, NULL);
1197*b1cdbd2cSJim Jagielski             }
1198*b1cdbd2cSJim Jagielski 		}
1199*b1cdbd2cSJim Jagielski 
1200*b1cdbd2cSJim Jagielski         if ( (rc != NO_ERROR) && bWriteable)
1201*b1cdbd2cSJim Jagielski         {
1202*b1cdbd2cSJim Jagielski             free(pFile);
1203*b1cdbd2cSJim Jagielski 			rtl_string_release(strFileName);
1204*b1cdbd2cSJim Jagielski       	    return (NULL);
1205*b1cdbd2cSJim Jagielski         }
1206*b1cdbd2cSJim Jagielski 
1207*b1cdbd2cSJim Jagielski 	rtl_string_release(strFileName);
1208*b1cdbd2cSJim Jagielski 
1209*b1cdbd2cSJim Jagielski 	pFile->m_pWriteBuf=0;
1210*b1cdbd2cSJim Jagielski 	pFile->m_nWriteBufFree=0;
1211*b1cdbd2cSJim Jagielski 	pFile->m_nWriteBufLen=0;
1212*b1cdbd2cSJim Jagielski 
1213*b1cdbd2cSJim Jagielski     if ( ProfileFlags & (osl_Profile_WRITELOCK | osl_Profile_READLOCK ) )
1214*b1cdbd2cSJim Jagielski     {
1215*b1cdbd2cSJim Jagielski #ifdef DEBUG_OSL_PROFILE
1216*b1cdbd2cSJim Jagielski         OSL_TRACE("locking '%s' file\n",pszFilename);
1217*b1cdbd2cSJim Jagielski #endif
1218*b1cdbd2cSJim Jagielski 
1219*b1cdbd2cSJim Jagielski 		lockFile(pFile, bWriteable ? write_lock : read_lock);
1220*b1cdbd2cSJim Jagielski 	}
1221*b1cdbd2cSJim Jagielski 
1222*b1cdbd2cSJim Jagielski     /* mfe: new WriteBuf obsolete */
1223*b1cdbd2cSJim Jagielski /*	pFile->m_pWritePtr = pFile->m_Buf;*/
1224*b1cdbd2cSJim Jagielski /*	pFile->m_pReadPtr  = pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf);*/
1225*b1cdbd2cSJim Jagielski 
1226*b1cdbd2cSJim Jagielski 	return (pFile);
1227*b1cdbd2cSJim Jagielski }
1228*b1cdbd2cSJim Jagielski 
1229*b1cdbd2cSJim Jagielski //static osl_TStamp closeFile(osl_TFile* pFile)
closeFileImpl(osl_TFile * pFile)1230*b1cdbd2cSJim Jagielski static osl_TStamp closeFileImpl(osl_TFile* pFile)
1231*b1cdbd2cSJim Jagielski {
1232*b1cdbd2cSJim Jagielski 	osl_TStamp stamp = {0, 0};
1233*b1cdbd2cSJim Jagielski 
1234*b1cdbd2cSJim Jagielski     if ( pFile == 0 )
1235*b1cdbd2cSJim Jagielski     {
1236*b1cdbd2cSJim Jagielski         return stamp;
1237*b1cdbd2cSJim Jagielski     }
1238*b1cdbd2cSJim Jagielski 
1239*b1cdbd2cSJim Jagielski 	if (pFile->m_Handle)
1240*b1cdbd2cSJim Jagielski 	{
1241*b1cdbd2cSJim Jagielski 		/* mfe: new WriteBuf obsolete */
1242*b1cdbd2cSJim Jagielski         /* we just closing the file here, DO NOT write, it has to be handled in higher levels */
1243*b1cdbd2cSJim Jagielski 		//if (pFile->m_pWritePtr > pFile->m_WriteBuf)
1244*b1cdbd2cSJim Jagielski 		//{
1245*b1cdbd2cSJim Jagielski 		//	sal_uInt32 Bytes;
1246*b1cdbd2cSJim Jagielski 
1247*b1cdbd2cSJim Jagielski 		//	DosWrite(pFile->m_Handle, pFile->m_WriteBuf,
1248*b1cdbd2cSJim Jagielski 		//			 pFile->m_pWritePtr - pFile->m_WriteBuf,
1249*b1cdbd2cSJim Jagielski 		//			 &Bytes);
1250*b1cdbd2cSJim Jagielski 		//}
1251*b1cdbd2cSJim Jagielski 
1252*b1cdbd2cSJim Jagielski 		stamp = getFileStamp(pFile);
1253*b1cdbd2cSJim Jagielski 
1254*b1cdbd2cSJim Jagielski 		lockFile(pFile, un_lock);
1255*b1cdbd2cSJim Jagielski 
1256*b1cdbd2cSJim Jagielski 		DosClose(pFile->m_Handle);
1257*b1cdbd2cSJim Jagielski 	}
1258*b1cdbd2cSJim Jagielski 
1259*b1cdbd2cSJim Jagielski 	if ( pFile->m_pWriteBuf != 0 )
1260*b1cdbd2cSJim Jagielski 	{
1261*b1cdbd2cSJim Jagielski 		free(pFile->m_pWriteBuf);
1262*b1cdbd2cSJim Jagielski 	}
1263*b1cdbd2cSJim Jagielski 
1264*b1cdbd2cSJim Jagielski 	free(pFile);
1265*b1cdbd2cSJim Jagielski 
1266*b1cdbd2cSJim Jagielski 	return(stamp);
1267*b1cdbd2cSJim Jagielski }
1268*b1cdbd2cSJim Jagielski 
rewindFile(osl_TFile * pFile,sal_Bool bTruncate)1269*b1cdbd2cSJim Jagielski static sal_Bool rewindFile(osl_TFile* pFile, sal_Bool bTruncate)
1270*b1cdbd2cSJim Jagielski {
1271*b1cdbd2cSJim Jagielski 	if (pFile->m_Handle)
1272*b1cdbd2cSJim Jagielski 	{
1273*b1cdbd2cSJim Jagielski 		sal_uInt32 Position;
1274*b1cdbd2cSJim Jagielski 
1275*b1cdbd2cSJim Jagielski         /* mfe: new WriteBuf obsolete */
1276*b1cdbd2cSJim Jagielski         /* we just closing the file here, DO NOT write, it has to be handled in higher levels */
1277*b1cdbd2cSJim Jagielski 		/* if (pFile->m_pWritePtr > pFile->m_WriteBuf)
1278*b1cdbd2cSJim Jagielski 		{
1279*b1cdbd2cSJim Jagielski 			sal_uInt32 Bytes;
1280*b1cdbd2cSJim Jagielski 
1281*b1cdbd2cSJim Jagielski 			DosWrite(pFile->m_Handle, pFile->m_WriteBuf,
1282*b1cdbd2cSJim Jagielski 					 pFile->m_pWritePtr - pFile->m_WriteBuf,
1283*b1cdbd2cSJim Jagielski 					 &Bytes);
1284*b1cdbd2cSJim Jagielski 
1285*b1cdbd2cSJim Jagielski 			pFile->m_pWritePtr = pFile->m_WriteBuf;
1286*b1cdbd2cSJim Jagielski 		} */
1287*b1cdbd2cSJim Jagielski 
1288*b1cdbd2cSJim Jagielski 		pFile->m_pReadPtr = pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf);
1289*b1cdbd2cSJim Jagielski 
1290*b1cdbd2cSJim Jagielski 		DosSetFilePtr(pFile->m_Handle, 0, FILE_BEGIN, &Position);
1291*b1cdbd2cSJim Jagielski 
1292*b1cdbd2cSJim Jagielski 		if (bTruncate)
1293*b1cdbd2cSJim Jagielski 			DosSetFileSize(pFile->m_Handle, 0);
1294*b1cdbd2cSJim Jagielski 	}
1295*b1cdbd2cSJim Jagielski 
1296*b1cdbd2cSJim Jagielski 	return (sal_True);
1297*b1cdbd2cSJim Jagielski }
1298*b1cdbd2cSJim Jagielski 
getLine(osl_TFile * pFile,const sal_Char * pszLine,int MaxLen)1299*b1cdbd2cSJim Jagielski static sal_Bool getLine(osl_TFile* pFile, const sal_Char *pszLine, int MaxLen)
1300*b1cdbd2cSJim Jagielski {
1301*b1cdbd2cSJim Jagielski 	int   Free, Bytes;
1302*b1cdbd2cSJim Jagielski 	sal_Char* pChr;
1303*b1cdbd2cSJim Jagielski 	sal_Char* pLine = (sal_Char *)pszLine;
1304*b1cdbd2cSJim Jagielski 	sal_uInt32 	Max;
1305*b1cdbd2cSJim Jagielski 
1306*b1cdbd2cSJim Jagielski 	if (pFile->m_Handle == 0)
1307*b1cdbd2cSJim Jagielski 		return (sal_False);
1308*b1cdbd2cSJim Jagielski 
1309*b1cdbd2cSJim Jagielski 	MaxLen -= 1;
1310*b1cdbd2cSJim Jagielski 
1311*b1cdbd2cSJim Jagielski 	do
1312*b1cdbd2cSJim Jagielski 	{
1313*b1cdbd2cSJim Jagielski 		Bytes = sizeof(pFile->m_ReadBuf) - (pFile->m_pReadPtr - pFile->m_ReadBuf);
1314*b1cdbd2cSJim Jagielski 
1315*b1cdbd2cSJim Jagielski 		if (Bytes <= 1)
1316*b1cdbd2cSJim Jagielski 		{
1317*b1cdbd2cSJim Jagielski 			/* refill buffer */
1318*b1cdbd2cSJim Jagielski 			memcpy(pFile->m_ReadBuf, pFile->m_pReadPtr, Bytes);
1319*b1cdbd2cSJim Jagielski 			pFile->m_pReadPtr = pFile->m_ReadBuf;
1320*b1cdbd2cSJim Jagielski 
1321*b1cdbd2cSJim Jagielski 			Free = sizeof(pFile->m_ReadBuf) - Bytes;
1322*b1cdbd2cSJim Jagielski 
1323*b1cdbd2cSJim Jagielski 			if (DosRead(pFile->m_Handle, &pFile->m_ReadBuf[Bytes], Free, &Max))
1324*b1cdbd2cSJim Jagielski 			{
1325*b1cdbd2cSJim Jagielski 				*pLine = '\0';
1326*b1cdbd2cSJim Jagielski 				return (sal_False);
1327*b1cdbd2cSJim Jagielski 			}
1328*b1cdbd2cSJim Jagielski 
1329*b1cdbd2cSJim Jagielski 			if (Max < Free)
1330*b1cdbd2cSJim Jagielski 			{
1331*b1cdbd2cSJim Jagielski 				if ((Max == 0) && (pLine == pszLine))
1332*b1cdbd2cSJim Jagielski 				{
1333*b1cdbd2cSJim Jagielski 					*pLine = '\0';
1334*b1cdbd2cSJim Jagielski 					return (sal_False);
1335*b1cdbd2cSJim Jagielski 				}
1336*b1cdbd2cSJim Jagielski 
1337*b1cdbd2cSJim Jagielski 				pFile->m_ReadBuf[Bytes + Max] = '\0';
1338*b1cdbd2cSJim Jagielski 			}
1339*b1cdbd2cSJim Jagielski 		}
1340*b1cdbd2cSJim Jagielski 
1341*b1cdbd2cSJim Jagielski 		for (pChr = pFile->m_pReadPtr;
1342*b1cdbd2cSJim Jagielski 			 (*pChr != '\n') && (*pChr != '\r') && (*pChr != '\0') &&
1343*b1cdbd2cSJim Jagielski 			 (pChr < (pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf) - 1));
1344*b1cdbd2cSJim Jagielski 			 pChr++);
1345*b1cdbd2cSJim Jagielski 
1346*b1cdbd2cSJim Jagielski 		Max = min(pChr - pFile->m_pReadPtr, MaxLen);
1347*b1cdbd2cSJim Jagielski 		memcpy(pLine, pFile->m_pReadPtr, Max);
1348*b1cdbd2cSJim Jagielski 		MaxLen -= Max;
1349*b1cdbd2cSJim Jagielski 		pLine  += Max;
1350*b1cdbd2cSJim Jagielski 
1351*b1cdbd2cSJim Jagielski 		if (pChr < (pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf) - 1))
1352*b1cdbd2cSJim Jagielski 		{
1353*b1cdbd2cSJim Jagielski 			if (*pChr != '\0')
1354*b1cdbd2cSJim Jagielski 			{
1355*b1cdbd2cSJim Jagielski 				if ((pChr[0] == '\r') && (pChr[1] == '\n'))
1356*b1cdbd2cSJim Jagielski 					pChr += 2;
1357*b1cdbd2cSJim Jagielski 				else
1358*b1cdbd2cSJim Jagielski 					pChr += 1;
1359*b1cdbd2cSJim Jagielski 			}
1360*b1cdbd2cSJim Jagielski 
1361*b1cdbd2cSJim Jagielski 			if ((pChr < (pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf))) &&
1362*b1cdbd2cSJim Jagielski 				(*pChr == '\0'))
1363*b1cdbd2cSJim Jagielski 				pChr = pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf);
1364*b1cdbd2cSJim Jagielski 
1365*b1cdbd2cSJim Jagielski 			*pLine = '\0';
1366*b1cdbd2cSJim Jagielski 
1367*b1cdbd2cSJim Jagielski 			/* setting MaxLen to -1 indicates terminating read loop */
1368*b1cdbd2cSJim Jagielski 			MaxLen = -1;
1369*b1cdbd2cSJim Jagielski 		}
1370*b1cdbd2cSJim Jagielski 
1371*b1cdbd2cSJim Jagielski 		pFile->m_pReadPtr = pChr;
1372*b1cdbd2cSJim Jagielski 	}
1373*b1cdbd2cSJim Jagielski 	while (MaxLen > 0);
1374*b1cdbd2cSJim Jagielski 
1375*b1cdbd2cSJim Jagielski 	return (sal_True);
1376*b1cdbd2cSJim Jagielski }
1377*b1cdbd2cSJim Jagielski 
putLine(osl_TFile * pFile,const sal_Char * pszLine)1378*b1cdbd2cSJim Jagielski static sal_Bool putLine(osl_TFile* pFile, const sal_Char *pszLine)
1379*b1cdbd2cSJim Jagielski {
1380*b1cdbd2cSJim Jagielski 	unsigned int Len = strlen(pszLine);
1381*b1cdbd2cSJim Jagielski 
1382*b1cdbd2cSJim Jagielski #ifdef DEBUG_OSL_PROFILE
1383*b1cdbd2cSJim Jagielski 	int strLen=0;
1384*b1cdbd2cSJim Jagielski #endif
1385*b1cdbd2cSJim Jagielski 
1386*b1cdbd2cSJim Jagielski 	if ( pFile == 0 || pFile->m_Handle < 0 )
1387*b1cdbd2cSJim Jagielski     {
1388*b1cdbd2cSJim Jagielski 		return (sal_False);
1389*b1cdbd2cSJim Jagielski     }
1390*b1cdbd2cSJim Jagielski 
1391*b1cdbd2cSJim Jagielski     if ( pFile->m_pWriteBuf == 0 )
1392*b1cdbd2cSJim Jagielski     {
1393*b1cdbd2cSJim Jagielski         pFile->m_pWriteBuf = (sal_Char*) malloc(Len+3);
1394*b1cdbd2cSJim Jagielski         pFile->m_nWriteBufLen = Len+3;
1395*b1cdbd2cSJim Jagielski 		pFile->m_nWriteBufFree = Len+3;
1396*b1cdbd2cSJim Jagielski     }
1397*b1cdbd2cSJim Jagielski     else
1398*b1cdbd2cSJim Jagielski     {
1399*b1cdbd2cSJim Jagielski         if ( pFile->m_nWriteBufFree <= Len + 3 )
1400*b1cdbd2cSJim Jagielski         {
1401*b1cdbd2cSJim Jagielski             sal_Char* pTmp;
1402*b1cdbd2cSJim Jagielski 
1403*b1cdbd2cSJim Jagielski             pTmp=(sal_Char*) realloc(pFile->m_pWriteBuf,( ( pFile->m_nWriteBufLen + Len ) * 2) );
1404*b1cdbd2cSJim Jagielski             if ( pTmp == 0 )
1405*b1cdbd2cSJim Jagielski             {
1406*b1cdbd2cSJim Jagielski                 return sal_False;
1407*b1cdbd2cSJim Jagielski             }
1408*b1cdbd2cSJim Jagielski             pFile->m_pWriteBuf = pTmp;
1409*b1cdbd2cSJim Jagielski             pFile->m_nWriteBufFree = pFile->m_nWriteBufFree + pFile->m_nWriteBufLen + ( 2 * Len );
1410*b1cdbd2cSJim Jagielski             pFile->m_nWriteBufLen = ( pFile->m_nWriteBufLen + Len ) * 2;
1411*b1cdbd2cSJim Jagielski             memset( (pFile->m_pWriteBuf) + ( pFile->m_nWriteBufLen - pFile->m_nWriteBufFree ), 0, pFile->m_nWriteBufFree);
1412*b1cdbd2cSJim Jagielski         }
1413*b1cdbd2cSJim Jagielski     }
1414*b1cdbd2cSJim Jagielski 
1415*b1cdbd2cSJim Jagielski 
1416*b1cdbd2cSJim Jagielski 
1417*b1cdbd2cSJim Jagielski     memcpy(pFile->m_pWriteBuf + ( pFile->m_nWriteBufLen - pFile->m_nWriteBufFree ),pszLine,Len+1);
1418*b1cdbd2cSJim Jagielski #ifdef DEBUG_OSL_PROFILE
1419*b1cdbd2cSJim Jagielski 	strLen = strlen(pFile->m_pWriteBuf);
1420*b1cdbd2cSJim Jagielski #endif
1421*b1cdbd2cSJim Jagielski     pFile->m_pWriteBuf[pFile->m_nWriteBufLen - pFile->m_nWriteBufFree + Len]='\r';
1422*b1cdbd2cSJim Jagielski     pFile->m_pWriteBuf[pFile->m_nWriteBufLen - pFile->m_nWriteBufFree + Len + 1]='\n';
1423*b1cdbd2cSJim Jagielski     pFile->m_pWriteBuf[pFile->m_nWriteBufLen - pFile->m_nWriteBufFree + Len + 2]='\0';
1424*b1cdbd2cSJim Jagielski 
1425*b1cdbd2cSJim Jagielski     pFile->m_nWriteBufFree-=Len+2;
1426*b1cdbd2cSJim Jagielski 
1427*b1cdbd2cSJim Jagielski #ifdef DEBUG_OSL_PROFILE
1428*b1cdbd2cSJim Jagielski /*    OSL_TRACE("File Buffer in _putLine '%s' '%i'(%i)\n",pFile->m_pWriteBuf,strlen(pFile->m_pWriteBuf),pFile->m_nWriteBufLen - pFile->m_nWriteBufFree);*/
1429*b1cdbd2cSJim Jagielski #endif
1430*b1cdbd2cSJim Jagielski 
1431*b1cdbd2cSJim Jagielski 	return (sal_True);
1432*b1cdbd2cSJim Jagielski }
1433*b1cdbd2cSJim Jagielski 
1434*b1cdbd2cSJim Jagielski /* platform specific end */
1435*b1cdbd2cSJim Jagielski 
stripBlanks(const sal_Char * String,sal_uInt32 * pLen)1436*b1cdbd2cSJim Jagielski static const sal_Char* stripBlanks(const sal_Char* String, sal_uInt32* pLen)
1437*b1cdbd2cSJim Jagielski {
1438*b1cdbd2cSJim Jagielski 	if  ( (pLen != NULL) && ( *pLen != 0 ) )
1439*b1cdbd2cSJim Jagielski 	{
1440*b1cdbd2cSJim Jagielski 		while ((String[*pLen - 1] == ' ') || (String[*pLen - 1] == '\t'))
1441*b1cdbd2cSJim Jagielski 			(*pLen)--;
1442*b1cdbd2cSJim Jagielski 
1443*b1cdbd2cSJim Jagielski 		while ((*String == ' ') || (*String == '\t'))
1444*b1cdbd2cSJim Jagielski 		{
1445*b1cdbd2cSJim Jagielski 			String++;
1446*b1cdbd2cSJim Jagielski 			(*pLen)--;
1447*b1cdbd2cSJim Jagielski 		}
1448*b1cdbd2cSJim Jagielski 	}
1449*b1cdbd2cSJim Jagielski 	else
1450*b1cdbd2cSJim Jagielski 		while ((*String == ' ') || (*String == '\t'))
1451*b1cdbd2cSJim Jagielski 			String++;
1452*b1cdbd2cSJim Jagielski 
1453*b1cdbd2cSJim Jagielski 	return (String);
1454*b1cdbd2cSJim Jagielski }
1455*b1cdbd2cSJim Jagielski 
addLine(osl_TProfileImpl * pProfile,const sal_Char * Line)1456*b1cdbd2cSJim Jagielski static const sal_Char* addLine(osl_TProfileImpl* pProfile, const sal_Char* Line)
1457*b1cdbd2cSJim Jagielski {
1458*b1cdbd2cSJim Jagielski 	if (pProfile->m_NoLines >= pProfile->m_MaxLines)
1459*b1cdbd2cSJim Jagielski 	{
1460*b1cdbd2cSJim Jagielski 		if (pProfile->m_Lines == NULL)
1461*b1cdbd2cSJim Jagielski 		{
1462*b1cdbd2cSJim Jagielski 			pProfile->m_MaxLines = LINES_INI;
1463*b1cdbd2cSJim Jagielski 			pProfile->m_Lines = (sal_Char **)malloc(pProfile->m_MaxLines * sizeof(sal_Char *));
1464*b1cdbd2cSJim Jagielski 		}
1465*b1cdbd2cSJim Jagielski 		else
1466*b1cdbd2cSJim Jagielski 		{
1467*b1cdbd2cSJim Jagielski 			pProfile->m_MaxLines += LINES_ADD;
1468*b1cdbd2cSJim Jagielski 			pProfile->m_Lines = (sal_Char **)realloc(pProfile->m_Lines,
1469*b1cdbd2cSJim Jagielski 												 pProfile->m_MaxLines * sizeof(sal_Char *));
1470*b1cdbd2cSJim Jagielski 		}
1471*b1cdbd2cSJim Jagielski 
1472*b1cdbd2cSJim Jagielski 		if (pProfile->m_Lines == NULL)
1473*b1cdbd2cSJim Jagielski 		{
1474*b1cdbd2cSJim Jagielski 			pProfile->m_NoLines  = 0;
1475*b1cdbd2cSJim Jagielski 			pProfile->m_MaxLines = 0;
1476*b1cdbd2cSJim Jagielski 			return (NULL);
1477*b1cdbd2cSJim Jagielski 		}
1478*b1cdbd2cSJim Jagielski 
1479*b1cdbd2cSJim Jagielski 	}
1480*b1cdbd2cSJim Jagielski 
1481*b1cdbd2cSJim Jagielski 	pProfile->m_Lines[pProfile->m_NoLines++] = strdup(Line);
1482*b1cdbd2cSJim Jagielski 
1483*b1cdbd2cSJim Jagielski 	return (pProfile->m_Lines[pProfile->m_NoLines - 1]);
1484*b1cdbd2cSJim Jagielski }
1485*b1cdbd2cSJim Jagielski 
insertLine(osl_TProfileImpl * pProfile,const sal_Char * Line,sal_uInt32 LineNo)1486*b1cdbd2cSJim Jagielski static const sal_Char* insertLine(osl_TProfileImpl* pProfile, const sal_Char* Line, sal_uInt32 LineNo)
1487*b1cdbd2cSJim Jagielski {
1488*b1cdbd2cSJim Jagielski 	if (pProfile->m_NoLines >= pProfile->m_MaxLines)
1489*b1cdbd2cSJim Jagielski 	{
1490*b1cdbd2cSJim Jagielski 		if (pProfile->m_Lines == NULL)
1491*b1cdbd2cSJim Jagielski 		{
1492*b1cdbd2cSJim Jagielski 			pProfile->m_MaxLines = LINES_INI;
1493*b1cdbd2cSJim Jagielski 			pProfile->m_Lines = (sal_Char **)malloc(pProfile->m_MaxLines * sizeof(sal_Char *));
1494*b1cdbd2cSJim Jagielski 		}
1495*b1cdbd2cSJim Jagielski 		else
1496*b1cdbd2cSJim Jagielski 		{
1497*b1cdbd2cSJim Jagielski 			pProfile->m_MaxLines += LINES_ADD;
1498*b1cdbd2cSJim Jagielski 			pProfile->m_Lines = (sal_Char **)realloc(pProfile->m_Lines,
1499*b1cdbd2cSJim Jagielski 												 pProfile->m_MaxLines * sizeof(sal_Char *));
1500*b1cdbd2cSJim Jagielski 		}
1501*b1cdbd2cSJim Jagielski 
1502*b1cdbd2cSJim Jagielski 		if (pProfile->m_Lines == NULL)
1503*b1cdbd2cSJim Jagielski 		{
1504*b1cdbd2cSJim Jagielski 			pProfile->m_NoLines  = 0;
1505*b1cdbd2cSJim Jagielski 			pProfile->m_MaxLines = 0;
1506*b1cdbd2cSJim Jagielski 			return (NULL);
1507*b1cdbd2cSJim Jagielski 		}
1508*b1cdbd2cSJim Jagielski 
1509*b1cdbd2cSJim Jagielski 	}
1510*b1cdbd2cSJim Jagielski 
1511*b1cdbd2cSJim Jagielski 	LineNo = LineNo > pProfile->m_NoLines ? pProfile->m_NoLines : LineNo;
1512*b1cdbd2cSJim Jagielski 
1513*b1cdbd2cSJim Jagielski 	if (LineNo < pProfile->m_NoLines)
1514*b1cdbd2cSJim Jagielski 	{
1515*b1cdbd2cSJim Jagielski 		sal_uInt32 i, n;
1516*b1cdbd2cSJim Jagielski 		osl_TProfileSection* pSec;
1517*b1cdbd2cSJim Jagielski 
1518*b1cdbd2cSJim Jagielski 		memmove(&pProfile->m_Lines[LineNo + 1], &pProfile->m_Lines[LineNo],
1519*b1cdbd2cSJim Jagielski 				(pProfile->m_NoLines - LineNo) * sizeof(sal_Char *));
1520*b1cdbd2cSJim Jagielski 
1521*b1cdbd2cSJim Jagielski 		/* adjust line references */
1522*b1cdbd2cSJim Jagielski 		for (i = 0; i < pProfile->m_NoSections; i++)
1523*b1cdbd2cSJim Jagielski 		{
1524*b1cdbd2cSJim Jagielski 			pSec = &pProfile->m_Sections[i];
1525*b1cdbd2cSJim Jagielski 
1526*b1cdbd2cSJim Jagielski 			if (pSec->m_Line >= LineNo)
1527*b1cdbd2cSJim Jagielski 				pSec->m_Line++;
1528*b1cdbd2cSJim Jagielski 
1529*b1cdbd2cSJim Jagielski 			for (n = 0; n < pSec->m_NoEntries; n++)
1530*b1cdbd2cSJim Jagielski 				if (pSec->m_Entries[n].m_Line >= LineNo)
1531*b1cdbd2cSJim Jagielski 					pSec->m_Entries[n].m_Line++;
1532*b1cdbd2cSJim Jagielski 		}
1533*b1cdbd2cSJim Jagielski 	}
1534*b1cdbd2cSJim Jagielski 
1535*b1cdbd2cSJim Jagielski 	pProfile->m_NoLines++;
1536*b1cdbd2cSJim Jagielski 
1537*b1cdbd2cSJim Jagielski 	pProfile->m_Lines[LineNo] = strdup(Line);
1538*b1cdbd2cSJim Jagielski 
1539*b1cdbd2cSJim Jagielski 	return (pProfile->m_Lines[LineNo]);
1540*b1cdbd2cSJim Jagielski }
1541*b1cdbd2cSJim Jagielski 
removeLine(osl_TProfileImpl * pProfile,sal_uInt32 LineNo)1542*b1cdbd2cSJim Jagielski static void removeLine(osl_TProfileImpl* pProfile, sal_uInt32 LineNo)
1543*b1cdbd2cSJim Jagielski {
1544*b1cdbd2cSJim Jagielski 	if (LineNo < pProfile->m_NoLines)
1545*b1cdbd2cSJim Jagielski 	{
1546*b1cdbd2cSJim Jagielski 		free(pProfile->m_Lines[LineNo]);
1547*b1cdbd2cSJim Jagielski 		if (pProfile->m_NoLines - LineNo > 1)
1548*b1cdbd2cSJim Jagielski 		{
1549*b1cdbd2cSJim Jagielski 			sal_uInt32 i, n;
1550*b1cdbd2cSJim Jagielski 			osl_TProfileSection* pSec;
1551*b1cdbd2cSJim Jagielski 
1552*b1cdbd2cSJim Jagielski 			memmove(&pProfile->m_Lines[LineNo], &pProfile->m_Lines[LineNo + 1],
1553*b1cdbd2cSJim Jagielski 					(pProfile->m_NoLines - LineNo - 1) * sizeof(sal_Char *));
1554*b1cdbd2cSJim Jagielski 
1555*b1cdbd2cSJim Jagielski 			/* adjust line references */
1556*b1cdbd2cSJim Jagielski 			for (i = 0; i < pProfile->m_NoSections; i++)
1557*b1cdbd2cSJim Jagielski 			{
1558*b1cdbd2cSJim Jagielski 				pSec = &pProfile->m_Sections[i];
1559*b1cdbd2cSJim Jagielski 
1560*b1cdbd2cSJim Jagielski 				if (pSec->m_Line > LineNo)
1561*b1cdbd2cSJim Jagielski 					pSec->m_Line--;
1562*b1cdbd2cSJim Jagielski 
1563*b1cdbd2cSJim Jagielski 				for (n = 0; n < pSec->m_NoEntries; n++)
1564*b1cdbd2cSJim Jagielski 					if (pSec->m_Entries[n].m_Line > LineNo)
1565*b1cdbd2cSJim Jagielski 						pSec->m_Entries[n].m_Line--;
1566*b1cdbd2cSJim Jagielski 			}
1567*b1cdbd2cSJim Jagielski 		}
1568*b1cdbd2cSJim Jagielski 		else
1569*b1cdbd2cSJim Jagielski 		{
1570*b1cdbd2cSJim Jagielski 			pProfile->m_Lines[LineNo] = 0;
1571*b1cdbd2cSJim Jagielski 		}
1572*b1cdbd2cSJim Jagielski 
1573*b1cdbd2cSJim Jagielski 		pProfile->m_NoLines--;
1574*b1cdbd2cSJim Jagielski 	}
1575*b1cdbd2cSJim Jagielski 
1576*b1cdbd2cSJim Jagielski 	return;
1577*b1cdbd2cSJim Jagielski }
1578*b1cdbd2cSJim Jagielski 
setEntry(osl_TProfileImpl * pProfile,osl_TProfileSection * pSection,sal_uInt32 NoEntry,sal_uInt32 Line,const sal_Char * Entry,sal_uInt32 Len)1579*b1cdbd2cSJim Jagielski static void setEntry(osl_TProfileImpl* pProfile, osl_TProfileSection* pSection,
1580*b1cdbd2cSJim Jagielski 					 sal_uInt32 NoEntry, sal_uInt32 Line,
1581*b1cdbd2cSJim Jagielski 					 const sal_Char* Entry, sal_uInt32 Len)
1582*b1cdbd2cSJim Jagielski {
1583*b1cdbd2cSJim Jagielski 	Entry = stripBlanks(Entry, &Len);
1584*b1cdbd2cSJim Jagielski 	pSection->m_Entries[NoEntry].m_Line   = Line;
1585*b1cdbd2cSJim Jagielski 	pSection->m_Entries[NoEntry].m_Offset = Entry - pProfile->m_Lines[Line];
1586*b1cdbd2cSJim Jagielski 	pSection->m_Entries[NoEntry].m_Len    = Len;
1587*b1cdbd2cSJim Jagielski 
1588*b1cdbd2cSJim Jagielski 	return;
1589*b1cdbd2cSJim Jagielski }
1590*b1cdbd2cSJim Jagielski 
addEntry(osl_TProfileImpl * pProfile,osl_TProfileSection * pSection,int Line,const sal_Char * Entry,sal_uInt32 Len)1591*b1cdbd2cSJim Jagielski static sal_Bool addEntry(osl_TProfileImpl* pProfile, osl_TProfileSection *pSection,
1592*b1cdbd2cSJim Jagielski 						int Line, const sal_Char* Entry, sal_uInt32 Len)
1593*b1cdbd2cSJim Jagielski {
1594*b1cdbd2cSJim Jagielski 	if (pSection != NULL)
1595*b1cdbd2cSJim Jagielski 	{
1596*b1cdbd2cSJim Jagielski 		if (pSection->m_NoEntries >= pSection->m_MaxEntries)
1597*b1cdbd2cSJim Jagielski 		{
1598*b1cdbd2cSJim Jagielski 			if (pSection->m_Entries == NULL)
1599*b1cdbd2cSJim Jagielski 			{
1600*b1cdbd2cSJim Jagielski 				pSection->m_MaxEntries = ENTRIES_INI;
1601*b1cdbd2cSJim Jagielski 				pSection->m_Entries = (osl_TProfileEntry *)malloc(
1602*b1cdbd2cSJim Jagielski 								pSection->m_MaxEntries * sizeof(osl_TProfileEntry));
1603*b1cdbd2cSJim Jagielski 			}
1604*b1cdbd2cSJim Jagielski 			else
1605*b1cdbd2cSJim Jagielski 			{
1606*b1cdbd2cSJim Jagielski 				pSection->m_MaxEntries += ENTRIES_ADD;
1607*b1cdbd2cSJim Jagielski 				pSection->m_Entries = (osl_TProfileEntry *)realloc(pSection->m_Entries,
1608*b1cdbd2cSJim Jagielski 								pSection->m_MaxEntries * sizeof(osl_TProfileEntry));
1609*b1cdbd2cSJim Jagielski 			}
1610*b1cdbd2cSJim Jagielski 
1611*b1cdbd2cSJim Jagielski 			if (pSection->m_Entries == NULL)
1612*b1cdbd2cSJim Jagielski 			{
1613*b1cdbd2cSJim Jagielski 				pSection->m_NoEntries  = 0;
1614*b1cdbd2cSJim Jagielski 				pSection->m_MaxEntries = 0;
1615*b1cdbd2cSJim Jagielski 				return (sal_False);
1616*b1cdbd2cSJim Jagielski 			}
1617*b1cdbd2cSJim Jagielski 		}
1618*b1cdbd2cSJim Jagielski 
1619*b1cdbd2cSJim Jagielski 		pSection->m_NoEntries++;
1620*b1cdbd2cSJim Jagielski 
1621*b1cdbd2cSJim Jagielski 		Entry = stripBlanks(Entry, &Len);
1622*b1cdbd2cSJim Jagielski 		setEntry(pProfile, pSection, pSection->m_NoEntries - 1, Line,
1623*b1cdbd2cSJim Jagielski 				 Entry, Len);
1624*b1cdbd2cSJim Jagielski 
1625*b1cdbd2cSJim Jagielski 		return (sal_True);
1626*b1cdbd2cSJim Jagielski 	}
1627*b1cdbd2cSJim Jagielski 
1628*b1cdbd2cSJim Jagielski 	return (sal_False);
1629*b1cdbd2cSJim Jagielski }
1630*b1cdbd2cSJim Jagielski 
removeEntry(osl_TProfileSection * pSection,sal_uInt32 NoEntry)1631*b1cdbd2cSJim Jagielski static void removeEntry(osl_TProfileSection *pSection, sal_uInt32 NoEntry)
1632*b1cdbd2cSJim Jagielski {
1633*b1cdbd2cSJim Jagielski 	if (NoEntry < pSection->m_NoEntries)
1634*b1cdbd2cSJim Jagielski 	{
1635*b1cdbd2cSJim Jagielski 		if (pSection->m_NoEntries - NoEntry > 1)
1636*b1cdbd2cSJim Jagielski 			memmove(&pSection->m_Entries[NoEntry],
1637*b1cdbd2cSJim Jagielski 					&pSection->m_Entries[NoEntry + 1],
1638*b1cdbd2cSJim Jagielski 					(pSection->m_NoEntries - NoEntry - 1) * sizeof(osl_TProfileEntry));
1639*b1cdbd2cSJim Jagielski 		pSection->m_NoEntries--;
1640*b1cdbd2cSJim Jagielski 	}
1641*b1cdbd2cSJim Jagielski 
1642*b1cdbd2cSJim Jagielski 	return;
1643*b1cdbd2cSJim Jagielski }
1644*b1cdbd2cSJim Jagielski 
addSection(osl_TProfileImpl * pProfile,int Line,const sal_Char * Section,sal_uInt32 Len)1645*b1cdbd2cSJim Jagielski static sal_Bool addSection(osl_TProfileImpl* pProfile, int Line, const sal_Char* Section, sal_uInt32 Len)
1646*b1cdbd2cSJim Jagielski {
1647*b1cdbd2cSJim Jagielski 	if (pProfile->m_NoSections >= pProfile->m_MaxSections)
1648*b1cdbd2cSJim Jagielski 	{
1649*b1cdbd2cSJim Jagielski 		if (pProfile->m_Sections == NULL)
1650*b1cdbd2cSJim Jagielski 		{
1651*b1cdbd2cSJim Jagielski 			pProfile->m_MaxSections = SECTIONS_INI;
1652*b1cdbd2cSJim Jagielski 			pProfile->m_Sections = (osl_TProfileSection *)malloc(pProfile->m_MaxSections * sizeof(osl_TProfileSection));
1653*b1cdbd2cSJim Jagielski 		}
1654*b1cdbd2cSJim Jagielski 		else
1655*b1cdbd2cSJim Jagielski 		{
1656*b1cdbd2cSJim Jagielski 			pProfile->m_MaxSections += SECTIONS_ADD;
1657*b1cdbd2cSJim Jagielski 			pProfile->m_Sections = (osl_TProfileSection *)realloc(pProfile->m_Sections,
1658*b1cdbd2cSJim Jagielski 										  pProfile->m_MaxSections * sizeof(osl_TProfileSection));
1659*b1cdbd2cSJim Jagielski 		}
1660*b1cdbd2cSJim Jagielski 
1661*b1cdbd2cSJim Jagielski 		if (pProfile->m_Sections == NULL)
1662*b1cdbd2cSJim Jagielski 		{
1663*b1cdbd2cSJim Jagielski 			pProfile->m_NoSections = 0;
1664*b1cdbd2cSJim Jagielski 			pProfile->m_MaxSections = 0;
1665*b1cdbd2cSJim Jagielski 			return (sal_False);
1666*b1cdbd2cSJim Jagielski 		}
1667*b1cdbd2cSJim Jagielski 	}
1668*b1cdbd2cSJim Jagielski 
1669*b1cdbd2cSJim Jagielski 	pProfile->m_NoSections++;
1670*b1cdbd2cSJim Jagielski 
1671*b1cdbd2cSJim Jagielski 	pProfile->m_Sections[pProfile->m_NoSections - 1].m_Entries    = NULL;
1672*b1cdbd2cSJim Jagielski 	pProfile->m_Sections[pProfile->m_NoSections - 1].m_NoEntries  = 0;
1673*b1cdbd2cSJim Jagielski 	pProfile->m_Sections[pProfile->m_NoSections - 1].m_MaxEntries = 0;
1674*b1cdbd2cSJim Jagielski 
1675*b1cdbd2cSJim Jagielski 	Section = (sal_Char *)stripBlanks(Section, &Len);
1676*b1cdbd2cSJim Jagielski 	pProfile->m_Sections[pProfile->m_NoSections - 1].m_Line = Line;
1677*b1cdbd2cSJim Jagielski 	pProfile->m_Sections[pProfile->m_NoSections - 1].m_Offset = Section - pProfile->m_Lines[Line];
1678*b1cdbd2cSJim Jagielski 	pProfile->m_Sections[pProfile->m_NoSections - 1].m_Len = Len;
1679*b1cdbd2cSJim Jagielski 
1680*b1cdbd2cSJim Jagielski 	return (sal_True);
1681*b1cdbd2cSJim Jagielski }
1682*b1cdbd2cSJim Jagielski 
removeSection(osl_TProfileImpl * pProfile,osl_TProfileSection * pSection)1683*b1cdbd2cSJim Jagielski static void removeSection(osl_TProfileImpl* pProfile, osl_TProfileSection *pSection)
1684*b1cdbd2cSJim Jagielski {
1685*b1cdbd2cSJim Jagielski 	sal_uInt32 Section;
1686*b1cdbd2cSJim Jagielski 
1687*b1cdbd2cSJim Jagielski 	if ((Section = pSection - pProfile->m_Sections) < pProfile->m_NoSections)
1688*b1cdbd2cSJim Jagielski 	{
1689*b1cdbd2cSJim Jagielski 		free (pSection->m_Entries);
1690*b1cdbd2cSJim Jagielski 		if (pProfile->m_NoSections - Section > 1)
1691*b1cdbd2cSJim Jagielski 		{
1692*b1cdbd2cSJim Jagielski 			memmove(&pProfile->m_Sections[Section], &pProfile->m_Sections[Section + 1],
1693*b1cdbd2cSJim Jagielski 					(pProfile->m_NoSections - Section - 1) * sizeof(osl_TProfileSection));
1694*b1cdbd2cSJim Jagielski 		}
1695*b1cdbd2cSJim Jagielski 		else
1696*b1cdbd2cSJim Jagielski 		{
1697*b1cdbd2cSJim Jagielski 			pSection->m_Entries = 0;
1698*b1cdbd2cSJim Jagielski 		}
1699*b1cdbd2cSJim Jagielski 
1700*b1cdbd2cSJim Jagielski 		pProfile->m_NoSections--;
1701*b1cdbd2cSJim Jagielski 	}
1702*b1cdbd2cSJim Jagielski 
1703*b1cdbd2cSJim Jagielski 	return;
1704*b1cdbd2cSJim Jagielski }
1705*b1cdbd2cSJim Jagielski 
findEntry(osl_TProfileImpl * pProfile,const sal_Char * Section,const sal_Char * Entry,sal_uInt32 * pNoEntry)1706*b1cdbd2cSJim Jagielski static osl_TProfileSection* findEntry(osl_TProfileImpl* pProfile, const sal_Char* Section,
1707*b1cdbd2cSJim Jagielski 									  const sal_Char* Entry, sal_uInt32 *pNoEntry)
1708*b1cdbd2cSJim Jagielski {
1709*b1cdbd2cSJim Jagielski static  sal_uInt32    Sect = 0;
1710*b1cdbd2cSJim Jagielski 		sal_uInt32    i, n;
1711*b1cdbd2cSJim Jagielski 		sal_uInt32    Len;
1712*b1cdbd2cSJim Jagielski 		const sal_Char* pStr;
1713*b1cdbd2cSJim Jagielski 		osl_TProfileSection* pSec;
1714*b1cdbd2cSJim Jagielski 
1715*b1cdbd2cSJim Jagielski 	Len = strlen(Section);
1716*b1cdbd2cSJim Jagielski 	Section = (sal_Char *)stripBlanks(Section, &Len);
1717*b1cdbd2cSJim Jagielski 
1718*b1cdbd2cSJim Jagielski 	n = Sect;
1719*b1cdbd2cSJim Jagielski 
1720*b1cdbd2cSJim Jagielski 	for (i = 0; i < pProfile->m_NoSections; i++)
1721*b1cdbd2cSJim Jagielski 	{
1722*b1cdbd2cSJim Jagielski 		n %= pProfile->m_NoSections;
1723*b1cdbd2cSJim Jagielski 		pSec = &pProfile->m_Sections[n];
1724*b1cdbd2cSJim Jagielski 		if ((Len == pSec->m_Len) &&
1725*b1cdbd2cSJim Jagielski 			(strnicmp(Section, &pProfile->m_Lines[pSec->m_Line][pSec->m_Offset], pSec->m_Len)
1726*b1cdbd2cSJim Jagielski 			 == 0))
1727*b1cdbd2cSJim Jagielski 			break;
1728*b1cdbd2cSJim Jagielski 		n++;
1729*b1cdbd2cSJim Jagielski 	}
1730*b1cdbd2cSJim Jagielski 
1731*b1cdbd2cSJim Jagielski 	Sect = n;
1732*b1cdbd2cSJim Jagielski 
1733*b1cdbd2cSJim Jagielski 	if (i < pProfile->m_NoSections)
1734*b1cdbd2cSJim Jagielski 	{
1735*b1cdbd2cSJim Jagielski 		Len = strlen(Entry);
1736*b1cdbd2cSJim Jagielski 		Entry = stripBlanks(Entry, &Len);
1737*b1cdbd2cSJim Jagielski 
1738*b1cdbd2cSJim Jagielski 		*pNoEntry = pSec->m_NoEntries;
1739*b1cdbd2cSJim Jagielski 
1740*b1cdbd2cSJim Jagielski 		for (i = 0; i < pSec->m_NoEntries; i++)
1741*b1cdbd2cSJim Jagielski 		{
1742*b1cdbd2cSJim Jagielski 			pStr = &pProfile->m_Lines[pSec->m_Entries[i].m_Line]
1743*b1cdbd2cSJim Jagielski 									 [pSec->m_Entries[i].m_Offset];
1744*b1cdbd2cSJim Jagielski 			if ((Len == pSec->m_Entries[i].m_Len) &&
1745*b1cdbd2cSJim Jagielski 				(strnicmp(Entry, pStr, pSec->m_Entries[i].m_Len)
1746*b1cdbd2cSJim Jagielski 				 == 0))
1747*b1cdbd2cSJim Jagielski 			{
1748*b1cdbd2cSJim Jagielski 				*pNoEntry = i;
1749*b1cdbd2cSJim Jagielski 				break;
1750*b1cdbd2cSJim Jagielski 			}
1751*b1cdbd2cSJim Jagielski 		}
1752*b1cdbd2cSJim Jagielski 	}
1753*b1cdbd2cSJim Jagielski 	else
1754*b1cdbd2cSJim Jagielski 		pSec = NULL;
1755*b1cdbd2cSJim Jagielski 
1756*b1cdbd2cSJim Jagielski 	return (pSec);
1757*b1cdbd2cSJim Jagielski }
1758*b1cdbd2cSJim Jagielski 
loadProfile(osl_TFile * pFile,osl_TProfileImpl * pProfile)1759*b1cdbd2cSJim Jagielski static sal_Bool loadProfile(osl_TFile* pFile, osl_TProfileImpl* pProfile)
1760*b1cdbd2cSJim Jagielski {
1761*b1cdbd2cSJim Jagielski 	sal_uInt32    i;
1762*b1cdbd2cSJim Jagielski 	sal_Char*       pStr;
1763*b1cdbd2cSJim Jagielski 	sal_Char*       pChar;
1764*b1cdbd2cSJim Jagielski 	sal_Char        Line[1024];
1765*b1cdbd2cSJim Jagielski 
1766*b1cdbd2cSJim Jagielski 	pProfile->m_NoLines    = 0;
1767*b1cdbd2cSJim Jagielski 	pProfile->m_NoSections = 0;
1768*b1cdbd2cSJim Jagielski 
1769*b1cdbd2cSJim Jagielski 	OSL_VERIFY(rewindFile(pFile, sal_False));
1770*b1cdbd2cSJim Jagielski 
1771*b1cdbd2cSJim Jagielski 	while (getLine(pFile, Line, sizeof(Line)))
1772*b1cdbd2cSJim Jagielski 	{
1773*b1cdbd2cSJim Jagielski 		if (! addLine(pProfile, Line))
1774*b1cdbd2cSJim Jagielski 			return (sal_False);
1775*b1cdbd2cSJim Jagielski 	}
1776*b1cdbd2cSJim Jagielski 
1777*b1cdbd2cSJim Jagielski 	for (i = 0; i < pProfile->m_NoLines; i++)
1778*b1cdbd2cSJim Jagielski 	{
1779*b1cdbd2cSJim Jagielski 		pStr = (sal_Char *)stripBlanks(pProfile->m_Lines[i], NULL);
1780*b1cdbd2cSJim Jagielski 
1781*b1cdbd2cSJim Jagielski 		if ((*pStr == '\0') || (*pStr == ';'))
1782*b1cdbd2cSJim Jagielski 			continue;
1783*b1cdbd2cSJim Jagielski 
1784*b1cdbd2cSJim Jagielski 		if ((*pStr != '[') || ((pChar = strrchr(pStr, ']')) == NULL) ||
1785*b1cdbd2cSJim Jagielski 			((pChar - pStr) <= 2))
1786*b1cdbd2cSJim Jagielski 		{
1787*b1cdbd2cSJim Jagielski 			/* insert entry */
1788*b1cdbd2cSJim Jagielski 
1789*b1cdbd2cSJim Jagielski 			if (pProfile->m_NoSections < 1)
1790*b1cdbd2cSJim Jagielski 				continue;
1791*b1cdbd2cSJim Jagielski 
1792*b1cdbd2cSJim Jagielski 			if ((pChar = strchr(pStr, '=')) == NULL)
1793*b1cdbd2cSJim Jagielski 				pChar = pStr + strlen(pStr);
1794*b1cdbd2cSJim Jagielski 
1795*b1cdbd2cSJim Jagielski 			if (! addEntry(pProfile, &pProfile->m_Sections[pProfile->m_NoSections - 1],
1796*b1cdbd2cSJim Jagielski 						   i, pStr, pChar - pStr))
1797*b1cdbd2cSJim Jagielski 				return (sal_False);
1798*b1cdbd2cSJim Jagielski 		}
1799*b1cdbd2cSJim Jagielski 		else
1800*b1cdbd2cSJim Jagielski 		{
1801*b1cdbd2cSJim Jagielski 			/* new section */
1802*b1cdbd2cSJim Jagielski 
1803*b1cdbd2cSJim Jagielski 			if (! addSection(pProfile, i, pStr + 1, pChar - pStr - 1))
1804*b1cdbd2cSJim Jagielski 				return (sal_False);
1805*b1cdbd2cSJim Jagielski 		}
1806*b1cdbd2cSJim Jagielski 	}
1807*b1cdbd2cSJim Jagielski 
1808*b1cdbd2cSJim Jagielski 	return (sal_True);
1809*b1cdbd2cSJim Jagielski }
1810*b1cdbd2cSJim Jagielski 
storeProfile(osl_TFile * pFile,osl_TProfileImpl * pProfile,sal_Bool bCleanup)1811*b1cdbd2cSJim Jagielski static sal_Bool storeProfile(osl_TFile* pFile, osl_TProfileImpl* pProfile, sal_Bool bCleanup)
1812*b1cdbd2cSJim Jagielski {
1813*b1cdbd2cSJim Jagielski 	if (pProfile->m_Lines != NULL)
1814*b1cdbd2cSJim Jagielski 	{
1815*b1cdbd2cSJim Jagielski 		if (pProfile->m_Flags & FLG_MODIFIED)
1816*b1cdbd2cSJim Jagielski 		{
1817*b1cdbd2cSJim Jagielski 			sal_uInt32 i;
1818*b1cdbd2cSJim Jagielski 
1819*b1cdbd2cSJim Jagielski 			OSL_VERIFY(rewindFile(pFile, sal_True));
1820*b1cdbd2cSJim Jagielski 
1821*b1cdbd2cSJim Jagielski 			for (i = 0; i < pProfile->m_NoLines; i++)
1822*b1cdbd2cSJim Jagielski 				OSL_VERIFY(putLine(pFile, pProfile->m_Lines[i]));
1823*b1cdbd2cSJim Jagielski 
1824*b1cdbd2cSJim Jagielski 			pProfile->m_Flags &= ~FLG_MODIFIED;
1825*b1cdbd2cSJim Jagielski 		}
1826*b1cdbd2cSJim Jagielski 
1827*b1cdbd2cSJim Jagielski 		if (bCleanup)
1828*b1cdbd2cSJim Jagielski 		{
1829*b1cdbd2cSJim Jagielski 			while (pProfile->m_NoLines > 0)
1830*b1cdbd2cSJim Jagielski 				removeLine(pProfile, pProfile->m_NoLines - 1);
1831*b1cdbd2cSJim Jagielski 
1832*b1cdbd2cSJim Jagielski 			free(pProfile->m_Lines);
1833*b1cdbd2cSJim Jagielski 			pProfile->m_Lines = NULL;
1834*b1cdbd2cSJim Jagielski 			pProfile->m_MaxLines = 0;
1835*b1cdbd2cSJim Jagielski 
1836*b1cdbd2cSJim Jagielski 			while (pProfile->m_NoSections > 0)
1837*b1cdbd2cSJim Jagielski 				removeSection(pProfile, &pProfile->m_Sections[pProfile->m_NoSections - 1]);
1838*b1cdbd2cSJim Jagielski 
1839*b1cdbd2cSJim Jagielski 			free(pProfile->m_Sections);
1840*b1cdbd2cSJim Jagielski 			pProfile->m_Sections = NULL;
1841*b1cdbd2cSJim Jagielski 			pProfile->m_MaxSections = 0;
1842*b1cdbd2cSJim Jagielski 		}
1843*b1cdbd2cSJim Jagielski 	}
1844*b1cdbd2cSJim Jagielski 
1845*b1cdbd2cSJim Jagielski 	return (sal_True);
1846*b1cdbd2cSJim Jagielski }
1847*b1cdbd2cSJim Jagielski 
acquireProfile(oslProfile Profile,sal_Bool bWriteable)1848*b1cdbd2cSJim Jagielski static osl_TProfileImpl* acquireProfile(oslProfile Profile, sal_Bool bWriteable)
1849*b1cdbd2cSJim Jagielski {
1850*b1cdbd2cSJim Jagielski 	osl_TProfileImpl* pProfile = (osl_TProfileImpl*)Profile;
1851*b1cdbd2cSJim Jagielski     oslProfileOption PFlags=0;
1852*b1cdbd2cSJim Jagielski 
1853*b1cdbd2cSJim Jagielski 
1854*b1cdbd2cSJim Jagielski     if ( bWriteable )
1855*b1cdbd2cSJim Jagielski     {
1856*b1cdbd2cSJim Jagielski /*          PFlags = osl_Profile_DEFAULT | osl_Profile_READWRITE; */
1857*b1cdbd2cSJim Jagielski         PFlags = osl_Profile_DEFAULT | osl_Profile_WRITELOCK;
1858*b1cdbd2cSJim Jagielski     }
1859*b1cdbd2cSJim Jagielski     else
1860*b1cdbd2cSJim Jagielski     {
1861*b1cdbd2cSJim Jagielski         PFlags = osl_Profile_DEFAULT;
1862*b1cdbd2cSJim Jagielski     }
1863*b1cdbd2cSJim Jagielski 
1864*b1cdbd2cSJim Jagielski 
1865*b1cdbd2cSJim Jagielski 	if (pProfile == NULL)
1866*b1cdbd2cSJim Jagielski 	{
1867*b1cdbd2cSJim Jagielski #ifdef DEBUG_OSL_PROFILE
1868*b1cdbd2cSJim Jagielski         OSL_TRACE("AUTOOPEN MODE\n");
1869*b1cdbd2cSJim Jagielski #endif
1870*b1cdbd2cSJim Jagielski 
1871*b1cdbd2cSJim Jagielski 		if ((pProfile = (osl_TProfileImpl*)osl_openProfile(NULL, PFlags)) != NULL )
1872*b1cdbd2cSJim Jagielski         {
1873*b1cdbd2cSJim Jagielski 			pProfile->m_Flags |= FLG_AUTOOPEN;
1874*b1cdbd2cSJim Jagielski         }
1875*b1cdbd2cSJim Jagielski 	}
1876*b1cdbd2cSJim Jagielski 	else
1877*b1cdbd2cSJim Jagielski 	{
1878*b1cdbd2cSJim Jagielski #ifdef DEBUG_OSL_PROFILE
1879*b1cdbd2cSJim Jagielski         OSL_TRACE("try to acquire\n");
1880*b1cdbd2cSJim Jagielski #endif
1881*b1cdbd2cSJim Jagielski 
1882*b1cdbd2cSJim Jagielski 
1883*b1cdbd2cSJim Jagielski 
1884*b1cdbd2cSJim Jagielski 		if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
1885*b1cdbd2cSJim Jagielski 		{
1886*b1cdbd2cSJim Jagielski 			if (! (pProfile->m_Flags & (osl_Profile_READLOCK |
1887*b1cdbd2cSJim Jagielski                                         osl_Profile_WRITELOCK | osl_Profile_FLUSHWRITE)))
1888*b1cdbd2cSJim Jagielski 			{
1889*b1cdbd2cSJim Jagielski 				osl_TStamp Stamp;
1890*b1cdbd2cSJim Jagielski #ifdef DEBUG_OSL_PROFILE
1891*b1cdbd2cSJim Jagielski                 OSL_TRACE("DEFAULT MODE\n");
1892*b1cdbd2cSJim Jagielski #endif
1893*b1cdbd2cSJim Jagielski 				if (! (pProfile->m_pFile = openFileImpl(pProfile->m_strFileName, pProfile->m_Flags | PFlags)))
1894*b1cdbd2cSJim Jagielski 					return NULL;
1895*b1cdbd2cSJim Jagielski 
1896*b1cdbd2cSJim Jagielski 				Stamp = getFileStamp(pProfile->m_pFile);
1897*b1cdbd2cSJim Jagielski 
1898*b1cdbd2cSJim Jagielski 				if (memcmp(&Stamp, &(pProfile->m_Stamp), sizeof(osl_TStamp)))
1899*b1cdbd2cSJim Jagielski 				{
1900*b1cdbd2cSJim Jagielski 					pProfile->m_Stamp = Stamp;
1901*b1cdbd2cSJim Jagielski 
1902*b1cdbd2cSJim Jagielski 					loadProfile(pProfile->m_pFile, pProfile);
1903*b1cdbd2cSJim Jagielski 				}
1904*b1cdbd2cSJim Jagielski 			}
1905*b1cdbd2cSJim Jagielski 			else
1906*b1cdbd2cSJim Jagielski             {
1907*b1cdbd2cSJim Jagielski #ifdef DEBUG_OSL_PROFILE
1908*b1cdbd2cSJim Jagielski                 OSL_TRACE("READ/WRITELOCK MODE\n");
1909*b1cdbd2cSJim Jagielski #endif
1910*b1cdbd2cSJim Jagielski 
1911*b1cdbd2cSJim Jagielski 
1912*b1cdbd2cSJim Jagielski 				/* A readlock file could not be written */
1913*b1cdbd2cSJim Jagielski                 if ((pProfile->m_Flags & osl_Profile_READLOCK) && bWriteable)
1914*b1cdbd2cSJim Jagielski                 {
1915*b1cdbd2cSJim Jagielski                     return (NULL);
1916*b1cdbd2cSJim Jagielski                 }
1917*b1cdbd2cSJim Jagielski             }
1918*b1cdbd2cSJim Jagielski 		}
1919*b1cdbd2cSJim Jagielski 		else
1920*b1cdbd2cSJim Jagielski 		{
1921*b1cdbd2cSJim Jagielski 			sal_Bool bWriteable = sal_False;
1922*b1cdbd2cSJim Jagielski 			char pszFilename[PATH_MAX] = "";
1923*b1cdbd2cSJim Jagielski 
1924*b1cdbd2cSJim Jagielski 			if ( pProfile->m_strFileName != 0  && pProfile->m_strFileName->buffer[0] != 0 )
1925*b1cdbd2cSJim Jagielski 				FileURLToPath( pszFilename, PATH_MAX, pProfile->m_strFileName );
1926*b1cdbd2cSJim Jagielski 		    /* hack: usualy you have a specific HAB, but NULL works here... */
1927*b1cdbd2cSJim Jagielski 	        pProfile->m_hIni = PrfOpenProfile(NULL, (PCSZ)pszFilename);
1928*b1cdbd2cSJim Jagielski 	        if (! pProfile->m_hIni)
1929*b1cdbd2cSJim Jagielski 	        	return (NULL);
1930*b1cdbd2cSJim Jagielski 	    }
1931*b1cdbd2cSJim Jagielski 	}
1932*b1cdbd2cSJim Jagielski 
1933*b1cdbd2cSJim Jagielski 	return (pProfile);
1934*b1cdbd2cSJim Jagielski }
1935*b1cdbd2cSJim Jagielski 
releaseProfile(osl_TProfileImpl * pProfile)1936*b1cdbd2cSJim Jagielski static sal_Bool releaseProfile(osl_TProfileImpl* pProfile)
1937*b1cdbd2cSJim Jagielski {
1938*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
1939*b1cdbd2cSJim Jagielski     OSL_TRACE("In  releaseProfile\n");
1940*b1cdbd2cSJim Jagielski #endif
1941*b1cdbd2cSJim Jagielski 
1942*b1cdbd2cSJim Jagielski     if ( pProfile == 0 )
1943*b1cdbd2cSJim Jagielski     {
1944*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
1945*b1cdbd2cSJim Jagielski         OSL_TRACE("Out releaseProfile [profile==0]\n");
1946*b1cdbd2cSJim Jagielski #endif
1947*b1cdbd2cSJim Jagielski         return sal_False;
1948*b1cdbd2cSJim Jagielski     }
1949*b1cdbd2cSJim Jagielski 
1950*b1cdbd2cSJim Jagielski 	if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
1951*b1cdbd2cSJim Jagielski 	{
1952*b1cdbd2cSJim Jagielski 		if (pProfile->m_Flags & FLG_AUTOOPEN)
1953*b1cdbd2cSJim Jagielski         {
1954*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
1955*b1cdbd2cSJim Jagielski         OSL_TRACE("Out releaseProfile [AUTOOPEN]\n");
1956*b1cdbd2cSJim Jagielski #endif
1957*b1cdbd2cSJim Jagielski 			return (osl_closeProfile((oslProfile)pProfile));
1958*b1cdbd2cSJim Jagielski         }
1959*b1cdbd2cSJim Jagielski 		else
1960*b1cdbd2cSJim Jagielski 		{
1961*b1cdbd2cSJim Jagielski #ifdef DEBUG_OSL_PROFILE
1962*b1cdbd2cSJim Jagielski         OSL_TRACE("DEFAULT MODE\n");
1963*b1cdbd2cSJim Jagielski #endif
1964*b1cdbd2cSJim Jagielski         if (! (pProfile->m_Flags & (osl_Profile_READLOCK |
1965*b1cdbd2cSJim Jagielski                                     osl_Profile_WRITELOCK | osl_Profile_FLUSHWRITE)))
1966*b1cdbd2cSJim Jagielski 			{
1967*b1cdbd2cSJim Jagielski 				if (pProfile->m_Flags & FLG_MODIFIED)
1968*b1cdbd2cSJim Jagielski 					storeProfile(pProfile->m_pFile, pProfile, sal_False);
1969*b1cdbd2cSJim Jagielski 
1970*b1cdbd2cSJim Jagielski 				closeFileImpl(pProfile->m_pFile);
1971*b1cdbd2cSJim Jagielski 				pProfile->m_pFile = NULL;
1972*b1cdbd2cSJim Jagielski 			}
1973*b1cdbd2cSJim Jagielski 		}
1974*b1cdbd2cSJim Jagielski 	}
1975*b1cdbd2cSJim Jagielski 	else
1976*b1cdbd2cSJim Jagielski         PrfCloseProfile(pProfile->m_hIni);
1977*b1cdbd2cSJim Jagielski 
1978*b1cdbd2cSJim Jagielski #ifdef TRACE_OSL_PROFILE
1979*b1cdbd2cSJim Jagielski     OSL_TRACE("Out releaseProfile [ok]\n");
1980*b1cdbd2cSJim Jagielski #endif
1981*b1cdbd2cSJim Jagielski 	return (sal_True);
1982*b1cdbd2cSJim Jagielski }
1983*b1cdbd2cSJim Jagielski 
1984*b1cdbd2cSJim Jagielski #if 0 // YD
1985*b1cdbd2cSJim Jagielski 
1986*b1cdbd2cSJim Jagielski static sal_Bool lookupProfile(const sal_Char *pszPath, const sal_Char *pszFile, sal_Char *pPath)
1987*b1cdbd2cSJim Jagielski {
1988*b1cdbd2cSJim Jagielski 	sal_Char *pChr, *pStr;
1989*b1cdbd2cSJim Jagielski 	sal_Char Path[_MAX_PATH] = "";
1990*b1cdbd2cSJim Jagielski 	sal_Char Product[132] = "";
1991*b1cdbd2cSJim Jagielski 	sal_Char Buffer[1024];
1992*b1cdbd2cSJim Jagielski 
1993*b1cdbd2cSJim Jagielski 	if (*pszPath == '"')
1994*b1cdbd2cSJim Jagielski 	{
1995*b1cdbd2cSJim Jagielski 		int i = 0;
1996*b1cdbd2cSJim Jagielski 
1997*b1cdbd2cSJim Jagielski 		pszPath++;
1998*b1cdbd2cSJim Jagielski 
1999*b1cdbd2cSJim Jagielski 		while ((*pszPath != '"') && (*pszPath != '\0'))
2000*b1cdbd2cSJim Jagielski 			Product[i++] = *pszPath++;
2001*b1cdbd2cSJim Jagielski 
2002*b1cdbd2cSJim Jagielski 		Product[i] = '\0';
2003*b1cdbd2cSJim Jagielski 
2004*b1cdbd2cSJim Jagielski 		if (*pszPath == '"')
2005*b1cdbd2cSJim Jagielski 			pszPath++;
2006*b1cdbd2cSJim Jagielski 
2007*b1cdbd2cSJim Jagielski 		if ( (*pszPath == '/') || (*pszPath == '\\') )
2008*b1cdbd2cSJim Jagielski 		{
2009*b1cdbd2cSJim Jagielski 			pszPath++;
2010*b1cdbd2cSJim Jagielski 		}
2011*b1cdbd2cSJim Jagielski 	}
2012*b1cdbd2cSJim Jagielski 	else
2013*b1cdbd2cSJim Jagielski 	{
2014*b1cdbd2cSJim Jagielski 		/* if we have not product identfication, do a special handling for soffice.ini */
2015*b1cdbd2cSJim Jagielski 		if (stricmp(SVERSION_PROFILE, pszFile) == 0)
2016*b1cdbd2cSJim Jagielski 		{
2017*b1cdbd2cSJim Jagielski 			sal_Char   Profile[_MAX_PATH];
2018*b1cdbd2cSJim Jagielski 			sal_Char   Dir[_MAX_PATH];
2019*b1cdbd2cSJim Jagielski 			oslProfile hProfile;
2020*b1cdbd2cSJim Jagielski 
2021*b1cdbd2cSJim Jagielski 			/* open sversion.ini in the system directory, and try to locate the entry
2022*b1cdbd2cSJim Jagielski 			   with the highest version for StarOffice */
2023*b1cdbd2cSJim Jagielski 			if ((osl_getProfileName(SVERSION_FALLBACK, SVERSION_NAME, Profile, sizeof(Profile))) &&
2024*b1cdbd2cSJim Jagielski 				(hProfile = osl_openProfile(Profile, osl_Profile_READLOCK)))
2025*b1cdbd2cSJim Jagielski 			{
2026*b1cdbd2cSJim Jagielski 			  	osl_getProfileSectionEntries(hProfile, SVERSION_SECTION,
2027*b1cdbd2cSJim Jagielski 	   							             Buffer, sizeof(Buffer));
2028*b1cdbd2cSJim Jagielski 
2029*b1cdbd2cSJim Jagielski 				for (pChr = Buffer; *pChr != '\0'; pChr += strlen(pChr) + 1)
2030*b1cdbd2cSJim Jagielski 				{
2031*b1cdbd2cSJim Jagielski 					if ((strnicmp(pChr, SVERSION_SOFFICE, sizeof(SVERSION_SOFFICE) - 1) == 0) &&
2032*b1cdbd2cSJim Jagielski 						(stricmp(Product, pChr) < 0))
2033*b1cdbd2cSJim Jagielski 					{
2034*b1cdbd2cSJim Jagielski 						osl_readProfileString(hProfile, SVERSION_SECTION, pChr,
2035*b1cdbd2cSJim Jagielski 						                      Dir, sizeof(Dir), "");
2036*b1cdbd2cSJim Jagielski 
2037*b1cdbd2cSJim Jagielski 						/* check for existence of path */
2038*b1cdbd2cSJim Jagielski 						if (access(Dir, 0) >= 0)
2039*b1cdbd2cSJim Jagielski 							strcpy(Product, pChr);
2040*b1cdbd2cSJim Jagielski 					}
2041*b1cdbd2cSJim Jagielski 				}
2042*b1cdbd2cSJim Jagielski 
2043*b1cdbd2cSJim Jagielski 				osl_closeProfile(hProfile);
2044*b1cdbd2cSJim Jagielski 			}
2045*b1cdbd2cSJim Jagielski 
2046*b1cdbd2cSJim Jagielski 			/* open sversion.ini in the users directory, and try to locate the entry
2047*b1cdbd2cSJim Jagielski 			   with the highest version for StarOffice */
2048*b1cdbd2cSJim Jagielski 			if ((strcmp(SVERSION_LOCATION, SVERSION_FALLBACK) != 0) &&
2049*b1cdbd2cSJim Jagielski 			    (osl_getProfileName(SVERSION_LOCATION, SVERSION_NAME, Profile, sizeof(Profile))) &&
2050*b1cdbd2cSJim Jagielski 				(hProfile = osl_openProfile(Profile, osl_Profile_READLOCK)))
2051*b1cdbd2cSJim Jagielski 			{
2052*b1cdbd2cSJim Jagielski 			  	osl_getProfileSectionEntries(hProfile, SVERSION_SECTION,
2053*b1cdbd2cSJim Jagielski 	   							             Buffer, sizeof(Buffer));
2054*b1cdbd2cSJim Jagielski 
2055*b1cdbd2cSJim Jagielski 				for (pChr = Buffer; *pChr != '\0'; pChr += strlen(pChr) + 1)
2056*b1cdbd2cSJim Jagielski 				{
2057*b1cdbd2cSJim Jagielski 					if ((strnicmp(pChr, SVERSION_SOFFICE, sizeof(SVERSION_SOFFICE) - 1) == 0) &&
2058*b1cdbd2cSJim Jagielski 						(stricmp(Product, pChr) < 0))
2059*b1cdbd2cSJim Jagielski 					{
2060*b1cdbd2cSJim Jagielski 						osl_readProfileString(hProfile, SVERSION_SECTION, pChr,
2061*b1cdbd2cSJim Jagielski 						                      Dir, sizeof(Dir), "");
2062*b1cdbd2cSJim Jagielski 
2063*b1cdbd2cSJim Jagielski 						/* check for existence of path */
2064*b1cdbd2cSJim Jagielski 						if (access(Dir, 0) >= 0)
2065*b1cdbd2cSJim Jagielski 							strcpy(Product, pChr);
2066*b1cdbd2cSJim Jagielski 					}
2067*b1cdbd2cSJim Jagielski 				}
2068*b1cdbd2cSJim Jagielski 
2069*b1cdbd2cSJim Jagielski 				osl_closeProfile(hProfile);
2070*b1cdbd2cSJim Jagielski 			}
2071*b1cdbd2cSJim Jagielski 
2072*b1cdbd2cSJim Jagielski 			/* remove any trailing build number */
2073*b1cdbd2cSJim Jagielski 			if ((pChr = strrchr(Product, '/')) != NULL)
2074*b1cdbd2cSJim Jagielski 				*pChr = '\0';
2075*b1cdbd2cSJim Jagielski 		}
2076*b1cdbd2cSJim Jagielski 	}
2077*b1cdbd2cSJim Jagielski 
2078*b1cdbd2cSJim Jagielski 
2079*b1cdbd2cSJim Jagielski 	/* if we have an userid option eg. "-userid:rh[/usr/home/rh/staroffice]",
2080*b1cdbd2cSJim Jagielski 	   this will supercede all other locations */
2081*b1cdbd2cSJim Jagielski 	if (osl_getCommandArgs(Buffer, sizeof(Buffer)) == osl_Process_E_None)
2082*b1cdbd2cSJim Jagielski 	{
2083*b1cdbd2cSJim Jagielski 		sal_Char *pStart, *pEnd;
2084*b1cdbd2cSJim Jagielski 
2085*b1cdbd2cSJim Jagielski 		for (pChr = Buffer; *pChr != '\0'; pChr += strlen(pChr) + 1)
2086*b1cdbd2cSJim Jagielski 			if (((*pChr == '-') || (*pChr == '+')) &&
2087*b1cdbd2cSJim Jagielski 			    (strnicmp(pChr + 1, SVERSION_OPTION, sizeof(SVERSION_OPTION) - 1) == 0))
2088*b1cdbd2cSJim Jagielski 			{
2089*b1cdbd2cSJim Jagielski 				if (((pStart = strchr(pChr + sizeof(SVERSION_OPTION), '[')) != NULL) &&
2090*b1cdbd2cSJim Jagielski 				    ((pEnd = strchr(pStart + 1, ']')) != NULL))
2091*b1cdbd2cSJim Jagielski 				{
2092*b1cdbd2cSJim Jagielski 					strncpy(Path, pStart + 1, pEnd - (pStart + 1));
2093*b1cdbd2cSJim Jagielski 					Path[pEnd - (pStart + 1)] = '\0';
2094*b1cdbd2cSJim Jagielski 
2095*b1cdbd2cSJim Jagielski 					/* build full path */
2096*b1cdbd2cSJim Jagielski 					if ((Path[strlen(Path) - 1] != '/') && (Path[strlen(Path) - 1] != '\\'))
2097*b1cdbd2cSJim Jagielski 					{
2098*b1cdbd2cSJim Jagielski 						strcat(Path, "\\");
2099*b1cdbd2cSJim Jagielski 					}
2100*b1cdbd2cSJim Jagielski 
2101*b1cdbd2cSJim Jagielski 					pChr =&Path[strlen(Path)];
2102*b1cdbd2cSJim Jagielski 					if ( strlen(pszPath) <= 0 )
2103*b1cdbd2cSJim Jagielski 					{
2104*b1cdbd2cSJim Jagielski 						strcat(Path,SVERSION_USER);
2105*b1cdbd2cSJim Jagielski 
2106*b1cdbd2cSJim Jagielski 						if ( access(Path, 0) < 0 )
2107*b1cdbd2cSJim Jagielski 						{
2108*b1cdbd2cSJim Jagielski 							*pChr='\0';
2109*b1cdbd2cSJim Jagielski 						}
2110*b1cdbd2cSJim Jagielski 					}
2111*b1cdbd2cSJim Jagielski 					else
2112*b1cdbd2cSJim Jagielski 					{
2113*b1cdbd2cSJim Jagielski 						strcat(Path, pszPath);
2114*b1cdbd2cSJim Jagielski 					}
2115*b1cdbd2cSJim Jagielski 
2116*b1cdbd2cSJim Jagielski 					break;
2117*b1cdbd2cSJim Jagielski 				}
2118*b1cdbd2cSJim Jagielski 			}
2119*b1cdbd2cSJim Jagielski 	}
2120*b1cdbd2cSJim Jagielski 
2121*b1cdbd2cSJim Jagielski 	if (strlen(Path) <= 0)
2122*b1cdbd2cSJim Jagielski 	{
2123*b1cdbd2cSJim Jagielski 		/* try to find the file in the directory of the executbale */
2124*b1cdbd2cSJim Jagielski 		if (osl_getExecutableFile(Path, sizeof(Path)) != osl_Process_E_None)
2125*b1cdbd2cSJim Jagielski 			return (sal_False);
2126*b1cdbd2cSJim Jagielski 
2127*b1cdbd2cSJim Jagielski 		/* seperate path from filename */
2128*b1cdbd2cSJim Jagielski 		if ((pChr = strrchr(Path, '\\')) == NULL)
2129*b1cdbd2cSJim Jagielski 			if ((pChr = strrchr(Path, ':')) == NULL)
2130*b1cdbd2cSJim Jagielski 				return (sal_False);
2131*b1cdbd2cSJim Jagielski 			else
2132*b1cdbd2cSJim Jagielski 				*pChr = '\0';
2133*b1cdbd2cSJim Jagielski 		else
2134*b1cdbd2cSJim Jagielski 			*pChr = '\0';
2135*b1cdbd2cSJim Jagielski 
2136*b1cdbd2cSJim Jagielski 		/* if we have no product identification use the executable file name */
2137*b1cdbd2cSJim Jagielski 		if (strlen(Product) <= 0)
2138*b1cdbd2cSJim Jagielski 		{
2139*b1cdbd2cSJim Jagielski 			strcpy(Product, pChr + 1);
2140*b1cdbd2cSJim Jagielski 
2141*b1cdbd2cSJim Jagielski 			/* remove extension */
2142*b1cdbd2cSJim Jagielski 			if ((pChr = strrchr(Product, '.')) != NULL)
2143*b1cdbd2cSJim Jagielski 				*pChr = '\0';
2144*b1cdbd2cSJim Jagielski 		}
2145*b1cdbd2cSJim Jagielski 
2146*b1cdbd2cSJim Jagielski 		/* remember last subdir */
2147*b1cdbd2cSJim Jagielski 		pStr = strrchr(Path, '\\');
2148*b1cdbd2cSJim Jagielski 
2149*b1cdbd2cSJim Jagielski 		strcat(Path, "\\");
2150*b1cdbd2cSJim Jagielski 
2151*b1cdbd2cSJim Jagielski 		if ( strlen(pszPath) <= 0 )
2152*b1cdbd2cSJim Jagielski 		{
2153*b1cdbd2cSJim Jagielski 			strcat(Path, pszPath);
2154*b1cdbd2cSJim Jagielski 		}
2155*b1cdbd2cSJim Jagielski 		else
2156*b1cdbd2cSJim Jagielski 		{
2157*b1cdbd2cSJim Jagielski 			strcat(Path,pszPath);
2158*b1cdbd2cSJim Jagielski 		}
2159*b1cdbd2cSJim Jagielski 
2160*b1cdbd2cSJim Jagielski 		/* if file not exists, remove any specified subdirectories
2161*b1cdbd2cSJim Jagielski 		   like "bin" or "program" */
2162*b1cdbd2cSJim Jagielski 		if (((access(Path, 0) < 0) && (pStr != NULL)) || (strlen(pszPath) <= 0))
2163*b1cdbd2cSJim Jagielski 		{
2164*b1cdbd2cSJim Jagielski 			static sal_Char *SubDirs[] = SVERSION_DIRS;
2165*b1cdbd2cSJim Jagielski 
2166*b1cdbd2cSJim Jagielski 			int i = 0;
2167*b1cdbd2cSJim Jagielski 
2168*b1cdbd2cSJim Jagielski 			for (i = 0; i < (sizeof(SubDirs) / sizeof(SubDirs[0])); i++)
2169*b1cdbd2cSJim Jagielski 				if (strnicmp(pStr + 1, SubDirs[i], strlen(SubDirs[i])) == 0)
2170*b1cdbd2cSJim Jagielski 				{
2171*b1cdbd2cSJim Jagielski 					if ( strlen(pszPath) <= 0)
2172*b1cdbd2cSJim Jagielski 					{
2173*b1cdbd2cSJim Jagielski 						strcpy(pStr + 1,SVERSION_USER);
2174*b1cdbd2cSJim Jagielski 						if ( access(Path, 0) < 0 )
2175*b1cdbd2cSJim Jagielski 						{
2176*b1cdbd2cSJim Jagielski 							*(pStr+1)='\0';
2177*b1cdbd2cSJim Jagielski 						}
2178*b1cdbd2cSJim Jagielski 					}
2179*b1cdbd2cSJim Jagielski 					else
2180*b1cdbd2cSJim Jagielski 					{
2181*b1cdbd2cSJim Jagielski 						strcpy(pStr + 1, pszPath);
2182*b1cdbd2cSJim Jagielski 					}
2183*b1cdbd2cSJim Jagielski 
2184*b1cdbd2cSJim Jagielski 					break;
2185*b1cdbd2cSJim Jagielski 				}
2186*b1cdbd2cSJim Jagielski 		}
2187*b1cdbd2cSJim Jagielski 
2188*b1cdbd2cSJim Jagielski 		pChr = &Path[strlen(Path)];
2189*b1cdbd2cSJim Jagielski 		if ((Path[strlen(Path) - 1] != '/') && (Path[strlen(Path) - 1] != '\\'))
2190*b1cdbd2cSJim Jagielski 			strcat(Path, "\\");
2191*b1cdbd2cSJim Jagielski 		strcat(Path, pszFile);
2192*b1cdbd2cSJim Jagielski 
2193*b1cdbd2cSJim Jagielski 		if ((access(Path, 0) < 0) && (strlen(Product) > 0))
2194*b1cdbd2cSJim Jagielski 		{
2195*b1cdbd2cSJim Jagielski 			sal_Char   Profile[_MAX_PATH];
2196*b1cdbd2cSJim Jagielski 			oslProfile hProfile;
2197*b1cdbd2cSJim Jagielski 
2198*b1cdbd2cSJim Jagielski 			/* remove appended filename */
2199*b1cdbd2cSJim Jagielski 			*pChr = '\0';
2200*b1cdbd2cSJim Jagielski 
2201*b1cdbd2cSJim Jagielski 			/* open sversion.ini in the system directory, and try to locate the entry
2202*b1cdbd2cSJim Jagielski 			   with the highest version for StarOffice */
2203*b1cdbd2cSJim Jagielski 			if ((osl_getProfileName(SVERSION_LOCATION, SVERSION_NAME, Profile, sizeof(Profile))) &&
2204*b1cdbd2cSJim Jagielski 				(hProfile = osl_openProfile(Profile, osl_Profile_READLOCK)))
2205*b1cdbd2cSJim Jagielski 			{
2206*b1cdbd2cSJim Jagielski 				pChr = &Product[strlen(Product)];
2207*b1cdbd2cSJim Jagielski 
2208*b1cdbd2cSJim Jagielski 				/* append build number */
2209*b1cdbd2cSJim Jagielski 				strcat(Product, "/");
2210*b1cdbd2cSJim Jagielski 				strcat(Product, BUILD_STR(SUPD));
2211*b1cdbd2cSJim Jagielski 
2212*b1cdbd2cSJim Jagielski 				osl_readProfileString(hProfile, SVERSION_SECTION, Product,
2213*b1cdbd2cSJim Jagielski 				                      Buffer, sizeof(Buffer), "");
2214*b1cdbd2cSJim Jagielski 
2215*b1cdbd2cSJim Jagielski 				/* if not found, try it without build number */
2216*b1cdbd2cSJim Jagielski 				if (strlen(Buffer) <= 0)
2217*b1cdbd2cSJim Jagielski 				{
2218*b1cdbd2cSJim Jagielski 					*pChr = '\0';
2219*b1cdbd2cSJim Jagielski 
2220*b1cdbd2cSJim Jagielski 					osl_readProfileString(hProfile, SVERSION_SECTION, Product,
2221*b1cdbd2cSJim Jagielski 					                      Buffer, sizeof(Buffer), "");
2222*b1cdbd2cSJim Jagielski 
2223*b1cdbd2cSJim Jagielski 					osl_closeProfile(hProfile);
2224*b1cdbd2cSJim Jagielski 
2225*b1cdbd2cSJim Jagielski 					/* if not found, try the fallback */
2226*b1cdbd2cSJim Jagielski 					if ((strlen(Buffer) <= 0) && (strcmp(SVERSION_LOCATION, SVERSION_FALLBACK) != 0))
2227*b1cdbd2cSJim Jagielski 					{
2228*b1cdbd2cSJim Jagielski 						if ((osl_getProfileName(SVERSION_FALLBACK, SVERSION_NAME, Profile, sizeof(Profile))) &&
2229*b1cdbd2cSJim Jagielski 							(hProfile = osl_openProfile(Profile, osl_Profile_READLOCK)))
2230*b1cdbd2cSJim Jagielski 						{
2231*b1cdbd2cSJim Jagielski 							/* prepare build number */
2232*b1cdbd2cSJim Jagielski 							*pChr = '/';
2233*b1cdbd2cSJim Jagielski 
2234*b1cdbd2cSJim Jagielski 							osl_readProfileString(hProfile, SVERSION_SECTION, Product,
2235*b1cdbd2cSJim Jagielski 							                      Buffer, sizeof(Buffer), "");
2236*b1cdbd2cSJim Jagielski 
2237*b1cdbd2cSJim Jagielski 							/* if not found, try it without build number */
2238*b1cdbd2cSJim Jagielski 							if (strlen(Buffer) <= 0)
2239*b1cdbd2cSJim Jagielski 							{
2240*b1cdbd2cSJim Jagielski 								*pChr = '\0';
2241*b1cdbd2cSJim Jagielski 
2242*b1cdbd2cSJim Jagielski 								osl_readProfileString(hProfile, SVERSION_SECTION, Product,
2243*b1cdbd2cSJim Jagielski 								                      Buffer, sizeof(Buffer), "");
2244*b1cdbd2cSJim Jagielski 							}
2245*b1cdbd2cSJim Jagielski 
2246*b1cdbd2cSJim Jagielski 							osl_closeProfile(hProfile);
2247*b1cdbd2cSJim Jagielski 						}
2248*b1cdbd2cSJim Jagielski 					}
2249*b1cdbd2cSJim Jagielski 				}
2250*b1cdbd2cSJim Jagielski 				else
2251*b1cdbd2cSJim Jagielski 					osl_closeProfile(hProfile);
2252*b1cdbd2cSJim Jagielski 
2253*b1cdbd2cSJim Jagielski 				if (strlen(Buffer) > 0)
2254*b1cdbd2cSJim Jagielski 				{
2255*b1cdbd2cSJim Jagielski 					strcpy(Path, Buffer);
2256*b1cdbd2cSJim Jagielski 
2257*b1cdbd2cSJim Jagielski 					/* build full path */
2258*b1cdbd2cSJim Jagielski 					if ((Path[strlen(Path) - 1] != '/') && (Path[strlen(Path) - 1] != '\\'))
2259*b1cdbd2cSJim Jagielski 					{
2260*b1cdbd2cSJim Jagielski 						if ((*pszPath != '/') && (*pszPath != '\\'))
2261*b1cdbd2cSJim Jagielski 							strcat(Path, "\\");
2262*b1cdbd2cSJim Jagielski 					}
2263*b1cdbd2cSJim Jagielski 
2264*b1cdbd2cSJim Jagielski 					pChr=&Path[strlen(pszPath)];
2265*b1cdbd2cSJim Jagielski 					if ( strlen(pszPath) > 0 )
2266*b1cdbd2cSJim Jagielski 					{
2267*b1cdbd2cSJim Jagielski 						strcat(Path, pszPath);
2268*b1cdbd2cSJim Jagielski 					}
2269*b1cdbd2cSJim Jagielski 					else
2270*b1cdbd2cSJim Jagielski 					{
2271*b1cdbd2cSJim Jagielski 						strcat(Path,SVERSION_USER);
2272*b1cdbd2cSJim Jagielski 						if ( access(Path, 0) < 0 )
2273*b1cdbd2cSJim Jagielski 						{
2274*b1cdbd2cSJim Jagielski 							*pChr='\0';
2275*b1cdbd2cSJim Jagielski 						}
2276*b1cdbd2cSJim Jagielski 					}
2277*b1cdbd2cSJim Jagielski 				}
2278*b1cdbd2cSJim Jagielski 			}
2279*b1cdbd2cSJim Jagielski 		}
2280*b1cdbd2cSJim Jagielski 		else
2281*b1cdbd2cSJim Jagielski 			/* remove appended filename */
2282*b1cdbd2cSJim Jagielski 			*pChr = '\0';
2283*b1cdbd2cSJim Jagielski 	}
2284*b1cdbd2cSJim Jagielski 
2285*b1cdbd2cSJim Jagielski 	strcpy(pPath, Path);
2286*b1cdbd2cSJim Jagielski 
2287*b1cdbd2cSJim Jagielski 	return (sal_True);
2288*b1cdbd2cSJim Jagielski }
2289*b1cdbd2cSJim Jagielski 
2290*b1cdbd2cSJim Jagielski #endif // 0 // YD
2291*b1cdbd2cSJim Jagielski 
2292