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: */
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"
25 #include "nsParserCIID.h"
27 #include "nsIParser.h"
30 nsTestXmlQuery::Clear()
33 mReference
.Truncate();
37 static NS_DEFINE_CID(kParserCID
, NS_PARSER_CID
);
40 TestInputStream(nsIInputStream
*inStr
, void *closure
, const char *buffer
,
41 PRUint32 offset
, PRUint32 count
, PRUint32
*countWritten
)
43 PRBool
*result
= static_cast<PRBool
*>(closure
);
45 return NS_ERROR_ABORT
; // don't call me anymore
49 NS_InputStreamIsBuffered(nsIInputStream
*stream
)
51 PRBool result
= PR_FALSE
;
53 nsresult rv
= stream
->ReadSegments(TestInputStream
,
55 return result
|| NS_SUCCEEDED(rv
);
58 NS_IMPL_ISUPPORTS2(nsTestXmlParser
,
63 nsTestXmlParser::Init(nsIURI
* aFileUri
)
66 NS_ENSURE_ARG_POINTER(aFileUri
);
67 NS_ENSURE_STATE(!mFileUri
);
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
),
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
);
103 parserChannel
->Cancel(rv
);
106 parserChannel
->GetStatus(&status
);
109 while (NS_SUCCEEDED(rv
) && NS_SUCCEEDED(status
)) {
111 rv
= stream
->Available(&available
);
112 if (rv
== NS_BASE_STREAM_CLOSED
)
119 parserChannel
->Cancel(rv
);
124 rv
= listener
->OnDataAvailable(parserChannel
, nsnull
, stream
,
126 if (NS_SUCCEEDED(rv
))
129 parserChannel
->Cancel(rv
);
131 parserChannel
->GetStatus(&status
);
133 rv
= listener
->OnStopRequest(parserChannel
, nsnull
, status
);
139 nsTestXmlParser::GetFileURI(nsIURI
** aRetFileURI
)
141 NS_ENSURE_ARG_POINTER(aRetFileURI
);
142 NS_IF_ADDREF(*aRetFileURI
= mFileUri
);
148 nsTestXmlParser::HandleStartElement(const PRUnichar
*aName
, const
149 PRUnichar
**aAtts
, PRUint32 aAttsCount
, PRInt32 aIndex
, PRUint32
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
;
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();
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
;
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
;
241 NS_ENSURE_STATE(mIsQueryReference
&& !mIsQueryUrl
);
242 mIsQueryReference
= PR_FALSE
;
247 mNodeType
= XML_NODE_UNKNOWN
;
253 nsTestXmlParser::HandleComment(const PRUnichar
*aCommentText
)
255 return NS_ERROR_NOT_IMPLEMENTED
;
259 nsTestXmlParser::HandleCDataSection(const PRUnichar
*aData
, PRUint32
262 return NS_ERROR_NOT_IMPLEMENTED
;
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
;
274 nsTestXmlParser::HandleCharacterData(const PRUnichar
*aData
, PRUint32
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
;
286 mCID
.Parse(value
.get());
289 case XML_NODE_CONTRACT
:
295 case XML_NODE_CHILDREN
:
297 NS_ENSURE_STATE(mIsChildContract
);
298 mChildrens
.AppendElement(value
);
303 NS_ENSURE_STATE(mIsQueryUrl
|| mIsQueryReference
);
306 mCurrentQuery
.mUrl
.Append(value
);
308 else if (mIsQueryReference
)
310 mCurrentQuery
.mReference
= value
;
315 NS_ENSURE_TRUE(PR_FALSE
, NS_ERROR_INVALID_ARG
);
323 nsTestXmlParser::HandleProcessingInstruction(const PRUnichar
324 *aTarget
, const PRUnichar
*aData
)
326 return NS_ERROR_NOT_IMPLEMENTED
;
330 nsTestXmlParser::HandleXMLDeclaration(const PRUnichar
*aVersion
,
331 const PRUnichar
*aEncoding
, PRInt32 aStandalone
)
337 nsTestXmlParser::ReportError(const PRUnichar
*aErrorText
, const
338 PRUnichar
*aSourceText
, nsIScriptError
*aError
, PRBool
*_retval
341 nsAutoString
error(aErrorText
);
342 printf_stderr("\nReportError: %s\n", NS_ConvertUTF16toUTF8(error
).get());