Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 /******* BEGIN LICENSE BLOCK *******
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
8 *
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
13 *
14 * The Initial Developers of the Original Code are Kevin Hendricks (MySpell)
15 * and László Németh (Hunspell). Portions created by the Initial Developers
16 * are Copyright (C) 2002-2005 the Initial Developers. All Rights Reserved.
17 *
18 * Contributor(s): Benjamin Smedberg (benjamin@smedbergs.us) (Original Code)
19 * László Németh (nemethl@gyorsposta.hu)
20 * Ryan VanderMeulen (ryanvm@gmail.com)
21 *
22 * Alternatively, the contents of this file may be used under the terms of
23 * either the GNU General Public License Version 2 or later (the "GPL"), or
24 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
25 * in which case the provisions of the GPL or the LGPL are applicable instead
26 * of those above. If you wish to allow use of your version of this file only
27 * under the terms of either the GPL or the LGPL, and not to allow others to
28 * use your version of this file under the terms of the MPL, indicate your
29 * decision by deleting the provisions above and replace them with the notice
30 * and other provisions required by the GPL or the LGPL. If you do not delete
31 * the provisions above, a recipient may use your version of this file under
32 * the terms of any one of the MPL, the GPL or the LGPL.
33 *
34 ******* END LICENSE BLOCK *******/
36 #include "mozHunspellDirProvider.h"
37 #include "nsXULAppAPI.h"
38 #include "nsString.h"
40 #include "mozISpellCheckingEngine.h"
41 #include "nsICategoryManager.h"
43 NS_IMPL_ISUPPORTS(mozHunspellDirProvider,
44 nsIDirectoryServiceProvider,
45 nsIDirectoryServiceProvider2)
47 NS_IMETHODIMP
48 mozHunspellDirProvider::GetFile(const char *aKey, bool *aPersist,
49 nsIFile* *aResult)
50 {
51 return NS_ERROR_FAILURE;
52 }
54 NS_IMETHODIMP
55 mozHunspellDirProvider::GetFiles(const char *aKey,
56 nsISimpleEnumerator* *aResult)
57 {
58 if (strcmp(aKey, DICTIONARY_SEARCH_DIRECTORY_LIST) != 0) {
59 return NS_ERROR_FAILURE;
60 }
62 nsCOMPtr<nsIProperties> dirSvc =
63 do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID);
64 if (!dirSvc)
65 return NS_ERROR_FAILURE;
67 nsCOMPtr<nsISimpleEnumerator> list;
68 nsresult rv = dirSvc->Get(XRE_EXTENSIONS_DIR_LIST,
69 NS_GET_IID(nsISimpleEnumerator),
70 getter_AddRefs(list));
71 if (NS_FAILED(rv))
72 return rv;
74 nsCOMPtr<nsISimpleEnumerator> e = new AppendingEnumerator(list);
75 if (!e)
76 return NS_ERROR_OUT_OF_MEMORY;
78 *aResult = nullptr;
79 e.swap(*aResult);
80 return NS_SUCCESS_AGGREGATE_RESULT;
81 }
83 NS_IMPL_ISUPPORTS(mozHunspellDirProvider::AppendingEnumerator,
84 nsISimpleEnumerator)
86 NS_IMETHODIMP
87 mozHunspellDirProvider::AppendingEnumerator::HasMoreElements(bool *aResult)
88 {
89 *aResult = mNext ? true : false;
90 return NS_OK;
91 }
93 NS_IMETHODIMP
94 mozHunspellDirProvider::AppendingEnumerator::GetNext(nsISupports* *aResult)
95 {
96 if (aResult)
97 NS_ADDREF(*aResult = mNext);
99 mNext = nullptr;
101 nsresult rv;
103 // Ignore all errors
105 bool more;
106 while (NS_SUCCEEDED(mBase->HasMoreElements(&more)) && more) {
107 nsCOMPtr<nsISupports> nextbasesupp;
108 mBase->GetNext(getter_AddRefs(nextbasesupp));
110 nsCOMPtr<nsIFile> nextbase(do_QueryInterface(nextbasesupp));
111 if (!nextbase)
112 continue;
114 nextbase->Clone(getter_AddRefs(mNext));
115 if (!mNext)
116 continue;
118 mNext->AppendNative(NS_LITERAL_CSTRING("dictionaries"));
120 bool exists;
121 rv = mNext->Exists(&exists);
122 if (NS_SUCCEEDED(rv) && exists)
123 break;
125 mNext = nullptr;
126 }
128 return NS_OK;
129 }
131 mozHunspellDirProvider::AppendingEnumerator::AppendingEnumerator
132 (nsISimpleEnumerator* aBase) :
133 mBase(aBase)
134 {
135 // Initialize mNext to begin
136 GetNext(nullptr);
137 }
139 char const *const
140 mozHunspellDirProvider::kContractID = "@mozilla.org/spellcheck/dir-provider;1";