/src/mozilla-central/dom/xul/nsXULControllers.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
2 | | /* This Source Code Form is subject to the terms of the Mozilla Public |
3 | | * License, v. 2.0. If a copy of the MPL was not distributed with this |
4 | | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
5 | | |
6 | | /* |
7 | | |
8 | | This file provides the implementation for the XUL "controllers" |
9 | | object. |
10 | | |
11 | | */ |
12 | | |
13 | | #include "nsString.h" |
14 | | |
15 | | #include "nsIControllers.h" |
16 | | #include "nsXULControllers.h" |
17 | | #include "nsIController.h" |
18 | | #include "mozilla/RefPtr.h" |
19 | | |
20 | | //---------------------------------------------------------------------- |
21 | | |
22 | | nsXULControllers::nsXULControllers() |
23 | | : mCurControllerID(0) |
24 | 0 | { |
25 | 0 | } |
26 | | |
27 | | nsXULControllers::~nsXULControllers(void) |
28 | 0 | { |
29 | 0 | DeleteControllers(); |
30 | 0 | } |
31 | | |
32 | | void |
33 | | nsXULControllers::DeleteControllers() |
34 | 0 | { |
35 | 0 | uint32_t count = mControllers.Length(); |
36 | 0 | for (uint32_t i = 0; i < count; i++) |
37 | 0 | { |
38 | 0 | nsXULControllerData* controllerData = mControllers.ElementAt(i); |
39 | 0 | delete controllerData; // releases the nsIController |
40 | 0 | } |
41 | 0 |
|
42 | 0 | mControllers.Clear(); |
43 | 0 | } |
44 | | |
45 | | NS_IMPL_CYCLE_COLLECTION_CLASS(nsXULControllers) |
46 | | |
47 | 0 | NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsXULControllers) |
48 | 0 | tmp->DeleteControllers(); |
49 | 0 | NS_IMPL_CYCLE_COLLECTION_UNLINK_END |
50 | 0 | NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsXULControllers) |
51 | 0 | { |
52 | 0 | uint32_t i, count = tmp->mControllers.Length(); |
53 | 0 | for (i = 0; i < count; ++i) { |
54 | 0 | nsXULControllerData* controllerData = tmp->mControllers[i]; |
55 | 0 | if (controllerData) { |
56 | 0 | cb.NoteXPCOMChild(controllerData->mController); |
57 | 0 | } |
58 | 0 | } |
59 | 0 | } |
60 | 0 | NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END |
61 | | |
62 | 0 | NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsXULControllers) |
63 | 0 | NS_INTERFACE_MAP_ENTRY(nsIControllers) |
64 | 0 | NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIControllers) |
65 | 0 | NS_INTERFACE_MAP_END |
66 | | |
67 | | NS_IMPL_CYCLE_COLLECTING_ADDREF(nsXULControllers) |
68 | | NS_IMPL_CYCLE_COLLECTING_RELEASE(nsXULControllers) |
69 | | |
70 | | NS_IMETHODIMP |
71 | | nsXULControllers::GetControllerForCommand(const char *aCommand, nsIController** _retval) |
72 | 0 | { |
73 | 0 | NS_ENSURE_ARG_POINTER(_retval); |
74 | 0 | *_retval = nullptr; |
75 | 0 |
|
76 | 0 | uint32_t count = mControllers.Length(); |
77 | 0 | for (uint32_t i=0; i < count; i++) |
78 | 0 | { |
79 | 0 | nsXULControllerData* controllerData = mControllers.ElementAt(i); |
80 | 0 | if (controllerData) |
81 | 0 | { |
82 | 0 | nsCOMPtr<nsIController> controller; |
83 | 0 | controllerData->GetController(getter_AddRefs(controller)); |
84 | 0 | if (controller) |
85 | 0 | { |
86 | 0 | bool supportsCommand; |
87 | 0 | controller->SupportsCommand(aCommand, &supportsCommand); |
88 | 0 | if (supportsCommand) { |
89 | 0 | controller.forget(_retval); |
90 | 0 | return NS_OK; |
91 | 0 | } |
92 | 0 | } |
93 | 0 | } |
94 | 0 | } |
95 | 0 |
|
96 | 0 | return NS_OK; |
97 | 0 | } |
98 | | |
99 | | NS_IMETHODIMP |
100 | | nsXULControllers::InsertControllerAt(uint32_t aIndex, nsIController *controller) |
101 | 0 | { |
102 | 0 | nsXULControllerData* controllerData = new nsXULControllerData(++mCurControllerID, controller); |
103 | | #ifdef DEBUG |
104 | | nsXULControllerData** inserted = |
105 | | #endif |
106 | | mControllers.InsertElementAt(aIndex, controllerData); |
107 | 0 | NS_ASSERTION(inserted != nullptr, "Insertion of controller failed"); |
108 | 0 | return NS_OK; |
109 | 0 | } |
110 | | |
111 | | NS_IMETHODIMP |
112 | | nsXULControllers::RemoveControllerAt(uint32_t aIndex, nsIController **_retval) |
113 | 0 | { |
114 | 0 | NS_ENSURE_ARG_POINTER(_retval); |
115 | 0 | *_retval = nullptr; |
116 | 0 |
|
117 | 0 | nsXULControllerData* controllerData = mControllers.SafeElementAt(aIndex); |
118 | 0 | if (!controllerData) return NS_ERROR_FAILURE; |
119 | 0 | |
120 | 0 | mControllers.RemoveElementAt(aIndex); |
121 | 0 |
|
122 | 0 | controllerData->GetController(_retval); |
123 | 0 | delete controllerData; |
124 | 0 |
|
125 | 0 | return NS_OK; |
126 | 0 | } |
127 | | |
128 | | |
129 | | NS_IMETHODIMP |
130 | | nsXULControllers::GetControllerAt(uint32_t aIndex, nsIController **_retval) |
131 | 0 | { |
132 | 0 | NS_ENSURE_ARG_POINTER(_retval); |
133 | 0 | *_retval = nullptr; |
134 | 0 |
|
135 | 0 | nsXULControllerData* controllerData = mControllers.SafeElementAt(aIndex); |
136 | 0 | if (!controllerData) return NS_ERROR_FAILURE; |
137 | 0 | |
138 | 0 | return controllerData->GetController(_retval); // does the addref |
139 | 0 | } |
140 | | |
141 | | NS_IMETHODIMP |
142 | | nsXULControllers::AppendController(nsIController *controller) |
143 | 0 | { |
144 | 0 | // This assigns controller IDs starting at 1 so we can use 0 to test if an ID was obtained |
145 | 0 | nsXULControllerData* controllerData = new nsXULControllerData(++mCurControllerID, controller); |
146 | 0 |
|
147 | | #ifdef DEBUG |
148 | | nsXULControllerData** appended = |
149 | | #endif |
150 | | mControllers.AppendElement(controllerData); |
151 | 0 | NS_ASSERTION(appended != nullptr, "Appending controller failed"); |
152 | 0 | return NS_OK; |
153 | 0 | } |
154 | | |
155 | | NS_IMETHODIMP |
156 | | nsXULControllers::RemoveController(nsIController *controller) |
157 | 0 | { |
158 | 0 | // first get the identity pointer |
159 | 0 | nsCOMPtr<nsISupports> controllerSup(do_QueryInterface(controller)); |
160 | 0 | // then find it |
161 | 0 | uint32_t count = mControllers.Length(); |
162 | 0 | for (uint32_t i = 0; i < count; i++) |
163 | 0 | { |
164 | 0 | nsXULControllerData* controllerData = mControllers.ElementAt(i); |
165 | 0 | if (controllerData) |
166 | 0 | { |
167 | 0 | nsCOMPtr<nsIController> thisController; |
168 | 0 | controllerData->GetController(getter_AddRefs(thisController)); |
169 | 0 | nsCOMPtr<nsISupports> thisControllerSup(do_QueryInterface(thisController)); // get identity |
170 | 0 | if (thisControllerSup == controllerSup) |
171 | 0 | { |
172 | 0 | mControllers.RemoveElementAt(i); |
173 | 0 | delete controllerData; |
174 | 0 | return NS_OK; |
175 | 0 | } |
176 | 0 | } |
177 | 0 | } |
178 | 0 | return NS_ERROR_FAILURE; // right thing to return if no controller found? |
179 | 0 | } |
180 | | |
181 | | NS_IMETHODIMP |
182 | | nsXULControllers::GetControllerId(nsIController *controller, uint32_t *_retval) |
183 | 0 | { |
184 | 0 | NS_ENSURE_ARG_POINTER(_retval); |
185 | 0 |
|
186 | 0 | uint32_t count = mControllers.Length(); |
187 | 0 | for (uint32_t i = 0; i < count; i++) |
188 | 0 | { |
189 | 0 | nsXULControllerData* controllerData = mControllers.ElementAt(i); |
190 | 0 | if (controllerData) |
191 | 0 | { |
192 | 0 | nsCOMPtr<nsIController> thisController; |
193 | 0 | controllerData->GetController(getter_AddRefs(thisController)); |
194 | 0 | if (thisController.get() == controller) |
195 | 0 | { |
196 | 0 | *_retval = controllerData->GetControllerID(); |
197 | 0 | return NS_OK; |
198 | 0 | } |
199 | 0 | } |
200 | 0 | } |
201 | 0 | return NS_ERROR_FAILURE; // none found |
202 | 0 | } |
203 | | |
204 | | NS_IMETHODIMP |
205 | | nsXULControllers::GetControllerById(uint32_t controllerID, nsIController **_retval) |
206 | 0 | { |
207 | 0 | NS_ENSURE_ARG_POINTER(_retval); |
208 | 0 |
|
209 | 0 | uint32_t count = mControllers.Length(); |
210 | 0 | for (uint32_t i = 0; i < count; i++) |
211 | 0 | { |
212 | 0 | nsXULControllerData* controllerData = mControllers.ElementAt(i); |
213 | 0 | if (controllerData && controllerData->GetControllerID() == controllerID) |
214 | 0 | { |
215 | 0 | return controllerData->GetController(_retval); |
216 | 0 | } |
217 | 0 | } |
218 | 0 | return NS_ERROR_FAILURE; // none found |
219 | 0 | } |
220 | | |
221 | | NS_IMETHODIMP |
222 | | nsXULControllers::GetControllerCount(uint32_t *_retval) |
223 | 0 | { |
224 | 0 | NS_ENSURE_ARG_POINTER(_retval); |
225 | 0 | *_retval = mControllers.Length(); |
226 | 0 | return NS_OK; |
227 | 0 | } |
228 | | |