1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: ownlist.cxx,v $
10 * $Revision: 1.6.136.1 $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_svtools.hxx"
35 #include <com/sun/star/beans/PropertyValues.hpp>
37 #include <svtools/ownlist.hxx>
39 using namespace com::sun::star
;
41 //=========================================================================
42 //============== SvCommandList ============================================
43 //=========================================================================
44 PRV_SV_IMPL_OWNER_LIST(SvCommandList
,SvCommand
)
47 static String
parseString(const String
& rCmd
, USHORT
* pIndex
)
51 if(rCmd
.GetChar( *pIndex
) == '\"') {
54 USHORT begin
= *pIndex
;
56 while(*pIndex
< rCmd
.Len() && rCmd
.GetChar((*pIndex
) ++) != '\"') ;
58 result
= String(rCmd
.Copy(begin
, *pIndex
- begin
- 1));
64 static String
parseWord(const String
& rCmd
, USHORT
* pIndex
)
66 USHORT begin
= *pIndex
;
68 while(*pIndex
< rCmd
.Len() && !isspace(rCmd
.GetChar(*pIndex
)) && rCmd
.GetChar(*pIndex
) != '=')
71 return String(rCmd
.Copy(begin
, *pIndex
- begin
));
74 static void eatSpace(const String
& rCmd
, USHORT
* pIndex
)
76 while(*pIndex
< rCmd
.Len() && isspace(rCmd
.GetChar(*pIndex
)))
81 //=========================================================================
82 BOOL
SvCommandList::AppendCommands
84 const String
& rCmd
, /* Dieser Text wird in Kommandos umgesetzt */
85 USHORT
* pEaten
/* Anzahl der Zeichen, die gelesen wurden */
89 Es wird eine Text geparsed und die einzelnen Kommandos werden an
94 BOOL TRUE, der Text wurde korrekt geparsed.
95 FALSE, der Text wurde nicht korrekt geparsed.
99 while(index
< rCmd
.Len())
102 eatSpace(rCmd
, &index
);
103 String name
= (rCmd
.GetChar(index
) == '\"') ? parseString(rCmd
, &index
) : parseWord(rCmd
, &index
);
105 eatSpace(rCmd
, &index
);
107 if(index
< rCmd
.Len() && rCmd
.GetChar(index
) == '=')
111 eatSpace(rCmd
, &index
);
112 value
= (rCmd
.GetChar(index
) == '\"') ? parseString(rCmd
, &index
) : parseWord(rCmd
, &index
);
115 SvCommand
* pCmd
= new SvCommand(name
, value
);
116 aTypes
.Insert(pCmd
, LIST_APPEND
);
122 // while( nPos < rCmd.Len() )
124 // // ein Zeichen ? Dann faengt hier eine Option an
125 // if( isalpha( rCmd[nPos] ) )
128 // USHORT nStt = nPos;
131 // while( nPos < rCmd.Len() &&
132 // ( isalnum(c=rCmd[nPos]) || '-'==c || '.'==c ) )
135 // String aToken( rCmd.Copy( nStt, nPos-nStt ) );
137 // while( nPos < rCmd.Len() &&
138 // ( !String::IsPrintable( (c=rCmd[nPos]),
139 // RTL_TEXTENCODING_MS_1252 ) || isspace(c) ) )
142 // // hat die Option auch einen Wert?
143 // if( nPos!=rCmd.Len() && '='==c )
147 // while( nPos < rCmd.Len() &&
148 // ( !String::IsPrintable( (c=rCmd[nPos]),
149 // RTL_TEXTENCODING_MS_1252 ) || isspace(c) ) )
152 // if( nPos != rCmd.Len() )
159 // while( nPos < rCmd.Len() &&
160 // '"' != rCmd[nPos] )
162 // if( nPos!=rCmd.Len() )
166 // // hier sind wir etwas laxer als der
167 // // Standard und erlauben alles druckbare
168 // while( nPos < rCmd.Len() &&
169 // String::IsPrintable( (c=rCmd[nPos]),
170 // RTL_TEXTENCODING_MS_1252 ) &&
175 // aValue = rCmd( nStt, nLen );
179 // SvCommand * pCmd = new SvCommand( aToken, aValue );
180 // aTypes.Insert( pCmd, LIST_APPEND );
183 // // white space un unerwartete Zeichen ignorieren wie
190 //=========================================================================
191 String
SvCommandList::GetCommands() const
194 Die Kommandos in der Liste werden als Text hintereinander, durch ein
195 Leerzeichen getrennt geschrieben. Der Text muss nicht genauso
196 aussehen wie der in <SvCommandList::AppendCommands()> "ubergebene.
200 String Die Kommandos werden zur"uckgegeben.
204 for( ULONG i
= 0; i
< aTypes
.Count(); i
++ )
208 SvCommand
* pCmd
= (SvCommand
*)aTypes
.GetObject( i
);
209 aRet
+= pCmd
->GetCommand();
210 if( pCmd
->GetArgument().Len() )
212 aRet
.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "=\"" ) );
213 aRet
+= pCmd
->GetArgument();
214 aRet
.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "\"" ) );
220 //=========================================================================
221 SvCommand
& SvCommandList::Append
223 const String
& rCommand
, /* das Kommando */
224 const String
& rArg
/* dasArgument des Kommandos */
228 Es wird eine Objekt vom Typ SvCommand erzeugt und an die Liste
233 SvCommand & Das erteugte Objekt wird zur"uckgegeben.
236 SvCommand
* pCmd
= new SvCommand( rCommand
, rArg
);
237 aTypes
.Insert( pCmd
, LIST_APPEND
);
241 //=========================================================================
242 SvStream
& operator >>
244 SvStream
& rStm
, /* Stream aus dem gelesen wird */
245 SvCommandList
& rThis
/* Die zu f"ullende Liste */
249 Die Liste mit ihren Elementen wird gelesen. Das Format ist:
250 1. Anzahl der Elemente
255 SvStream & Der "ubergebene Stream.
260 if( !rStm
.GetError() )
264 SvCommand
* pCmd
= new SvCommand();
266 rThis
.aTypes
.Insert( pCmd
, LIST_APPEND
);
272 //=========================================================================
273 SvStream
& operator <<
275 SvStream
& rStm
, /* Stream in den geschrieben wird */
276 const SvCommandList
& rThis
/* Die zu schreibende Liste */
280 Die Liste mit ihren Elementen wir geschrieben. Das Format ist:
281 1. Anzahl der Elemente
286 SvStream & Der "ubergebene Stream.
289 UINT32 nCount
= rThis
.aTypes
.Count();
292 for( UINT32 i
= 0; i
< nCount
; i
++ )
294 SvCommand
* pCmd
= (SvCommand
*)rThis
.aTypes
.GetObject( i
);
300 BOOL
SvCommandList::FillFromSequence( const com::sun::star::uno::Sequence
< com::sun::star::beans::PropertyValue
>& aCommandSequence
)
302 const sal_Int32 nCount
= aCommandSequence
.getLength();
303 String aCommand
, aArg
;
304 ::rtl::OUString aApiArg
;
305 for( sal_Int32 nIndex
=0; nIndex
<nCount
; nIndex
++ )
307 aCommand
= aCommandSequence
[nIndex
].Name
;
308 if( !( aCommandSequence
[nIndex
].Value
>>= aApiArg
) )
311 Append( aCommand
, aArg
);
317 void SvCommandList::FillSequence( com::sun::star::uno::Sequence
< com::sun::star::beans::PropertyValue
>& aCommandSequence
)
319 const sal_Int32 nCount
= Count();
320 aCommandSequence
.realloc( nCount
);
321 for( sal_Int32 nIndex
= 0; nIndex
< nCount
; nIndex
++ )
323 const SvCommand
& rCommand
= (*this)[ nIndex
];
324 aCommandSequence
[nIndex
].Name
= rCommand
.GetCommand();
325 aCommandSequence
[nIndex
].Handle
= -1;
326 aCommandSequence
[nIndex
].Value
= uno::makeAny( ::rtl::OUString( rCommand
.GetArgument() ) );
327 aCommandSequence
[nIndex
].State
= beans::PropertyState_DIRECT_VALUE
;