| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_svl.hxx" |
| #include <ctype.h> |
| #include <stdio.h> |
| #include <com/sun/star/beans/PropertyValues.hpp> |
| |
| #include <svl/ownlist.hxx> |
| |
| using namespace com::sun::star; |
| |
| //========================================================================= |
| //============== SvCommandList ============================================ |
| //========================================================================= |
| PRV_SV_IMPL_OWNER_LIST(SvCommandList,SvCommand) |
| |
| |
| static String parseString(const String & rCmd, sal_uInt16 * pIndex) |
| { |
| String result; |
| |
| if(rCmd.GetChar( *pIndex ) == '\"') { |
| (*pIndex) ++; |
| |
| sal_uInt16 begin = *pIndex; |
| |
| while(*pIndex < rCmd.Len() && rCmd.GetChar((*pIndex) ++) != '\"') ; |
| |
| result = String(rCmd.Copy(begin, *pIndex - begin - 1)); |
| } |
| |
| return result; |
| } |
| |
| static String parseWord(const String & rCmd, sal_uInt16 * pIndex) |
| { |
| sal_uInt16 begin = *pIndex; |
| |
| while(*pIndex < rCmd.Len() && !isspace(rCmd.GetChar(*pIndex)) && rCmd.GetChar(*pIndex) != '=') |
| (*pIndex) ++; |
| |
| return String(rCmd.Copy(begin, *pIndex - begin)); |
| } |
| |
| static void eatSpace(const String & rCmd, sal_uInt16 * pIndex) |
| { |
| while(*pIndex < rCmd.Len() && isspace(rCmd.GetChar(*pIndex))) |
| (*pIndex) ++; |
| } |
| |
| |
| //========================================================================= |
| sal_Bool SvCommandList::AppendCommands |
| ( |
| const String & rCmd, /* Dieser Text wird in Kommandos umgesetzt */ |
| sal_uInt16 * pEaten /* Anzahl der Zeichen, die gelesen wurden */ |
| ) |
| /* [Beschreibung] |
| |
| Es wird eine Text geparsed und die einzelnen Kommandos werden an |
| die Liste angeh"angt. |
| |
| [R"uckgabewert] |
| |
| sal_Bool sal_True, der Text wurde korrekt geparsed. |
| sal_False, der Text wurde nicht korrekt geparsed. |
| */ |
| { |
| sal_uInt16 index = 0; |
| while(index < rCmd.Len()) |
| { |
| |
| eatSpace(rCmd, &index); |
| String name = (rCmd.GetChar(index) == '\"') ? parseString(rCmd, &index) : parseWord(rCmd, &index); |
| |
| eatSpace(rCmd, &index); |
| String value; |
| if(index < rCmd.Len() && rCmd.GetChar(index) == '=') |
| { |
| index ++; |
| |
| eatSpace(rCmd, &index); |
| value = (rCmd.GetChar(index) == '\"') ? parseString(rCmd, &index) : parseWord(rCmd, &index); |
| } |
| |
| SvCommand * pCmd = new SvCommand(name, value); |
| aTypes.Insert(pCmd, LIST_APPEND); |
| } |
| |
| *pEaten = index; |
| |
| // sal_uInt16 nPos = 0; |
| // while( nPos < rCmd.Len() ) |
| // { |
| // // ein Zeichen ? Dann faengt hier eine Option an |
| // if( isalpha( rCmd[nPos] ) ) |
| // { |
| // String aValue; |
| // sal_uInt16 nStt = nPos; |
| // register char c; |
| |
| // while( nPos < rCmd.Len() && |
| // ( isalnum(c=rCmd[nPos]) || '-'==c || '.'==c ) ) |
| // nPos++; |
| |
| // String aToken( rCmd.Copy( nStt, nPos-nStt ) ); |
| |
| // while( nPos < rCmd.Len() && |
| // ( !String::IsPrintable( (c=rCmd[nPos]), |
| // RTL_TEXTENCODING_MS_1252 ) || isspace(c) ) ) |
| // nPos++; |
| |
| // // hat die Option auch einen Wert? |
| // if( nPos!=rCmd.Len() && '='==c ) |
| // { |
| // nPos++; |
| |
| // while( nPos < rCmd.Len() && |
| // ( !String::IsPrintable( (c=rCmd[nPos]), |
| // RTL_TEXTENCODING_MS_1252 ) || isspace(c) ) ) |
| // nPos++; |
| |
| // if( nPos != rCmd.Len() ) |
| // { |
| // sal_uInt16 nLen = 0; |
| // nStt = nPos; |
| // if( '"' == c ) |
| // { |
| // nPos++; nStt++; |
| // while( nPos < rCmd.Len() && |
| // '"' != rCmd[nPos] ) |
| // nPos++, nLen++; |
| // if( nPos!=rCmd.Len() ) |
| // nPos++; |
| // } |
| // else |
| // // hier sind wir etwas laxer als der |
| // // Standard und erlauben alles druckbare |
| // while( nPos < rCmd.Len() && |
| // String::IsPrintable( (c=rCmd[nPos]), |
| // RTL_TEXTENCODING_MS_1252 ) && |
| // !isspace( c ) ) |
| // nPos++, nLen++; |
| |
| // if( nLen ) |
| // aValue = rCmd( nStt, nLen ); |
| // } |
| // } |
| |
| // SvCommand * pCmd = new SvCommand( aToken, aValue ); |
| // aTypes.Insert( pCmd, LIST_APPEND ); |
| // } |
| // else |
| // // white space un unerwartete Zeichen ignorieren wie |
| // nPos++; |
| // } |
| // *pEaten = nPos; |
| return sal_True; |
| } |
| |
| //========================================================================= |
| String SvCommandList::GetCommands() const |
| /* [Beschreibung] |
| |
| Die Kommandos in der Liste werden als Text hintereinander, durch ein |
| Leerzeichen getrennt geschrieben. Der Text muss nicht genauso |
| aussehen wie der in <SvCommandList::AppendCommands()> "ubergebene. |
| |
| [R"uckgabewert] |
| |
| String Die Kommandos werden zur"uckgegeben. |
| */ |
| { |
| String aRet; |
| for( sal_uLong i = 0; i < aTypes.Count(); i++ ) |
| { |
| if( i != 0 ) |
| aRet += ' '; |
| SvCommand * pCmd = (SvCommand *)aTypes.GetObject( i ); |
| aRet += pCmd->GetCommand(); |
| if( pCmd->GetArgument().Len() ) |
| { |
| aRet.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "=\"" ) ); |
| aRet += pCmd->GetArgument(); |
| aRet.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "\"" ) ); |
| } |
| } |
| return aRet; |
| } |
| |
| //========================================================================= |
| SvCommand & SvCommandList::Append |
| ( |
| const String & rCommand, /* das Kommando */ |
| const String & rArg /* dasArgument des Kommandos */ |
| ) |
| /* [Beschreibung] |
| |
| Es wird eine Objekt vom Typ SvCommand erzeugt und an die Liste |
| angeh"angt. |
| |
| [R"uckgabewert] |
| |
| SvCommand & Das erteugte Objekt wird zur"uckgegeben. |
| */ |
| { |
| SvCommand * pCmd = new SvCommand( rCommand, rArg ); |
| aTypes.Insert( pCmd, LIST_APPEND ); |
| return *pCmd; |
| } |
| |
| //========================================================================= |
| SvStream & operator >> |
| ( |
| SvStream & rStm, /* Stream aus dem gelesen wird */ |
| SvCommandList & rThis /* Die zu f"ullende Liste */ |
| ) |
| /* [Beschreibung] |
| |
| Die Liste mit ihren Elementen wird gelesen. Das Format ist: |
| 1. Anzahl der Elemente |
| 2. Alle Elemente |
| |
| [R"uckgabewert] |
| |
| SvStream & Der "ubergebene Stream. |
| */ |
| { |
| sal_uInt32 nCount = 0; |
| rStm >> nCount; |
| if( !rStm.GetError() ) |
| { |
| while( nCount-- ) |
| { |
| SvCommand * pCmd = new SvCommand(); |
| rStm >> *pCmd; |
| rThis.aTypes.Insert( pCmd, LIST_APPEND ); |
| } |
| } |
| return rStm; |
| } |
| |
| //========================================================================= |
| SvStream & operator << |
| ( |
| SvStream & rStm, /* Stream in den geschrieben wird */ |
| const SvCommandList & rThis /* Die zu schreibende Liste */ |
| ) |
| /* [Beschreibung] |
| |
| Die Liste mit ihren Elementen wir geschrieben. Das Format ist: |
| 1. Anzahl der Elemente |
| 2. Alle Elemente |
| |
| [R"uckgabewert] |
| |
| SvStream & Der "ubergebene Stream. |
| */ |
| { |
| sal_uInt32 nCount = rThis.aTypes.Count(); |
| rStm << nCount; |
| |
| for( sal_uInt32 i = 0; i < nCount; i++ ) |
| { |
| SvCommand * pCmd = (SvCommand *)rThis.aTypes.GetObject( i ); |
| rStm << *pCmd; |
| } |
| return rStm; |
| } |
| |
| sal_Bool SvCommandList::FillFromSequence( const com::sun::star::uno::Sequence < com::sun::star::beans::PropertyValue >& aCommandSequence ) |
| { |
| const sal_Int32 nCount = aCommandSequence.getLength(); |
| String aCommand, aArg; |
| ::rtl::OUString aApiArg; |
| for( sal_Int32 nIndex=0; nIndex<nCount; nIndex++ ) |
| { |
| aCommand = aCommandSequence[nIndex].Name; |
| if( !( aCommandSequence[nIndex].Value >>= aApiArg ) ) |
| return sal_False; |
| aArg = aApiArg; |
| Append( aCommand, aArg ); |
| } |
| |
| return sal_True; |
| } |
| |
| void SvCommandList::FillSequence( com::sun::star::uno::Sequence < com::sun::star::beans::PropertyValue >& aCommandSequence ) |
| { |
| const sal_Int32 nCount = Count(); |
| aCommandSequence.realloc( nCount ); |
| for( sal_Int32 nIndex = 0; nIndex < nCount; nIndex++ ) |
| { |
| const SvCommand& rCommand = (*this)[ nIndex ]; |
| aCommandSequence[nIndex].Name = rCommand.GetCommand(); |
| aCommandSequence[nIndex].Handle = -1; |
| aCommandSequence[nIndex].Value = uno::makeAny( ::rtl::OUString( rCommand.GetArgument() ) ); |
| aCommandSequence[nIndex].State = beans::PropertyState_DIRECT_VALUE; |
| } |
| } |
| |