xref: /aoo41x/main/sal/osl/all/filepath.c (revision cdf0e10c)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir #include <osl/file.h>
29*cdf0e10cSrcweir #include <rtl/ustring.h>
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir static sal_uInt32 SAL_CALL osl_defCalcTextWidth( rtl_uString *ustrText )
32*cdf0e10cSrcweir {
33*cdf0e10cSrcweir 	return ustrText ? ustrText->length : 0;
34*cdf0e10cSrcweir }
35*cdf0e10cSrcweir 
36*cdf0e10cSrcweir 
37*cdf0e10cSrcweir oslFileError SAL_CALL osl_abbreviateSystemPath( rtl_uString *ustrSystemPath, rtl_uString **pustrCompacted, sal_uInt32 uMaxWidth, oslCalcTextWidthFunc pfnCalcWidth )
38*cdf0e10cSrcweir {
39*cdf0e10cSrcweir 	oslFileError	error = osl_File_E_None;
40*cdf0e10cSrcweir 	rtl_uString		*ustrPath = NULL;
41*cdf0e10cSrcweir 	rtl_uString		*ustrFile = NULL;
42*cdf0e10cSrcweir 	sal_uInt32		uPathWidth, uFileWidth;
43*cdf0e10cSrcweir 
44*cdf0e10cSrcweir 	if ( !pfnCalcWidth )
45*cdf0e10cSrcweir 		pfnCalcWidth = osl_defCalcTextWidth;
46*cdf0e10cSrcweir 
47*cdf0e10cSrcweir 	{
48*cdf0e10cSrcweir 		sal_Int32	iLastSlash = rtl_ustr_lastIndexOfChar_WithLength( ustrSystemPath->buffer, ustrSystemPath->length, SAL_PATHDELIMITER );
49*cdf0e10cSrcweir 
50*cdf0e10cSrcweir 		if ( iLastSlash >= 0 )
51*cdf0e10cSrcweir 		{
52*cdf0e10cSrcweir 			rtl_uString_newFromStr_WithLength( &ustrPath, ustrSystemPath->buffer, iLastSlash );
53*cdf0e10cSrcweir 			rtl_uString_newFromStr_WithLength( &ustrFile, &ustrSystemPath->buffer[iLastSlash], ustrSystemPath->length - iLastSlash );
54*cdf0e10cSrcweir 		}
55*cdf0e10cSrcweir 		else
56*cdf0e10cSrcweir 		{
57*cdf0e10cSrcweir 			rtl_uString_new( &ustrPath );
58*cdf0e10cSrcweir 			rtl_uString_newFromString( &ustrFile, ustrSystemPath );
59*cdf0e10cSrcweir 		}
60*cdf0e10cSrcweir 	}
61*cdf0e10cSrcweir 
62*cdf0e10cSrcweir 	uPathWidth = pfnCalcWidth( ustrPath );
63*cdf0e10cSrcweir 	uFileWidth = pfnCalcWidth( ustrFile );
64*cdf0e10cSrcweir 
65*cdf0e10cSrcweir 	/* First abbreviate the directory component of the path */
66*cdf0e10cSrcweir 
67*cdf0e10cSrcweir 	while ( uPathWidth + uFileWidth > uMaxWidth )
68*cdf0e10cSrcweir 	{
69*cdf0e10cSrcweir 		if ( ustrPath->length > 3 )
70*cdf0e10cSrcweir 		{
71*cdf0e10cSrcweir 			ustrPath->length--;
72*cdf0e10cSrcweir 			ustrPath->buffer[ustrPath->length-3] = '.';
73*cdf0e10cSrcweir 			ustrPath->buffer[ustrPath->length-2] = '.';
74*cdf0e10cSrcweir 			ustrPath->buffer[ustrPath->length-1] = '.';
75*cdf0e10cSrcweir 			ustrPath->buffer[ustrPath->length] = 0;
76*cdf0e10cSrcweir 
77*cdf0e10cSrcweir 			uPathWidth = pfnCalcWidth( ustrPath );
78*cdf0e10cSrcweir 		}
79*cdf0e10cSrcweir 		else
80*cdf0e10cSrcweir 			break;
81*cdf0e10cSrcweir 	}
82*cdf0e10cSrcweir 
83*cdf0e10cSrcweir 	/* Now abbreviate file component */
84*cdf0e10cSrcweir 
85*cdf0e10cSrcweir 	while ( uPathWidth + uFileWidth > uMaxWidth )
86*cdf0e10cSrcweir 	{
87*cdf0e10cSrcweir 		if ( ustrFile->length > 4 )
88*cdf0e10cSrcweir 		{
89*cdf0e10cSrcweir 			ustrFile->length--;
90*cdf0e10cSrcweir 			ustrFile->buffer[ustrFile->length-3] = '.';
91*cdf0e10cSrcweir 			ustrFile->buffer[ustrFile->length-2] = '.';
92*cdf0e10cSrcweir 			ustrFile->buffer[ustrFile->length-1] = '.';
93*cdf0e10cSrcweir 			ustrFile->buffer[ustrFile->length] = 0;
94*cdf0e10cSrcweir 
95*cdf0e10cSrcweir 			uFileWidth = pfnCalcWidth( ustrFile );
96*cdf0e10cSrcweir 		}
97*cdf0e10cSrcweir 		else
98*cdf0e10cSrcweir 			break;
99*cdf0e10cSrcweir 	}
100*cdf0e10cSrcweir 
101*cdf0e10cSrcweir 	rtl_uString_newConcat( pustrCompacted, ustrPath, ustrFile );
102*cdf0e10cSrcweir 
103*cdf0e10cSrcweir 	/* Event now if path was compacted to ".../..." it can be to large */
104*cdf0e10cSrcweir 
105*cdf0e10cSrcweir 	uPathWidth += uFileWidth;
106*cdf0e10cSrcweir 
107*cdf0e10cSrcweir 	while ( uPathWidth > uMaxWidth )
108*cdf0e10cSrcweir 	{
109*cdf0e10cSrcweir 		(*pustrCompacted)->length--;
110*cdf0e10cSrcweir 		(*pustrCompacted)->buffer[(*pustrCompacted)->length] = 0;
111*cdf0e10cSrcweir 		uPathWidth = pfnCalcWidth( *pustrCompacted );
112*cdf0e10cSrcweir 	}
113*cdf0e10cSrcweir 
114*cdf0e10cSrcweir 	if ( ustrPath )
115*cdf0e10cSrcweir 		rtl_uString_release( ustrPath );
116*cdf0e10cSrcweir 
117*cdf0e10cSrcweir 	if ( ustrFile )
118*cdf0e10cSrcweir 		rtl_uString_release( ustrFile );
119*cdf0e10cSrcweir 
120*cdf0e10cSrcweir 	return error;
121*cdf0e10cSrcweir }
122*cdf0e10cSrcweir 
123*cdf0e10cSrcweir 
124