void WmLButtonDownProc(HWND hwnd, LPARAM lParam){ ChannelData *cd; bool changeFlg = FALSE; ChannelDataLock.on(); cd = channelDataTop; while(cd){ int x = LOWORD(lParam); int y = HIWORD(lParam); if (cd->checkDown(LOWORD(lParam), HIWORD(lParam))){ if (!(cd->isSelected())){ changeFlg = TRUE; } cd->setSelected(TRUE); } else { if (cd->isSelected()){ changeFlg = TRUE; } cd->setSelected(FALSE); } int sx = cd->getPosX() + cd->getWidth(); int sy = cd->getPosY(); int index = 0; ServentData *sd = cd->getServentDataTop(); while(sd){ if ( ( (!cd->getOpenFlg()) && (sx + index*14 < x) && (x < sx + (index+1)*14) && (sy < y) && (y < sy + 14) ) || sd->checkDown(LOWORD(lParam), HIWORD(lParam)) ){ if (!sd->getSelected()){ changeFlg = TRUE; } sd->setSelected(TRUE); } else { if (sd->getSelected()){ changeFlg = TRUE; } sd->setSelected(FALSE); } sd = sd->getNextData(); index++; } cd = cd->getNextData(); } ChannelDataLock.off(); if (changeFlg){ MakeBack(hwnd); } }
THREAD_PROC GUIDataUpdate(ThreadInfo *thread){ int i; // set GUI thread status to running thread->finish = false; while(thread->active){ // チャンネルデータロック ChannelDataLock.on(); // チャンネルデータの更新フラグを全てFALSEにする ChannelData *cd = channelDataTop; while(cd){ // Serventの更新フラグをFALSEにする ServentData *sv = cd->getServentDataTop(); while(sv){ sv->setEnableFlg(FALSE); sv = sv->getNextData(); } cd->setEnableFlg(FALSE); cd = cd->getNextData(); } Channel *c = chanMgr->channel; // 現在存在するチャンネル分ループ while(c){ // 既にチャンネルデータを持っているか cd = channelDataTop; // 発見フラグFALSE bool bFoundFlg = FALSE; while(cd){ if (cd->getChannelId() == c->channel_id){ //既にチャンネルデータがあるので、そのまま更新 cd->setData(c); // 更新フラグTRUE cd->setEnableFlg(TRUE); // 発見フラグTRUE bFoundFlg = TRUE; // ループ離脱 break; } // 見つからなかった場合、次のデータをチェック cd = cd->getNextData(); } // 新しいチャンネルの場合、新規データ作成 if (!bFoundFlg){ // 新規データ作成 cd = ::new ChannelData(); // データ更新 cd->setData(c); // 更新フラグTRUE cd->setEnableFlg(TRUE); // 新規データをリストの先頭に入れる cd->setNextData(channelDataTop); channelDataTop = cd; } // 次のチャンネルを取得 c = c->next; } #if 1 // COUTを検索 { bool foundFlg = false; bool foundFlg2 = false; Servent *s = servMgr->servents; while (s) { if (s->type == Servent::T_COUT && s->status == Servent::S_CONNECTED) { foundFlg = true; // ChannelData末尾まで探索 ChannelData *prev = NULL; cd = channelDataTop; while (cd) { if (cd->type == Servent::T_COUT && cd->servent_id == s->servent_id) { foundFlg2 = true; cd->setEnableFlg(true); break; } prev = cd; cd = cd->getNextData(); } cd = prev; if (foundFlg2) break; // ノード追加 if (channelDataTop) { // channelDataが空でない。cdはここでリスト末尾を指してる(はず) cd->setNextData(::new ChannelData()); cd = cd->getNextData(); memset(cd, 0, sizeof(cd)); cd->setNextData(NULL); } else { // channelDataが空 channelDataTop = ::new ChannelData(); channelDataTop->setNextData(NULL); cd = channelDataTop; } // データ設定 cd->type = s->type; cd->servent_id = s->servent_id; cd->setEnableFlg(true); } s = s->next; } // COUTが切れてたら削除 if (!foundFlg) { cd = channelDataTop; ChannelData *prev = NULL; while (cd) { // COUTの情報を削除 if (cd->type == Servent::T_COUT) { // 先頭 if (!prev) { channelDataTop = cd->getNextData(); } else { prev->setNextData(cd->getNextData()); } //::delete cd; } prev = cd; cd = cd->getNextData(); } } } #endif // チャンネルがなくなっている場合の処理 cd = channelDataTop; ChannelData *prev = NULL; while(cd){ // データを更新しなかったか if (cd->getEnableFlg() == FALSE){ // チャンネルがなくなっているので削除 ChannelData *next; next = cd->getNextData(); if (!prev){ // 先頭のデータを削除 // ここメモリリークしそう by えるー channelDataTop = next; } else { // 途中のデータを削除 prev->setNextData(next); } // 次のデータへ cd = next; } else { // データ更新済:次のデータへ prev = cd; cd = cd->getNextData(); } } Servent *s = servMgr->servents; while(s){ // 初期化 ChanHitList *chl; bool infoFlg = false; bool relay = true; bool firewalled = false; unsigned int numRelays = 0; int vp_ver = 0; char ver_ex_prefix[2] = {' ', ' '}; int ver_ex_number = 0; // 直下ホスト情報チェック unsigned int totalRelays = 0; unsigned int totalListeners = 0; ChanHit hitData; // 受信中か if ((s->type == Servent::T_RELAY) && (s->status == Servent::S_CONNECTED)){ // ホスト情報ロック chanMgr->hitlistlock.on(); // 直下ホストが受信しているチャンネルのホスト情報を取得 chl = chanMgr->findHitListByID(s->chanID); // チャンネルのホスト情報があるか if (chl){ // チャンネルのホスト情報がある場合 ChanHit *hit = chl->hit; // チャンネルのホスト情報を全走査して while(hit){ // IDが同じものであれば if (hit->servent_id == s->servent_id){ // トータルリレーとトータルリスナーを加算 totalRelays += hit->numRelays; totalListeners += hit->numListeners; // 直下であれば if (hit->numHops == 1){ // 情報を一旦保存 infoFlg = true; hitData.relay = hit->relay; hitData.firewalled = hit->firewalled; hitData.numRelays = hit->numRelays; hitData.version_vp = hit->version_vp; hitData.version_ex_prefix[0] = hit->version_ex_prefix[0]; hitData.version_ex_prefix[1] = hit->version_ex_prefix[1]; hitData.version_ex_number = hit->version_ex_number; } } // 次をチェック hit = hit->next; } } // チャンネルデータからServentを検索 bool bFoundFlg = FALSE; cd = channelDataTop; while(cd){ ServentData *sv = cd->findServentData(s->servent_id); // ServentDataがあれば if (sv && cd->getChannelId() == s->channel_id){ // データ設定 sv->setData(s, &hitData, totalListeners, totalRelays, infoFlg); sv->setEnableFlg(TRUE); bFoundFlg = TRUE; break; } cd = cd->getNextData(); } // ServentDataが見つからなかった場合 if (!bFoundFlg){ // チャンネルデータを探す cd = channelDataTop; while(cd){ // チャンネルIDが同じか if (cd->getChannelId() == s->channel_id){ // データ設定 ServentData *sv = ::new ServentData(); sv->setData(s, &hitData, totalListeners, totalRelays, infoFlg); sv->setEnableFlg(TRUE); // チャンネルデータにServentData追加 cd->addServentData(sv); // ホスト名を取得する IdData *id = ::new IdData(cd->getChannelId(), sv->getServentId(), sv->getHost().ip); ThreadInfo *t; t = ::new ThreadInfo(); t->func = GetHostName; t->data = (void*)id; sys->startThread(t); LOG_DEBUG("resolving thread was started(%d)", id->getServentId()); // ループ終了 break; } // 次のデータへ cd = cd->getNextData(); } } // ホスト情報アンロック chanMgr->hitlistlock.off(); } s = s->next; } // 更新していないServentDataを削除 cd = channelDataTop; while(cd){ cd->deleteDisableServents(); cd = cd->getNextData(); } // チャンネルデータアンロック ChannelDataLock.off(); // 描画更新 if (guiWnd){ MakeBack(guiWnd); } // 0.1秒×10で1秒待ち for(i=0; i<2; i++) { if (!thread->active) break; sys->sleep(100); } } // set GUI thread status to terminated thread->finish = true; return 0; }
void WmRButtonDownProc(HWND hwnd, LPARAM lParam){ ChannelData *cd; bool changeFlg = FALSE; bool channel_selected = FALSE; bool servent_selected = FALSE; int channel_id = 0; int servent_id = 0; cd = channelDataTop; while(cd){ if (cd->checkDown(LOWORD(lParam), HIWORD(lParam))){ if (!(cd->isSelected())){ changeFlg = TRUE; } cd->setSelected(TRUE); channel_id = cd->getChannelId(); channel_selected = TRUE; // COUT識別 if (cd->type == Servent::T_COUT) { channel_selected = FALSE; servent_selected = TRUE; servent_id = cd->servent_id; } } else { if (cd->isSelected()){ changeFlg = TRUE; } cd->setSelected(FALSE); } ServentData *sd = cd->getServentDataTop(); while(sd){ if (sd->checkDown(LOWORD(lParam), HIWORD(lParam))){ if (!sd->getSelected()){ changeFlg = TRUE; } sd->setSelected(TRUE); servent_id = sd->getServentId(); servent_selected = TRUE; } else { if (sd->getSelected()){ changeFlg = TRUE; } sd->setSelected(FALSE); } sd = sd->getNextData(); } cd = cd->getNextData(); } if (changeFlg){ MakeBack(hwnd); } if (channel_selected){ PopupChannelMenu(channel_id); } else if (servent_selected){ PopupServentMenu(servent_id); } else { PopupOtherMenu(); } }