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"
37 #include <unordered_map>
41 // This type represents a loaded plugin module of some kind. For each CssmManager
42 // instance and each one plugin, there is only (at most) one Module object to
45 class Module
: public MdsComponent
{
48 Module(CssmManager
*mgr
, const MdsComponent
&info
, Plugin
*plugin
);
53 bool unload(const ModuleCallback
&callback
);
55 CSSM_HANDLE
attach(const CSSM_VERSION
&version
,
57 CSSM_SERVICE_TYPE subserviceType
,
58 const CSSM_API_MEMORY_FUNCS
&memoryOps
,
59 CSSM_ATTACH_FLAGS attachFlags
,
60 CSSM_KEY_HIERARCHY keyHierarchy
,
61 CSSM_FUNC_NAME_ADDR
*functionTable
,
62 uint32 functionTableSize
);
63 void detach(Attachment
*attachment
);
65 void add(const ModuleCallback
&cb
) { callbackSet
.insert(cb
); }
66 void remove(const ModuleCallback
&cb
) { callbackSet
.erase(cb
); }
68 unsigned int callbackCount() const { return callbackSet
.size(); }
69 unsigned int attachmentCount() const { return (int)attachmentMap
.size(); }
71 void safeLock() { if (!isThreadSafe()) mLock
.lock(); }
72 void safeUnlock() { if (!isThreadSafe()) mLock
.unlock(); }
75 typedef std::unordered_map
<CSSM_HANDLE
, Attachment
*> AttachmentMap
;
77 Plugin
*plugin
; // our loader module
80 void spiEvent(CSSM_MODULE_EVENT event
,
83 CSSM_SERVICE_TYPE serviceType
);
85 static CSSM_RETURN
spiEventRelay(const CSSM_GUID
*ModuleGuid
,
88 CSSM_SERVICE_TYPE ServiceType
,
89 CSSM_MODULE_EVENT EventType
);
92 AttachmentMap attachmentMap
; // map of all outstanding attachment handles
93 ModuleCallbackSet callbackSet
; // set of registered callbacks