|
1 // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). |
|
2 // All rights reserved. |
|
3 // This component and the accompanying materials are made available |
|
4 // under the terms of "Eclipse Public License v1.0" |
|
5 // which accompanies this distribution, and is available |
|
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
7 // |
|
8 // Initial Contributors: |
|
9 // Nokia Corporation - initial contribution. |
|
10 // |
|
11 // Contributors: |
|
12 // |
|
13 // Description: |
|
14 // |
|
15 |
|
16 #ifndef __SSMCMD_RH__ |
|
17 #define __SSMCMD_RH__ |
|
18 |
|
19 #include <ssm/ssmcmd.hrh> |
|
20 #include <dscstorecommondefs.hrh> |
|
21 |
|
22 /** |
|
23 The first resource in all command list resource files must be |
|
24 a SSM_COMMAND_LIST_ROOT resource. |
|
25 Identifies the resource format version a command list resource |
|
26 file was built with. |
|
27 Also identifies a resource containing mappings between command list ids |
|
28 requested by a policy and the resource containing the associated command list. |
|
29 |
|
30 @publishedPartner |
|
31 @released |
|
32 */ |
|
33 STRUCT SSM_COMMAND_LIST_ROOT |
|
34 { |
|
35 WORD version = ESsmInitialVersion; // Must not be changed |
|
36 WORD reserved1 = 0; // Must not be changed |
|
37 LLINK command_list_mapping; // SSM_COMMAND_LIST_MAPPING |
|
38 } |
|
39 |
|
40 |
|
41 STRUCT SSM_COMMAND_LIST_MAPPING |
|
42 { |
|
43 STRUCT mappings[]; // SSM_COMMANDLISTID_TO_RESOURCEID |
|
44 } |
|
45 |
|
46 |
|
47 STRUCT SSM_COMMANDLISTID_TO_RESOURCEID |
|
48 { |
|
49 LONG command_list_id = -1; |
|
50 LLINK resource_id = -1; |
|
51 } |
|
52 |
|
53 |
|
54 /** |
|
55 List of commands. |
|
56 |
|
57 @publishedPartner |
|
58 @released |
|
59 */ |
|
60 STRUCT SSM_COMMAND_LIST |
|
61 { |
|
62 LONG delay_between_commands = 0; // Delay between executing commands in milliseconds |
|
63 LLINK commands[]; |
|
64 } |
|
65 |
|
66 |
|
67 /** |
|
68 Conditional reason information for including commands within command lists. |
|
69 |
|
70 @publishedPartner |
|
71 @released |
|
72 */ |
|
73 STRUCT SSM_SYMBIAN_CONDITIONAL_INFORMATION |
|
74 { |
|
75 LONG software_reason = EUnconditionalSoftwareReason; |
|
76 LONG hardware_reason = EUnconditionalHardwareReason; |
|
77 } |
|
78 |
|
79 /** |
|
80 Struct for publishing a system state change. |
|
81 |
|
82 @publishedPartner |
|
83 @released |
|
84 */ |
|
85 STRUCT SSM_PUBLISH_SYSTEM_STATE |
|
86 { |
|
87 LLINK conditional_information = 0; // Must be the first entry in this struct - Zero means command is unconditional |
|
88 WORD type = ESsmCmdPublishSystemState; // Must be the second entry in this struct and must not be changed |
|
89 #ifndef SYMBIAN_SSM_FLEXIBLE_MERGE |
|
90 WORD version = ECmdPublishSystemStateInitialVersion; // Must be the third entry in this struct |
|
91 #else |
|
92 WORD version = ECmdPublishSystemStateVersionWithPriority; // This version supports priority of the command |
|
93 #endif |
|
94 WORD severity = ECmdIgnoreFailure; // Can have a higher severity defined in TCmdErrorSeverity |
|
95 BYTE execution_behaviour = ESsmWaitForSignal; // Can also be ESsmDeferredWaitForSignal or ESsmFireAndForget |
|
96 BYTE direction = 2; // The direction to traverse the domain state list (2=ETraverseDefault) |
|
97 WORD retries = 0; // Number of times to retry on failure |
|
98 BYTE failure_policy = 1; // Whether to stop on failure or continue (0=ETransitionFailureStop, 1=ETransitionFailureContinue) |
|
99 #ifdef SYMBIAN_SSM_FLEXIBLE_MERGE |
|
100 WORD priority = KDefaultCommandPriority; // The order of the command in the list - range can be from 0x00 to 0xffffu |
|
101 #endif |
|
102 } |
|
103 |
|
104 |
|
105 /** |
|
106 Struct for publishing a system-wide property change. |
|
107 |
|
108 @publishedPartner |
|
109 @released |
|
110 */ |
|
111 STRUCT SSM_PUBLISH_SYSTEM_WIDE_PROPERTY |
|
112 { |
|
113 LLINK conditional_information = 0; // Must be the first entry in this struct - Zero means command is unconditional |
|
114 WORD type = ESsmCmdPublishSwp; // Must be the second entry in this struct and must not be changed |
|
115 #ifndef SYMBIAN_SSM_FLEXIBLE_MERGE |
|
116 WORD version = ECmdPublishSwpInitialVersion; // Must be the third entry in this struct |
|
117 #else |
|
118 WORD version = ECmdPublishSwpVersionWithPriority; // This version supports priority of the command |
|
119 #endif |
|
120 WORD severity = ECmdIgnoreFailure; // Can have a higher severity defined in TCmdErrorSeverity |
|
121 BYTE execution_behaviour = ESsmWaitForSignal; // Can also be ESsmDeferredWaitForSignal or ESsmFireAndForget |
|
122 #ifdef SYMBIAN_SSM_FLEXIBLE_MERGE |
|
123 WORD priority = KDefaultCommandPriority; // The order of the command in the list - range can be from 0x00 to 0xffffu |
|
124 #endif |
|
125 } |
|
126 |
|
127 |
|
128 /** |
|
129 Struct for starting a custom command. |
|
130 |
|
131 @publishedPartner |
|
132 @released |
|
133 */ |
|
134 STRUCT SSM_START_CUSTOM_COMMAND |
|
135 { |
|
136 LLINK conditional_information = 0; // Must be the first entry in this struct - Zero means command is unconditional |
|
137 WORD type = ESsmCmdCustomCommand; // Must be the second entry in this struct and must not be changed |
|
138 #ifndef SYMBIAN_SSM_FLEXIBLE_MERGE |
|
139 WORD version = ECmdCustomCommandInitialVersion; // Must be the third entry in this struct |
|
140 #else |
|
141 WORD version = ECmdCustomCommandVersionWithPriority; // This version supports priority of the command |
|
142 #endif |
|
143 WORD severity = ECmdIgnoreFailure; // Can have a higher severity defined in TCmdErrorSeverity |
|
144 BYTE execution_behaviour = ESsmWaitForSignal; // Can also be ESsmDeferredWaitForSignal or ESsmFireAndForget |
|
145 LTEXT dllname = ""; // VALUE REQUIRED - DLL name |
|
146 LONG ordinal = 1; // Ordinal number for the function |
|
147 BYTE unload_on_finish = EUnloadOnCommandCompletion; // Whether to unload dll on command completion or not at all |
|
148 WORD retries = 0; // Re-attempts to make if DLL fails to load or the DLL function returns an error code |
|
149 LLINK dll_data = 0; // Optional data to be passed as a parameter to the custom command limited to KMaxDLLParams |
|
150 #ifdef SYMBIAN_SSM_FLEXIBLE_MERGE |
|
151 WORD priority = KDefaultCommandPriority; // The order of the command in the list - range can be from 0x00 to 0xffffu |
|
152 #endif |
|
153 } |
|
154 |
|
155 /** |
|
156 Struct for starting AMAStarter with a particular DSC. |
|
157 |
|
158 @publishedPartner |
|
159 @released |
|
160 */ |
|
161 STRUCT SSM_START_AMA_STARTER |
|
162 { |
|
163 LLINK conditional_information = 0; // Must be the first entry in this struct - Zero means command is unconditional |
|
164 WORD type = ESsmCmdAMAStarter; // Must be the second entry in this struct and must not be changed |
|
165 #ifndef SYMBIAN_SSM_FLEXIBLE_MERGE |
|
166 WORD version = ECmdAmaStarterInitialVersion; // Must be the third entry in this struct |
|
167 #else |
|
168 WORD version = ECmdAmaStarterVersionWithPriority; // This version supports priority of the command |
|
169 #endif |
|
170 WORD severity = ECmdIgnoreFailure; // Can have a higher severity defined in TCmdErrorSeverity |
|
171 BYTE execution_behaviour = ESsmWaitForSignal; // Can also be ESsmDeferredWaitForSignal or ESsmFireAndForget |
|
172 LONG dsc_id = KDefaultSymbianDsc; // DSC id for AMAStarter |
|
173 #ifdef SYMBIAN_SSM_FLEXIBLE_MERGE |
|
174 WORD priority = KDefaultCommandPriority; // The order of the command in the list - range can be from 0x00 to 0xffffu |
|
175 #endif |
|
176 } |
|
177 |
|
178 /** |
|
179 Struct for checking that all preceding commands with execution_behaviour=ESsmDeferredWaitForSignal have finished. |
|
180 |
|
181 @publishedPartner |
|
182 @released |
|
183 */ |
|
184 STRUCT SSM_MULTIPLE_WAIT |
|
185 { |
|
186 LLINK conditional_information = 0; // Must be the first entry in this struct - Zero means command is unconditional |
|
187 WORD type = ESsmCmdMultipleWait; // Must be the second entry in this struct and must not be changed |
|
188 #ifndef SYMBIAN_SSM_FLEXIBLE_MERGE |
|
189 WORD version = ECmdMultipleWaitInitialVersion; // Must be the third entry in this struct |
|
190 #else |
|
191 WORD version = ECmdMultipleWaitVersionWithPriority; // This version supports priority of the command |
|
192 #endif //SYMBIAN_SSM_FLEXIBLE_MERGE |
|
193 LONG timeout = 0; // In milliseconds. |
|
194 #ifdef SYMBIAN_SSM_FLEXIBLE_MERGE |
|
195 /** |
|
196 There must be at least one multiple wait command with priority lower than the deferred wait for command in the list |
|
197 */ |
|
198 WORD priority = KDefaultCommandPriority; // The order of the command in the list - range can be from 0x00 to 0xffffu |
|
199 #endif //SYMBIAN_SSM_FLEXIBLE_MERGE |
|
200 } |
|
201 |
|
202 /** |
|
203 Struct for setting the publish and subscribe key |
|
204 |
|
205 @publishedPartner |
|
206 @released |
|
207 */ |
|
208 STRUCT SSM_SET_PUBLISH_AND_SUBSCRIBE |
|
209 { |
|
210 LLINK conditional_information = 0; // Must be the first entry in this struct - Zero means command is unconditional |
|
211 WORD type = ESsmCmdSetPAndSKey; // Must be the second entry in this struct and must not be changed |
|
212 #ifndef SYMBIAN_SSM_FLEXIBLE_MERGE |
|
213 WORD version = ECmdSetPAndSKeyInitialVersion; // Must be the third entry in this struct |
|
214 #else |
|
215 WORD version = ECmdSetPAndSKeyVersionWithPriority; // This version supports priority of the command |
|
216 #endif |
|
217 WORD severity = ECmdIgnoreFailure; // Can have a higher severity defined in TCmdErrorSeverity |
|
218 LONG category = 0; // Category of the P&S key |
|
219 LONG key = 0; // P & S key |
|
220 WORD value = 0; // Value of P & S key |
|
221 #ifdef SYMBIAN_SSM_FLEXIBLE_MERGE |
|
222 WORD priority = KDefaultCommandPriority; // The order of the command in the list - range can be from 0x00 to 0xffffu |
|
223 #endif |
|
224 } |
|
225 |
|
226 /** |
|
227 Struct for starting applications using Apparc. |
|
228 |
|
229 @publishedPartner |
|
230 @released |
|
231 */ |
|
232 STRUCT SSM_START_APP_INFO |
|
233 { |
|
234 LLINK conditional_information = 0; // Must be the first entry in this struct - Zero means command is unconditional |
|
235 WORD type = ESsmCmdStartApp; // Must be the second entry in this struct and must not be changed |
|
236 #ifndef SYMBIAN_SSM_FLEXIBLE_MERGE |
|
237 WORD version = ECmdStartAppInitialVersion; // Must be the third entry in this struct |
|
238 #else |
|
239 WORD version = ECmdStartAppVersionWithPriority; // This version supports priority of the command |
|
240 #endif |
|
241 WORD severity = ECmdIgnoreFailure; // Can have a higher severity defined in TCmdErrorSeverity |
|
242 LTEXT name = ""; // VALUE REQUIRED - full path to the application |
|
243 LTEXT args = ""; // Passed to the "Tail End" at the command line see CApaCommandLine. Maximum argument length allowed is 256 chars. |
|
244 BYTE execution_behaviour = ESsmFireAndForget; // Can also be ESsmWaitForSignal or ESsmDeferredWaitForSignal |
|
245 LONG timeout = 0; // Time in milliseconds for every retry on failure |
|
246 WORD retries = 0; // Number of times to retry on failure |
|
247 BYTE viewless = 0; // Set to 1 if app is viewless |
|
248 BYTE background = 0; // Set to 1 if app should be launched in the background |
|
249 LLINK monitor_info = 0; // zero means no monitoring is required, SSM_MONITOR_INFO should be used if monitoring is required |
|
250 #ifdef SYMBIAN_SSM_FLEXIBLE_MERGE |
|
251 WORD priority = KDefaultCommandPriority; // The order of the command in the list - range can be from 0x00 to 0xffffu |
|
252 #endif |
|
253 } |
|
254 |
|
255 /** |
|
256 Struct for starting processes. |
|
257 |
|
258 @publishedPartner |
|
259 @released |
|
260 */ |
|
261 STRUCT SSM_START_PROCESS_INFO |
|
262 { |
|
263 LLINK conditional_information = 0; // Must be the first entry in this struct - Zero means command is unconditional |
|
264 WORD type = ESsmCmdStartProcess; // Must be the second entry in this struct and must not be changed |
|
265 #ifndef SYMBIAN_SSM_FLEXIBLE_MERGE |
|
266 WORD version = ECmdStartProcessInitialVersion; // Must be the third entry in this struct |
|
267 #else |
|
268 WORD version = ECmdStartProcessVersionWithPriority; // This version supports priority of the command |
|
269 #endif |
|
270 WORD severity = ECmdIgnoreFailure; // Can have a higher severity defined in TCmdErrorSeverity |
|
271 LTEXT name = ""; // VALUE REQUIRED - full path to the process |
|
272 LTEXT args = ""; // Passed to the "Tail End" at the command line see CApaCommandLine. Maximum argument length allowed is 256 chars. |
|
273 BYTE execution_behaviour = ESsmFireAndForget; // Can also be ESsmWaitForSignal or ESsmDeferredWaitForSignal |
|
274 LONG timeout = 0; // Time in milliseconds for every retry on failure |
|
275 WORD retries = 0; // Number of times to retry on failure |
|
276 LLINK monitor_info = 0; // zero means no monitoring is required, SSM_MONITOR_INFO should be used if monitoring is required |
|
277 #ifdef SYMBIAN_SSM_FLEXIBLE_MERGE |
|
278 WORD priority = KDefaultCommandPriority; // The order of the command in the list - range can be from 0x00 to 0xffffu |
|
279 #endif |
|
280 } |
|
281 |
|
282 /** |
|
283 Struct for monitoring information. |
|
284 |
|
285 @publishedPartner |
|
286 @released |
|
287 */ |
|
288 STRUCT SSM_MONITOR_INFO |
|
289 { |
|
290 WORD type = ESsmMonitorInfo; // Must be the first entry in this struct and must not be changed |
|
291 WORD version = ESsmMonitorInfoInitialVersion; // Must be the second entry in this struct |
|
292 BYTE restart_policy=ESsmIgnoreOnFailure; // OS Restart policy to be used if component restarting has failed |
|
293 BYTE restart_mode; // Restart mode when restart_policy=ESsmRestartOSWithMode |
|
294 LONG timeout = 0; // Delay in milliseconds between retries |
|
295 WORD retries = 0; // Number of times to attempt to restart a failed component |
|
296 } |
|
297 |
|
298 /** |
|
299 Struct for waiting for apparc server to initialise. |
|
300 |
|
301 @publishedPartner |
|
302 @released |
|
303 */ |
|
304 STRUCT SSM_WAIT_FOR_APPARC_INIT |
|
305 { |
|
306 LLINK conditional_information = 0; // Must be the first entry in this struct - Zero means command is unconditional |
|
307 WORD type = ESsmCmdWaitForApparcInit; // Must be the second entry in this struct and must not be changed |
|
308 #ifndef SYMBIAN_SSM_FLEXIBLE_MERGE |
|
309 WORD version = ECmdWaitForApparcInitInitialVersion; // Must be the third entry in this struct |
|
310 #else |
|
311 WORD version = ECmdWaitForApparcInitVersionWithPriority; // This version supports priority of the command |
|
312 #endif |
|
313 WORD severity = ECmdIgnoreFailure; // Can have a higher severity defined in TCmdErrorSeverity |
|
314 #ifdef SYMBIAN_SSM_FLEXIBLE_MERGE |
|
315 WORD priority = KDefaultCommandPriority; // The order of the command in the list - range can be from 0x00 to 0xffffu |
|
316 #endif |
|
317 } |
|
318 |
|
319 /** |
|
320 Struct for loading a State Utility Plugin (SUP). |
|
321 SUPs are typechecked using UID2 which must be set to KSsmUtilityPluginDllTypeUidValue. |
|
322 SUPs can only be loaded from ROM file system (Z:). |
|
323 |
|
324 @see MSsmUtility |
|
325 @see RSsmSusCli |
|
326 @publishedPartner |
|
327 @released |
|
328 */ |
|
329 STRUCT SSM_START_SSM_UTILITY_PLUGIN |
|
330 { |
|
331 LLINK conditional_information = 0; // Must be the first entry in this struct - Zero means command is unconditional |
|
332 WORD type = ESsmCmdLoadSup; // Must be the second entry in this struct and must not be changed |
|
333 #ifndef SYMBIAN_SSM_FLEXIBLE_MERGE |
|
334 WORD version = ECmdLoadSupInitialVersion; // Must be the third entry in this struct |
|
335 #else |
|
336 WORD version = ECmdLoadSupVersionWithPriority; // This version supports priority of the command |
|
337 #endif |
|
338 WORD severity = ECmdIgnoreFailure; // Can have a higher severity defined in TCmdErrorSeverity |
|
339 BYTE execution_behaviour = ESsmWaitForSignal; // Can also be ESsmDeferredWaitForSignal or ESsmFireAndForget |
|
340 LTEXT filename = ""; // VALUE REQUIRED - DLL filename only, no drive or path. |
|
341 LONG uid3 = 0; // Optional DLL UID3. Use if you want to enforce UID3 is what you expect it to be. |
|
342 LONG ordinal = 1; // Ordinal number for the function: static MSsmUtility* NewL() |
|
343 WORD retries = 0; // Re-attempts to make if DLL fails to load or the DLL function returns an error code |
|
344 #ifdef SYMBIAN_SSM_FLEXIBLE_MERGE |
|
345 WORD priority = KDefaultCommandPriority; // The order of the command in the list - range can be from 0x00 to 0xffffu |
|
346 #endif |
|
347 } |
|
348 |
|
349 |
|
350 /** |
|
351 Struct for initiating a device restart or shutdown. |
|
352 |
|
353 @publishedPartner |
|
354 @released |
|
355 */ |
|
356 STRUCT SSM_POWER_OFF |
|
357 { |
|
358 LLINK conditional_information = 0; // Must be the first entry in this struct - Zero means command is unconditional |
|
359 WORD type = ESsmCmdPowerOff; // Must be the second entry in this struct and must not be changed |
|
360 WORD version = ECmdPowerOffInitialVersion; // Must be the third entry in this struct |
|
361 WORD severity = ECmdIgnoreFailure; // Can have a higher severity defined in TCmdErrorSeverity |
|
362 WORD power_state = 0; // VALUE REQUIRED - TPowerState value |
|
363 } |
|
364 |
|
365 |
|
366 /** |
|
367 Struct for requesting a system-wide property change. |
|
368 |
|
369 @publishedPartner |
|
370 @released |
|
371 */ |
|
372 STRUCT SSM_REQUEST_SYSTEM_WIDE_PROPERTY |
|
373 { |
|
374 LLINK conditional_information = 0; // Must be the first entry in this struct - Zero means command is unconditional |
|
375 WORD type = ESsmCmdReqSwProperty; // Must be the second entry in this struct and must not be changed |
|
376 #ifndef SYMBIAN_SSM_FLEXIBLE_MERGE |
|
377 WORD version = ECmdReqSwPropertyInitialVersion; // Must be the third entry in this struct |
|
378 #else |
|
379 WORD version = ECmdReqSwPropertyVersionWithPriority; // This version supports priority of the command |
|
380 #endif |
|
381 WORD severity = ECmdIgnoreFailure; // Can have a higher severity defined in TCmdErrorSeverity |
|
382 BYTE execution_behaviour = ESsmWaitForSignal; // Can also be ESsmDeferredWaitForSignal or ESsmFireAndForget |
|
383 LONG key = 0; // VALUE REQUIRED - system-wide property key |
|
384 LONG value = 0; // VALUE REQUIRED - system-wide property value |
|
385 #ifdef SYMBIAN_SSM_FLEXIBLE_MERGE |
|
386 WORD priority = KDefaultCommandPriority; // The order of the command in the list - range can be from 0x00 to 0xffffu |
|
387 #endif |
|
388 } |
|
389 |
|
390 |
|
391 /** |
|
392 Struct for creating a system-wide property. |
|
393 |
|
394 @publishedPartner |
|
395 @released |
|
396 */ |
|
397 STRUCT SSM_CREATE_SYSTEM_WIDE_PROPERTY |
|
398 { |
|
399 LLINK conditional_information = 0; // Must be the first entry in this struct - Zero means command is unconditional |
|
400 WORD type = ESsmCmdCreateSwp; // Must be the second entry in this struct and must not be changed |
|
401 #ifndef SYMBIAN_SSM_FLEXIBLE_MERGE |
|
402 WORD version = ECmdCreateSwpInitialVersion; // Must be the third entry in this struct |
|
403 #else |
|
404 WORD version = ECmdCreateSwpVersionWithPriority; // This version supports priority of the command |
|
405 #endif |
|
406 WORD severity = ECmdIgnoreFailure; // Can have a higher severity defined in TCmdErrorSeverity |
|
407 LONG key = 0; // VALUE REQUIRED - system-wide property UID key |
|
408 LONG value = 0; // Optional default value to set the key to |
|
409 LTEXT filename = ""; // VALUE REQUIRED - name of the dll implementing the MSsmSwpPolicy interface - filename only, no drive, path or suffix. |
|
410 #ifdef SYMBIAN_SSM_FLEXIBLE_MERGE |
|
411 WORD priority = KDefaultCommandPriority; // The order of the command in the list - range can be from 0x00 to 0xffffu |
|
412 #endif |
|
413 } |
|
414 |
|
415 |
|
416 /** |
|
417 Struct for finalising drives. Causes the RFs.FinaliseDrives() function to be called. |
|
418 |
|
419 @publishedPartner |
|
420 @released |
|
421 */ |
|
422 STRUCT SSM_FINALISE_DRIVES |
|
423 { |
|
424 LLINK conditional_information = 0; // Must be the first entry in this struct - Zero means command is unconditional |
|
425 WORD type = ESsmCmdFinaliseDrives; // Must be the second entry in this struct and must not be changed |
|
426 WORD version = ECmdFinaliseDrivesInitialVersion;// Must be the third entry in this struct |
|
427 WORD severity = ECmdIgnoreFailure; // Can have a higher severity defined in TCmdErrorSeverity |
|
428 } |
|
429 |
|
430 |
|
431 /** |
|
432 Struct for persisting HAL attributes. Causes the BaflUtils::PersistHAL() function to be called. |
|
433 |
|
434 @publishedPartner |
|
435 @released |
|
436 */ |
|
437 STRUCT SSM_PERSIST_HAL_ATTRIBUTES |
|
438 { |
|
439 LLINK conditional_information = 0; // Must be the first entry in this struct - Zero means command is unconditional |
|
440 WORD type = ESsmCmdPersistHalAttributes; // Must be the second entry in this struct and must not be changed |
|
441 WORD version = ECmdPersistHalAttributesInitialVersion; // Must be the third entry in this struct |
|
442 WORD severity = ECmdIgnoreFailure; // Can have a higher severity defined in TCmdErrorSeverity |
|
443 } |
|
444 |
|
445 |
|
446 |
|
447 |
|
448 #endif // __SSMCMD_RH__ |
|
449 |
|
450 |