2 * Copyright (c) 2000-2004,2011-2012,2014 Apple Inc. All Rights Reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
21 * @APPLE_LICENSE_HEADER_END@
26 // module - CSSM Module objects
33 #include <security_cdsa_utilities/callback.h>
34 #include "modloader.h"
38 #include <ext/hash_map>
39 using __gnu_cxx::hash_map
;
46 // This type represents a loaded plugin module of some kind. For each CssmManager
47 // instance and each one plugin, there is only (at most) one Module object to
50 class Module
: public MdsComponent
{
53 Module(CssmManager
*mgr
, const MdsComponent
&info
, Plugin
*plugin
);
58 bool unload(const ModuleCallback
&callback
);
60 CSSM_HANDLE
attach(const CSSM_VERSION
&version
,
62 CSSM_SERVICE_TYPE subserviceType
,
63 const CSSM_API_MEMORY_FUNCS
&memoryOps
,
64 CSSM_ATTACH_FLAGS attachFlags
,
65 CSSM_KEY_HIERARCHY keyHierarchy
,
66 CSSM_FUNC_NAME_ADDR
*functionTable
,
67 uint32 functionTableSize
);
68 void detach(Attachment
*attachment
);
70 void add(const ModuleCallback
&cb
) { callbackSet
.insert(cb
); }
71 void remove(const ModuleCallback
&cb
) { callbackSet
.erase(cb
); }
73 unsigned int callbackCount() const { return callbackSet
.size(); }
74 unsigned int attachmentCount() const { return (int)attachmentMap
.size(); }
76 void safeLock() { if (!isThreadSafe()) mLock
.lock(); }
77 void safeUnlock() { if (!isThreadSafe()) mLock
.unlock(); }
80 typedef hash_map
<CSSM_HANDLE
, Attachment
*> AttachmentMap
;
82 Plugin
*plugin
; // our loader module
85 void spiEvent(CSSM_MODULE_EVENT event
,
88 CSSM_SERVICE_TYPE serviceType
);
90 static CSSM_RETURN
spiEventRelay(const CSSM_GUID
*ModuleGuid
,
93 CSSM_SERVICE_TYPE ServiceType
,
94 CSSM_MODULE_EVENT EventType
);
97 AttachmentMap attachmentMap
; // map of all outstanding attachment handles
98 ModuleCallbackSet callbackSet
; // set of registered callbacks