#ifndef __KC_OPERATION_ID__
#define __KC_OPERATION_ID__
#include <stdio.h>
enum eKCOperationID {
OpID_Unknown = -1,
OpID_COp_KCGetKeychainManagerVersion = 0,
OpID_COp_KeychainManagerAvailable, OpID_COp_KCMakeKCRefFromFSRef, OpID_COp_KCMakeKCRefFromFSSpec, OpID_COp_KCMakeKCRefFromAlias, OpID_COp_KCMakeAliasFromKCRef, OpID_COp_KCReleaseKeychain, OpID_COp_KCUnlockNoUI, OpID_COp_KCUnlock, OpID_COp_KCUnlockWithInfo, OpID_COp_KCLock, OpID_COp_KCLockNoUI, OpID_COp_KCGetDefaultKeychain, OpID_COp_KCSetDefaultKeychain, OpID_COp_KCCreateKeychain, OpID_COp_KCCreateKeychainNoUI, OpID_COp_KCGetStatus, OpID_COp_KCChangeSettingsNoUI, OpID_COp_KCGetKeychain, OpID_COp_KCGetKeychainName, OpID_COp_KCChangeSettings, OpID_COp_KCCountKeychains, OpID_COp_KCGetIndKeychain, OpID_COp_KCAddCallback, OpID_COp_KCRemoveCallback, OpID_COp_KCSetInteractionAllowed, OpID_COp_KCIsInteractionAllowed, OpID_COp_KCAddAppleSharePassword, OpID_COp_KCFindAppleSharePassword, OpID_COp_KCAddInternetPassword, OpID_COp_KCAddInternetPasswordWithPath, OpID_COp_KCFindInternetPassword, OpID_COp_KCFindInternetPasswordWithPath, OpID_COp_KCAddGenericPassword, OpID_COp_KCFindGenericPassword, OpID_COp_KCNewItem, OpID_COp_KCSetAttribute, OpID_COp_KCGetAttribute, OpID_COp_KCSetData, OpID_COp_KCGetData, OpID_COp_KCGetDataNoUI, OpID_COp_KCAddItem, OpID_COp_KCAddItemNoUI, OpID_COp_KCDeleteItem, OpID_COp_KCDeleteItemNoUI, OpID_COp_KCUpdateItem, OpID_COp_KCReleaseItem, OpID_COp_KCCopyItem, OpID_COp_KCFindFirstItem, OpID_COp_KCFindNextItem, OpID_COp_KCReleaseSearch, OpID_COp_KCFindX509Certificates, OpID_COp_KCChooseCertificate, OpID_COp_kcunlock, OpID_COp_kccreatekeychain, OpID_COp_kcgetkeychainname, OpID_COp_kcaddapplesharepassword, OpID_COp_kcfindapplesharepassword, OpID_COp_kcaddinternetpassword, OpID_COp_kcaddinternetpasswordwithpath, OpID_COp_kcfindinternetpassword, OpID_COp_kcfindinternetpasswordwithpath, OpID_COp_kcaddgenericpassword, OpID_COp_kcfindgenericpassword, OpID_COp_KCLogin, OpID_COp_KCLogout, OpID_COp_KCChangeLoginPassword, OpID_NumOperations
};
#define IS_VALID_OPERATIONID(aID) (aID >= 0 && aID < OpID_NumOperations)
typedef void * (*tClassCreatorFunc)(void *inClient);
typedef struct tOperationInfo{
const char * name;
tClassCreatorFunc func;
} tOperationInfo;
class COpRegister {
public:
static void * CreateOperation(
eKCOperationID inID,
void *inClient)
{
RegisterAll();
if(IS_VALID_OPERATIONID(inID)){
if(sOperationInfoTbl[inID].func)
return (sOperationInfoTbl[inID].func)(inClient);
}
return NULL;
}
static const char * GetOperationName(
eKCOperationID inID)
{
RegisterAll();
if(IS_VALID_OPERATIONID(inID))
return sOperationInfoTbl[inID].name;
else
return "INVALID OPERATION ID";
}
static void RegisterAll();
static void RegisterOne(
eKCOperationID inID,
const char * inName,
tClassCreatorFunc inFunc = NULL)
{
sOperationInfoTbl[inID].name = inName;
sOperationInfoTbl[inID].func = inFunc;
}
protected:
static bool sRegistered;
static tOperationInfo sOperationInfoTbl[OpID_NumOperations];
};
template <class T>
class TOpRegister{
public:
static T * Create(
void *inClient)
{
T *aOperation = new T;
if(aOperation) aOperation->SetClient(inClient);
return aOperation;
}
static void RegisterOne(
eKCOperationID inID,
const char * inName)
{
COpRegister::RegisterOne(inID, inName, (tClassCreatorFunc)Create);
}
};
#define KC_CLASS(funcname) COp_## funcname
#define KC_OP_ID(funcname) OpID_COp_## funcname
#define Register(funcname) TOpRegister<KC_CLASS(funcname)>::RegisterOne(KC_OP_ID(funcname), (const char*)#funcname "")
#define OPERATION_ID(funcname) enum{ operation_ID = KC_OP_ID(funcname) };\
eKCOperationID GetID(){ return (eKCOperationID)operation_ID; };
#endif // __KC_OPERATION_ID__