1*ab595ff6SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*ab595ff6SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*ab595ff6SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*ab595ff6SAndrew Rist * distributed with this work for additional information
6*ab595ff6SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*ab595ff6SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*ab595ff6SAndrew Rist * "License"); you may not use this file except in compliance
9*ab595ff6SAndrew Rist * with the License. You may obtain a copy of the License at
10cdf0e10cSrcweir *
11*ab595ff6SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
13*ab595ff6SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*ab595ff6SAndrew Rist * software distributed under the License is distributed on an
15*ab595ff6SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*ab595ff6SAndrew Rist * KIND, either express or implied. See the License for the
17*ab595ff6SAndrew Rist * specific language governing permissions and limitations
18*ab595ff6SAndrew Rist * under the License.
19cdf0e10cSrcweir *
20*ab595ff6SAndrew Rist *************************************************************/
21*ab595ff6SAndrew Rist
22*ab595ff6SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir #include "xml_cdff.hxx"
25cdf0e10cSrcweir
26cdf0e10cSrcweir #include <string.h>
27cdf0e10cSrcweir #include <tools/stream.hxx>
28cdf0e10cSrcweir #include "xml_cdim.hxx"
29cdf0e10cSrcweir #include <ctype.h>
30cdf0e10cSrcweir
31cdf0e10cSrcweir
32cdf0e10cSrcweir typedef ComponentDescriptionImpl::ValueList CdiValueList;
33cdf0e10cSrcweir
34cdf0e10cSrcweir class dyn_buffer
35cdf0e10cSrcweir {
36cdf0e10cSrcweir public:
dyn_buffer()37cdf0e10cSrcweir dyn_buffer() : s(0) {}
~dyn_buffer()38cdf0e10cSrcweir ~dyn_buffer() { if (s) delete [] s; }
operator const char*() const39cdf0e10cSrcweir operator const char *() const { return s; }
operator ->()40cdf0e10cSrcweir char * operator->() { return s; }
operator [](INT32 ix)41cdf0e10cSrcweir char & operator[](
42cdf0e10cSrcweir INT32 ix ) { return s[ix]; }
SetSize(INT32 i_size)43cdf0e10cSrcweir void SetSize(
44cdf0e10cSrcweir INT32 i_size ) { if (s) delete [] s; s = new char [i_size]; }
45cdf0e10cSrcweir private:
46cdf0e10cSrcweir char * s;
47cdf0e10cSrcweir };
48cdf0e10cSrcweir
49cdf0e10cSrcweir
50cdf0e10cSrcweir inline BOOL
LoadXmlFile(dyn_buffer & o_rBuffer,const UniString & i_sXmlFilePath)51cdf0e10cSrcweir LoadXmlFile( dyn_buffer & o_rBuffer,
52cdf0e10cSrcweir const UniString & i_sXmlFilePath )
53cdf0e10cSrcweir {
54cdf0e10cSrcweir BOOL ret = TRUE;
55cdf0e10cSrcweir SvFileStream aXmlFile;
56cdf0e10cSrcweir
57cdf0e10cSrcweir aXmlFile.Open(i_sXmlFilePath, STREAM_READ);
58cdf0e10cSrcweir if (aXmlFile.GetErrorCode() != FSYS_ERR_OK)
59cdf0e10cSrcweir ret = FALSE;
60cdf0e10cSrcweir if (ret)
61cdf0e10cSrcweir {
62cdf0e10cSrcweir aXmlFile.Seek(STREAM_SEEK_TO_END);
63cdf0e10cSrcweir INT32 nBufferSize = aXmlFile.Tell();
64cdf0e10cSrcweir o_rBuffer.SetSize(nBufferSize + 1);
65cdf0e10cSrcweir o_rBuffer[nBufferSize] = '\0';
66cdf0e10cSrcweir aXmlFile.Seek(0);
67cdf0e10cSrcweir if (aXmlFile.Read(o_rBuffer.operator->(), nBufferSize) == 0)
68cdf0e10cSrcweir ret = FALSE;
69cdf0e10cSrcweir }
70cdf0e10cSrcweir
71cdf0e10cSrcweir aXmlFile.Close();
72cdf0e10cSrcweir return ret;
73cdf0e10cSrcweir }
74cdf0e10cSrcweir
75cdf0e10cSrcweir
76cdf0e10cSrcweir
CompDescrsFromAnXmlFile()77cdf0e10cSrcweir CompDescrsFromAnXmlFile::CompDescrsFromAnXmlFile()
78cdf0e10cSrcweir : dpDescriptions(new std::vector< ComponentDescriptionImpl* >),
79cdf0e10cSrcweir eStatus(not_yet_parsed)
80cdf0e10cSrcweir {
81cdf0e10cSrcweir dpDescriptions->reserve(3);
82cdf0e10cSrcweir }
83cdf0e10cSrcweir
~CompDescrsFromAnXmlFile()84cdf0e10cSrcweir CompDescrsFromAnXmlFile::~CompDescrsFromAnXmlFile()
85cdf0e10cSrcweir {
86cdf0e10cSrcweir Empty();
87cdf0e10cSrcweir delete dpDescriptions;
88cdf0e10cSrcweir }
89cdf0e10cSrcweir
90cdf0e10cSrcweir
91cdf0e10cSrcweir BOOL
Parse(const UniString & i_sXmlFilePath)92cdf0e10cSrcweir CompDescrsFromAnXmlFile::Parse( const UniString & i_sXmlFilePath )
93cdf0e10cSrcweir {
94cdf0e10cSrcweir dyn_buffer dpBuffer;
95cdf0e10cSrcweir
96cdf0e10cSrcweir if (! LoadXmlFile(dpBuffer,i_sXmlFilePath) )
97cdf0e10cSrcweir {
98cdf0e10cSrcweir eStatus = cant_read_file;
99cdf0e10cSrcweir return FALSE;
100cdf0e10cSrcweir }
101cdf0e10cSrcweir
102cdf0e10cSrcweir const char * pTokenStart = 0;
103cdf0e10cSrcweir const char * pBufferPosition = dpBuffer;
104cdf0e10cSrcweir INT32 nTokenLength = 0;
105cdf0e10cSrcweir BOOL bWithinElement = FALSE;
106cdf0e10cSrcweir
107cdf0e10cSrcweir CdiValueList * pCurTagData = 0;
108cdf0e10cSrcweir ByteString sStatusValue; // Used only if a <Status ...> tag is found.
109cdf0e10cSrcweir
110cdf0e10cSrcweir
111cdf0e10cSrcweir for ( ComponentDescriptionImpl::ParseUntilStartOfDescription(pBufferPosition);
112cdf0e10cSrcweir pBufferPosition != 0;
113cdf0e10cSrcweir ComponentDescriptionImpl::ParseUntilStartOfDescription(pBufferPosition) )
114cdf0e10cSrcweir {
115cdf0e10cSrcweir ComponentDescriptionImpl * pCurCD = 0;
116cdf0e10cSrcweir pCurCD = new ComponentDescriptionImpl;
117cdf0e10cSrcweir dpDescriptions->push_back(pCurCD);
118cdf0e10cSrcweir
119cdf0e10cSrcweir for ( ; *pBufferPosition != '\0' && pCurCD != 0; )
120cdf0e10cSrcweir {
121cdf0e10cSrcweir switch (*pBufferPosition)
122cdf0e10cSrcweir {
123cdf0e10cSrcweir case '<' :
124cdf0e10cSrcweir if (! bWithinElement)
125cdf0e10cSrcweir {
126cdf0e10cSrcweir pCurTagData = pCurCD->GetBeginTag(sStatusValue, pBufferPosition);
127cdf0e10cSrcweir if (pCurTagData != 0)
128cdf0e10cSrcweir {
129cdf0e10cSrcweir if (sStatusValue.Len () == 0)
130cdf0e10cSrcweir {
131cdf0e10cSrcweir // Start new token:
132cdf0e10cSrcweir pTokenStart = pBufferPosition;
133cdf0e10cSrcweir nTokenLength = 0;
134cdf0e10cSrcweir bWithinElement = TRUE;;
135cdf0e10cSrcweir }
136cdf0e10cSrcweir else
137cdf0e10cSrcweir {
138cdf0e10cSrcweir // Status tag is already parsed:
139cdf0e10cSrcweir pCurTagData->push_back(sStatusValue);
140cdf0e10cSrcweir } // endif (sStatusValue.Length () == 0)
141cdf0e10cSrcweir }
142cdf0e10cSrcweir else if ( ComponentDescriptionImpl::CheckEndOfDescription(pBufferPosition) )
143cdf0e10cSrcweir {
144cdf0e10cSrcweir pBufferPosition += ComponentDescriptionImpl::DescriptionEndTagSize();
145cdf0e10cSrcweir pCurCD = 0;
146cdf0e10cSrcweir }
147cdf0e10cSrcweir else
148cdf0e10cSrcweir {
149cdf0e10cSrcweir eStatus = inconsistent_file;
150cdf0e10cSrcweir return FALSE;
151cdf0e10cSrcweir } // endif (pCurTagData != 0) elseif() else
152cdf0e10cSrcweir }
153cdf0e10cSrcweir else if ( pCurTagData->MatchesEndTag(pBufferPosition) )
154cdf0e10cSrcweir {
155cdf0e10cSrcweir // Finish token:
156cdf0e10cSrcweir pBufferPosition += pCurTagData->EndTagLength();
157cdf0e10cSrcweir bWithinElement = FALSE;
158cdf0e10cSrcweir
159cdf0e10cSrcweir // Remove leading and trailing spaces:
160cdf0e10cSrcweir while ( isspace(*pTokenStart) )
161cdf0e10cSrcweir {
162cdf0e10cSrcweir pTokenStart++;
163cdf0e10cSrcweir nTokenLength--;
164cdf0e10cSrcweir }
165cdf0e10cSrcweir while ( nTokenLength > 0
166cdf0e10cSrcweir && isspace(pTokenStart[nTokenLength-1]) )
167cdf0e10cSrcweir {
168cdf0e10cSrcweir nTokenLength--;
169cdf0e10cSrcweir }
170cdf0e10cSrcweir // Add token to tag values list.
171cdf0e10cSrcweir pCurTagData->push_back(ByteString(pTokenStart,nTokenLength));
172cdf0e10cSrcweir }
173cdf0e10cSrcweir else
174cdf0e10cSrcweir {
175cdf0e10cSrcweir nTokenLength++;
176cdf0e10cSrcweir ++pBufferPosition;
177cdf0e10cSrcweir } // endif (!bWithinElement) else if () else
178cdf0e10cSrcweir break;
179cdf0e10cSrcweir default:
180cdf0e10cSrcweir if (bWithinElement)
181cdf0e10cSrcweir {
182cdf0e10cSrcweir ++nTokenLength;
183cdf0e10cSrcweir }
184cdf0e10cSrcweir ++pBufferPosition;
185cdf0e10cSrcweir } // end switch
186cdf0e10cSrcweir } // end for
187cdf0e10cSrcweir
188cdf0e10cSrcweir if (bWithinElement)
189cdf0e10cSrcweir {
190cdf0e10cSrcweir eStatus = inconsistent_file;
191cdf0e10cSrcweir return FALSE;
192cdf0e10cSrcweir }
193cdf0e10cSrcweir } // end for
194cdf0e10cSrcweir
195cdf0e10cSrcweir return TRUE;
196cdf0e10cSrcweir }
197cdf0e10cSrcweir
198cdf0e10cSrcweir INT32
NrOfDescriptions() const199cdf0e10cSrcweir CompDescrsFromAnXmlFile::NrOfDescriptions() const
200cdf0e10cSrcweir {
201cdf0e10cSrcweir return dpDescriptions->size();
202cdf0e10cSrcweir }
203cdf0e10cSrcweir
204cdf0e10cSrcweir const ComponentDescription &
operator [](INT32 i_nIndex) const205cdf0e10cSrcweir CompDescrsFromAnXmlFile::operator[](INT32 i_nIndex) const
206cdf0e10cSrcweir {
207cdf0e10cSrcweir static const ComponentDescriptionImpl aNullDescr_;
208cdf0e10cSrcweir return 0 <= i_nIndex && i_nIndex < dpDescriptions->size()
209cdf0e10cSrcweir ? *(*dpDescriptions)[i_nIndex]
210cdf0e10cSrcweir : aNullDescr_;
211cdf0e10cSrcweir }
212cdf0e10cSrcweir
213cdf0e10cSrcweir void
Empty()214cdf0e10cSrcweir CompDescrsFromAnXmlFile::Empty()
215cdf0e10cSrcweir {
216cdf0e10cSrcweir for ( std::vector< ComponentDescriptionImpl* >::iterator aIter = dpDescriptions->begin();
217cdf0e10cSrcweir aIter != dpDescriptions->end();
218cdf0e10cSrcweir ++aIter )
219cdf0e10cSrcweir {
220cdf0e10cSrcweir delete *aIter;
221cdf0e10cSrcweir }
222cdf0e10cSrcweir dpDescriptions->erase( dpDescriptions->begin(),
223cdf0e10cSrcweir dpDescriptions->end() );
224cdf0e10cSrcweir }
225cdf0e10cSrcweir
226cdf0e10cSrcweir
227cdf0e10cSrcweir
228