--- /dev/null
+// ------------------------------------------------
+// File : gui.cpp
+// Date: 4-apr-2002
+// Author: giles
+// Desc:
+// Windows front end GUI, PeerCast core is not dependant on any of this.
+// Its very messy at the moment, but then again Windows UI always is.
+// I really don`t like programming win32 UI.. I want my borland back..
+//
+// (c) 2002 peercast.org
+// ------------------------------------------------
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+// ------------------------------------------------
+
+#include <windows.h>
+#include "stdio.h"
+#include "string.h"
+#include "stdarg.h"
+#include "resource.h"
+#include "socket.h"
+#include "win32/wsys.h"
+#include "servent.h"
+#include "win32/wsocket.h"
+#include "inifile.h"
+#include "gui.h"
+#include "servmgr.h"
+#include "peercast.h"
+#include "simple.h"
+#ifdef _DEBUG
+#include "chkMemoryLeak.h"
+#define DEBUG_NEW new(__FILE__, __LINE__)
+#define new DEBUG_NEW
+#endif
+
+ThreadInfo guiThread;
+bool shownChannels=false;
+
+class ListData{
+public:
+ int channel_id;
+ char name[21];
+ int bitRate;
+ int status;
+ const char *statusStr;
+ int totalListeners;
+ int totalRelays;
+ int localListeners;
+ int localRelays;
+ bool stayConnected;
+ ChanHit chDisp;
+ bool bTracker;
+
+ bool flg;
+ ListData *next;
+};
+
+class ServentData{
+public:
+ int servent_id;
+ unsigned int tnum;
+ int type;
+ int status;
+ String agent;
+ Host h;
+ unsigned int syncpos;
+ char *typeStr;
+ char *statusStr;
+ bool infoFlg;
+ bool relay;
+ bool firewalled;
+ unsigned int numRelays;
+ unsigned int totalRelays;
+ unsigned int totalListeners;
+ int vp_ver;
+ char ver_ex_prefix[2];
+ int ver_ex_number;
+
+ bool flg;
+ ServentData *next;
+
+ unsigned int lastSkipTime;
+ unsigned int lastSkipCount;
+};
+
+ListData *list_top = NULL;
+ServentData *servent_top = NULL;
+
+// --------------------------------------------------
+// for PCRaw (connection list) start
+WNDPROC wndOldListBox = NULL, wndOldConnListBox = NULL;
+bool sleep_skip = false;
+
+LRESULT CALLBACK ListBoxProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ switch(message)
+ {
+ case WM_LBUTTONDOWN:
+ {
+ int index = SendMessage(hwnd, LB_ITEMFROMPOINT, 0, lParam);
+ if(index >= 0x10000)
+ {
+ SendMessage(hwnd, LB_SETCURSEL, (DWORD)-1, 0L);
+ }
+ sleep_skip = true;
+ }
+ break;
+
+ case WM_LBUTTONDBLCLK:
+ {
+ int index = SendMessage(hwnd, LB_ITEMFROMPOINT, 0, lParam);
+ if(index < 0x10000)
+ {
+ SendMessage(guiWnd, WM_COMMAND, IDC_BUTTON8, NULL);
+ }
+ }
+ break;
+
+ case WM_RBUTTONDOWN:
+ {
+ POINT pos;
+ MENUITEMINFO info, separator;
+ HMENU hMenu;
+ DWORD dwID;
+
+ int index = SendMessage(hwnd, LB_ITEMFROMPOINT, 0, lParam);
+ if(index < 0x10000)
+ {
+ SendMessage(hwnd, LB_SETCURSEL, (DWORD)index, 1L);
+ }
+ else
+ {
+ SendMessage(hwnd, LB_SETCURSEL, (DWORD)-1, 0L);
+ sleep_skip = true;
+ break;
+ }
+
+ hMenu = CreatePopupMenu();
+
+ memset(&separator, 0, sizeof(MENUITEMINFO));
+ separator.cbSize = sizeof(MENUITEMINFO);
+ separator.fMask = MIIM_ID | MIIM_TYPE;
+ separator.fType = MFT_SEPARATOR;
+ separator.wID = 8000;
+
+ memset(&info, 0, sizeof(MENUITEMINFO));
+ info.cbSize = sizeof(MENUITEMINFO);
+ info.fMask = MIIM_ID | MIIM_TYPE;
+ info.fType = MFT_STRING;
+
+ info.wID = 1001;
+ info.dwTypeData = "\90Ø\92f(&X)";
+ InsertMenuItem(hMenu, -1, true, &info);
+
+ InsertMenuItem(hMenu, -1, true, &separator);
+
+ info.wID = 1000;
+ info.dwTypeData = "\8dÄ\90¶(&P)";
+ InsertMenuItem(hMenu, -1, true, &info);
+
+ InsertMenuItem(hMenu, -1, true, &separator);
+
+ info.wID = 1002;
+ info.dwTypeData = "\8dÄ\90Ú\91±(&R)";
+ InsertMenuItem(hMenu, -1, true, &info);
+
+ info.wID = 1003;
+ info.dwTypeData = "\83L\81[\83v(&K)";
+ InsertMenuItem(hMenu, -1, true, &info);
+
+ InsertMenuItem(hMenu, -1, true, &separator);
+
+ info.wID = 2000;
+ info.dwTypeData = "\91I\91ð\89ð\8f\9c(&D)";
+ InsertMenuItem(hMenu, -1, true, &info);
+
+ GetCursorPos(&pos);
+ dwID = TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RETURNCMD, pos.x, pos.y, 0, hwnd, NULL);
+
+ DestroyMenu(hMenu);
+
+ switch(dwID)
+ {
+ case 1000:
+ SendMessage(guiWnd, WM_COMMAND, IDC_BUTTON8, NULL);
+ break;
+
+ case 1001:
+ SendMessage(guiWnd, WM_COMMAND, IDC_BUTTON5, NULL);
+ break;
+
+ case 1002:
+ SendMessage(guiWnd, WM_COMMAND, IDC_BUTTON3, NULL);
+ break;
+
+ case 1003:
+ SendMessage(guiWnd, WM_COMMAND, IDC_BUTTON9, NULL);
+ break;
+
+ case 2000:
+ SendMessage(hwnd, LB_SETCURSEL, (DWORD)-1, 0L);
+ sleep_skip = true;
+ break;
+ }
+
+ }
+ break;
+
+ case WM_KEYDOWN:
+ sleep_skip = true;
+ break;
+ }
+
+ return CallWindowProc(wndOldListBox, hwnd, message, wParam, lParam);
+}
+
+LRESULT CALLBACK ConnListBoxProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ switch(message)
+ {
+ case WM_LBUTTONDOWN:
+ {
+ int index = SendMessage(hwnd, LB_ITEMFROMPOINT, 0, lParam);
+ if(index >= 0x10000)
+ {
+ SendMessage(hwnd, LB_SETCURSEL, (DWORD)-1, 0L);
+ }
+ }
+ break;
+
+ case WM_RBUTTONDOWN:
+ {
+ POINT pos;
+ MENUITEMINFO info;
+ HMENU hMenu;
+ DWORD dwID;
+
+ int index = SendMessage(hwnd, LB_ITEMFROMPOINT, 0, lParam);
+ if(index < 0x10000)
+ {
+ SendMessage(hwnd, LB_SETCURSEL, (DWORD)index, 1L);
+ }
+ else
+ {
+ SendMessage(hwnd, LB_SETCURSEL, (DWORD)-1, 0L);
+ break;
+ }
+
+ hMenu = CreatePopupMenu();
+
+ memset(&info, 0, sizeof(MENUITEMINFO));
+ info.cbSize = sizeof(MENUITEMINFO);
+ info.fMask = MIIM_ID | MIIM_TYPE;
+ info.fType = MFT_STRING;
+
+ info.wID = 1001;
+ info.dwTypeData = "\90Ø\92f(&X)";
+ InsertMenuItem(hMenu, -1, true, &info);
+
+ GetCursorPos(&pos);
+ dwID = TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RETURNCMD, pos.x, pos.y, 0, hwnd, NULL);
+
+ DestroyMenu(hMenu);
+
+ switch(dwID)
+ {
+ case 1001:
+ SendMessage(guiWnd, WM_COMMAND, IDC_BUTTON6, NULL);
+ break;
+ }
+
+ }
+ break;
+ }
+
+ return CallWindowProc(wndOldConnListBox, hwnd, message, wParam, lParam);
+}
+// for PCRaw (connection list) end
+// --------------------------------------------------
+int logID,statusID,hitID,chanID;
+
+// --------------------------------------------------
+bool getButtonState(int id)
+{
+ return SendDlgItemMessage(guiWnd, id,BM_GETCHECK, 0, 0) == BST_CHECKED;
+}
+
+// --------------------------------------------------
+void enableControl(int id, bool on)
+{
+ EnableWindow(GetDlgItem(guiWnd,id),on);
+}
+
+// --------------------------------------------------
+void enableEdit(int id, bool on)
+{
+ SendDlgItemMessage(guiWnd, id,WM_ENABLE, on, 0);
+ SendDlgItemMessage(guiWnd, id,EM_SETREADONLY, !on, 0);
+}
+// --------------------------------------------------
+int getEditInt(int id)
+{
+ char str[128];
+ SendDlgItemMessage(guiWnd, id,WM_GETTEXT, 128, (LONG)str);
+ return atoi(str);
+}
+// --------------------------------------------------
+char * getEditStr(int id)
+{
+ static char str[128];
+ SendDlgItemMessage(guiWnd, id,WM_GETTEXT, 128, (LONG)str);
+ return str;
+}
+// --------------------------------------------------
+void setEditStr(int id, char *str)
+{
+ SendDlgItemMessage(guiWnd, id,WM_SETTEXT, 0, (LONG)str);
+}
+// --------------------------------------------------
+void setEditInt(int id, int v)
+{
+ char str[128];
+ sprintf(str,"%d",v);
+ SendDlgItemMessage(guiWnd, id,WM_SETTEXT, 0, (LONG)str);
+}
+
+// --------------------------------------------------
+void *getListBoxSelData(int id)
+{
+ int sel = SendDlgItemMessage(guiWnd, id,LB_GETCURSEL, 0, 0);
+ if (sel >= 0)
+ return (void *)SendDlgItemMessage(guiWnd, id,LB_GETITEMDATA, sel, 0);
+ return NULL;
+}
+
+Channel *getListBoxChannel(){
+ int sel = SendDlgItemMessage(guiWnd, chanID ,LB_GETCURSEL, 0, 0);
+ if (sel >= 0){
+ ListData *ld = list_top;
+ int idx = 0;
+
+ while(ld){
+ if (sel == idx){
+ return chanMgr->findChannelByChannelID(ld->channel_id);
+ }
+ ld = ld->next;
+ idx++;
+ }
+ }
+ return NULL;
+}
+
+Servent *getListBoxServent(){
+ int sel = SendDlgItemMessage(guiWnd, statusID ,LB_GETCURSEL, 0, 0);
+ if (sel >= 0){
+ ServentData *sd = servent_top;
+ int idx = 0;
+
+ while(sd){
+ if (sel == idx){
+ return servMgr->findServentByServentID(sd->servent_id);
+ }
+ sd = sd->next;
+ idx++;
+ }
+ }
+ return NULL;
+}
+
+// --------------------------------------------------
+void setButtonState(int id, bool on)
+{
+ SendDlgItemMessage(guiWnd, id,BM_SETCHECK, on, 0);
+ SendMessage(guiWnd,WM_COMMAND,id,0);
+}
+// --------------------------------------------------
+void ADDLOG(const char *str,int id,bool sel,void *data, LogBuffer::TYPE type)
+{
+ if (guiWnd)
+ {
+
+ String sjis; //JP-EX
+ int num = SendDlgItemMessage(guiWnd, id,LB_GETCOUNT, 0, 0);
+ if (num > 100)
+ {
+ SendDlgItemMessage(guiWnd, id, LB_DELETESTRING, 0, 0);
+ num--;
+ }
+ sjis = str; //JP-Patch
+ sjis.convertTo(String::T_SJIS); //JP-Patch
+ //int idx = SendDlgItemMessage(guiWnd, id, LB_ADDSTRING, 0, (LONG)(LPSTR)str);
+ int idx = SendDlgItemMessage(guiWnd, id, LB_ADDSTRING, 0, (LONG)(LPSTR)sjis.cstr());
+ SendDlgItemMessage(guiWnd, id, LB_SETITEMDATA, idx, (LONG)data);
+
+ if (sel)
+ SendDlgItemMessage(guiWnd, id, LB_SETCURSEL, num, 0);
+
+ }
+
+ if (type != LogBuffer::T_NONE)
+ {
+#if _DEBUG
+ OutputDebugString(str);
+ OutputDebugString("\n");
+#endif
+ }
+
+}
+
+
+// --------------------------------------------------
+void ADDLOG2(const char *fmt,va_list ap,int id,bool sel,void *data, LogBuffer::TYPE type)
+{
+ char str[4096];
+ vsprintf(str,fmt,ap);
+
+ ADDLOG(str,id,sel,data,type);
+}
+
+// --------------------------------------------------
+void ADDCHAN(void *d, const char *fmt,...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ ADDLOG2(fmt,ap,chanID,false,d,LogBuffer::T_NONE);
+ va_end(ap);
+}
+// --------------------------------------------------
+void ADDHIT(void *d, const char *fmt,...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ ADDLOG2(fmt,ap,hitID,false,d,LogBuffer::T_NONE);
+ va_end(ap);
+}
+// --------------------------------------------------
+void ADDCONN(void *d, const char *fmt,...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ ADDLOG2(fmt,ap,statusID,false,d,LogBuffer::T_NONE);
+ va_end(ap);
+}
+
+WLock sd_lock;
+WLock ld_lock;
+
+// --------------------------------------------------
+THREAD_PROC showConnections(ThreadInfo *thread)
+{
+// thread->lock();
+ while (thread->active)
+ {
+ int sel,top,i;
+/* sel = SendDlgItemMessage(guiWnd, statusID,LB_GETCURSEL, 0, 0);
+ top = SendDlgItemMessage(guiWnd, statusID,LB_GETTOPINDEX, 0, 0);
+
+ SendDlgItemMessage(guiWnd, statusID, LB_RESETCONTENT, 0, 0);
+ Servent *s = servMgr->servents;
+ while (s)
+ {
+ if (s->type != Servent::T_NONE)
+ {
+ Host h = s->getHost();
+ {
+ unsigned int ip = h.ip;
+ unsigned short port = h.port;
+
+ Host h(ip,port);
+ char hostName[64];
+ h.toStr(hostName);
+
+ unsigned int tnum = 0;
+ char tdef = 's';
+ if (s->lastConnect)
+ tnum = sys->getTime()-s->lastConnect;
+
+ if ((s->type == Servent::T_RELAY) || (s->type == Servent::T_DIRECT))
+ {
+ ADDCONN(s,"%s-%s-%d%c - %s - %d - %s ",
+ s->getTypeStr(),s->getStatusStr(),tnum,tdef,
+ hostName,
+ s->syncPos,s->agent.cstr()
+ ); //JP-Patch
+ }else{
+ if (s->status == Servent::S_CONNECTED)
+ {
+ ADDCONN(s,"%s-%s-%d%c - %s - %d/%d",
+ s->getTypeStr(),s->getStatusStr(),tnum,tdef,
+ hostName,
+ s->gnuStream.packetsIn,s->gnuStream.packetsOut);
+ }else{
+ ADDCONN(s,"%s-%s-%d%c - %s",
+ s->getTypeStr(),s->getStatusStr(),tnum,tdef,
+ hostName
+ );
+ }
+
+ }
+
+ }
+ }
+ s=s->next;
+ }
+ if (sel >= 0)
+ SendDlgItemMessage(guiWnd, statusID,LB_SETCURSEL, sel, 0);
+ if (top >= 0)
+ SendDlgItemMessage(guiWnd, statusID,LB_SETTOPINDEX, top, 0);*/
+
+ int sd_count = 0;
+ int diff = 0;
+
+ sel = SendDlgItemMessage(guiWnd, statusID,LB_GETCURSEL, 0, 0);
+ top = SendDlgItemMessage(guiWnd, statusID,LB_GETTOPINDEX, 0, 0);
+
+ ServentData *sd = servent_top;
+ while(sd){
+ sd->flg = false;
+ sd = sd->next;
+ sd_count++;
+ }
+
+ servMgr->lock.on();
+ Servent *s = servMgr->servents;
+
+ Channel *sel_ch = getListBoxChannel(); // for PCRaw (connection list)
+
+ while(s){
+ Servent *next;
+ bool foundFlg = false;
+ ChanHitList *chl;
+ bool infoFlg = false;
+ bool relay = true;
+ bool firewalled = false;
+ unsigned int numRelays = 0;
+ unsigned int totalRelays = 0;
+ unsigned int totalListeners = 0;
+ int vp_ver = 0;
+ char ver_ex_prefix[2] = {' ', ' '};
+ int ver_ex_number = 0;
+
+ next = s->next;
+
+ // for PCRaw (connection list) start
+ if(sel_ch && !sel_ch->info.id.isSame(s->chanID))
+ {
+ s = next;
+ continue;
+ }
+ // for PCRaw (connection list) end
+
+ if (s->type != Servent::T_NONE){
+
+ chanMgr->hitlistlock.on();
+
+ chl = chanMgr->findHitListByID(s->chanID);
+ if (chl){
+ ChanHit *hit = chl->hit;
+ while(hit){
+ if (hit->servent_id == s->servent_id){
+ if ((hit->numHops == 1)/* && (hit->host.ip == s->getHost().ip)*/){
+ infoFlg = true;
+ relay = hit->relay;
+ firewalled = hit->firewalled;
+ numRelays = hit->numRelays;
+ vp_ver = hit->version_vp;
+ ver_ex_prefix[0] = hit->version_ex_prefix[0];
+ ver_ex_prefix[1] = hit->version_ex_prefix[1];
+ ver_ex_number = hit->version_ex_number;
+ }
+ totalRelays += hit->numRelays;
+ totalListeners += hit->numListeners;
+ }
+ hit = hit->next;
+ }
+ }
+ chanMgr->hitlistlock.off();
+ }
+
+ sd = servent_top;
+ while(sd){
+ if (sd->servent_id == s->servent_id){
+ foundFlg = true;
+ if (s->thread.finish) break;
+ sd->flg = true;
+ sd->type = s->type;
+ sd->status = s->status;
+ sd->agent = s->agent;
+ sd->h = s->getHost();
+ sd->syncpos = s->syncPos;
+ sd->tnum = (s->lastConnect) ? sys->getTime()-s->lastConnect : 0;
+ sd->typeStr = s->getTypeStr();
+ sd->statusStr = s->getStatusStr();
+ sd->infoFlg = infoFlg;
+ sd->relay = relay;
+ sd->firewalled = firewalled;
+ sd->numRelays = numRelays;
+ sd->totalRelays = totalRelays;
+ sd->totalListeners = totalListeners;
+ sd->vp_ver = vp_ver;
+ sd->lastSkipTime = s->lastSkipTime;
+ sd->lastSkipCount = s->lastSkipCount;
+ sd->ver_ex_prefix[0] = ver_ex_prefix[0];
+ sd->ver_ex_prefix[1] = ver_ex_prefix[1];
+ sd->ver_ex_number = ver_ex_number;
+ break;
+ }
+ sd = sd->next;
+ }
+ if (!foundFlg && (s->type != Servent::T_NONE) && !s->thread.finish){
+ ServentData *newData = new ServentData();
+ newData->next = servent_top;
+ servent_top = newData;
+ newData->flg = true;
+ newData->servent_id = s->servent_id;
+ newData->type = s->type;
+ newData->status = s->status;
+ newData->agent = s->agent;
+ newData->h = s->getHost();
+ newData->syncpos = s->syncPos;
+ newData->tnum = (s->lastConnect) ? sys->getTime()-s->lastConnect : 0;
+ newData->typeStr = s->getTypeStr();
+ newData->statusStr = s->getStatusStr();
+ newData->infoFlg = infoFlg;
+ newData->relay = relay;
+ newData->firewalled = firewalled;
+ newData->numRelays = numRelays;
+ newData->totalRelays = totalRelays;
+ newData->totalListeners = totalListeners;
+ newData->vp_ver = vp_ver;
+ newData->lastSkipTime = s->lastSkipTime;
+ newData->lastSkipCount = s->lastSkipCount;
+ newData->ver_ex_prefix[0] = ver_ex_prefix[0];
+ newData->ver_ex_prefix[1] = ver_ex_prefix[1];
+ newData->ver_ex_number = ver_ex_number;
+
+ int idx = SendDlgItemMessage(guiWnd, statusID, LB_ADDSTRING, 0, (LONG)"");
+ SendDlgItemMessage(guiWnd, statusID, LB_SETITEMDATA, idx, (LONG)(newData->servent_id));
+ diff++;
+ }
+ s = next;
+ }
+ servMgr->lock.off();
+
+ sd_lock.on();
+ sd = servent_top;
+ int idx = 0;
+ ServentData *prev = NULL;
+ //int *idxs;
+ //if (sd_count){
+ // idxs = new int[sd_count];
+ //}
+ while(sd){
+ if (!sd->flg || (sd->type == Servent::T_NONE)){
+ ServentData *next = sd->next;
+ if (!prev){
+ servent_top = next;
+ } else {
+ prev->next = next;
+ }
+ delete sd;
+
+ PostMessage(GetDlgItem(guiWnd, statusID), LB_DELETESTRING, idx, 0);
+// SendDlgItemMessage(guiWnd, statusID, LB_DELETESTRING, idx, 0);
+ sd = next;
+// diff--;
+ } else {
+ idx++;
+ prev = sd;
+ sd = sd->next;
+ }
+ }
+ sd_lock.off();
+
+ if ((sel >= 0) && (diff != 0)){
+ PostMessage(GetDlgItem(guiWnd, statusID), LB_SETCURSEL, sel+diff, 0);
+ }
+ if (top >= 0){
+ PostMessage(GetDlgItem(guiWnd, statusID), LB_SETTOPINDEX, top, 0);
+ }
+ InvalidateRect(GetDlgItem(guiWnd, statusID), NULL, FALSE);
+
+ char cname[34];
+
+ {
+// sel = SendDlgItemMessage(guiWnd, chanID,LB_GETCURSEL, 0, 0);
+// top = SendDlgItemMessage(guiWnd, chanID,LB_GETTOPINDEX, 0, 0);
+// SendDlgItemMessage(guiWnd, chanID, LB_RESETCONTENT, 0, 0);
+
+ ListData *ld = list_top;
+ while(ld){
+ ld->flg = false;
+ ld = ld->next;
+ }
+
+ Channel *c = chanMgr->channel;
+
+ while (c)
+ {
+ Channel *next;
+ bool foundFlg = false;
+ String sjis;
+ sjis = c->getName();
+ sjis.convertTo(String::T_SJIS);
+
+ next = c->next;
+
+ ld = list_top;
+ while(ld){
+ if (ld->channel_id == c->channel_id){
+ foundFlg = true;
+ if (c->thread.finish) break;
+ ld->flg = true;
+ strncpy(ld->name, sjis, 20);
+ ld->name[20] = '\0';
+ ld->bitRate = c->info.bitrate;
+ ld->status = c->status;
+ ld->statusStr = c->getStatusStr();
+ ld->totalListeners = c->totalListeners();
+ ld->totalRelays = c->totalRelays();
+ ld->localListeners = c->localListeners();
+ ld->localRelays = c->localRelays();
+ ld->stayConnected = c->stayConnected;
+ ld->chDisp = c->chDisp;
+ ld->bTracker = c->sourceHost.tracker;
+ break;
+ }
+ ld = ld->next;
+ }
+ if (!foundFlg && !c->thread.finish){
+ ListData *newData = new ListData();
+ newData->next = list_top;
+ list_top = newData;
+ newData->flg = true;
+ newData->channel_id = c->channel_id;
+ strncpy(newData->name, sjis, 20);
+ newData->name[20] = '\0';
+ newData->bitRate = c->info.bitrate;
+ newData->status = c->status;
+ newData->statusStr = c->getStatusStr();
+ newData->totalListeners = c->totalListeners();
+ newData->totalRelays = c->totalRelays();
+ newData->localListeners = c->localListeners();
+ newData->localRelays = c->localRelays();
+ newData->stayConnected = c->stayConnected;
+ newData->chDisp = c->chDisp;
+ newData->bTracker = c->sourceHost.tracker;
+
+ int idx = SendDlgItemMessage(guiWnd, chanID, LB_ADDSTRING, 0, (LONG)"");
+ SendDlgItemMessage(guiWnd, chanID, LB_SETITEMDATA, idx, (LONG)(newData->channel_id));
+ }
+ c = next;
+ }
+
+ ld = list_top;
+ int idx = 0;
+ ListData *prev = NULL;
+ while(ld){
+ if (!ld->flg){
+ ListData *next = ld->next;
+ if (!prev){
+ list_top = next;
+ } else {
+ prev->next = next;
+ }
+ delete ld;
+
+ SendDlgItemMessage(guiWnd, chanID, LB_DELETESTRING, idx, 0);
+ ld = next;
+ } else {
+ idx++;
+ prev = ld;
+ ld = ld->next;
+ }
+ }
+
+ InvalidateRect(GetDlgItem(guiWnd, chanID), NULL, FALSE);
+
+/* String sjis; //JP-Patch
+ sjis = c->getName(); //JP-Patch
+ sjis.convertTo(String::T_SJIS); //JP-Patch
+ strncpy(cname,sjis.cstr(),16); //JP-Patch
+ //strncpy(cname,c->getName(),16);
+ cname[16] = 0;
+ //int sec = ((c->currSPacket*c->bitrate*SPacket::DATA_LEN)/8)/(c->bitrate*1024);
+ //int k = ((c->currSPacket*SPacket::DATA_LEN))/(1024);
+ //ADDCHAN(c,"%d. %s - %d KB/s - %du - %dk",num,cname,c->bitrate,c->listeners,k);
+ //ADDCHAN(c,"%d. %s - %d kb/s - %s",c->index,cname,c->getBitrate(),c->getStatusStr());
+ ADDCHAN(c,"%s - %d kb/s - %s - %d/%d-[%d/%d] - %s",cname,c->getBitrate(),c->getStatusStr(),
+ c->totalListeners(),c->totalRelays(),c->localListeners(),c->localRelays(),c->stayConnected?"Yes":"No"); //JP-Patch
+ }
+ c=c->next;
+ }*/
+// if (sel >= 0)
+// SendDlgItemMessage(guiWnd, chanID,LB_SETCURSEL, sel, 0);
+// if (top >= 0)
+// SendDlgItemMessage(guiWnd, chanID,LB_SETTOPINDEX, top, 0);
+ }
+
+
+
+ bool update = ((sys->getTime() - chanMgr->lastHit) < 3)||(!shownChannels);
+
+ if (update)
+ {
+ shownChannels = true;
+ {
+ sel = SendDlgItemMessage(guiWnd, hitID,LB_GETCURSEL, 0, 0);
+ top = SendDlgItemMessage(guiWnd, hitID,LB_GETTOPINDEX, 0, 0);
+ SendDlgItemMessage(guiWnd, hitID, LB_RESETCONTENT, 0, 0);
+
+ chanMgr->hitlistlock.on();
+
+ ChanHitList *chl = chanMgr->hitlist;
+
+ while (chl)
+ {
+ if (chl->isUsed())
+ {
+ if (chl->info.match(chanMgr->searchInfo))
+ {
+ strncpy(cname,chl->info.name.cstr(),16);
+ cname[16] = 0;
+ ADDHIT(chl,"%s - %d kb/s - %d/%d",cname,chl->info.bitrate,chl->numListeners(),chl->numHits());
+ }
+ }
+ chl = chl->next;
+ }
+ chanMgr->hitlistlock.off();
+ }
+
+ if (sel >= 0)
+ SendDlgItemMessage(guiWnd, hitID,LB_SETCURSEL, sel, 0);
+ if (top >= 0)
+ SendDlgItemMessage(guiWnd, hitID,LB_SETTOPINDEX, top, 0);
+ }
+
+
+
+
+ {
+ switch (servMgr->getFirewall())
+ {
+ case ServMgr::FW_ON:
+ SendDlgItemMessage(guiWnd, IDC_EDIT4,WM_SETTEXT, 0, (LONG)"Firewalled");
+ break;
+ case ServMgr::FW_UNKNOWN:
+ SendDlgItemMessage(guiWnd, IDC_EDIT4,WM_SETTEXT, 0, (LONG)"Unknown");
+ break;
+ case ServMgr::FW_OFF:
+ SendDlgItemMessage(guiWnd, IDC_EDIT4,WM_SETTEXT, 0, (LONG)"Normal");
+ break;
+ }
+ }
+
+ // sleep for 1 second .. check every 1/10th for shutdown
+ for(i=0; i<10; i++)
+ {
+ if(sleep_skip) // for PCRaw (connection list)
+ {
+ sleep_skip = false;
+ break;
+ }
+
+ if (!thread->active)
+ break;
+ sys->sleep(100);
+ }
+ }
+
+ ListData *ld = list_top;
+ while(ld){
+ ListData *next;
+ next = ld->next;
+
+ delete ld;
+
+ ld = next;
+ }
+ list_top = NULL;
+
+ ServentData *sd = servent_top;
+ while(sd){
+ ServentData *next;
+ next = sd->next;
+
+ delete sd;
+
+ sd = next;
+ }
+ servent_top = NULL;
+
+// thread->unlock();
+ return 0;
+}
+
+
+// --------------------------------------------------
+void tryConnect()
+{
+#if 0
+ ClientSocket sock;
+
+ char tmp[32];
+
+ char *sendStr = "GET / HTTP/1.1\n\n";
+
+ try {
+ sock.open("taiyo",80);
+ sock.write(sendStr,strlen(sendStr));
+ sock.read(tmp,32);
+ LOG("Connected: %s",tmp);
+ }catch(IOException &e)
+ {
+ LOG(e.msg);
+ }
+#endif
+}
+
+
+// ---------------------------------
+void APICALL MyPeercastApp ::printLog(LogBuffer::TYPE t, const char *str)
+{
+ ADDLOG(str,logID,true,NULL,t);
+ if (logFile.isOpen())
+ {
+ logFile.writeLine(str);
+ logFile.flush();
+ }
+}
+
+
+// --------------------------------------------------
+static void setControls(bool fromGUI)
+{
+ if (!guiWnd)
+ return;
+ setEditInt(IDC_EDIT1,servMgr->serverHost.port);
+ setEditStr(IDC_EDIT3,servMgr->password);
+ setEditStr(IDC_EDIT9,chanMgr->broadcastMsg.cstr());
+ setEditInt(IDC_MAXRELAYS,servMgr->maxRelays);
+
+ setButtonState(IDC_CHECK11,chanMgr->broadcastMsg[0]!=0);
+
+ setButtonState(IDC_LOGDEBUG,(servMgr->showLog&(1<<LogBuffer::T_DEBUG))!=0);
+ setButtonState(IDC_LOGERRORS,(servMgr->showLog&(1<<LogBuffer::T_ERROR))!=0);
+ setButtonState(IDC_LOGNETWORK,(servMgr->showLog&(1<<LogBuffer::T_NETWORK))!=0);
+ setButtonState(IDC_LOGCHANNELS,(servMgr->showLog&(1<<LogBuffer::T_CHANNEL))!=0);
+
+ setButtonState(IDC_CHECK9,servMgr->pauseLog);
+
+
+ if (!fromGUI)
+ setButtonState(IDC_CHECK1,servMgr->autoServe);
+
+
+}
+// --------------------------------------------------
+void APICALL MyPeercastApp::updateSettings()
+{
+ setControls(true);
+}
+
+void MoveControl(HWND hWnd, int cx, int cy, int y, HDWP& hDwp){
+ RECT rc2;
+ POINT pos;
+
+ GetWindowRect(hWnd, &rc2);
+ pos.x = rc2.left;
+ pos.y = rc2.top;
+ ScreenToClient(guiWnd, &pos);
+ hDwp = DeferWindowPos(hDwp, hWnd, HWND_TOP,
+ pos.x,cy-y-(rc2.bottom-rc2.top),rc2.right-rc2.left,rc2.bottom-rc2.top,SWP_SHOWWINDOW);
+}
+
+void MoveControl2(HWND hWnd, int cx, int cy, int y, HDWP& hDwp){
+ RECT rc;
+ POINT pos;
+
+ GetWindowRect(hWnd, &rc);
+ pos.x = rc.left;
+ pos.y = rc.top;
+ ScreenToClient(guiWnd, &pos);
+ hDwp = DeferWindowPos(hDwp, hWnd, HWND_TOP,
+ pos.x,pos.y,rc.right-rc.left,cy-y,SWP_SHOWWINDOW);
+}
+
+// --------------------------------------------------
+void MoveControls(LPARAM lParam){
+ HDWP hDwp;
+ //IDC_LIST1 3,291,291,43
+/* CONTROL "\97L\8cø",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE |
+ WS_TABSTOP,9,29,60,20,WS_EX_TRANSPARENT
+ EDITTEXT IDC_EDIT1,127,18,47,12,ES_AUTOHSCROLL
+ RTEXT "\83|\81[\83g :",IDC_STATIC,107,20,18,8
+ GROUPBOX "",IDC_STATIC,3,4,291,49
+ PUSHBUTTON "\90Ø\92f",IDC_BUTTON5,67,65,43,13
+ EDITTEXT IDC_EDIT3,127,34,47,12,ES_PASSWORD | ES_AUTOHSCROLL
+ RTEXT "\83p\83X\83\8f\81[\83h :",IDC_STATIC,89,36,36,8
+ PUSHBUTTON "\8dÄ\90¶",IDC_BUTTON8,10,65,22,13
+ PUSHBUTTON "\8dÄ\90Ú\91±",IDC_BUTTON3,41,65,24,13
+ RTEXT "\8dÅ\91å\83\8a\83\8c\81[\90\94 :",IDC_STATIC,203,20,40,8
+ EDITTEXT IDC_MAXRELAYS,248,18,40,14,ES_AUTOHSCROLL | ES_NUMBER
+ PUSHBUTTON "\83L\81[\83v",IDC_BUTTON9,112,65,24,13
+ LTEXT "Peercast-VP",IDC_STATIC,21,14,39,8*/
+
+/*
+ GROUPBOX "\83\8a\83\8c\81[",IDC_GROUPBOX_RELAY,3,54,291,132
+ LISTBOX IDC_LIST3,3,81,291,102,LBS_OWNERDRAWFIXED |
+ LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
+ CONTROL "DJ",IDC_CHECK11,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE |
+ WS_TABSTOP,5,190,23,12
+ EDITTEXT IDC_EDIT9,33,189,261,14,ES_AUTOHSCROLL
+ LTEXT "\83R\83l\83N\83V\83\87\83\93",IDC_STATIC_CONNECTION,3,214,40,8
+ PUSHBUTTON "\90Ø\92f",IDC_BUTTON6,47,209,43,13
+ LISTBOX IDC_LIST2,3,224,291,53,LBS_NOINTEGRALHEIGHT | WS_VSCROLL |
+ WS_TABSTOP
+ LTEXT "\83\8d\83O",IDC_STATIC_LOG,3,282,13,8
+ PUSHBUTTON "\83N\83\8a\83A",IDC_BUTTON1,35,279,25,11
+ CONTROL "\92â\8e~",IDC_CHECK9,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE |
+ WS_TABSTOP,60,279,30,11
+ CONTROL "\83f\83o\83b\83O",IDC_LOGDEBUG,"Button",BS_AUTOCHECKBOX |
+ BS_PUSHLIKE | WS_TABSTOP,127,279,32,11
+ CONTROL "\83G\83\89\81[",IDC_LOGERRORS,"Button",BS_AUTOCHECKBOX |
+ BS_PUSHLIKE | WS_TABSTOP,159,279,25,11
+ CONTROL "\83l\83b\83g\83\8f\81[\83N",IDC_LOGNETWORK,"Button",BS_AUTOCHECKBOX |
+ BS_PUSHLIKE | WS_TABSTOP,185,279,35,11
+ CONTROL "\83`\83\83\83\93\83l\83\8b",IDC_LOGCHANNELS,"Button",BS_AUTOCHECKBOX |
+ BS_PUSHLIKE | WS_TABSTOP,221,279,35,11
+ LISTBOX IDC_LIST1,3,291,291,43,LBS_NOINTEGRALHEIGHT | WS_VSCROLL |
+ WS_TABSTOP*/
+
+ hDwp = BeginDeferWindowPos(15);
+ int cx = LOWORD(lParam);
+ int cy = HIWORD(lParam);
+
+ MoveControl2(GetDlgItem(guiWnd, IDC_GROUPBOX_RELAY), cx, cy, 343, hDwp);
+ MoveControl2(GetDlgItem(guiWnd, IDC_LIST3), cx, cy, 385, hDwp);
+
+ MoveControl(GetDlgItem(guiWnd, IDC_EDIT9), cx, cy, 233, hDwp);
+ MoveControl(GetDlgItem(guiWnd, IDC_CHECK11), cx, cy, 232, hDwp);
+ MoveControl(GetDlgItem(guiWnd, IDC_STATIC_CONNECTION), cx, cy, 209, hDwp);
+ MoveControl(GetDlgItem(guiWnd, IDC_BUTTON6), cx, cy, 208, hDwp);
+ MoveControl(GetDlgItem(guiWnd, IDC_LIST2), cx, cy, 94, hDwp);
+ MoveControl(GetDlgItem(guiWnd, IDC_STATIC_LOG), cx, cy, 72, hDwp);
+ MoveControl(GetDlgItem(guiWnd, IDC_CHECK9), cx, cy, 71, hDwp);
+ MoveControl(GetDlgItem(guiWnd, IDC_BUTTON1), cx, cy, 71, hDwp);
+ MoveControl(GetDlgItem(guiWnd, IDC_LOGDEBUG), cx, cy, 71, hDwp);
+ MoveControl(GetDlgItem(guiWnd, IDC_LOGNETWORK), cx, cy, 71, hDwp);
+ MoveControl(GetDlgItem(guiWnd, IDC_LOGERRORS), cx, cy, 71, hDwp);
+ MoveControl(GetDlgItem(guiWnd, IDC_LOGCHANNELS), cx, cy, 71, hDwp);
+ MoveControl(GetDlgItem(guiWnd, IDC_LIST1), cx, cy, 3, hDwp);
+
+ EndDeferWindowPos(hDwp);
+}
+
+WINDOWPLACEMENT winPlace;
+bool guiFlg = false;
+
+// --------------------------------------------------
+LRESULT CALLBACK GUIProc (HWND hwnd, UINT message,
+ WPARAM wParam, LPARAM lParam)
+{
+
+ static const struct
+ {
+ LRESULT from; // \95Ï\8a·\8c³
+ LRESULT to; // \95Ï\8a·\90æ
+ }
+ trans[] =
+ {
+ { HTLEFT, HTBORDER }, // \8d¶\92[\82Ì\8d¶\89E\96î\88ó \81¨ \96î\88ó\82È\82µ
+ { HTRIGHT, HTBORDER }, // \89E\92[\82Ì\8d¶\89E\96î\88ó \81¨ \96î\88ó\82È\82µ
+ { HTTOPLEFT, HTTOP }, // \8d¶\8fã\8b÷\82Ì\8eÎ\82ß\96î\88ó \81¨ \8fc\96î\88ó
+ { HTTOPRIGHT, HTTOP }, // \89E\8fã\8b÷\82Ì\8eÎ\82ß\96î\88ó \81¨ \8fc\96î\88ó
+ { HTBOTTOMLEFT, HTBOTTOM }, // \8d¶\89º\8b÷\82Ì\8eÎ\82ß\96î\88ó \81¨ \8fc\96î\88ó
+ { HTBOTTOMRIGHT, HTBOTTOM }, // \89E\89º\8b÷\82Ì\8eÎ\82ß\96î\88ó \81¨ \8fc\96î\88ó
+ { HTTOP, HTTOP },
+ { HTBOTTOM, HTBOTTOM }
+ };
+
+
+ bool rectflg = false;
+
+ switch (message)
+ {
+ case WM_INITDIALOG:
+ guiWnd = hwnd;
+
+ shownChannels = false;
+ logID = IDC_LIST1; // log
+ statusID = IDC_LIST2; // status
+ hitID = IDC_LIST4; // hit
+ chanID = IDC_LIST3; // channels
+
+ enableControl(IDC_BUTTON8,false);
+ enableControl(IDC_BUTTON11,false);
+ enableControl(IDC_BUTTON10,false);
+
+ peercastApp->updateSettings();
+
+ if (servMgr->autoServe)
+ setButtonState(IDC_CHECK1,true);
+ if (servMgr->autoConnect)
+ setButtonState(IDC_CHECK2,true);
+
+
+ guiThread.func = showConnections;
+ if (!sys->startThread(&guiThread))
+ {
+ MessageBox(hwnd,"Unable to start GUI","PeerCast",MB_OK|MB_ICONERROR);
+ PostMessage(hwnd,WM_DESTROY,0,0);
+ }
+
+ if (guiFlg){
+ SetWindowPlacement(hwnd, &winPlace);
+ }
+
+ { // for PCRaw (connection list)
+ HWND hwndList;
+
+ hwndList = GetDlgItem(guiWnd, chanID);
+ wndOldListBox = (WNDPROC)GetWindowLong(hwndList, GWL_WNDPROC);
+ SetWindowLong(hwndList, GWL_WNDPROC, (DWORD)ListBoxProc);
+
+ hwndList = GetDlgItem(guiWnd, statusID);
+ wndOldConnListBox = (WNDPROC)GetWindowLong(hwndList, GWL_WNDPROC);
+ SetWindowLong(hwndList, GWL_WNDPROC, (DWORD)ConnListBoxProc);
+ }
+
+ break;
+
+ case WM_COMMAND:
+ switch( wParam )
+ {
+ case IDC_CHECK1: // start server
+ if (getButtonState(IDC_CHECK1))
+ {
+ //SendDlgItemMessage(hwnd, IDC_CHECK1,WM_SETTEXT, 0, (LPARAM)"Deactivate");
+
+ SendDlgItemMessage(hwnd, IDC_EDIT3,WM_GETTEXT, 64, (LONG)servMgr->password);
+
+ servMgr->serverHost.port = (unsigned short)getEditInt(IDC_EDIT1);
+ servMgr->setMaxRelays(getEditInt(IDC_MAXRELAYS));
+
+
+ enableControl(IDC_EDIT1,false);
+ enableControl(IDC_EDIT3,false);
+ enableControl(IDC_MAXRELAYS,false);
+ enableControl(IDC_BUTTON8,true);
+ enableControl(IDC_BUTTON11,true);
+ enableControl(IDC_BUTTON10,true);
+
+ //writeSettings();
+ servMgr->autoServe = true;
+
+ setEditStr(IDC_CHECK1,"Enabled");
+
+
+ }else{
+ //SendDlgItemMessage(hwnd, IDC_CHECK1,WM_SETTEXT, 0, (LPARAM)"Activate");
+
+ servMgr->autoServe = false;
+
+ enableControl(IDC_EDIT1,true);
+ enableControl(IDC_EDIT3,true);
+ enableControl(IDC_MAXRELAYS,true);
+ enableControl(IDC_BUTTON8,false);
+ enableControl(IDC_BUTTON11,false);
+ enableControl(IDC_BUTTON10,false);
+
+ setEditStr(IDC_CHECK1,"Disabled");
+
+ }
+ setControls(true);
+
+ break;
+ case IDC_CHECK11: // DJ message
+ if (getButtonState(IDC_CHECK11))
+ {
+ enableControl(IDC_EDIT9,false);
+ SendDlgItemMessage(hwnd, IDC_EDIT9,WM_GETTEXT, 128, (LONG)chanMgr->broadcastMsg.cstr());
+ }else{
+ enableControl(IDC_EDIT9,true);
+ chanMgr->broadcastMsg.clear();
+ }
+ break;
+ case IDC_LOGDEBUG: // log debug
+ servMgr->showLog = getButtonState(wParam) ? servMgr->showLog|(1<<LogBuffer::T_DEBUG) : servMgr->showLog&~(1<<LogBuffer::T_DEBUG);
+ break;
+ case IDC_LOGERRORS: // log errors
+ servMgr->showLog = getButtonState(wParam) ? servMgr->showLog|(1<<LogBuffer::T_ERROR) : servMgr->showLog&~(1<<LogBuffer::T_ERROR);
+ break;
+ case IDC_LOGNETWORK: // log network
+ servMgr->showLog = getButtonState(wParam) ? servMgr->showLog|(1<<LogBuffer::T_NETWORK) : servMgr->showLog&~(1<<LogBuffer::T_NETWORK);
+ break;
+ case IDC_LOGCHANNELS: // log channels
+ servMgr->showLog = getButtonState(wParam) ? servMgr->showLog|(1<<LogBuffer::T_CHANNEL) : servMgr->showLog&~(1<<LogBuffer::T_CHANNEL);
+ break;
+ case IDC_CHECK9: // pause log
+ servMgr->pauseLog = getButtonState(wParam);
+ break;
+ case IDC_CHECK2: // start outgoing
+
+ if (getButtonState(IDC_CHECK2))
+ {
+
+ SendDlgItemMessage(hwnd, IDC_COMBO1,WM_GETTEXT, 128, (LONG)servMgr->connectHost);
+ servMgr->autoConnect = true;
+ //SendDlgItemMessage(hwnd, IDC_CHECK2,WM_SETTEXT, 0, (LPARAM)"Disconnect");
+ enableControl(IDC_COMBO1,false);
+ }else{
+ servMgr->autoConnect = false;
+ //SendDlgItemMessage(hwnd, IDC_CHECK2,WM_SETTEXT, 0, (LPARAM)"Connect");
+ enableControl(IDC_COMBO1,true);
+ }
+ break;
+ case IDC_BUTTON11: // broadcast
+ {
+ Host sh = servMgr->serverHost;
+ if (sh.isValid())
+ {
+ char cmd[256];
+ sprintf(cmd,"http://localhost:%d/admin?page=broadcast",sh.port);
+ ShellExecute(hwnd, NULL, cmd, NULL, NULL, SW_SHOWNORMAL);
+
+ }else{
+ MessageBox(hwnd,"Server is not currently connected.\nPlease wait until you have a connection.","PeerCast",MB_OK);
+ }
+ }
+ break;
+ case IDC_BUTTON8: // play selected
+ {
+ Channel *c = getListBoxChannel();
+ if (c){
+ chanMgr->playChannel(c->info);
+ }
+ }
+ break;
+ case IDC_BUTTON7: // advanced
+ sys->callLocalURL("admin?page=settings",servMgr->serverHost.port);
+ break;
+ case IDC_BUTTON6: // servent disconnect
+ {
+/* Servent *s = (Servent *)getListBoxSelData(statusID);
+ if (s)
+ s->thread.active = false;*/
+ Servent *s = getListBoxServent();
+ if (s){
+ s->thread.active = false;
+ s->thread.finish = true;
+ }
+ sleep_skip = true;
+ }
+ break;
+ case IDC_BUTTON5: // chan disconnect
+ {
+/* Channel *c = (Channel *)getListBoxSelData(chanID);
+ if (c)
+ c->thread.active = false;*/
+
+// Channel *c = chanMgr->findChannelByChannelID((int)getListBoxSelData(chanID));
+ Channel *c = getListBoxChannel();
+ if (c){
+ c->thread.active = false;
+ c->thread.finish = true;
+ }
+ sleep_skip = true;
+ }
+ break;
+ case IDC_BUTTON3: // chan bump
+ {
+/* Channel *c = (Channel *)getListBoxSelData(chanID);
+ if (c)
+ c->bump = true;*/
+
+// Channel *c = chanMgr->findChannelByChannelID((int)getListBoxSelData(chanID));
+ Channel *c = getListBoxChannel();
+ if (c){
+ c->bump = true;
+ }
+ }
+
+ break;
+ case IDC_BUTTON4: // get channel
+ {
+ ChanHitList *chl = (ChanHitList *)getListBoxSelData(hitID);
+ if (chl)
+ {
+ if (!chanMgr->findChannelByID(chl->info.id))
+ {
+ Channel *c = chanMgr->createChannel(chl->info,NULL);
+ if (c)
+ c->startGet();
+ }
+ }else{
+ MessageBox(hwnd,"Please select a channel","PeerCast",MB_OK);
+ }
+ }
+ break;
+
+ case IDC_BUTTON9: //JP-EX chan keep
+ {
+/* Channel *c = (Channel *)getListBoxSelData(chanID);
+ if (c)
+ {
+ if (!c->stayConnected)
+ {
+ //if (servMgr->getFirewall() == ServMgr::FW_OFF)
+ c->stayConnected = true;
+ }
+ else
+ c->stayConnected = false;
+ }*/
+
+// Channel *c = chanMgr->findChannelByChannelID((int)getListBoxSelData(chanID));
+ Channel *c = getListBoxChannel();
+ if (c){
+ if (!c->stayConnected){
+ c->stayConnected = true;
+ } else {
+ c->stayConnected = false;
+ }
+ }
+ }
+ break;
+
+ case IDC_BUTTON1: // clear log
+ SendDlgItemMessage(guiWnd, logID, LB_RESETCONTENT, 0, 0);
+ sys->logBuf->clear(); // for PCRaw (clear log)
+ break;
+
+ case IDC_BUTTON2: // find
+ {
+ char str[64];
+ SendDlgItemMessage(hwnd, IDC_EDIT2,WM_GETTEXT, 64, (LONG)str);
+ SendDlgItemMessage(hwnd, hitID, LB_RESETCONTENT, 0, 0);
+ ChanInfo info;
+ info.init();
+ info.name.set(str);
+ chanMgr->startSearch(info);
+ }
+ break;
+
+ }
+ break;
+
+ case WM_MEASUREITEM:
+ if ((UINT) wParam==IDC_LIST3){
+ LPMEASUREITEMSTRUCT lpMI = (LPMEASUREITEMSTRUCT)lParam;
+ lpMI->itemHeight = 12;
+ } else if ((UINT) wParam==IDC_LIST2){
+ LPMEASUREITEMSTRUCT lpMI = (LPMEASUREITEMSTRUCT)lParam;
+ lpMI->itemHeight = 12;
+ }
+ break;
+ case WM_DRAWITEM:
+ if ((UINT) wParam==IDC_LIST3)
+ {
+ LPDRAWITEMSTRUCT _DrawItem=(LPDRAWITEMSTRUCT)lParam;
+ HBRUSH hBrush;
+ ListData *ld;
+ unsigned int idx = 0;
+ bool flg = false;
+
+ ld = list_top;
+ while(ld){
+ if (_DrawItem->itemID == idx){
+ flg = true;
+ break;
+ }
+ ld = ld->next;
+ idx++;
+ }
+ if ((_DrawItem->itemState) & (ODS_SELECTED))
+ {
+ hBrush=CreateSolidBrush(RGB(49,106,197));
+ }
+ else
+ {
+ hBrush=CreateSolidBrush(RGB(255,255,255));
+ }
+ FillRect(_DrawItem->hDC,&_DrawItem->rcItem,hBrush);
+ DeleteObject(hBrush);
+ if (flg){
+ char buf[256];
+ if (ld->status == Channel::S_RECEIVING){
+ if (ld->chDisp.status == Channel::S_RECEIVING){
+ if (ld->chDisp.relay){
+ /* relay ok */
+ SetTextColor(_DrawItem->hDC,RGB(0,255,0));
+ SetBkColor(_DrawItem->hDC,RGB(255,255,255)) ;
+ } else {
+ /* no more relay */
+ if (ld->chDisp.numRelays){
+ /* relay full */
+ SetTextColor(_DrawItem->hDC,RGB(0,0,255));
+ SetBkColor(_DrawItem->hDC,RGB(255,255,255)) ;
+ } else {
+ /* relay ng */
+ SetTextColor(_DrawItem->hDC,RGB(255,0,255));
+ SetBkColor(_DrawItem->hDC,RGB(255,255,255)) ;
+ }
+ }
+ } else {
+ /* status unmatch */
+ SetTextColor(_DrawItem->hDC,RGB(0,0,0));
+ SetBkColor(_DrawItem->hDC,RGB(255,255,255)) ;
+ }
+ TextOut(_DrawItem->hDC,
+ _DrawItem->rcItem.left,
+ _DrawItem->rcItem.top,
+ "\81¡",
+ 2);
+ } else {
+ SetTextColor(_DrawItem->hDC,RGB(0,0,0));
+ SetBkColor(_DrawItem->hDC,RGB(255,255,255)) ;
+ TextOut(_DrawItem->hDC,
+ _DrawItem->rcItem.left,
+ _DrawItem->rcItem.top,
+ "\81 ",
+ 2);
+ }
+ if ((_DrawItem->itemState) & (ODS_SELECTED))
+ {
+ SetTextColor(_DrawItem->hDC,RGB(255,255,255));
+ SetBkColor(_DrawItem->hDC,RGB(49,106,197)) ;
+ } else {
+ SetTextColor(_DrawItem->hDC,RGB(0,0,0));
+ SetBkColor(_DrawItem->hDC,RGB(255,255,255)) ;
+ }
+ if (servMgr->getFirewall() == ServMgr::FW_ON){
+ SetTextColor(_DrawItem->hDC,RGB(255,0,0));
+ } else if (ld->bTracker && (ld->status == Channel::S_RECEIVING)){
+ if ((_DrawItem->itemState) & (ODS_SELECTED))
+ {
+ SetTextColor(_DrawItem->hDC,RGB(0,255,0));
+ SetBkColor(_DrawItem->hDC,RGB(49,106,197)) ;
+ } else {
+ SetTextColor(_DrawItem->hDC,RGB(0,128,0));
+ }
+ }
+
+ TextOut(_DrawItem->hDC,
+ _DrawItem->rcItem.left + 12,
+ _DrawItem->rcItem.top,
+ ld->name,
+ strlen(ld->name));
+/* sprintf(buf, "- %4dkbps -", ld->bitRate);
+ TextOut(_DrawItem->hDC,
+ _DrawItem->rcItem.left + 12 + 118,
+ _DrawItem->rcItem.top,
+ buf,
+ strlen(buf));
+ TextOut(_DrawItem->hDC,
+ _DrawItem->rcItem.left + 12 + 118 + 80,
+ _DrawItem->rcItem.top,
+ ld->statusStr,
+ strlen(ld->statusStr));
+ sprintf(buf, "- %3d/%3d - [%3d/%3d] -", ld->totalListeners, ld->totalRelays, ld->localListeners, ld->localRelays);
+ TextOut(_DrawItem->hDC,
+ _DrawItem->rcItem.left + 12 + 118 + 80 + 80,
+ _DrawItem->rcItem.top,
+ buf,
+ strlen(buf));
+ strcpy(buf, ld->stayConnected?"YES":"NO");
+ TextOut(_DrawItem->hDC,
+ _DrawItem->rcItem.left + 12 + 118 + 80 + 80 + 130,
+ _DrawItem->rcItem.top,
+ buf,
+ strlen(buf));*/
+ sprintf(buf, "- %4dkbps - %s - %3d/%3d - [%3d/%3d] - %s",
+ ld->bitRate,
+ ld->statusStr,
+ ld->totalListeners,
+ ld->totalRelays,
+ ld->localListeners,
+ ld->localRelays,
+ ld->stayConnected?"YES":"NO");
+ TextOut(_DrawItem->hDC,
+ _DrawItem->rcItem.left + 12 + 118,
+ _DrawItem->rcItem.top,
+ buf,
+ strlen(buf));
+ }
+ } else if ((UINT) wParam==IDC_LIST2) {
+ LPDRAWITEMSTRUCT _DrawItem=(LPDRAWITEMSTRUCT)lParam;
+ HBRUSH hBrush;
+ ServentData *sd;
+ unsigned int idx = 0;
+ bool flg = false;
+
+ sd_lock.on();
+
+ sd = servent_top;
+ while(sd){
+ if (_DrawItem->itemID == idx){
+ flg = true;
+ break;
+ }
+ sd = sd->next;
+ idx++;
+ }
+ if (flg){
+ char buf[256];
+ char hostName[64];
+ sd->h.toStr(hostName);
+
+ if ((_DrawItem->itemState) & (ODS_SELECTED))
+ {
+ hBrush=CreateSolidBrush(RGB(49,106,197));
+ }
+ else
+ {
+ hBrush=CreateSolidBrush(RGB(255,255,255));
+ }
+ FillRect(_DrawItem->hDC,&_DrawItem->rcItem,hBrush);
+ DeleteObject(hBrush);
+
+ if (sd->infoFlg){
+ if (sd->relay){
+ /* relay ok */
+ SetTextColor(_DrawItem->hDC,RGB(0,255,0));
+// SetBkColor(_DrawItem->hDC,RGB(255,255,255));
+ } else {
+ /* no more relay */
+ if (sd->numRelays){
+ /* relay full */
+ SetTextColor(_DrawItem->hDC,RGB(0,0,255));
+// SetBkColor(_DrawItem->hDC,RGB(255,255,255));
+ } else {
+ /* relay ng */
+ SetTextColor(_DrawItem->hDC,RGB(255,0,255));
+// SetBkColor(_DrawItem->hDC,RGB(255,255,255));
+ }
+ }
+ } else {
+ /* no info */
+ SetTextColor(_DrawItem->hDC,RGB(0,0,0));
+// SetBkColor(_DrawItem->hDC,RGB(255,255,255));
+ }
+
+ if (sd->lastSkipTime + 120 > sys->getTime()){
+ SetBkColor(_DrawItem->hDC,RGB(128,128,128));
+ if (sd->type == Servent::T_RELAY){
+ sprintf(buf, "\81¥(%d)",sd->lastSkipCount);
+ TextOut(_DrawItem->hDC,
+ _DrawItem->rcItem.left,
+ _DrawItem->rcItem.top,
+ buf,
+ strlen(buf));
+ } else {
+ SetTextColor(_DrawItem->hDC,RGB(0,0,0));
+ sprintf(buf, "\81¤(%d)",sd->lastSkipCount);
+ TextOut(_DrawItem->hDC,
+ _DrawItem->rcItem.left,
+ _DrawItem->rcItem.top,
+ buf,
+ strlen(buf));
+ }
+ } else {
+ SetBkColor(_DrawItem->hDC,RGB(255,255,255));
+ if (sd->type == Servent::T_RELAY){
+ TextOut(_DrawItem->hDC,
+ _DrawItem->rcItem.left,
+ _DrawItem->rcItem.top,
+ "\81¡",
+ 2);
+ } else {
+ SetTextColor(_DrawItem->hDC,RGB(0,0,0));
+ SetBkColor(_DrawItem->hDC,RGB(255,255,255)) ;
+ TextOut(_DrawItem->hDC,
+ _DrawItem->rcItem.left,
+ _DrawItem->rcItem.top,
+ "\81 ",
+ 2);
+ }
+ }
+
+ if ((_DrawItem->itemState) & (ODS_SELECTED))
+ {
+ SetTextColor(_DrawItem->hDC,RGB(255,255,255));
+ SetBkColor(_DrawItem->hDC,RGB(49,106,197)) ;
+ } else {
+ SetTextColor(_DrawItem->hDC,RGB(0,0,0));
+ SetBkColor(_DrawItem->hDC,RGB(255,255,255)) ;
+ }
+ if (sd->firewalled){
+ if (!sd->numRelays){
+ SetTextColor(_DrawItem->hDC,RGB(255,0,0));
+ } else {
+ SetTextColor(_DrawItem->hDC,RGB(255,168,0));
+ }
+ }
+
+ char buf2[16];
+ if (sd->ver_ex_number){
+ sprintf(buf2, "(%c%c%04d)", sd->ver_ex_prefix[0], sd->ver_ex_prefix[1], sd->ver_ex_number);
+ } else if (sd->vp_ver){
+ sprintf(buf2, "(VP%04d)", sd->vp_ver);
+ } else {
+ buf2[0] = '\0';
+ }
+ if (sd->type == Servent::T_RELAY){
+ if (sd->status == Servent::S_CONNECTED){
+ sprintf(buf, "(%d)RELAYING-%ds - %d/%d - %s - %d - %s%s",
+ sd->lastSkipCount,
+ sd->tnum,
+ sd->totalListeners, sd->totalRelays,
+ hostName,
+ sd->syncpos, sd->agent.cstr(), buf2
+ );
+ } else {
+ sprintf(buf, "%s-%s-%ds - %d/%d - %s - %d - %s%s",
+ sd->typeStr, sd->statusStr, sd->tnum,
+ sd->totalListeners, sd->totalRelays,
+ hostName,
+ sd->syncpos, sd->agent.cstr(), buf2
+ );
+ }
+ } else if (sd->type == Servent::T_DIRECT){
+ sprintf(buf, "%s-%s-%ds - %s - %d - %s ",
+ sd->typeStr, sd->statusStr, sd->tnum,
+ hostName,
+ sd->syncpos, sd->agent.cstr()
+ );
+ } else {
+ if (sd->status == Servent::S_CONNECTED){
+ sprintf(buf, "%s-%s-%ds - %s - %d/%d",
+ sd->typeStr, sd->statusStr, sd->tnum,
+ hostName,
+ sd->syncpos, sd->agent.cstr()
+ );
+ } else {
+ sprintf(buf, "%s-%s-%ds - %s",
+ sd->typeStr, sd->statusStr, sd->tnum,
+ hostName
+ );
+ }
+ }
+ TextOut(_DrawItem->hDC,
+ _DrawItem->rcItem.left + 12,
+ _DrawItem->rcItem.top,
+ buf,
+ strlen(buf));
+ }
+ sd_lock.off();
+ }
+ break;
+
+ case WM_SIZE:
+ MoveControls(lParam);
+ break;
+
+ case WM_GETMINMAXINFO:
+ {
+ MINMAXINFO *pmmi = (MINMAXINFO *)lParam;
+ if ( pmmi )
+ {
+ pmmi->ptMinTrackSize.x = 530; // \8dÅ\8f¬\95\9d
+ pmmi->ptMinTrackSize.y = 435; // \8dÅ\8f¬\8d\82
+ pmmi->ptMaxTrackSize.x = 530; // \8dÅ\91å\95\9d
+ pmmi->ptMaxTrackSize.y = 1200; // \8dÅ\91å\8d\82
+ }
+ return 0;
+ }
+
+/* case WM_NCHITTEST:
+ {
+ LRESULT lResult; // \83J\81[\83\\83\8b\88Ê\92u\94»\92è\8c\8b\89Ê
+
+ // \95Ï\8a·\88ê\97\97\82É\82 \82ê\82Î\95Ï\8a·\82µ\82½\92l\82ð\95Ô\82·\81B
+ lResult = DefWindowProc( guiWnd, message, wParam, lParam );
+ for( int i = 0; i < 8; i++ )
+ {
+ if ( lResult == trans[ i ].from )
+ {
+ return trans[ i ].to;
+ }
+ }
+// return lResult;
+// return HTCAPTION;
+// return 0;
+ }*/
+
+ case WM_CLOSE:
+ GetWindowPlacement(hwnd, &winPlace);
+ guiFlg = true;
+ DestroyWindow( hwnd );
+ break;
+
+ case WM_DESTROY:
+ GetWindowPlacement(hwnd, &winPlace);
+ guiFlg = true;
+ guiThread.active = false;
+// guiThread.lock();
+ guiWnd = NULL;
+// guiThread.unlock();
+ EndDialog(hwnd, LOWORD(wParam));
+ break;
+
+ //default:
+ // do nothing
+ //return DefDlgProc(hwnd, message, wParam, lParam); // this recurses for ever
+ //return DefWindowProc(hwnd, message, wParam, lParam); // this stops window messages
+ }
+ return 0;
+}