1 // ======================================================================
4 // pure virtual base class for performing operations in KeychainLib
5 // (based on Dave Akhond's Operation for CDSA
7 // Copyright: Copyright (c) 2000,2003,2008 Apple Inc. All Rights Reserved.
9 // Change History (most recent first):
11 // <1> 2/22/00 em Created.
12 // ======================================================================
14 #ifndef __KC_OPERATION__
15 #define __KC_OPERATION__
22 #include <Carbon/Carbon.h>
25 #if TARGET_RT_MAC_MACHO
26 #include <OSServices/KeychainCore.h>
27 #include <OSServices/KeychainCorePriv.h>
28 #include <SecurityHI/KeychainHI.h>
33 #include "testKeychainAPI.h"
34 #include "KCParamUtility.h"
35 #include "KCOperationID.h"
38 // ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ
40 // ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ
44 Operation():mStatus(noErr
){}
45 virtual ~Operation(){}
47 virtual void SetClient(void *inClient
);
48 virtual OSStatus
Operate() = 0;
49 virtual eKCOperationID
GetID() = 0;
51 virtual void ReadArguments(
54 virtual void WriteArguments(
57 virtual void WriteResults(
60 static int ReadScript(
62 eKCOperationID
&outID
);
64 virtual void ReadScript(
67 virtual void WriteScript(
70 virtual void GenerateScript(
73 virtual bool RunScript(
76 virtual bool CompareResults(
81 tParamList mParamList
;
82 tParamList mResultList
;
84 virtual void AddParam(CParam
&inParam
){ mParamList
.push_back(&inParam
);}
85 virtual void AddResult(CParam
&inParam
){ mResultList
.push_back(&inParam
);}
90 // ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ
92 // ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ
93 class KCOperation
: public Operation
{
95 KCOperation():mKeychainIndex("KeychainIndex"), mAliasIndex("AliasIndex") {}
96 virtual ~KCOperation(){}
98 virtual void AddAlias(AliasHandle alias
)
100 sAliasList
.push_back(alias
);
101 mAliasIndex
= (UInt32
)(sAliasList
.size()-1);
104 virtual void AddKeychain(KCRef
&inKeychain
)
106 sKCRefList
.push_back(inKeychain
);
107 mKeychainIndex
= (UInt32
)(sKCRefList
.size()-1);
110 virtual AliasHandle
GetAlias()
112 if((UInt32
)mAliasIndex
< sAliasList
.size())
113 return sAliasList
[(UInt32
)mAliasIndex
];
118 virtual KCRef
GetKeychain()
120 if((UInt32
)mKeychainIndex
< sKCRefList
.size())
121 return sKCRefList
[(UInt32
)mKeychainIndex
];
126 static void Cleanup()
128 // ¥¥¥ need to release each keychain first
133 class CKeychainIndex
: public CUInt32
136 CKeychainIndex
& operator = (const UInt32
&inData
){ data
= inData
; return *this; }
137 bool operator == (const UInt32 inData
) const
139 return (CKCRef(KCOperation::sKCRefList
[data
]) == KCOperation::sKCRefList
[inData
]);
142 typedef TParam
<CKeychainIndex
, POD_STRUCT(UInt32
), UInt32
> CParamKeychainIndex
;
144 class CAliasIndex
: public CUInt32
147 CAliasIndex
& operator = (const UInt32
&inData
){ data
= inData
; return *this; }
148 bool operator == (const UInt32 inData
) const
150 return (CAliasHandle(KCOperation::sAliasList
[data
]) == KCOperation::sAliasList
[inData
]);
153 typedef TParam
<CAliasIndex
, POD_STRUCT(UInt32
), UInt32
> CParamAliasIndex
;
155 CParamKeychainIndex mKeychainIndex
;
156 CParamAliasIndex mAliasIndex
;
157 static vector
<KCRef
> sKCRefList
;
158 static vector
<AliasHandle
> sAliasList
;
160 friend class CKeychainIndex
;
161 friend class CAliasIndex
;
165 // ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ
167 // ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ
168 class KCItemOperation
: public KCOperation
{
170 KCItemOperation():mItemIndex("ItemIndex"){}
171 virtual ~KCItemOperation(){}
173 virtual void AddItem(KCItemRef
&inItem
)
175 sKCItemRefList
.push_back(inItem
);
176 mItemIndex
= (UInt32
)(sKCItemRefList
.size()-1);
179 virtual KCItemRef
GetItem()
181 if((UInt32
)mItemIndex
< sKCItemRefList
.size())
182 return sKCItemRefList
[(UInt32
)mItemIndex
];
187 static void Cleanup()
189 // ¥¥¥ need to release each item first
190 sKCItemRefList
.clear();
193 class CItemIndex
: public CUInt32
196 CItemIndex
& operator = (const UInt32
&inData
){ data
= inData
; return *this; }
197 bool operator == (const UInt32 inData
) const
199 return(CKCItemRef(KCItemOperation::sKCItemRefList
[data
]) == KCItemOperation::sKCItemRefList
[inData
]);
202 typedef TParam
<CItemIndex
, POD_STRUCT(UInt32
), UInt32
> CParamItemIndex
;
203 CParamItemIndex mItemIndex
;
205 static vector
<KCItemRef
> sKCItemRefList
;
207 friend class CItemIndex
;
210 // ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ
211 // ¥ KCSearchOperation
212 // ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ
213 class KCSearchOperation
: public KCItemOperation
{
215 KCSearchOperation():mSearchIndex("SearchIndex"){}
216 virtual ~KCSearchOperation(){}
218 virtual void AddSearch(KCSearchRef
&inSearch
)
220 sKCSearchRefList
.push_back(inSearch
); mSearchIndex
= (UInt32
)(sKCSearchRefList
.size()-1);
223 virtual KCSearchRef
GetSearch()
225 if((UInt32
)mSearchIndex
< sKCSearchRefList
.size())
226 return sKCSearchRefList
[(UInt32
)mSearchIndex
];
231 static void Cleanup()
233 // ¥¥¥ need to release each ref first
234 sKCSearchRefList
.clear();
237 class CSearchIndex
: public CUInt32
240 CSearchIndex
& operator = (const UInt32
&inData
){ data
= inData
; return *this; }
241 bool operator == (const UInt32 inData
) const
243 return (data
== inData
) ||
244 (KCSearchOperation::sKCSearchRefList
[data
] == KCSearchOperation::sKCSearchRefList
[inData
]);
247 typedef TParam
<CSearchIndex
, POD_STRUCT(UInt32
), UInt32
> CParamSearchIndex
;
248 CParamSearchIndex mSearchIndex
;
250 static vector
<KCSearchRef
> sKCSearchRefList
;
252 friend class CSearchIndex
;
255 #ifdef _CPP_UTILITIES
259 #endif // __KC_OPERATION__