static int list_channel_CB(HANDLE hProcess, void* addr, struct __wine_debug_channel* channel, void* user) { int j; WCHAR nameW[sizeof(channel->name)], val[2]; LVITEMW lvitem; int index; HWND hChannelLV = user; MultiByteToWideChar(CP_ACP, 0, channel->name, sizeof(channel->name), nameW, sizeof(nameW)/sizeof(WCHAR)); lvitem.mask = LVIF_TEXT; lvitem.pszText = nameW; lvitem.iItem = 0; lvitem.iSubItem = 0; index = ListView_InsertItemW(hChannelLV, &lvitem); if (index == -1) return 0; val[1] = '\0'; for (j = 0; j < 4; j++) { val[0] = (channel->flags & (1 << j)) ? 'x' : ' '; ListView_SetItemTextW(hChannelLV, index, j + 1, val); } return 1; }
static void DebugChannels_OnNotify(HWND hDlg, LPARAM lParam) { NMHDR* nmh = (NMHDR*)lParam; switch (nmh->code) { case NM_CLICK: if (nmh->idFrom == IDC_DEBUG_CHANNELS_LIST) { LVHITTESTINFO lhti; HWND hChannelLV; HANDLE hProcess; NMITEMACTIVATE* nmia = (NMITEMACTIVATE*)lParam; hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, get_selected_pid()); if (!hProcess) return; /* FIXME message box */ lhti.pt = nmia->ptAction; hChannelLV = GetDlgItem(hDlg, IDC_DEBUG_CHANNELS_LIST); SendMessageW(hChannelLV, LVM_SUBITEMHITTEST, 0, (LPARAM)&lhti); if (nmia->iSubItem >= 1 && nmia->iSubItem <= 4) { WCHAR val[2]; char name[32]; unsigned bitmask = 1 << (lhti.iSubItem - 1); struct cce_user user; ListView_GetItemTextA(hChannelLV, lhti.iItem, 0, name, sizeof(name) / sizeof(name[0])); ListView_GetItemTextW(hChannelLV, lhti.iItem, lhti.iSubItem, val, sizeof(val) / sizeof(val[0])); user.name = name; user.value = (val[0] == 'x') ? 0 : bitmask; user.mask = bitmask; user.done = user.notdone = 0; enum_channel(hProcess, change_channel_CB, &user); if (user.done) { val[0] ^= ('x' ^ ' '); ListView_SetItemTextW(hChannelLV, lhti.iItem, lhti.iSubItem, val); } if (user.notdone) printf("Some channel instances weren't correctly set\n"); } CloseHandle(hProcess); } break; } }
void addwatchtolist(HWND hwnd2list, struct DBsetting *lParam) { LVITEM lvItem; int index; char data[32], tmp[32]; DBVARIANT *dbv = &(lParam->dbv); MCONTACT hContact = lParam->hContact; char *module = lParam->module; char *setting = lParam->setting; if (!module) return; lvItem.lParam = (LPARAM)lParam->hContact; lvItem.mask = LVIF_TEXT|LVIF_PARAM; lvItem.iItem = 0; lvItem.iSubItem = 0; if (!setting || (int)(lParam->setting) == WATCH_MODULE) // add every item in the module and return { ModuleSettingLL settinglist; struct DBsetting dummy; ModSetLinkLinkItem *setting; if (!EnumSettings(hContact,module,&settinglist)) return; dummy.hContact = hContact; dummy.module = mir_tstrdup(module); setting = settinglist.first; while (setting) { dummy.setting = setting->name; addwatchtolist(hwnd2list, &dummy); setting = (ModSetLinkLinkItem *)setting->next; } mir_free(dummy.module); FreeModuleSettingLL(&settinglist); return; } db_free(&(lParam->dbv)); if (GetSetting(hContact, module, setting, &(lParam->dbv))) return; if (!hContact) lvItem.pszText = "NULL"; else lvItem.pszText = (char*)GetContactName(hContact, NULL, 1); index = ListView_InsertItem(hwnd2list,&lvItem); WCHAR* ptszText = mir_a2u(lvItem.pszText); ListView_SetItemTextW(hwnd2list, index, 0, ptszText); mir_free(ptszText); ListView_SetItemText(hwnd2list,index,1,module); ListView_SetItemText(hwnd2list,index,2,setting); switch (dbv->type) { case DBVT_BLOB: { int j; char *data = NULL; if (!(data = (char*)mir_realloc(data, 3*(dbv->cpbVal+1)) )) return; data[0] = '\0'; for (j=0; j<dbv->cpbVal; j++) { char tmp[16]; mir_snprintf(tmp, SIZEOF(tmp), "%02X ", (BYTE)dbv->pbVal[j]); strcat(data, tmp); } ListView_SetItemText(hwnd2list,index,4,data); ListView_SetItemText(hwnd2list,index,3,"BLOB"); mir_free(data); } break; case DBVT_BYTE: mir_snprintf(data, 32, "0x%02X (%s)", dbv->bVal, itoa(dbv->bVal,tmp,10)); ListView_SetItemText(hwnd2list,index,4,data); ListView_SetItemText(hwnd2list,index,3,"BYTE"); break; case DBVT_WORD: mir_snprintf(data, 32, "0x%04X (%s)", dbv->wVal, itoa(dbv->wVal,tmp,10)); ListView_SetItemText(hwnd2list,index,4,data); ListView_SetItemText(hwnd2list,index,3,"WORD"); break; case DBVT_DWORD: mir_snprintf(data, 32, "0x%08X (%s)", dbv->dVal, itoa(dbv->dVal,tmp,10)); ListView_SetItemText(hwnd2list,index,4,data); ListView_SetItemText(hwnd2list,index,3,"DWORD"); break; case DBVT_ASCIIZ: ListView_SetItemText(hwnd2list,index,4,dbv->pszVal); ListView_SetItemText(hwnd2list,index,3,"STRING"); break; case DBVT_UTF8: int length = (int)strlen(dbv->pszVal) + 1; WCHAR *wc = (WCHAR*)_alloca(length*sizeof(WCHAR)); MultiByteToWideChar(CP_UTF8, 0, dbv->pszVal, -1, wc, length); ListView_SetItemTextW(hwnd2list,index,4,wc); ListView_SetItemText(hwnd2list,index,3,"UNICODE"); break; } }