Example #1
0
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);
	}
}
Example #2
0
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;
}
Example #3
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();
	}
}