#include "credprov.h"
#include<assert.h>
khm_int32 credtype_id = KCDB_CREDTYPE_INVALID;
khm_handle g_credset = NULL;
khm_int32 KHMAPI
handle_kmsg_system(khm_int32 msg_type,
khm_int32 msg_subtype,
khm_ui_4 uparam,
void * vparam) {
khm_int32 rv = KHM_ERROR_SUCCESS;
switch (msg_subtype) {
case KMSG_SYSTEM_INIT:
{
kcdb_credtype ct;
wchar_t short_desc[KCDB_MAXCCH_SHORT_DESC];
wchar_t long_desc[KCDB_MAXCCH_LONG_DESC];
khui_config_node cnode;
khui_config_node_reg creg;
ZeroMemory(&ct, sizeof(ct));
ct.id = KCDB_CREDTYPE_AUTO;
ct.name = MYCREDTYPE_NAMEW;
short_desc[0] = L'\0';
LoadString(hResModule, IDS_CT_SHORT_DESC,
short_desc, ARRAYLENGTH(short_desc));
long_desc[0] = L'\0';
LoadString(hResModule, IDS_CT_LONG_DESC,
long_desc, ARRAYLENGTH(long_desc));
ct.icon = NULL;
kmq_create_subscription(plugin_msg_proc, &ct.sub);
ct.is_equal = cred_is_equal;
rv = kcdb_credtype_register(&ct, &credtype_id);
kcdb_credset_create(&g_credset);
ZeroMemory(&creg, sizeof(creg));
short_desc[0] = L'\0';
LoadString(hResModule, IDS_CFG_SHORT_DESC,
short_desc, ARRAYLENGTH(short_desc));
long_desc[0] = L'\0';
LoadString(hResModule, IDS_CFG_LONG_DESC,
long_desc, ARRAYLENGTH(long_desc));
creg.name = CONFIGNODE_MAIN;
creg.short_desc = short_desc;
creg.long_desc = long_desc;
creg.h_module = hResModule;
creg.dlg_template = MAKEINTRESOURCE(IDD_CONFIG);
creg.dlg_proc = config_dlgproc;
creg.flags = 0;
khui_cfg_register(NULL, &creg);
if (KHM_FAILED(khui_cfg_open(NULL, L"KhmIdentities", &cnode))) {
assert(FALSE);
rv = KHM_ERROR_NOT_FOUND;
break;
}
ZeroMemory(&creg, sizeof(creg));
short_desc[0] = L'\0';
LoadString(hResModule, IDS_CFG_IDS_SHORT_DESC,
short_desc, ARRAYLENGTH(short_desc));
long_desc[0] = L'\0';
LoadString(hResModule, IDS_CFG_IDS_LONG_DESC,
long_desc, ARRAYLENGTH(long_desc));
creg.name = CONFIGNODE_ALL_ID;
creg.short_desc = short_desc;
creg.long_desc = long_desc;
creg.h_module = hResModule;
creg.dlg_template = MAKEINTRESOURCE(IDD_CONFIG_IDS);
creg.dlg_proc = config_ids_dlgproc;
creg.flags = KHUI_CNFLAG_SUBPANEL;
khui_cfg_register(cnode, &creg);
ZeroMemory(&creg, sizeof(creg));
short_desc[0] = L'\0';
LoadString(hResModule, IDS_CFG_ID_SHORT_DESC,
short_desc, ARRAYLENGTH(short_desc));
long_desc[0] = L'\0';
LoadString(hResModule, IDS_CFG_ID_LONG_DESC,
long_desc, ARRAYLENGTH(long_desc));
creg.name = CONFIGNODE_PER_ID;
creg.short_desc = short_desc;
creg.long_desc = long_desc;
creg.h_module = hResModule;
creg.dlg_template = MAKEINTRESOURCE(IDD_CONFIG_ID);
creg.dlg_proc = config_id_dlgproc;
creg.flags = KHUI_CNFLAG_SUBPANEL | KHUI_CNFLAG_PLURAL;
khui_cfg_register(cnode, &creg);
khui_cfg_release(cnode);
}
break;
case KMSG_SYSTEM_EXIT:
{
khui_config_node cnode;
khui_config_node cn_idents;
if (credtype_id != KCDB_CREDTYPE_INVALID) {
kcdb_credtype_unregister(credtype_id);
credtype_id = KCDB_CREDTYPE_INVALID;
}
if (g_credset) {
kcdb_credset_delete(g_credset);
g_credset = NULL;
}
if (KHM_SUCCEEDED(khui_cfg_open(NULL, CONFIGNODE_MAIN, &cnode))) {
khui_cfg_remove(cnode);
khui_cfg_release(cnode);
}
if (KHM_SUCCEEDED(khui_cfg_open(NULL, L"KhmIdentities", &cn_idents))) {
if (KHM_SUCCEEDED(khui_cfg_open(cn_idents,
CONFIGNODE_ALL_ID,
&cnode))) {
khui_cfg_remove(cnode);
khui_cfg_release(cnode);
}
if (KHM_SUCCEEDED(khui_cfg_open(cn_idents,
CONFIGNODE_PER_ID,
&cnode))) {
khui_cfg_remove(cnode);
khui_cfg_release(cnode);
}
khui_cfg_release(cn_idents);
}
}
break;
}
return rv;
}
khm_int32
handle_kmsg_cred_refresh(void) {
return KHM_ERROR_SUCCESS;
}
khm_int32
handle_kmsg_cred_destroy_creds(khui_action_context * ctx) {
return KHM_ERROR_SUCCESS;
}
khm_int32
handle_kmsg_cred_pp_begin(khui_property_sheet * ps) {
PROPSHEETPAGE *p;
if (ps->credtype == credtype_id &&
ps->cred) {
p = malloc(sizeof(*p));
ZeroMemory(p, sizeof(*p));
p->dwSize = sizeof(*p);
p->dwFlags = 0;
p->hInstance = hResModule;
p->pszTemplate = MAKEINTRESOURCE(IDD_PP_CRED);
p->pfnDlgProc = pp_cred_dlg_proc;
p->lParam = (LPARAM) ps;
khui_ps_add_page(ps, credtype_id, 0, p, NULL);
}
return KHM_ERROR_SUCCESS;
}
khm_int32
handle_kmsg_cred_pp_end(khui_property_sheet * ps) {
khui_property_page * p = NULL;
khui_ps_find_page(ps, credtype_id, &p);
if (p) {
if (p->p_page)
free(p->p_page);
p->p_page = NULL;
}
return KHM_ERROR_SUCCESS;
}
khm_int32
handle_kmsg_cred_addr_change(void) {
return KHM_ERROR_SUCCESS;
}
khm_int32 KHMAPI
handle_kmsg_cred(khm_int32 msg_type,
khm_int32 msg_subtype,
khm_ui_4 uparam,
void * vparam) {
khm_int32 rv = KHM_ERROR_SUCCESS;
switch(msg_subtype) {
case KMSG_CRED_REFRESH:
return handle_kmsg_cred_refresh();
case KMSG_CRED_DESTROY_CREDS:
return handle_kmsg_cred_destroy_creds((khui_action_context *) vparam);
case KMSG_CRED_PP_BEGIN:
return handle_kmsg_cred_pp_begin((khui_property_sheet *) vparam);
case KMSG_CRED_PP_END:
return handle_kmsg_cred_pp_end((khui_property_sheet *) vparam);
case KMSG_CRED_ADDR_CHANGE:
return handle_kmsg_cred_addr_change();
default:
if (IS_CRED_ACQ_MSG(msg_subtype))
return handle_cred_acq_msg(msg_type, msg_subtype,
uparam, vparam);
}
return rv;
}
khm_int32 KHMAPI plugin_msg_proc(khm_int32 msg_type,
khm_int32 msg_subtype,
khm_ui_4 uparam,
void * vparam) {
switch(msg_type) {
case KMSG_SYSTEM:
return handle_kmsg_system(msg_type, msg_subtype, uparam, vparam);
case KMSG_CRED:
return handle_kmsg_cred(msg_type, msg_subtype, uparam, vparam);
}
return KHM_ERROR_SUCCESS;
}