/* This is obviously a very stripped down implementation that only attempts to implement the bare minimum functionality needed by this plug-in. */ khm_int32 KHMAPI int_kcdb_get_resource(khm_handle h, kcdb_resource_id r_id, khm_int32 flags, khm_int32 *prflags, void * vparam, void * buf, khm_size * pcb_buf) { if (r_id == KCDB_RES_DISPLAYNAME) { return kcdb_buf_get_attr_string(h, KCDB_ATTR_NAME, buf, pcb_buf, 0); } return KHM_ERROR_NOT_FOUND; }
void pw_update_property_data(HWND hw, pw_data * d) { HWND hwnd_lv; khm_int32 * attrs = NULL; hwnd_lv = d->hwnd_lv; if(hwnd_lv == NULL) return; ListView_DeleteAllItems(hwnd_lv); if(d->record != NULL) { wchar_t * buffer; khm_size attr_count; khm_size i; khm_size cb_buf; khm_size t; LVITEM lvi; int idx; if(KHM_FAILED(kcdb_attrib_get_count( KCDB_ATTR_FLAG_VOLATILE | KCDB_ATTR_FLAG_HIDDEN, 0, &attr_count))) return; attrs = PMALLOC(sizeof(khm_int32) * attr_count); assert(attrs != NULL); kcdb_attrib_get_ids( KCDB_ATTR_FLAG_VOLATILE | KCDB_ATTR_FLAG_HIDDEN, 0, attrs, &attr_count); cb_buf = sizeof(wchar_t) * 2048; buffer = PMALLOC(cb_buf); assert(buffer != NULL); for(i=0; i<attr_count; i++) { if(KHM_FAILED(kcdb_buf_get_attr(d->record, attrs[i], NULL, NULL, NULL))) continue; ZeroMemory(&lvi, sizeof(lvi)); lvi.mask = LVIF_TEXT | LVIF_PARAM; lvi.iItem = (int) i; lvi.iSubItem = 0; lvi.pszText = buffer; lvi.lParam = (LPARAM) attrs[i]; t = cb_buf; kcdb_attrib_describe(attrs[i], buffer, &t, KCDB_TS_SHORT); idx = ListView_InsertItem(hwnd_lv, &lvi); ZeroMemory(&lvi, sizeof(lvi)); lvi.mask = LVIF_TEXT; lvi.iItem = idx; lvi.iSubItem = 1; lvi.pszText = buffer; t = cb_buf; kcdb_buf_get_attr_string(d->record, attrs[i], buffer, &t, 0); ListView_SetItem(hwnd_lv, &lvi); } PFREE(attrs); PFREE(buffer); } }