1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_xmloff.hxx"
26 #include "xmloff/xmlerror.hxx"
27 #include <tools/debug.hxx>
28 #include <rtl/ustring.hxx>
29 #include <com/sun/star/xml/sax/XLocator.hpp>
30 #include <com/sun/star/xml/sax/SAXParseException.hpp>
31 #include <com/sun/star/uno/Any.hxx>
32 #include <com/sun/star/uno/Reference.hxx>
33 #include <com/sun/star/uno/Sequence.hxx>
34
35
36 #include <rtl/ustrbuf.hxx>
37 #include <tools/string.hxx>
38
39
40
41 using ::rtl::OUString;
42 using ::rtl::OUStringBuffer;
43 using ::com::sun::star::uno::Any;
44 using ::com::sun::star::uno::Sequence;
45 using ::com::sun::star::uno::Reference;
46 using ::com::sun::star::xml::sax::XLocator;
47 using ::com::sun::star::xml::sax::SAXParseException;
48
49
50 //
51 /// ErrorRecord: contains all information for one error
52 //
53
54 class ErrorRecord
55 {
56 public:
57
58 ErrorRecord( sal_Int32 nId,
59 const Sequence<OUString>& rParams,
60 const OUString& rExceptionMessage,
61 sal_Int32 nRow,
62 sal_Int32 nColumn,
63 const OUString& rPublicId,
64 const OUString& rSystemId);
65 ~ErrorRecord();
66
67 sal_Int32 nId; /// error ID
68
69 OUString sExceptionMessage;/// message of original exception (if available)
70
71 // XLocator information:
72 sal_Int32 nRow; /// row number where error occurred (or -1 for unknown)
73 sal_Int32 nColumn; /// column number where error occurred (or -1)
74 OUString sPublicId; /// public identifier
75 OUString sSystemId; /// public identifier
76
77 /// message Parameters
78 Sequence<OUString> aParams;
79 };
80
81
ErrorRecord(sal_Int32 nID,const Sequence<OUString> & rParams,const OUString & rExceptionMessage,sal_Int32 nRowNumber,sal_Int32 nCol,const OUString & rPublicId,const OUString & rSystemId)82 ErrorRecord::ErrorRecord( sal_Int32 nID, const Sequence<OUString>& rParams,
83 const OUString& rExceptionMessage, sal_Int32 nRowNumber, sal_Int32 nCol,
84 const OUString& rPublicId, const OUString& rSystemId) :
85 nId(nID),
86 sExceptionMessage(rExceptionMessage),
87 nRow(nRowNumber),
88 nColumn(nCol),
89 sPublicId(rPublicId),
90 sSystemId(rSystemId),
91 aParams(rParams)
92 {
93 }
94
~ErrorRecord()95 ErrorRecord::~ErrorRecord()
96 {
97 }
98
99
100
101
XMLErrors()102 XMLErrors::XMLErrors()
103 {
104 }
105
~XMLErrors()106 XMLErrors::~XMLErrors()
107 {
108 }
109
AddRecord(sal_Int32 nId,const Sequence<OUString> & rParams,const OUString & rExceptionMessage,sal_Int32 nRow,sal_Int32 nColumn,const OUString & rPublicId,const OUString & rSystemId)110 void XMLErrors::AddRecord(
111 sal_Int32 nId,
112 const Sequence<OUString> & rParams,
113 const OUString& rExceptionMessage,
114 sal_Int32 nRow,
115 sal_Int32 nColumn,
116 const OUString& rPublicId,
117 const OUString& rSystemId )
118 {
119 aErrors.push_back( ErrorRecord( nId, rParams, rExceptionMessage,
120 nRow, nColumn, rPublicId, rSystemId ) );
121
122 #ifdef DBG_UTIL
123
124 // give detailed assertion on this message
125
126 OUStringBuffer sMessage;
127
128 sMessage.appendAscii( "An error or a warning has occurred during XML import/export!\n" );
129
130 // ID & flags
131 sMessage.appendAscii( "Error-Id: 0x");
132 sMessage.append( nId, 16 );
133 sMessage.appendAscii( "\n Flags: " );
134 sal_Int32 nFlags = (nId & XMLERROR_MASK_FLAG);
135 sMessage.append( nFlags >> 28, 16 );
136 if( (nFlags & XMLERROR_FLAG_WARNING) != 0 )
137 sMessage.appendAscii( " WARNING" );
138 if( (nFlags & XMLERROR_FLAG_ERROR) != 0 )
139 sMessage.appendAscii( " ERRROR" );
140 if( (nFlags & XMLERROR_FLAG_SEVERE) != 0 )
141 sMessage.appendAscii( " SEVERE" );
142 sMessage.appendAscii( "\n Class: " );
143 sal_Int32 nClass = (nId & XMLERROR_MASK_CLASS);
144 sMessage.append( nClass >> 16, 16 );
145 if( (nClass & XMLERROR_CLASS_IO) != 0 )
146 sMessage.appendAscii( " IO" );
147 if( (nClass & XMLERROR_CLASS_FORMAT) != 0 )
148 sMessage.appendAscii( " FORMAT" );
149 if( (nClass & XMLERROR_CLASS_API) != 0 )
150 sMessage.appendAscii( " API" );
151 if( (nClass & XMLERROR_CLASS_OTHER) != 0 )
152 sMessage.appendAscii( " OTHER" );
153 sMessage.appendAscii( "\n Number: " );
154 sal_Int32 nNumber = (nId & XMLERROR_MASK_NUMBER);
155 sMessage.append( nNumber, 16 );
156 sMessage.appendAscii( "\n");
157
158 // the parameters
159 sMessage.appendAscii( "Parameters:\n" );
160 sal_Int32 nLength = rParams.getLength();
161 const OUString* pParams = rParams.getConstArray();
162 for( sal_Int32 i = 0; i < nLength; i++ )
163 {
164 sMessage.appendAscii( " " );
165 sMessage.append( i );
166 sMessage.appendAscii( ": " );
167 sMessage.append( pParams[i] );
168 sMessage.appendAscii( "\n" );
169 }
170
171 // the exception message
172 sMessage.appendAscii( "Exception-Message: " );
173 sMessage.append( rExceptionMessage );
174 sMessage.appendAscii( "\n" );
175
176 // position (if given)
177 if( (nRow != -1) || (nColumn != -1) )
178 {
179 sMessage.appendAscii( "Position:\n Public Identifier: " );
180 sMessage.append( rPublicId );
181 sMessage.appendAscii( "\n System Identifier: " );
182 sMessage.append( rSystemId );
183 sMessage.appendAscii( "\n Row, Column: " );
184 sMessage.append( nRow );
185 sMessage.appendAscii( "," );
186 sMessage.append( nColumn );
187 sMessage.appendAscii( "\n" );
188 }
189
190 // convert to byte string and signal the error
191 ByteString aError( String( sMessage.makeStringAndClear() ),
192 RTL_TEXTENCODING_ASCII_US );
193 DBG_ERROR( aError.GetBuffer() );
194 #endif
195 }
196
AddRecord(sal_Int32 nId,const Sequence<OUString> & rParams,const OUString & rExceptionMessage,const Reference<XLocator> & rLocator)197 void XMLErrors::AddRecord(
198 sal_Int32 nId,
199 const Sequence<OUString> & rParams,
200 const OUString& rExceptionMessage,
201 const Reference<XLocator> & rLocator)
202 {
203 if ( rLocator.is() )
204 {
205 AddRecord( nId, rParams, rExceptionMessage,
206 rLocator->getLineNumber(), rLocator->getColumnNumber(),
207 rLocator->getPublicId(), rLocator->getSystemId() );
208 }
209 else
210 {
211 OUString sEmpty;
212 AddRecord( nId, rParams, rExceptionMessage,
213 -1, -1, sEmpty, sEmpty );
214 }
215 }
216
AddRecord(sal_Int32 nId,const Sequence<OUString> & rParams,const OUString & rExceptionMessage)217 void XMLErrors::AddRecord(
218 sal_Int32 nId,
219 const Sequence<OUString> & rParams,
220 const OUString& rExceptionMessage)
221 {
222 OUString sEmpty;
223 AddRecord( nId, rParams, rExceptionMessage, -1, -1, sEmpty, sEmpty );
224 }
225
AddRecord(sal_Int32 nId,const Sequence<OUString> & rParams)226 void XMLErrors::AddRecord(
227 sal_Int32 nId,
228 const Sequence<OUString> & rParams)
229 {
230 OUString sEmpty;
231 AddRecord( nId, rParams, sEmpty, -1, -1, sEmpty, sEmpty );
232 }
233
ThrowErrorAsSAXException(sal_Int32 nIdMask)234 void XMLErrors::ThrowErrorAsSAXException(sal_Int32 nIdMask)
235 throw( SAXParseException )
236 {
237 // search first error/warning that matches the nIdMask
238 for( ErrorList::iterator aIter = aErrors.begin();
239 aIter != aErrors.end();
240 aIter++ )
241 {
242 if ( (aIter->nId & nIdMask) != 0 )
243 {
244 // we throw the error
245 ErrorRecord& rErr = aErrors[0];
246 Any aAny;
247 aAny <<= rErr.aParams;
248 throw SAXParseException(
249 rErr.sExceptionMessage, NULL, aAny,
250 rErr.sPublicId, rErr.sSystemId, rErr.nRow, rErr.nColumn );
251 }
252 }
253 }
254