28 #include <nsIConverterInputStream.h>
29 #include <nsServiceManagerUtils.h>
30 #include <nsIObserverService.h>
33 #include <nsNetUtil.h>
34 #include <nsIDOMParser.h>
35 #include <nsIDOMDocument.h>
36 #include <nsIDOMElement.h>
37 #include <nsIDOMNode.h>
38 #include <nsIDOMNodeList.h>
39 #include <nsIDOMNamedNodeMap.h>
40 #include <nsUnicharUtils.h>
43 #define DATA_URL "chrome://songbird/content/intl/sbArticleRemoval.xml"
44 #define DOCUMENT_DATA "sb-article-removal-document"
45 #define LANGUAGE_DATA "article-removal-data"
46 #define ARTICLE_DATA "article"
48 #define CONVERTER_BUFFER_SIZE 8192
59 : mArticlesLoaded(PR_FALSE)
74 nsresult sbArticlesData::AddObserver() {
81 do_GetService(NS_OBSERVERSERVICE_CONTRACTID, &rv);
82 NS_ENSURE_SUCCESS(rv, rv);
86 NS_ENSURE_SUCCESS(rv, rv);
90 NS_XPCOM_SHUTDOWN_OBSERVER_ID,
92 NS_WARN_IF_FALSE(NS_SUCCEEDED(rv),
"Failed to add shutdown observer");
97 nsresult sbArticlesData::RemoveObserver() {
103 do_GetService(NS_OBSERVERSERVICE_CONTRACTID, &rv);
104 NS_ENSURE_SUCCESS(rv, rv);
107 NS_XPCOM_SHUTDOWN_OBSERVER_ID);
108 NS_WARN_IF_FALSE(NS_SUCCEEDED(rv),
109 "Failed to remove shutdown observer");
120 nsresult rv = AddObserver();
121 NS_ENSURE_SUCCESS(rv, rv);
125 nsCOMPtr<nsIURI> dataURI;
126 rv = NS_NewURI(getter_AddRefs(dataURI), NS_LITERAL_CSTRING(
DATA_URL));
127 NS_ENSURE_SUCCESS(rv, rv);
129 nsCOMPtr<nsIInputStream> input;
130 rv = NS_OpenURI(getter_AddRefs(input), dataURI);
131 NS_ENSURE_SUCCESS(rv, rv);
133 nsCOMPtr<nsIConverterInputStream> converterStream =
134 do_CreateInstance(
"@mozilla.org/intl/converter-input-stream;1", &rv);
135 NS_ENSURE_SUCCESS(rv, rv);
137 rv = converterStream->Init(input,
140 nsIConverterInputStream::DEFAULT_REPLACEMENT_CHARACTER);
141 NS_ENSURE_SUCCESS(rv, rv);
143 nsCOMPtr<nsIUnicharInputStream> unichar =
144 do_QueryInterface(converterStream, &rv);
145 NS_ENSURE_SUCCESS(rv, rv);
150 NS_ENSURE_SUCCESS(rv, rv);
154 nsCOMPtr<nsIDOMParser> parser =
155 do_CreateInstance(NS_DOMPARSER_CONTRACTID, &rv);
156 NS_ENSURE_SUCCESS(rv, rv);
158 nsCOMPtr<nsIDOMDocument>
doc;
159 rv = parser->ParseFromString(response.get(),
"text/xml", getter_AddRefs(doc));
160 NS_ENSURE_SUCCESS(rv, rv);
164 nsCOMPtr<nsIDOMElement>
top;
165 rv = doc->GetDocumentElement(getter_AddRefs(top));
166 NS_ENSURE_SUCCESS(rv, rv);
168 nsCOMPtr<nsIDOMNode> topNode;
169 topNode = do_QueryInterface(top, &rv);
170 NS_ENSURE_SUCCESS(rv, rv);
173 nsString topLocalName;
174 rv = topNode->GetLocalName(topLocalName);
175 NS_ENSURE_SUCCESS(rv, rv);
179 return NS_ERROR_FAILURE;
184 nsCOMPtr<nsIDOMNodeList> childNodes;
185 rv = topNode->GetChildNodes(getter_AddRefs(childNodes));
186 NS_ENSURE_SUCCESS(rv, rv);
189 rv = childNodes->GetLength(&nchildren);
190 NS_ENSURE_SUCCESS(rv, rv);
192 for (PRUint32
i=0;
i<nchildren;
i++) {
196 nsCOMPtr<nsIDOMNode> childNode;
197 rv = childNodes->Item(
i, getter_AddRefs(childNode));
198 NS_ENSURE_SUCCESS(rv, rv);
201 rv = childNode->GetNodeType(&nodeType);
202 NS_ENSURE_SUCCESS(rv, rv);
205 if (nodeType == nsIDOMNode::ELEMENT_NODE) {
208 rv = childNode->GetLocalName(localName);
209 NS_ENSURE_SUCCESS(rv, rv);
215 nsTArray<nsRefPtr<sbArticle> >
data;
218 nsCOMPtr<nsIDOMNamedNodeMap> attrs;
219 rv = childNode->GetAttributes(getter_AddRefs(attrs));
220 NS_ENSURE_SUCCESS(rv, rv);
223 nsCOMPtr<nsIDOMNode> lang;
224 rv = attrs->GetNamedItem(NS_LITERAL_STRING(
"lang"), getter_AddRefs(lang));
225 NS_ENSURE_SUCCESS(rv, rv);
228 rv = lang->GetNodeValue(language);
229 NS_ENSURE_SUCCESS(rv, rv);
233 nsCOMPtr<nsIDOMNodeList> articleNodes;
234 rv = childNode->GetChildNodes(getter_AddRefs(articleNodes));
235 NS_ENSURE_SUCCESS(rv, rv);
238 rv = articleNodes->GetLength(&narticles);
239 NS_ENSURE_SUCCESS(rv, rv);
241 for (PRUint32 j=0; j<narticles; j++) {
245 nsCOMPtr<nsIDOMNode> articleNode;
246 rv = articleNodes->Item(j, getter_AddRefs(articleNode));
247 NS_ENSURE_SUCCESS(rv, rv);
249 PRUint16 articleNodeType;
250 rv = articleNode->GetNodeType(&articleNodeType);
251 NS_ENSURE_SUCCESS(rv, rv);
254 if (nodeType == nsIDOMNode::ELEMENT_NODE) {
257 nsString articleLocalName;
258 rv = articleNode->GetLocalName(articleLocalName);
259 NS_ENSURE_SUCCESS(rv, rv);
266 nsCOMPtr<nsIDOMNamedNodeMap> artAttrs;
267 rv = articleNode->GetAttributes(getter_AddRefs(artAttrs));
268 NS_ENSURE_SUCCESS(rv, rv);
271 nsCOMPtr<nsIDOMNode> patt;
272 rv = artAttrs->GetNamedItem(NS_LITERAL_STRING(
"pattern"), getter_AddRefs(patt));
273 NS_ENSURE_SUCCESS(rv, rv);
276 rv = patt->GetNodeValue(pattern);
277 NS_ENSURE_SUCCESS(rv, rv);
280 rv = ParsePattern(pattern, prefix, suffix);
281 NS_ENSURE_SUCCESS(rv, rv);
284 nsRefPtr<sbArticle> art =
285 new sbArticle(prefix, suffix);
286 NS_ENSURE_TRUE(art, NS_ERROR_OUT_OF_MEMORY);
288 data.AppendElement(art);
293 nsRefPtr<sbArticleLanguageData> ldata =
294 new sbArticleLanguageData(language, data);
295 NS_ENSURE_TRUE(ldata, NS_ERROR_OUT_OF_MEMORY);
297 mLanguages.AppendElement(ldata);
304 mArticlesLoaded = PR_TRUE;
310 if (!mArticlesLoaded)
313 nsresult rv = RemoveObserver();
314 NS_ENSURE_SUCCESS(rv, rv);
319 mArticlesLoaded = PR_FALSE;
325 sbArticlesDataObserver::Observe(
nsISupports* aSubject,
327 const PRUnichar*
aData) {
329 if (strcmp(aTopic, NS_XPCOM_SHUTDOWN_OBSERVER_ID) == 0) {
333 gArticlesData = NULL;
347 return NS_ERROR_OUT_OF_MEMORY;
349 return gArticlesData->
Init();
353 const nsAString & aLanguage,
354 nsAString &_retval) {
356 NS_ENSURE_SUCCESS(rv, rv);
358 return gArticlesData->_RemoveArticles(aInput, aLanguage, _retval);
361 nsresult sbArticlesData::ParsePattern(
const nsAString &aPattern,
363 nsAString &aSuffix) {
366 PRInt32
pos = aPattern.FindChar(
'*');
368 return NS_ERROR_ILLEGAL_VALUE;
370 const nsAString&
left = Substring(aPattern, 0, pos);
371 const nsAString&
right = Substring(aPattern, pos+1);
379 nsresult sbArticlesData::_RemoveArticles(
const nsAString & aInput,
380 const nsAString & aLanguage,
381 nsAString &_retval) {
385 PRUint32 nlang = mLanguages.Length();
386 PRBool abort = PR_FALSE;
387 for (PRUint32
i=0;
i<nlang && !abort;
i++) {
388 sbArticleLanguageData *lang = mLanguages[
i];
389 if (aLanguage.IsEmpty() ||
390 aLanguage.Equals(lang->mLanguage)) {
391 PRUint32 narticles = lang->mArticles.Length();
392 for (PRUint32 j=0;j<narticles;j++) {
395 nsresult rv = RemoveArticle(val, lang->mArticles[j], newVal);
396 NS_ENSURE_SUCCESS(rv, rv);
398 if (newVal.IsEmpty()) {
412 nsresult sbArticlesData::RemoveArticle(
const nsAString & aInput,
413 const sbArticle * aArticle,
414 nsAString &_retval) {
418 if (!aArticle->mPrefix.IsEmpty()) {
419 const nsAString &
left = Substring(val, 0, aArticle->mPrefix.Length());
420 if (left.Equals(aArticle->mPrefix, CaseInsensitiveCompare)) {
421 val = Substring(val, left.Length());
424 if (!aArticle->mSuffix.IsEmpty()) {
425 const nsAString &
right = Substring(val, val.Length() - aArticle->mSuffix.Length());
426 if (right.Equals(aArticle->mSuffix, CaseInsensitiveCompare)) {
427 val = Substring(val, 0, val.Length()-right.Length());
nsCOMPtr< sbArticlesDataObserver > gArticlesDataObserver
sbArticlesData * gArticlesData
static nsCOMPtr< nsIObserverService > observerService
function doc() browser.contentDocument
friend class sbArticlesDataObserver
static nsresult EnsureLoaded()
NS_IMPL_THREADSAFE_ISUPPORTS1(sbArticlesDataObserver, nsIObserver) sbArticlesData
this _dialogInput val(dateText)
#define CONVERTER_BUFFER_SIZE
_getSelectedPageStyle s i
nsresult UnloadArticles()
_updateTextAndScrollDataForFrame aData
static nsresult RemoveArticles(const nsAString &aInput, const nsAString &aLanguage, nsAString &_retval)