resource.h
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:24k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
  2. /*
  3.  * The contents of this file are subject to the Mozilla Public
  4.  * License Version 1.1 (the "License"); you may not use this file
  5.  * except in compliance with the License. You may obtain a copy of
  6.  * the License at http://www.mozilla.org/MPL/
  7.  * 
  8.  * Software distributed under the License is distributed on an "AS
  9.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  10.  * implied. See the License for the specific language governing
  11.  * rights and limitations under the License.
  12.  * 
  13.  * The Original Code is the Netscape security libraries.
  14.  * 
  15.  * The Initial Developer of the Original Code is Netscape
  16.  * Communications Corporation.  Portions created by Netscape are 
  17.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  18.  * Rights Reserved.
  19.  * 
  20.  * Contributor(s):
  21.  * 
  22.  * Alternatively, the contents of this file may be used under the
  23.  * terms of the GNU General Public License Version 2 or later (the
  24.  * "GPL"), in which case the provisions of the GPL are applicable 
  25.  * instead of those above.  If you wish to allow use of your 
  26.  * version of this file only under the terms of the GPL and not to
  27.  * allow others to use your version of this file under the MPL,
  28.  * indicate your decision by deleting the provisions above and
  29.  * replace them with the notice and other provisions required by
  30.  * the GPL.  If you do not delete the provisions above, a recipient
  31.  * may use your version of this file under either the MPL or the
  32.  * GPL.
  33.  */
  34. /*
  35.   SSMResource is the base class for anything that wants to be accessible 
  36.   to the NSM client.
  37.   To subclass from SSMResource, you *must* do the following:
  38.   * Define a resource type for your class in the SSMResourceType enumerated
  39.   type below.
  40.   * Embed an SSMResource struct as the first member of your class struct.
  41.   This is the way that polymorphism works in this class system: you can freely
  42.   change type on a pointer to an SSMResource or its subclasses, because
  43.   the memory pointed to is guaranteed to consist of the base class followed
  44.   by subclass members. Subsequently, to subclass from any subclass of
  45.   SSMResource, you must embed an instance of the existing class as the 
  46.   first member of your subclass.
  47.   (This is how it's done in C++, btw. Why don't we use C++, you ask?
  48.   Because of variations among C++ compilers, and because the rest of the
  49.   group will hate us if we do.)
  50.   * Provide the following member functions for your class:
  51.     - SSMStatus YourClassName_Create (void *arg, SSMResource **res)
  52.       Requirement: MANDATORY
  53.       Description: This creates an instance of your class. Necessary because
  54.                    you need to allocate a properly sized chunk of memory,
  55.                    and because the _Create routine also must call the correct
  56.                    _Init method to properly initialize member data.
  57.       Parameters:  arg - an initialization argument specific to the class.
  58.                    res - Returns the newly created instance, or NULL if error.
  59.                    Return value - PR_SUCCESS for success, etc.
  60.     - SSMStatus YourClassName_Init([signature varies])
  61.       Requirement: MANDATORY
  62.       Description: This initializes member data in your class. 
  63.       Parameters:  Dependent on how your class needs to be initialized. 
  64.                    The calling convention is used only by your _Create method,
  65.                    and by the _Init method of all subclasses of your class.
  66.     - SSMStatus YourClassName_Destroy(SSMResource *res, PRBool doFree)
  67.       Requirement: MANDATORY
  68.       Description: This deallocates member data in an instance of your 
  69.                    class, and optionally deallocates the class instance 
  70.                    itself (if doFree is true). When calling superclass
  71.                    _Destroy functions, should always pass PR_FALSE in
  72.                    doFree. The default method deallocates the object with
  73.                    PR_Free.
  74.       Parameters:  res - An instance of your class.
  75.                    doFree - if PR_TRUE, you must free (res). Presumably,
  76.                             if doFree is true, then this object was created
  77.                             by your _Create method above, so use whatever
  78.                             memory deallocator corresponds to how the
  79.                             instance was allocated in _Create.
  80.                    Return value - PR_SUCCESS if successful, etc.
  81.     - SSMStatus YourClassName_GetAttrIDs(SSMResource *res,
  82.                                         SSMAttributeID **ids,
  83.                                         PRIntn *count)
  84.       Requirement: MANDATORY
  85.       Description: This is called when the client or part of the NSM server
  86.                    wants to know all the available attributes of a particular
  87.                    object.
  88.       Parameters:  res - An instance of your class.
  89.                    ids - Returns an array (allocated with PR_CALLOC) of
  90.                          the available IDs.
  91.                    count - Returns the number of IDs in (ids).
  92.                    Return value - PR_SUCCESS if successful
  93.                                   (Other underlying errors as appropriate)
  94.     - SSMStatus YourClassName_GetAttr(SSMResource *res, 
  95.                                      SSMAttributeID attrID, 
  96.                                      SSMAttributeValue *value)
  97.       Requirement: MANDATORY
  98.       Description: This is called when a client requests data from an
  99.                    instance of your class. The default method simply 
  100.                    returns PR_FAILURE.
  101.       Parameters:  res - An instance of your class.
  102.                    attrID - The ID of the requested member data.
  103.                    value - The attribute value struct to be filled in.
  104.                    Return value - PR_SUCCESS if successful
  105.                                   SSM_ERR_BAD_FID: Field ID is incorrect.
  106.                                   (Other underlying errors as appropriate)
  107.     - SSMStatus YourClassName_SetAttr(SSMResource *res,
  108.                                      SSMAttributeID attrID,
  109.                                      SSMAttributeValue *value)
  110.       Requirement: Optional
  111.       Description: This is called when a client wants to change a member
  112.                    of an instance of your class. This only needs to be 
  113.                    implemented if you want to accept values from the 
  114.                    client (most classes will not want to do this). The 
  115.                    default method simply returns PR_FAILURE.
  116.       Parameters:  res - An instance of your class.
  117.                    attrID - The ID of the member to be changed.
  118.                    value - The value to set the attribute to.
  119.                    Return value - PR_SUCCESS if successful
  120.                                   SSM_ERR_BAD_FID: Field ID is incorrect.
  121.                                   SSM_ERR_ATTRTYPE_MISMATCH: Type mismatch
  122.                                   (Other underlying errors as appropriate)
  123.       
  124.     - void YourClassName_Invariant(YourClassName *obj)
  125.       Requirement: Optional (but recommended)
  126.       Description: Performs invariant checking on member data particular
  127.                    to your class. Normally this is done by calling PR_ASSERT
  128.                    on typical expected conditions in your member data.
  129.                    Your invariant method should call the superclass' Invariant
  130.                    method to ensure proper invariant checking of the whole
  131.                    instance.
  132.       Parameters:  obj - An instance of your class.
  133.                    Return value - PR_SUCCESS if successful
  134.                                   (Errors as appropriate)
  135.   * Register your class by making a call to SSM_RegisterResourceType 
  136.   from inside SSM_ResourceInit in resource.c, passing whatever 
  137.   methods your class overrides. Note that in some subclasses (such as 
  138.   SSMConnection), additional virtual functions are provided for other 
  139.   polymorphic functionality. You'll need to override those methods 
  140.   inside your _Init routine directly.
  141.  */
  142. #ifndef __SSM_RESOURCE_H__
  143. #define __SSM_RESOURCE_H__
  144. #include "ssmdefs.h"
  145. #include "ssmerrs.h"
  146. #include "rsrcids.h"
  147. #include "hashtbl.h"
  148. #include "protocol.h"
  149. #include "protocolf.h"
  150. #include "prtypes.h"
  151. #include "nspr.h"
  152. #include "serv.h"
  153. #include "collectn.h"
  154. /* typedef struct SSMResource SSMResource; */
  155. /* SSMControlConnection is defined in ctrlcon.h */
  156. /* typedef struct SSMControlConnection SSMControlConnection; */
  157. typedef struct HTTPRequest HTTPRequest;
  158. typedef SSMStatus (*SSMResourceCreateFunc) (void *arg, 
  159.                                            SSMControlConnection * conn, 
  160.                                            SSMResource **res);
  161. typedef SSMStatus (*SSMResourceDestroyFunc)(SSMResource *res, PRBool doFree);
  162. typedef SSMStatus (*SSMResourceGetAttrIDsFunc)(SSMResource *res,
  163.                                               SSMAttributeID **ids,
  164.                                               PRIntn *count);
  165. typedef SSMStatus (*SSMResourceGetAttrFunc)(SSMResource *res,
  166.                                            SSMAttributeID attrID,
  167.                                            SSMResourceAttrType attrType, 
  168.                                            SSMAttributeValue *value);
  169. typedef SSMStatus (*SSMResourceSetAttrFunc)(SSMResource *res,
  170.                                            SSMAttributeID attrID,
  171.                                            SSMAttributeValue *value);
  172. typedef SSMStatus (*SSMResourceShutdownFunc)(SSMResource *res,
  173.                                             SSMStatus status);
  174. typedef SSMStatus (*SSMResourcePickleFunc)(SSMResource *res, 
  175.                                           PRIntn * len,
  176.                                           void **value);
  177. typedef SSMStatus (*SSMResourceUnpickleFunc)(SSMResource ** res,
  178.                                             SSMControlConnection * conn,
  179.                                             PRIntn len, void * value);
  180. typedef SSMStatus (*SSMResourceHTMLFunc)(SSMResource *res,
  181.                                         PRIntn * len, 
  182.                                         void ** value);
  183. /* be sure to include <nlsutil.h> before your implementations */
  184. typedef SSMStatus (*SSMResourcePrintFunc)(SSMResource *res,
  185.                                          char *fmt,
  186.                                          PRIntn numParams,
  187.  char ** value,
  188.                                          char **resultStr);
  189. typedef SSMStatus (*SSMSubmitHandlerFunc)(struct SSMResource *res,
  190.                                           HTTPRequest *req);
  191. /* What do we do with a resource when the client wants to destroy it? */
  192. typedef enum
  193. {
  194.     SSM_CLIENTDEST_NOTHING = (PRUint32) 0, /* take no action */
  195.     SSM_CLIENTDEST_FREE,                   /* free the resource */
  196.     SSM_CLIENTDEST_SHUTDOWN                /* shut down threads
  197.                                               before freeing object */
  198. } SSMClientDestroyAction;
  199. typedef enum
  200. {
  201.   SSM_BUTTON_NONE = 0,
  202.   SSM_BUTTON_CANCEL,
  203.   SSM_BUTTON_OK
  204. } SSMUIButtonType;
  205. typedef struct SSMResourceClass SSMResourceClass;
  206. /* typedef struct SSMResource SSMResource; */
  207. struct SSMResource
  208. {
  209.     SSMResourceClass *m_class; /* Pointer to class object */
  210.     SSMResourceID          m_id;
  211.     SSMResourceType        m_classType;
  212.     SSMControlConnection*  m_connection; /* Control connection 
  213.                                                    that owns the  resource */
  214.     SSMStatus               m_status;    /* Status of last closing thread.
  215.                                            Indicates whether to do an
  216.                                            emergency shutdown (interrupt all
  217.                                            threads, post shutdown msgs, etc.)
  218.                                            or to allow continuing operation. */
  219.     PRIntn                 m_threadCount; /* Number of service threads */
  220.     PRMonitor *            m_lock;      /* Thread lock for this connection 
  221.                                            object */
  222.     PRMonitor *            m_UILock; /* Use this lock for waiting and 
  223.                                       * notifying for UI events.
  224.                                       */
  225.     PRBool                 m_UIBoolean; /* This value is set by the Notify 
  226.                                          * on UILock.
  227.                                          */
  228.     PRIntn                 m_refCount;       /* Reference count */
  229.     PRIntn                 m_clientCount;  /* Number of client references */
  230.     SSMUIButtonType        m_buttonType; /* This will be set when a UI event
  231.                                           * button event happens and the 
  232.                                           * target is the resource.
  233.                                           */
  234.     char *                 m_formName; /* The name of the form that created
  235.                                         * the UI event causing the form submit
  236.                                         * handler to get called.
  237.                                         */
  238.     char *                 m_fileName; /* If this object requested a file path,
  239.                                         * then this field will be used to 
  240.                                         * store the returned value.
  241.                                         */
  242.     void *                 m_uiData;   /* Using this value to pass misc UI 
  243. * information.
  244. */
  245.     CMTItem                m_clientContext; /* This is set by client and passed back
  246.                                        * to client during UI operations */
  247.     PRThread *             m_waitThread; /*Thread waiting for us to shut down*/
  248.     SSMClientDestroyAction m_clientDest;/* what to do if client destroys us */
  249.     SSMResourceDestroyFunc m_destroy_func;
  250.     SSMResourceShutdownFunc m_shutdown_func;
  251.     SSMResourceGetAttrIDsFunc m_getids_func;
  252.     SSMResourceGetAttrFunc m_get_func;
  253.     SSMResourceSetAttrFunc m_set_func;
  254.     SSMResourcePickleFunc  m_pickle_func;
  255.     SSMResourceHTMLFunc    m_html_func;
  256.     SSMResourcePrintFunc   m_print_func;
  257.     SSMSubmitHandlerFunc   m_submit_func;
  258.     PRBool                 m_resourceShutdown;
  259. };
  260. /* Macros */
  261. #define RESOURCE_CLASS(x) ( ((SSMResource *) (x))->m_classType )
  262. /************************************************************
  263. ** FUNCTION: SSM_CreateResource
  264. **
  265. ** DESCRIPTION: Create a new resource of type (type). If (rawData)
  266. **              is not NULL, get initial values from that structure.
  267. **              rawData is treated differently depending on the type
  268. **              of resource being created; for example, a certificate
  269. **              object will store a reference to the certificate 
  270. **              structure in (rawData), whereas a connection resource
  271. **              will copy values out of an SSMHashTable pointed to
  272. **              by (rawData).
  273. ** INPUTS:
  274. **   type
  275. **     The type of resource to be created.
  276. **   arg
  277. **     A type-dependent initial value for attribute(s) of the newly
  278. **     created resource.
  279. **   resID
  280. **     Returns the ID of the newly created resource.
  281. **   result
  282. **     Returns a pointer to the newly created resource.
  283. ** RETURNS:
  284. **   If successful, returns PR_SUCCESS.
  285. **   If failed, returns either PR_FAILURE or the underlying NSPR error,
  286. **      if it is available.
  287. **
  288. *************************************************************/
  289. SSMStatus SSM_CreateResource(SSMResourceType type, 
  290.                             void *arg,
  291.                             SSMControlConnection * conn,
  292.                             SSMResourceID *resID, 
  293.                             SSMResource **result);
  294.   
  295.   
  296. /************************************************************
  297. ** FUNCTION: SSM_GetResAttribute
  298. **
  299. ** DESCRIPTION: Get an attribute from an SSMResource object.
  300. **
  301. ** INPUTS:
  302. **   res
  303. **     The resource from which an attribute is to be retrieved.
  304. **   attrID
  305. **     The field/resource ID of the attribute.
  306. **   attrType
  307. **     The expected type of the retrieved attribute.
  308. **   value
  309. **     The attribute value to be filled in.
  310. ** RETURNS:
  311. **   If successful, returns PR_SUCCESS.
  312. **   If failed, returns either PR_FAILURE or the underlying NSPR error,
  313. **      if it is available.
  314. **
  315. ** NOTES:
  316. **   ### mwelch All this memory allocation can be problematic.
  317. *************************************************************/
  318. SSMStatus SSM_GetResAttribute(SSMResource *res, SSMAttributeID attrID,
  319.                               SSMResourceAttrType attrType,
  320.                               SSMAttributeValue *value);
  321. /************************************************************
  322. ** FUNCTION: SSM_SetResAttribute
  323. **
  324. ** DESCRIPTION: Set an attribute on an SSMResource object. If
  325. **              the attribute does not yet exist, it is created.
  326. **
  327. ** INPUTS:
  328. **   res
  329. **     The resource in which an attribute is to be changed.
  330. **   attrID
  331. **     The field/resource ID of the attribute.
  332. **   value
  333. **     A pointer to the value of the newly changed attribute. The value
  334. **     is copied into the resource.
  335. ** RETURNS:
  336. **   If successful, returns PR_SUCCESS.
  337. **   If failed, returns either PR_FAILURE or the underlying NSPR error,
  338. **      if it is available.
  339. *************************************************************/
  340. SSMStatus SSM_SetResAttribute(SSMResource *res, SSMAttributeID attrID,
  341.                              SSMAttributeValue *value);
  342. /************************************************************
  343. ** FUNCTION: SSM_PickleResource
  344. ** 
  345. ** DESCRIPTION: Pickle resource. 
  346. ** 
  347. ** INPUTS: 
  348. **   res
  349. **     The resource to be pickled.
  350. **
  351. ** OUTPUTS:
  352. **   len
  353. **     Length of the pickled blob.
  354. **   value
  355. **     Pickled resource.
  356. **
  357. ** RETURNS:
  358. **   If successful, returns PR_SUCCESS.
  359. **   If failed, returns either PR_FAILURE or NSPR error code.
  360. *************************************************************/    
  361. SSMStatus
  362. SSM_PickleResource(SSMResource * res, PRIntn * len, void ** value);
  363. /************************************************************
  364. ** FUNCTION: SSM_FreeResource
  365. **
  366. ** DESCRIPTION: Free a reference on (res). If the reference count
  367. **              reaches 0, (res) is destroyed.
  368. **
  369. ** INPUTS:
  370. **   res
  371. **     The resource to be dereferenced.
  372. ** RETURNS:
  373. **   If successful, returns PR_SUCCESS.
  374. **   If failed, returns either PR_FAILURE or the underlying NSPR error,
  375. **      if it is available.
  376. *************************************************************/
  377. SSMStatus SSM_FreeResource(SSMResource *res);
  378. /************************************************************
  379. ** FUNCTION: SSM_GetResourceReference
  380. **
  381. ** DESCRIPTION: Get a reference on (res). 
  382. **
  383. ** INPUTS:
  384. **   res
  385. **     The resource to be referenced.
  386. ** RETURNS:
  387. **   If successful, returns PR_SUCCESS.
  388. **   If failed, returns either PR_FAILURE or the underlying NSPR error,
  389. **      if it is available.
  390. *************************************************************/
  391. SSMStatus SSM_GetResourceReference(SSMResource *res);
  392. /************************************************************
  393. ** FUNCTION: SSM_RegisterResourceType
  394. **
  395. ** DESCRIPTION: Register a resource type within the Cartman server.
  396. **
  397. ** INPUTS:
  398. **   type
  399. **      The new type to be registered.
  400. **   superClass
  401. **      Inherit functions from the already-registered superclass.
  402. **      if (superClass) is not SSM_RESTYPE_NULL and any function
  403. **      parameters below are NULL, those functions are inherited
  404. **      from the indicated superclass.
  405. **  createFunc, rDestFunc, setFunc, getFunc
  406. **      Accessor functions for the resource.
  407. ** RETURNS:
  408. **   If successful, returns PR_SUCCESS.
  409. **   If failed, returns either PR_FAILURE, the underlying NSPR error,
  410. **      or the following values:
  411. **      SSM_ERR_INVALID_FUNC: (superClass) was SSM_RESTYPE_NULL
  412. **                            and one or more of the function parameters
  413. **                            was also NULL.
  414. *************************************************************/
  415. SSMStatus SSM_RegisterResourceType(char *                    className, 
  416.                                   SSMResourceType           type,
  417.                                   SSMResourceType           superClass,
  418.                                   SSMClientDestroyAction    cDestAction,
  419.                                   SSMResourceCreateFunc     createFunc,
  420.                                   SSMResourceDestroyFunc    destFunc,
  421.                                   SSMResourceShutdownFunc   shutdownFunc,
  422.                                   SSMResourceGetAttrIDsFunc getIDsFunc,
  423.                                   SSMResourceGetAttrFunc    getFunc,
  424.                                   SSMResourceSetAttrFunc    setFunc,
  425.                                   SSMResourcePickleFunc     pickleFunc, 
  426.                                   SSMResourceUnpickleFunc   unpickleFunc,
  427.                                   SSMResourceHTMLFunc       htmlFunc,
  428.                                   SSMResourcePrintFunc      printFunc,
  429.                                   SSMSubmitHandlerFunc      submitFunc);
  430. PRBool SSM_IsA(SSMResource *res, SSMResourceType type);
  431. PRBool SSM_IsAKindOf(SSMResource *res, SSMResourceType type);
  432. SSMStatus SSM_ClientGetResourceReference(SSMResource *res, SSMResourceID *id);
  433. SSMStatus SSM_ShutdownResource(SSMResource *res, SSMStatus status);
  434. SSMStatus SSM_ClientDestroyResource(SSMControlConnection *connection,
  435.                                    SSMResourceID rid, SSMResourceType type);
  436. void SSM_LockResource(SSMResource *res);
  437. SSMStatus SSM_UnlockResource(SSMResource *res);
  438. SSMStatus SSM_WaitResource(SSMResource *res, PRIntervalTime ticks);
  439. SSMStatus SSM_WaitForOKCancelEvent(SSMResource *res, PRIntervalTime ticks);
  440. SSMStatus SSM_NotifyOKCancelEvent(SSMResource *res);
  441. SSMStatus SSM_NotifyResource(SSMResource *res);
  442. void SSM_LockUIEvent(SSMResource *res);
  443. SSMStatus SSM_UnlockUIEvent(SSMResource *res);
  444. SSMStatus SSM_WaitUIEvent(SSMResource *res, PRIntervalTime ticks);
  445. SSMStatus SSM_NotifyUIEvent(SSMResource *);
  446. SSMStatus SSM_PickleResource(SSMResource * res, PRIntn * len, void ** value);
  447. SSMStatus SSM_UnpickleResource(SSMResource ** res, SSMResourceType type, 
  448.                               SSMControlConnection * connection,
  449.                               PRIntn len, void * value);
  450. SSMStatus SSM_MessageFormatResource(SSMResource *res, char *fmt, PRIntn numParam,
  451.    char ** value,
  452.                                    char **resultStr);
  453. SSMStatus SSMResource_Create(void *arg, SSMControlConnection * conn, 
  454.                             SSMResource **res);
  455. SSMStatus SSMResource_Destroy(SSMResource *res, PRBool doFree);
  456. SSMStatus SSMResource_Shutdown(SSMResource *res, SSMStatus status);
  457. SSMStatus SSMResource_Init(SSMControlConnection * conn, SSMResource *res, 
  458.   SSMResourceType type);
  459. void SSMResource_Invariant(SSMResource *res);
  460. SSMStatus SSMResource_GetAttr(SSMResource *res,
  461.                               SSMAttributeID attrID,
  462.                               SSMResourceAttrType attrType,
  463.                               SSMAttributeValue *value);
  464. SSMStatus SSMResource_SetAttr(SSMResource *res,
  465.                              SSMAttributeID attrID,
  466.                              SSMAttributeValue *value);
  467. SSMStatus SSMResource_GetAttrIDs(SSMResource *res,
  468.                                 SSMAttributeID **ids,
  469.                                 PRIntn *count);
  470. SSMStatus SSMResource_Pickle(SSMResource *res,
  471.                             PRIntn * len,
  472.                             void **value);
  473. SSMStatus SSMResource_Unpickle(SSMResource ** res,
  474.                               SSMControlConnection *conn,
  475.                               PRIntn len,
  476.                               void * value);
  477. SSMStatus SSMResource_HTML(SSMResource *res,
  478.                           PRIntn * len,
  479.                           void ** value);
  480. SSMStatus SSMResource_Print(SSMResource *res,
  481.                            char *fmt,
  482.                            PRIntn numParam,
  483.                            char **value,
  484.                            char **resultStr);
  485. SSMStatus SSMResource_FormSubmitHandler(SSMResource *res,
  486.                                         HTTPRequest *req);
  487. /* ALWAYS pass in msg a string allocated by NSPR (PR_smprintf for example),
  488.    because the string is freed from within SSM_Debug. */
  489. void SSM_Debug(SSMResource *res, char *msg);
  490. char * SSM_ResourceClassName(SSMResource *res);
  491. /* Wait for a resource to shut down. */
  492. SSMStatus SSM_WaitForResourceShutdown(SSMResource *res);
  493. /* Register a thread with a resource (or pass arg==NULL for standalone) */
  494. void SSM_RegisterThread(char *threadName, SSMResource *arg);
  495. void SSM_RegisterNewThread(char *threadName, SSMResource *ptr);
  496. SSMStatus
  497. SSM_ShutdownResource(SSMResource *res, SSMStatus status);
  498. SSMStatus SSM_HandlePromptReply(SSMResource *res, char *reply);
  499. /* Initialize resources. Only called by main. */
  500. SSMStatus SSM_ResourceInit();
  501. /* Create a resource thread */
  502. PRThread *
  503. SSM_CreateThread(SSMResource *res, void (*func)(void *arg));
  504. #endif