• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*---------------------------------------------------------------------------*
2  *  ESR_Session.h  *
3  *                                                                           *
4  *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
5  *                                                                           *
6  *  Licensed under the Apache License, Version 2.0 (the 'License');          *
7  *  you may not use this file except in compliance with the License.         *
8  *                                                                           *
9  *  You may obtain a copy of the License at                                  *
10  *      http://www.apache.org/licenses/LICENSE-2.0                           *
11  *                                                                           *
12  *  Unless required by applicable law or agreed to in writing, software      *
13  *  distributed under the License is distributed on an 'AS IS' BASIS,        *
14  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
15  *  See the License for the specific language governing permissions and      *
16  *  limitations under the License.                                           *
17  *                                                                           *
18  *---------------------------------------------------------------------------*/
19 
20 #ifndef __ESR_SESSION_H
21 #define __ESR_SESSION_H
22 
23 
24 
25 #include "ESR_ReturnCode.h"
26 #include "ESR_SharedPrefix.h"
27 #include "pstdio.h"
28 #include "ptypes.h"
29 #include "ESR_SessionType.h"
30 
31 /**
32  * @addtogroup ESR_SessionModule ESR_Session API functions
33  * Manages ESR session information.
34  *
35  * @{
36  */
37 
38 /**
39  * Hashmap with helper functions for adding primitives and add-if-empty.
40  */
41 typedef struct ESR_SessionSingleton_t
42 {
43   /**
44    * Returns session property value.
45    *
46    * @param name Property name
47    * @param value Property value
48    * @param type Expected variable type (for strong-typing purposes)
49    */
50   ESR_ReturnCode(*getProperty)(const LCHAR* name, void** value, VariableTypes type);
51   /**
52    * Returns the type of a property value.
53    *
54    * @param name Property name
55    * @param type [out] Value type
56    */
57   ESR_ReturnCode(*getPropertyType)(const LCHAR* name, VariableTypes* type);
58   /**
59    * Returns copy of session property value.
60    *
61    * @param name Property name
62    * @param value Property value
63    */
64   ESR_ReturnCode(*getInt)(const LCHAR* name, int* value);
65   /**
66    * Returns copy of session property value.
67    *
68    * @param name Property name
69    * @param value Property value
70    */
71   ESR_ReturnCode(*getUint16_t)(const LCHAR* name, asr_uint16_t* value);
72   /**
73    * Returns copy of session property value.
74    *
75    * @param name Property name
76    * @param value Property value
77    */
78   ESR_ReturnCode(*getSize_t)(const LCHAR* name, size_t* value);
79   /**
80    * Returns copy of session property value.
81    *
82    * @param name Property name
83    * @param value Property value
84    */
85   ESR_ReturnCode(*getFloat)(const LCHAR* name, float* value);
86   /**
87    * Returns copy of session property value.
88    *
89    * @param name Property name
90    * @param value Property value
91    */
92   ESR_ReturnCode(*getBool)(const LCHAR* name, ESR_BOOL* value);
93   /**
94    * Returns copy of session property value.
95    *
96    * @param name Property name
97    * @param value Property value
98    * @param len Length of value argument. If the return code is ESR_BUFFER_OVERFLOW,
99    *            the required length is returned in this variable.
100    */
101   ESR_ReturnCode(*getLCHAR)(const LCHAR* name, LCHAR* value, size_t* len);
102   /**
103    * Indicates if key exists in the session.
104    *
105    * @param name Property name
106    * @param exists True if key exists, false otherwise
107    */
108   ESR_ReturnCode(*contains)(const LCHAR* name, ESR_BOOL* exists);
109   /**
110    * Sets session property value.
111    *
112    * @param name Property name
113    * @param value Property value
114    * @param type Type of value being set
115    */
116   ESR_ReturnCode(*setProperty)(const LCHAR* name, void* value, VariableTypes type);
117   /**
118    * Sets session property value, storing a copy of the value.
119    *
120    * @param name Property name
121    * @param value Property value
122    */
123   ESR_ReturnCode(*setInt)(const LCHAR* name, int value);
124   /**
125    * Sets session property value, storing a copy of the value.
126    *
127    * @param name Property name
128    * @param value Property value
129    */
130   ESR_ReturnCode(*setUint16_t)(const LCHAR* name, asr_uint16_t value);
131   /**
132    * Sets session property value, storing a copy of the value.
133    *
134    * @param name Property name
135    * @param value Property value
136    */
137   ESR_ReturnCode(*setSize_t)(const LCHAR* name, size_t value);
138   /**
139    * Sets session property value, storing a copy of the value.
140    *
141    * @param name Property name
142    * @param value Property value
143    */
144   ESR_ReturnCode(*setFloat)(const LCHAR* name, float value);
145   /**
146    * Sets session property value, storing a copy of the value.
147    *
148    * @param name Property name
149    * @param value Property value
150    */
151   ESR_ReturnCode(*setBool)(const LCHAR* name, ESR_BOOL value);
152   /**
153    * Sets session property value, storing a copy of the value.
154    *
155    * @param name Property name
156    * @param value Property value
157    */
158   ESR_ReturnCode(*setLCHAR)(const LCHAR* name, LCHAR* value);
159   /**
160    * If the key does not exist in the session, calls SessionSetInt().
161    *
162    * This helper function aids implementation of "default values", overwriting
163    * session values only if they have not been set already.
164    *
165    * @param name Property name
166    * @param value Property value
167    */
168   ESR_ReturnCode(*setIntIfEmpty)(const LCHAR* name, int value);
169   /**
170    * If the key does not exist in the session, calls SessionSetUint16_t().
171    *
172    * This helper function aids implementation of "default values", overwriting
173    * session values only if they have not been set already.
174    *
175    * @param name Property name
176    * @param value Property value
177    */
178   ESR_ReturnCode(*setUint16_tIfEmpty)(const LCHAR* name, asr_uint16_t value);
179   /**
180    * If the key does not exist in the session, calls SessionSetSize_t().
181    *
182    * This helper function aids implementation of "default values", overwriting
183    * session values only if they have not been set already.
184    *
185    * @param name Property name
186    * @param value Property value
187    */
188   ESR_ReturnCode(*setSize_tIfEmpty)(const LCHAR* name, size_t value);
189   /**
190    * If the key does not exist in the session, calls SessionSetFloat().
191    *
192    * This helper function aids implementation of "default values", overwriting
193    * session values only if they have not been set already.
194    *
195    * @param name Property name
196    * @param value Property value
197    */
198   ESR_ReturnCode(*setFloatIfEmpty)(const LCHAR* name, float value);
199   /**
200    * If the key does not exist in the session, calls SessionSetBool().
201    *
202    * This helper function aids implementation of "default values", overwriting
203    * session values only if they have not been set already.
204    *
205    * @param name Property name
206    * @param value Property value
207    */
208   ESR_ReturnCode(*setBoolIfEmpty)(const LCHAR* name, ESR_BOOL value);
209   /**
210    * If the key does not exist in the session, calls SessionSetLCHAR().
211    *
212    * This helper function aids implementation of "default values", overwriting
213    * session values only if they have not been set already.
214    *
215    * @param name Property name
216    * @param value Property value
217    */
218   ESR_ReturnCode(*setLCHARIfEmpty)(const LCHAR* name, LCHAR* value);
219   /**
220    * Removes property from session.
221    *
222    * @param name Property name
223    */
224   ESR_ReturnCode(*removeProperty)(const LCHAR* name);
225   /**
226    * Removes and deallocates property from session.
227    *
228    * @param name Property name
229    */
230   ESR_ReturnCode(*removeAndFreeProperty)(const LCHAR* name);
231   /**
232    * Imports commandline arguments into the system session.
233    *
234    * Keys are imported as "cmdline.[name]" where [name] is the name of the command-line argument
235    * Values are set in char* format.
236    *
237    * For example, given the argument "-timer=5", the following key will be added to the session:
238    * ["cmdline.timer", "5"]
239    *
240    * Validation is left up to the application.
241    *
242    * If the session contains a key that is clobbered by the parser, the old [key, value]
243    * pair will be deallocated. For example, if the session contained
244    * ["cmdline.timer", "value"] before the aforementioned example occured, then the old
245    * [key, value] pair will be allocated by the parser.
246    *
247    * @param argc Number of arguments
248    * @param argv Argument values
249    */
250   ESR_ReturnCode(*importCommandLine)(int argc, char* argv[]);
251   /**
252    * Returns the number of elements in the session.
253    *
254    * @param size [out] Session size
255    */
256   ESR_ReturnCode(*getSize)(size_t* size);
257   /**
258    * Returns the key associated with the specified index.
259    *
260    * @param index Element index
261    * @param key [out] Key name
262    */
263   ESR_ReturnCode(*getKeyAtIndex)(size_t index, LCHAR** key);
264   /**
265    * Convert the specified argument to int.
266    *
267    * @param key Property name
268    */
269   ESR_ReturnCode(*convertToInt)(const LCHAR* key);
270   /**
271    * Convert the specified argument to asr_uint16_t.
272    *
273    * @param key Property name
274    */
275   ESR_ReturnCode(*convertToUint16_t)(const LCHAR* key);
276 
277   /**
278    * Convert the specified argument to size_t.
279    *
280    * @param key Property name
281    */
282   ESR_ReturnCode(*convertToSize_t)(const LCHAR* key);
283 
284   /**
285    * Convert the specified argument to float.
286    *
287    * @param key Property name
288    */
289   ESR_ReturnCode(*convertToFloat)(const LCHAR* key);
290 
291   /**
292    * Convert the specified argument to bool.
293    *
294    * @param key Property name
295    */
296   ESR_ReturnCode(*convertToBool)(const LCHAR* key);
297   /**
298    * Destroys the system session.
299    */
300   ESR_ReturnCode(*destroy)(void);
301   /**
302    * Import PAR file into session.
303    *
304    * @param file File to read session from
305    */
306   ESR_ReturnCode(*importParFile)(const LCHAR* filename);
307   /**
308    * Import ARG file into session.
309    *
310    * @param file File to read arguments from
311    */
312   ESR_ReturnCode(*importArgFile)(const LCHAR* filename);
313 
314   /**
315    * Pointer to session data.
316    */
317   void* data;
318 }
319 ESR_SessionSingleton;
320 
321 /**
322  * Initializes the system session.
323  *
324  * @param filename File to read session information from
325  * @return ESR_OPEN_ERROR if file cannot be opened; ESR_READ_ERROR if file cannot be read;
326  * ESR_OUT_OF_MEMORY if system is out of memory
327  */
328 ESR_SHARED_API ESR_ReturnCode ESR_SessionCreate(const LCHAR* filename);
329 /**
330  * Returns session property value.
331  *
332  * @param name Property name
333  * @param value Property value
334  * @param type Expected variable type (for strong-typing purposes)
335  * @return ESR_INVALID_RESULT_TYPE if the property is not of the specified type
336  */
337 ESR_SHARED_API ESR_ReturnCode ESR_SessionGetProperty(const LCHAR* name, void** value,
338     VariableTypes type);
339 /**
340  * Returns copy of session property value.
341  *
342  * @param name Property name
343  * @param value Property value
344  * @return ESR_INVALID_RESULT_TYPE if the property is not an int
345  */
346 ESR_SHARED_API ESR_ReturnCode ESR_SessionGetInt(const LCHAR* name, int* value);
347 /**
348  * Returns copy of session property value.
349  *
350  * @param name Property name
351  * @param value Property value
352  * @return ESR_INVALID_RESULT_TYPE if the property is not a asr_uint16_t
353  */
354 ESR_SHARED_API ESR_ReturnCode ESR_SessionGetUint16_t(const LCHAR* name, asr_uint16_t* value);
355 /**
356  * Returns copy of session property value.
357  *
358  * @param name Property name
359  * @param value Property value
360  * @return ESR_INVALID_RESULT_TYPE if the property is not a size_t
361  */
362 ESR_SHARED_API ESR_ReturnCode ESR_SessionGetSize_t(const LCHAR* name, size_t* value);
363 /**
364  * Returns copy of session property value.
365  *
366  * @param name Property name
367  * @param value Property value
368  * @return ESR_INVALID_RESULT_TYPE if the property is not a float
369  */
370 ESR_SHARED_API ESR_ReturnCode ESR_SessionGetFloat(const LCHAR* name, float* value);
371 /**
372  * Returns copy of session property value.
373  *
374  * @param name Property name
375  * @param value Property value
376  * @return ESR_INVALID_RESULT_TYPE if the property is not a bool
377  */
378 ESR_SHARED_API ESR_ReturnCode ESR_SessionGetBool(const LCHAR* name, ESR_BOOL* value);
379 /**
380  * Returns copy of session property value.
381  *
382  * @param name Property name
383  * @param value Property value
384  * @param len Length of value argument. If the return code is ESR_BUFFER_OVERFLOW,
385  *            the required length is returned in this variable.
386  * @return ESR_INVALID_RESULT_TYPE if the property is not a LCHAR*
387  */
388 ESR_SHARED_API ESR_ReturnCode ESR_SessionGetLCHAR(const LCHAR* name, LCHAR* value, size_t* len);
389 /**
390  * Indicates if key exists in the session.
391  *
392  * @param name Property name
393  * @param exists True if key exists, false otherwise
394  * @return ESR_SUCCESS
395  */
396 ESR_SHARED_API ESR_ReturnCode ESR_SessionContains(const LCHAR* name, ESR_BOOL* exists);
397 /**
398  * Sets session property value.
399  *
400  * @param name Property name
401  * @param value Property value
402  * @param type Type of value being set
403  * @return ESR_OUT_OF_MEMORY if system is out of memory
404  */
405 ESR_SHARED_API ESR_ReturnCode ESR_SessionSetProperty(const LCHAR* name, void* value,
406     VariableTypes type);
407 /**
408  * Sets session property value, storing a copy of the value.
409  *
410  * @param name Property name
411  * @param value Property value
412  * @return ESR_OUT_OF_MEMORY if system is out of memory
413  */
414 ESR_SHARED_API ESR_ReturnCode ESR_SessionSetInt(const LCHAR* name, int value);
415 /**
416  * Sets session property value, storing a copy of the value.
417  *
418  * @param name Property name
419  * @param value Property value
420  * @return ESR_OUT_OF_MEMORY if system is out of memory
421  */
422 ESR_SHARED_API ESR_ReturnCode ESR_SessionSetUint16_t(const LCHAR* name, asr_uint16_t value);
423 /**
424  * Sets session property value, storing a copy of the value.
425  *
426  * @param name Property name
427  * @param value Property value
428  * @return ESR_OUT_OF_MEMORY if system is out of memory
429  */
430 ESR_SHARED_API ESR_ReturnCode ESR_SessionSetSize_t(const LCHAR* name, size_t value);
431 /**
432  * Sets session property value, storing a copy of the value.
433  *
434  * @param name Property name
435  * @param value Property value
436  * @return ESR_OUT_OF_MEMORY if system is out of memory
437  */
438 ESR_SHARED_API ESR_ReturnCode ESR_SessionSetFloat(const LCHAR* name, float value);
439 /**
440  * Sets session property value, storing a copy of the value.
441  *
442  * @param name Property name
443  * @param value Property value
444  * @return ESR_OUT_OF_MEMORY if system is out of memory
445  */
446 ESR_SHARED_API ESR_ReturnCode ESR_SessionSetBool(const LCHAR* name, ESR_BOOL value);
447 /**
448  * Sets session property value, storing a copy of the value.
449  *
450  * @param name Property name
451  * @param value Property value
452  * @return ESR_OUT_OF_MEMORY if system is out of memory
453  */
454 ESR_SHARED_API ESR_ReturnCode ESR_SessionSetLCHAR(const LCHAR* name, LCHAR* value);
455 /**
456  * If the key does not exist in the session, calls SessionSetInt().
457  *
458  * @param name Property name
459  * @param value Property value
460  * @return ESR_OUT_OF_MEMORY if system is out of memory
461  */
462 ESR_SHARED_API ESR_ReturnCode ESR_SessionSetIntIfEmpty(const LCHAR* name, int value);
463 /**
464  * If the key does not exist in the session, calls SessionSetSize_t().
465  *
466  * @param name Property name
467  * @param value Property value
468  * @return ESR_OUT_OF_MEMORY if system is out of memory
469  */
470 ESR_SHARED_API ESR_ReturnCode ESR_SessionSetUint16_tIfEmpty(const LCHAR* name, asr_uint16_t value);
471 /**
472  * If the key does not exist in the session, calls SessionSetSize_t().
473  *
474  * @param name Property name
475  * @param value Property value
476  * @return ESR_OUT_OF_MEMORY if system is out of memory
477  */
478 ESR_SHARED_API ESR_ReturnCode ESR_SessionSetSize_tIfEmpty(const LCHAR* name, size_t value);
479 /**
480  * If the key does not exist in the session, calls SessionSetFloat().
481  *
482  * @param name Property name
483  * @param value Property value
484  * @return ESR_OUT_OF_MEMORY if system is out of memory
485  */
486 ESR_SHARED_API ESR_ReturnCode ESR_SessionSetFloatIfEmpty(const LCHAR* name, float value);
487 /**
488  * If the key does not exist in the session, calls SessionSetBool().
489  *
490  * @param name Property name
491  * @param value Property value
492  * @return ESR_OUT_OF_MEMORY if system is out of memory
493  */
494 ESR_SHARED_API ESR_ReturnCode ESR_SessionSetBoolIfEmpty(const LCHAR* name, ESR_BOOL value);
495 /**
496  * If the key does not exist in the session, calls SessionSetLCHAR().
497  *
498  * @param name Property name
499  * @param value Property value
500  * @return ESR_OUT_OF_MEMORY if system is out of memory
501  */
502 ESR_SHARED_API ESR_ReturnCode ESR_SessionSetLCHARIfEmpty(const LCHAR* name, LCHAR* value);
503 /**
504  * Removes property from session.
505  *
506  * @param name Property name
507  * @return ESR_OUT_OF_MEMORY if system is out of memory
508  */
509 ESR_SHARED_API ESR_ReturnCode ESR_SessionRemoveProperty(const LCHAR* name);
510 /**
511  * Removes and deallocates property from session.
512  *
513  * @param name Property name
514  * @return ESR_OUT_OF_MEMORY if system is out of memory
515  */
516 ESR_SHARED_API ESR_ReturnCode ESR_SessionRemoveAndFreeProperty(const LCHAR* name);
517 /**
518  * Destroys the system session.
519  *
520  * @return ESR_SUCCESS
521  */
522 ESR_SHARED_API ESR_ReturnCode ESR_SessionDestroy(void);
523 /**
524  * Imports commandline arguments into the system session.
525  *
526  * Keys are imported as "cmdline.[name]" where [name] is the name of the command-line argument
527  * Values are set in char* format.
528  *
529  * For example, given the argument "-timer=5", the following key will be added to the session:
530  * ["cmdline.timer", "5"]
531  *
532  * Validation is left up to the application.
533  *
534  * If the session contains a key that is clobbered by the parser, the old [key, value]
535  * pair will be deallocated. For example, if the session contained
536  * ["cmdline.timer", "value"] before the aforementioned example occured, then the old
537  * [key, value] pair will be allocated by the parser.
538  *
539  * @param argc Number of arguments
540  * @param argv Argument values
541  * @return ESR_OUT_OF_MEMORY if the system is out of memory
542  */
543 ESR_SHARED_API ESR_ReturnCode ESR_SessionImportCommandLine(int argc, LCHAR* argv[]);
544 
545 /**
546  * Returns the number of elements in the session.
547  *
548  * @param size [out] Session size
549  * @return ESR_SUCCESS
550  */
551 ESR_SHARED_API ESR_ReturnCode ESR_SessionGetSize(size_t* size);
552 
553 /**
554  * Returns the key associated with the specified index.
555  *
556  * @param index Element index
557  * @param key [out] Key name
558  * @return ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds
559  */
560 ESR_SHARED_API ESR_ReturnCode ESR_SessionGetKeyAtIndex(size_t index, LCHAR** key);
561 
562 /**
563  * Convert the specified argument to int.
564  *
565  * @param key Property name
566  * @return ESR_INVALID_RESULT_TYPE if the property is not a LCHAR*; ESR_OUT_OF_MEMORY if system is out of memory;
567  * ESR_INVALID_ARGUMENT if property cannot be converted to int
568  */
569 ESR_SHARED_API ESR_ReturnCode ESR_SessionConvertToInt(const LCHAR* key);
570 
571 /**
572  * Convert the specified argument to int.
573  *
574  * @param key Property name
575  * @return ESR_INVALID_RESULT_TYPE if the property is not a LCHAR*; ESR_OUT_OF_MEMORY if system is out of memory;
576  * ESR_INVALID_ARGUMENT if property cannot be converted to asr_uint16_t
577  */
578 ESR_SHARED_API ESR_ReturnCode ESR_SessionConvertToUint16_t(const LCHAR* key);
579 
580 /**
581  * Convert the specified argument to size_t.
582  *
583  * @param key Property name
584  * @return ESR_INVALID_RESULT_TYPE if the property is not a LCHAR*; ESR_OUT_OF_MEMORY if system is out of memory;
585  * ESR_INVALID_ARGUMENT if property cannot be converted to size_t
586  */
587 ESR_SHARED_API ESR_ReturnCode ESR_SessionConvertToSize_t(const LCHAR* key);
588 
589 /**
590  * Convert the specified argument to float.
591  *
592  * @param key Property name
593  * @return ESR_INVALID_RESULT_TYPE if the property is not a LCHAR*; ESR_OUT_OF_MEMORY if system is out of memory;
594  * ESR_INVALID_ARGUMENT if property cannot be converted to float
595  */
596 ESR_SHARED_API ESR_ReturnCode ESR_SessionConvertToFloat(const LCHAR* key);
597 
598 /**
599  * Convert the specified argument to bool.
600  *
601  * @param key Property name
602  * @return ESR_INVALID_RESULT_TYPE if the property is not a LCHAR*; ESR_OUT_OF_MEMORY if system is out of memory;
603  * ESR_INVALID_ARGUMENT if property cannot be converted to bool
604  */
605 ESR_SHARED_API ESR_ReturnCode ESR_SessionConvertToBool(const LCHAR* key);
606 /**
607  * Returns the type of a property value.
608  *
609  * @param name Property name
610  * @param type [out] Value type
611  * @return ESR_INVALID_ARGUMENT if property cannot be found
612  */
613 ESR_SHARED_API ESR_ReturnCode ESR_SessionGetPropertyType(const LCHAR* name, VariableTypes* type);
614 /**
615  * Import PAR file into session.
616  *
617  * @param filename File to read session from
618  * @return ESR_OPEN_ERROR if file cannot be opened; ESR_READ_ERROR if file cannot be read;
619  * ESR_OUT_OF_MEMORY if system is out of memory
620  */
621 ESR_SHARED_API ESR_ReturnCode ESR_SessionImportParFile(const LCHAR* filename);
622 /**
623  * Sets val to true if a session object exists (non-null), FALSE otherwise.
624  *
625  * @param val True if session is non-null, false otherwise
626  * @return ESR_SUCCESS
627  */
628 ESR_SHARED_API ESR_ReturnCode ESR_SessionExists(ESR_BOOL* val);
629 /**
630  * Prefixes relative paths with the PAR-file base directory. If the path is not relative,
631  * it is not changed.
632  *
633  * @param path Path to be prefixed
634  * @param len Length of path argument. If the return code is ESR_BUFFER_OVERFLOW,
635  *            the required length is returned in this variable.
636  * @return ESR_INVALID_ARGUMENT if path is null;
637  * ESR_NO_MATCH_ERROR if session property "parFile.baseDirectory" is undefined
638  */
639 ESR_SHARED_API ESR_ReturnCode ESR_SessionPrefixWithBaseDirectory(LCHAR* path, size_t* len);
640 /**
641  * Adds an event-listener.
642  *
643  * @param self ESR_SessionType handle
644  * @param listener The event-listener to add
645  * @return ESR_OUT_OF_MEMORY if system is out of memory
646  */
647 ESR_SHARED_API ESR_ReturnCode ESR_SessionAddListener(ESR_SessionType* self, ESR_SessionTypeListenerPair* listener);
648 
649 /**
650  * Removes an event-listener.
651  *
652  * @param self ESR_SessionType handle
653  * @param listener The event-listener to remove
654  * @return ESR_SUCCESS
655  */
656 ESR_SHARED_API ESR_ReturnCode ESR_SessionRemoveListener(ESR_SessionType* self, ESR_SessionTypeListenerPair* listener);
657 
658 
659 
660 /**
661  * @}
662  */
663 
664 
665 
666 #endif /* __ESR_SESSION_H */
667