xpunit: fixed bug with multirow "url" xml tag
[abstract.git] / xpunit / xml / nsTestXmlParser.cpp
blob3ea7c47e11bf01235359886e9c4127dc594f8096
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:set ts=2 sw=2 sts=2 et cindent tw=79 ft=cpp: */
3 /*
4 * Copyright (C) 2007 Sergey Yanovich <ynvich@gmail.com>
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of the
9 * License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public
17 * License along with this program; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
22 #include "nsTestXmlParser.h"
23 #include "nsNetUtil.h"
24 #include "nsCOMPtr.h"
25 #include "nsParserCIID.h"
27 #include "nsIParser.h"
29 void
30 nsTestXmlQuery::Clear()
32 mUrl.Truncate();
33 mReference.Truncate();
34 mReferenceLine = -1;
37 static NS_DEFINE_CID(kParserCID, NS_PARSER_CID);
39 static NS_METHOD
40 TestInputStream(nsIInputStream *inStr, void *closure, const char *buffer,
41 PRUint32 offset, PRUint32 count, PRUint32 *countWritten)
43 PRBool *result = static_cast<PRBool *>(closure);
44 *result = PR_TRUE;
45 return NS_ERROR_ABORT; // don't call me anymore
48 PRBool
49 NS_InputStreamIsBuffered(nsIInputStream *stream)
51 PRBool result = PR_FALSE;
52 PRUint32 n;
53 nsresult rv = stream->ReadSegments(TestInputStream,
54 &result, 1, &n);
55 return result || NS_SUCCEEDED(rv);
58 NS_IMPL_ISUPPORTS2(nsTestXmlParser,
59 nsIContentSink,
60 nsIExpatSink)
62 nsresult
63 nsTestXmlParser::Init(nsIURI* aFileUri)
65 nsresult rv = NS_OK;
66 NS_ENSURE_ARG_POINTER(aFileUri);
67 NS_ENSURE_STATE(!mFileUri);
69 mFileUri = aFileUri;
71 nsCOMPtr<nsIChannel> parserChannel;
72 rv = NS_NewChannel(getter_AddRefs(parserChannel), mFileUri);
73 NS_ENSURE_SUCCESS(rv, rv);
75 rv = parserChannel->SetContentType(nsDependentCString("text/xml"));
76 NS_ENSURE_SUCCESS(rv, rv);
78 nsCOMPtr<nsIParser> parser = do_CreateInstance(kParserCID, &rv);
79 NS_ENSURE_SUCCESS(rv, rv);
81 parser->SetContentSink(this);
83 rv = parser->Parse(mFileUri, nsnull);
84 NS_ENSURE_SUCCESS(rv, rv);
86 nsCOMPtr<nsIInputStream> stream;
87 rv = parserChannel->Open(getter_AddRefs(stream));
88 NS_ENSURE_SUCCESS(rv, rv);
90 nsCOMPtr<nsIInputStream> bufferedStream;
91 if (!NS_InputStreamIsBuffered(stream)) {
92 rv = NS_NewBufferedInputStream(getter_AddRefs(bufferedStream),
93 stream, 4096);
94 NS_ENSURE_SUCCESS(rv, rv);
95 stream = bufferedStream;
98 nsCOMPtr<nsIStreamListener> listener = do_QueryInterface(parser, &rv);
99 NS_ENSURE_SUCCESS(rv, rv);
101 rv = listener->OnStartRequest(parserChannel, nsnull);
102 if (NS_FAILED(rv))
103 parserChannel->Cancel(rv);
105 nsresult status;
106 parserChannel->GetStatus(&status);
108 PRUint32 offset = 0;
109 while (NS_SUCCEEDED(rv) && NS_SUCCEEDED(status)) {
110 PRUint32 available;
111 rv = stream->Available(&available);
112 if (rv == NS_BASE_STREAM_CLOSED)
114 rv = NS_OK;
115 available = 0;
117 if (NS_FAILED(rv))
119 parserChannel->Cancel(rv);
120 break;
122 if (!available)
123 break;
124 rv = listener->OnDataAvailable(parserChannel, nsnull, stream,
125 offset, available);
126 if (NS_SUCCEEDED(rv))
127 offset += available;
128 else {
129 parserChannel->Cancel(rv);
131 parserChannel->GetStatus(&status);
133 rv = listener->OnStopRequest(parserChannel, nsnull, status);
135 return NS_OK;
138 nsresult
139 nsTestXmlParser::GetFileURI(nsIURI** aRetFileURI)
141 NS_ENSURE_ARG_POINTER(aRetFileURI);
142 NS_IF_ADDREF(*aRetFileURI = mFileUri);
143 return NS_OK;
146 //nsIExpatSink
147 NS_IMETHODIMP
148 nsTestXmlParser::HandleStartElement(const PRUnichar *aName, const
149 PRUnichar **aAtts, PRUint32 aAttsCount, PRInt32 aIndex, PRUint32
150 aLineNumber)
152 nsAutoString name(aName);
153 if (!mTestElementStarted)
155 NS_ENSURE_TRUE(name.EqualsLiteral("test"), NS_ERROR_INVALID_ARG);
156 mTestElementStarted = PR_TRUE;
158 else if (XML_NODE_CHILDREN == mNodeType)
160 NS_ENSURE_STATE(!mIsChildContract);
161 if (name.EqualsLiteral("contract"))
163 mIsChildContract = PR_TRUE;
166 else if (XML_NODE_QUERY == mNodeType)
168 NS_ENSURE_STATE(!mIsQueryUrl && !mIsQueryReference);
169 if (name.EqualsLiteral("url"))
171 mIsQueryUrl = PR_TRUE;
173 else if (name.EqualsLiteral("reference"))
175 mIsQueryReference = PR_TRUE;
176 mCurrentQuery.mReferenceLine = (PRInt32)aLineNumber;
179 else
181 NS_ENSURE_STATE(XML_NODE_UNKNOWN == mNodeType);
182 if (name.EqualsLiteral("cid"))
184 mNodeType = XML_NODE_CID;
186 else if (name.EqualsLiteral("contract"))
188 mNodeType = XML_NODE_CONTRACT;
190 else if (name.EqualsLiteral("name"))
192 mNodeType = XML_NODE_NAME;
194 else if (name.EqualsLiteral("children"))
196 mNodeType = XML_NODE_CHILDREN;
198 else if (name.EqualsLiteral("query"))
200 mNodeType = XML_NODE_QUERY;
201 mCurrentQuery.Clear();
204 return NS_OK;
207 NS_IMETHODIMP
208 nsTestXmlParser::HandleEndElement(const PRUnichar *aName)
210 NS_ENSURE_STATE(mTestElementStarted);
211 if (XML_NODE_CHILDREN == mNodeType)
213 nsAutoString name(aName);
214 if (name.EqualsLiteral("children"))
216 mNodeType = XML_NODE_UNKNOWN;
218 else
220 NS_ENSURE_STATE(mIsChildContract);
221 mIsChildContract = PR_FALSE;
224 else if (XML_NODE_QUERY == mNodeType)
226 nsAutoString name(aName);
227 if (name.EqualsLiteral("query"))
229 NS_ENSURE_STATE(!mIsQueryUrl && !mIsQueryReference);
230 mQueries.AppendElement(mCurrentQuery);
231 mCurrentQuery.Clear();
232 mNodeType = XML_NODE_UNKNOWN;
234 else if (name.EqualsLiteral("url"))
236 NS_ENSURE_STATE(mIsQueryUrl && !mIsQueryReference);
237 mIsQueryUrl = PR_FALSE;
239 else
241 NS_ENSURE_STATE(mIsQueryReference && !mIsQueryUrl);
242 mIsQueryReference = PR_FALSE;
245 else
247 mNodeType = XML_NODE_UNKNOWN;
249 return NS_OK;
252 NS_IMETHODIMP
253 nsTestXmlParser::HandleComment(const PRUnichar *aCommentText)
255 return NS_ERROR_NOT_IMPLEMENTED;
258 NS_IMETHODIMP
259 nsTestXmlParser::HandleCDataSection(const PRUnichar *aData, PRUint32
260 aLength)
262 return NS_ERROR_NOT_IMPLEMENTED;
265 NS_IMETHODIMP
266 nsTestXmlParser::HandleDoctypeDecl(const nsAString & aSubset, const
267 nsAString & aName, const nsAString & aSystemId, const nsAString &
268 aPublicId, nsISupports *aCatalogData)
270 return NS_ERROR_NOT_IMPLEMENTED;
273 NS_IMETHODIMP
274 nsTestXmlParser::HandleCharacterData(const PRUnichar *aData, PRUint32
275 aLength)
277 if (XML_NODE_UNKNOWN != mNodeType)
279 nsCAutoString value = NS_ConvertUTF16toUTF8(aData, aLength);
280 value.Trim("\n\r\t ");
281 if (value.IsEmpty()) return NS_OK;
282 switch (mNodeType)
284 case XML_NODE_CID:
286 mCID.Parse(value.get());
288 break;
289 case XML_NODE_CONTRACT:
290 mContract = value;
291 break;
292 case XML_NODE_NAME:
293 mName = value;
294 break;
295 case XML_NODE_CHILDREN:
297 NS_ENSURE_STATE(mIsChildContract);
298 mChildrens.AppendElement(value);
300 break;
301 case XML_NODE_QUERY:
303 NS_ENSURE_STATE(mIsQueryUrl || mIsQueryReference);
304 if (mIsQueryUrl)
306 mCurrentQuery.mUrl.Append(value);
308 else if (mIsQueryReference)
310 mCurrentQuery.mReference = value;
313 break;
314 default:
315 NS_ENSURE_TRUE(PR_FALSE, NS_ERROR_INVALID_ARG);
316 break;
319 return NS_OK;
322 NS_IMETHODIMP
323 nsTestXmlParser::HandleProcessingInstruction(const PRUnichar
324 *aTarget, const PRUnichar *aData)
326 return NS_ERROR_NOT_IMPLEMENTED;
329 NS_IMETHODIMP
330 nsTestXmlParser::HandleXMLDeclaration(const PRUnichar *aVersion,
331 const PRUnichar *aEncoding, PRInt32 aStandalone)
333 return NS_OK;
336 NS_IMETHODIMP
337 nsTestXmlParser::ReportError(const PRUnichar *aErrorText, const
338 PRUnichar *aSourceText, nsIScriptError *aError, PRBool *_retval
339 NS_OUTPARAM)
341 nsAutoString error(aErrorText);
342 printf_stderr("\nReportError: %s\n", NS_ConvertUTF16toUTF8(error).get());
343 return NS_OK;