OSDN Git Service

COUT切断機能を追加
[peercast-im/PeerCastIM.git] / c: / Git / PeerCast.root / PeerCast / ui / win32 / simple / gui.cpp
index 23eb053..90504fb 100644 (file)
@@ -22,6 +22,9 @@
 
 #define _WIN32_WINNT 0x0500
 
+#include "ws2tcpip.h" // getnameinfo
+#include "wspiapi.h" // compatibility for Win2k and earlier
+
 #include <windows.h>
 #include "stdio.h"
 #include "string.h"
@@ -105,117 +108,101 @@ WLock ChannelDataLock;
 WLock MakeBackLock;
 ChannelData *channelDataTop = NULL;
 
-extern bool gbGetFile;
-extern bool gbStart;
-extern time_t gtGetFile;
-extern time_t gtStartTime;
-ThreadInfo gtiStart;
-ThreadInfo gtiGetFile;
-static char *data1URL = "http://www.idolmaster.jp/download/images/wallpaper/imas360p_800.jpg";
-static char *data2URL = "http://www.xbox.com/NR/rdonlyres/CAB05E2F-3051-409B-A4C8-830167C1C138/0/wpr0701idolmasterw120001.jpg";
-HWND ghStart;
-
 bool gbDispTop = false;
 bool gbAllOpen = false;
 
-THREAD_PROC FestivalStart(ThreadInfo *thread);
-
 THREAD_PROC GetHostName(ThreadInfo *thread){
        IdData *id = (IdData*)(thread->data);
 
-       HOSTENT *he;
-       unsigned int ip;
+       //HOSTENT *he;
+       u_long ip;
+       struct sockaddr_in sa;
+       char host[256];
+       char *tmp;
        bool flg = TRUE;
+       bool findFlg;
+       int error;
 
-       ChannelDataLock.on();
        ip = htonl(id->getIpAddr());
 
-       for (int i=0; i<5 && flg; i++){
-               he = gethostbyaddr((char *)&ip,sizeof(ip),AF_INET);
+       memset(&sa, 0, sizeof(sa));
+       sa.sin_addr.S_un.S_addr = ip;
+       sa.sin_family = AF_INET;
 
-               ChannelData* cd = channelDataTop;
-               if (he)
+       for (int i=0; i<10 && flg; i++){
+               error = getnameinfo(reinterpret_cast<sockaddr*>(&sa), sizeof(sa), host, sizeof(host)/sizeof(host[0]), NULL, 0, NI_NAMEREQD);
+               switch (error)
                {
-                       while(cd){
-                               if (cd->setName(id->getServentId(), he->h_name)){
-                                       flg = FALSE;
-                                       break;
-                               }
-                               cd = cd->getNextData();
-                       }
-               }
-//             ::delete id;
-               ChannelDataLock.off();
-               sys->sleep(1000);
-       }
-
-
-       return 0;
-}
-
-bool DownloadFile(LPCTSTR URL, LPCTSTR local){
-       char header[] = "Accept: */*\r\n\r\n";
-       char buf[4096];
+               case 0:
+                       // success
+                       flg = FALSE;
+                       break;
 
-       FileStream f;
-       HINTERNET hInternet;
-       HINTERNET hConnect;
+               case WSAHOST_NOT_FOUND:
+                       LOG_ERROR("cannot resolve host for %s",
+                               ((tmp = inet_ntoa(sa.sin_addr)) ? tmp : ""));
+                       flg = TRUE;
+                       break;
 
-       try{
-               f.openWriteReplace(local);
-       }catch(StreamException &e){
-               return false;
+               default:
+                       LOG_ERROR("an error occurred while resolving hostname of %s (%ld)",
+                               ((tmp = inet_ntoa(sa.sin_addr)) ? tmp : ""), error);
+               }
        }
 
-       hInternet = ::InternetOpen(NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
-       if (hInternet == NULL){
-               return false;
-       }
+       if (error)
+               return 0;
 
-       hConnect = ::InternetOpenUrl(hInternet, URL, header, strlen(header), INTERNET_FLAG_DONT_CACHE, 0);
-       if (hConnect == NULL){
-               ::InternetCloseHandle(hInternet);
-               return false;
-       }
+       for (flg=TRUE, findFlg=FALSE; flg; )
+       {
+               ChannelDataLock.on();
+               ChannelData* cd = channelDataTop;
 
-       while(1){
-               sys->sleep(0);
-               DWORD dwReadSize;
-               BOOL ret = ::InternetReadFile(hConnect, buf, 4096, &dwReadSize);
-               if (ret){
-                       if (dwReadSize == 0){
-                               break;
-                       }
-                       try{
-                               f.write(buf, dwReadSize);
-                               continue;
-                       } catch(StreamException e){
+               while(cd){
+                       if (cd->getChannelId() == id->getChannelId())
+                       {
+                               findFlg = TRUE;
+
+                               if (cd->findServentData(id->getServentId()))
+                               {
+                                       if (cd->setName(id->getServentId(), host))
+                                       {
+                                               LOG_DEBUG("successfully resolved(%d)", id->getServentId());
+                                               flg = FALSE;
+                                               break;
+                                       } else
+                                       {
+                                               LOG_ERROR("cannot update servent data with resolved information");
+                                               flg = FALSE;
+                                               break;
+                                       }
+                               } else
+                               {
+                                       LOG_DEBUG("servent data has been removed");
+                                       flg = FALSE;
+                                       break;
+                               }
                        }
-                       f.close();
-                       ::InternetCloseHandle(hConnect);
-                       ::InternetCloseHandle(hInternet);
-                       return false;
+
+                       cd = cd->getNextData();
                }
-       }
 
-       f.flush();
-       f.close();
-       ::InternetCloseHandle(hConnect);
-       ::InternetCloseHandle(hInternet);
+//             ::delete id;
+               ChannelDataLock.off();
 
-       return true;
-}
+               if (!findFlg)
+               {
+                       LOG_DEBUG("servent data has been removed(channel)");
+                       flg = FALSE;
+               }
+
+               sys->sleep(1000);
+       }
 
-THREAD_PROC GetInternetFile(ThreadInfo *thread){
 
-       DownloadFile(data1URL, "data1.jpg");
-       DownloadFile(data2URL, "data2.jpg");
        return 0;
 }
 
-extern TCHAR szWindowClass3[];                                                         // The title bar text
-
-
 int drawSpeed(Graphics *gra, int posX, int posY){
 
        // \91¬\93x\95\\8e¦\95\94\82Ì\94w\8ci\82ð\94\92\82­\82·\82é
@@ -339,7 +326,7 @@ int ChannelData::drawChannel(Graphics *g, int x, int y){
        posX = x;
        posY = y;
 
-       int w,h;
+       int w/*,h*/;
 
        if (getWidth() == 0){
                if (gW){
@@ -366,7 +353,11 @@ int ChannelData::drawChannel(Graphics *g, int x, int y){
        // \83X\83e\81[\83^\83X\95\\8e¦
        Gdiplus::Image *img = NULL;
        unsigned int nowTime = sys->getTime();
-       switch(this->getStatus()){
+       if (this->type != Servent::T_COUT)
+       {
+               // COUT\88È\8aO
+               Channel *ch = chanMgr->findChannelByChannelID(this->channel_id);
+               switch(this->getStatus()){
                case Channel::S_IDLE:
                        img = img_idle;
                        break;
@@ -401,12 +392,25 @@ int ChannelData::drawChannel(Graphics *g, int x, int y){
                        img = img_broad_ok;
                        break;
                case Channel::S_ERROR:
-                       img = img_error;
+                       // bump\8e\9e\82É\83G\83\89\81[\82ª\95\\8e¦\82³\82ê\82é\82Ì\82ð\96h\8e~
+                       if (ch && ch->bumped)
+                       {
+                               img = img_connect;
+                       } else
+                       {
+                               img = img_error;
+                       }
                        break;
                default:
                        img = img_idle;
                        break;
+               }
+       } else
+       {
+               // COUT\97p
+               img = img_broad_ok;
        }
+
        // \95`\89æ\8aî\93_
        PointF origin(xx, yy);
        // \83X\83e\81[\83^\83X\95\\8e¦\88Ê\92u
@@ -435,127 +439,146 @@ int ChannelData::drawChannel(Graphics *g, int x, int y){
                        strBrush = ::new SolidBrush(Color::Black);
                }
        }
-       // \83`\83\83\83\93\83l\83\8b\96¼\95\\8e¦
-       g->SetTextRenderingHint(TextRenderingHintAntiAlias);
-       _bstr_t bstr1(getName());
-       // \95\8e\9a\95`\89æ\94Í\88Í\8ew\92è
-       RectF r1(origin.X, origin.Y, 120.0f, 13.0f);
-       StringFormat format;
-       format.SetAlignment(StringAlignmentNear);
-       g->DrawString(bstr1, -1, &font, r1, &format, strBrush);
-       // \8e\9f\82Ì\8aî\93_
-       origin.X += r1.Width;
-
-       //// \8fã\97¬IP/\83\8a\83X\83i\81[\90\94/\83\8a\83\8c\81[\90\94\95\\8e¦
-       //// NOTE:
-       ////    \82Ò\82 \82©\82·\82Ì\93®\8dì\95×\8b­\97p\81B\83\8a\83\8a\81[\83X\83r\83\8b\83h\82Å\82Í\8c³\82Ì\83R\81[\83h\82ð\8eg\97p\82Ì\8e\96\81B
-       ////    \95\8e\9a\95\\8e¦\94Í\88Í\82Í\95\9d220\82®\82ç\82¢\82Å\82¨\82\8b
-       //char tmp[512]; // \95\\8e¦\97p\83o\83b\83t\83@
-       //char hostip[256]; // IP\83A\83h\83\8c\83X\83o\83b\83t\83@
-       //chDisp.uphost.toStr(hostip); // \8fã\97¬IP
-       //sprintf(tmp, "%d/%d - [%d/%d] - %s",
-       //      getTotalListeners(),
-       //      getTotalRelays(),
-       //      getLocalListeners(),
-       //      getLocalRelays(),
-       //      hostip
-       //      );
-
-       // \83\8a\83X\83i\81[\90\94/\83\8a\83\8c\81[\90\94\95\\8e¦
-       char tmp[256];
-       sprintf(tmp, "%d/%d - [%d/%d]", getTotalListeners(), getTotalRelays(), getLocalListeners(), getLocalRelays());
-       _bstr_t bstr2(tmp);
-       // \95\8e\9a\95\\8e¦\94Í\88Í\8ew\92è
-       RectF r2(origin.X, origin.Y, 100.0f, 13.0f);
-       format.SetAlignment(StringAlignmentCenter);
-       g->DrawString(bstr2, -1, &font, r2, &format, strBrush);
-       // \8e\9f\82Ì\8aî\93_
-       origin.X += r2.Width;
-
-       // bps\95\\8e¦
-       Font *f;
-       if (isStayConnected()){
-               f = ::new Font(L"Arial", 9.0f, FontStyleItalic|FontStyleBold, UnitPoint);
-       } else {
-               f = ::new Font(L"Arial", 9.0f);
-       }
-       sprintf(tmp, "%dkbps", getBitRate());
-       _bstr_t bstr3(tmp);
-       format.SetAlignment(StringAlignmentFar);
-       // \95\8e\9a\95\\8e¦\94Í\88Í\8ew\92è
-       RectF r3(origin.X, origin.Y, 80.0f, 13.0f);
-       g->DrawString(bstr3, -1, f, r3, &format, strBrush);
-       // \83t\83H\83\93\83g\8aJ\95ú
-       ::delete f;
-
-       // \8e\9f\82Ì\8aî\93_
-       origin.X += r3.Width;
 
-       // \83u\83\89\83V\8dí\8f\9c
-       ::delete strBrush;
-
-       
-       // Servent\95\\8e¦
-       if (!openFlg){
-               int count = getServentCount();
-               // Servent\95\\8e¦\95\94\82Ì\94w\8ci\82ð\94\92\82É\82·\82é
-               SolidBrush b(Color(160,255,255,255));
-               g->FillRectangle(&b, (INT)origin.X, (INT)origin.Y, 14*count, 14);
-
-               sd = serventDataTop;
-               int index = 0;
-               while(sd){
-                       SolidBrush *serventBrush;
-                       if (sd->getInfoFlg()){
-                               ChanHit *hit = sd->getChanHit();
-                               if (hit->firewalled){
-                                       SolidBrush bb(Color(180,255,0,0));
-                                       g->FillRectangle(&bb, (INT)origin.X + 14*index, (INT)origin.Y, 14, 14);
-                               }
-                               if (hit->relay){
-                                       // \83\8a\83\8c\81[\82n\82j
-                                       serventBrush = ::new SolidBrush(Color::Green);
-                               } else {
-                                       // \83\8a\83\8c\81[\95s\89Â
-                                       if (hit->numRelays){
-                                               // \83\8a\83\8c\81[\88ê\94t
-                                               serventBrush = ::new SolidBrush(Color::Blue);
+       if (this->type != Servent::T_COUT)
+       {
+               // COUT\88È\8aO
+
+               // \83`\83\83\83\93\83l\83\8b\96¼\95\\8e¦
+               g->SetTextRenderingHint(TextRenderingHintAntiAlias);
+               _bstr_t bstr1(getName());
+               // \95\8e\9a\95`\89æ\94Í\88Í\8ew\92è
+               RectF r1(origin.X, origin.Y, 120.0f, 13.0f);
+               StringFormat format;
+               format.SetAlignment(StringAlignmentNear);
+               g->DrawString(bstr1, -1, &font, r1, &format, strBrush);
+               // \8e\9f\82Ì\8aî\93_
+               origin.X += r1.Width;
+
+               //// \8fã\97¬IP/\83\8a\83X\83i\81[\90\94/\83\8a\83\8c\81[\90\94\95\\8e¦
+               //// NOTE:
+               ////    \82Ò\82 \82©\82·\82Ì\93®\8dì\95×\8b­\97p\81B\83\8a\83\8a\81[\83X\83r\83\8b\83h\82Å\82Í\8c³\82Ì\83R\81[\83h\82ð\8eg\97p\82Ì\8e\96\81B
+               ////    \95\8e\9a\95\\8e¦\94Í\88Í\82Í\95\9d220\82®\82ç\82¢\82Å\82¨\82\8b
+               //char tmp[512]; // \95\\8e¦\97p\83o\83b\83t\83@
+               //char hostip[256]; // IP\83A\83h\83\8c\83X\83o\83b\83t\83@
+               //chDisp.uphost.toStr(hostip); // \8fã\97¬IP
+               //sprintf(tmp, "%d/%d - [%d/%d] - %s",
+               //      getTotalListeners(),
+               //      getTotalRelays(),
+               //      getLocalListeners(),
+               //      getLocalRelays(),
+               //      hostip
+               //      );
+
+               // \83\8a\83X\83i\81[\90\94/\83\8a\83\8c\81[\90\94\95\\8e¦
+               char tmp[256];
+               sprintf(tmp, "%d/%d - [%d/%d]", getTotalListeners(), getTotalRelays(), getLocalListeners(), getLocalRelays());
+               _bstr_t bstr2(tmp);
+               // \95\8e\9a\95\\8e¦\94Í\88Í\8ew\92è
+               RectF r2(origin.X, origin.Y, 100.0f, 13.0f);
+               format.SetAlignment(StringAlignmentCenter);
+               g->DrawString(bstr2, -1, &font, r2, &format, strBrush);
+               // \8e\9f\82Ì\8aî\93_
+               origin.X += r2.Width;
+
+               // bps\95\\8e¦
+               Font *f;
+               if (isStayConnected()){
+                       f = ::new Font(L"Arial", 9.0f, FontStyleItalic|FontStyleBold, UnitPoint);
+               } else {
+                       f = ::new Font(L"Arial", 9.0f);
+               }
+               sprintf(tmp, "%dkbps", getBitRate());
+               _bstr_t bstr3(tmp);
+               format.SetAlignment(StringAlignmentFar);
+               // \95\8e\9a\95\\8e¦\94Í\88Í\8ew\92è
+               RectF r3(origin.X, origin.Y, 80.0f, 13.0f);
+               g->DrawString(bstr3, -1, f, r3, &format, strBrush);
+               // \83t\83H\83\93\83g\8aJ\95ú
+               ::delete f;
+
+               // \8e\9f\82Ì\8aî\93_
+               origin.X += r3.Width;
+
+               // \83u\83\89\83V\8dí\8f\9c
+               ::delete strBrush;
+
+
+               // Servent\95\\8e¦
+               if (!openFlg){
+                       int count = getServentCount();
+                       // Servent\95\\8e¦\95\94\82Ì\94w\8ci\82ð\94\92\82É\82·\82é
+                       SolidBrush b(Color(160,255,255,255));
+                       g->FillRectangle(&b, (INT)origin.X, (INT)origin.Y, 14*count, 14);
+
+                       sd = serventDataTop;
+                       int index = 0;
+                       while(sd){
+                               SolidBrush *serventBrush;
+                               if (sd->getInfoFlg()){
+                                       ChanHit *hit = sd->getChanHit();
+                                       if (hit->firewalled){
+                                               SolidBrush bb(Color(180,255,0,0));
+                                               g->FillRectangle(&bb, (INT)origin.X + 14*index, (INT)origin.Y, 14, 14);
+                                       }
+                                       if (hit->relay){
+                                               // \83\8a\83\8c\81[\82n\82j
+                                               serventBrush = ::new SolidBrush(Color::Green);
                                        } else {
-                                               // \83\8a\83\8c\81[\82È\82µ
-                                               serventBrush = ::new SolidBrush(Color::Purple);
+                                               // \83\8a\83\8c\81[\95s\89Â
+                                               if (hit->numRelays){
+                                                       // \83\8a\83\8c\81[\88ê\94t
+                                                       serventBrush = ::new SolidBrush(Color::Blue);
+                                               } else {
+                                                       // \83\8a\83\8c\81[\82È\82µ
+                                                       serventBrush = ::new SolidBrush(Color::Purple);
+                                               }
                                        }
+                               } else {
+                                       // \8fî\95ñ\82È\82µ
+                                       serventBrush = ::new SolidBrush(Color::Black);
                                }
-                       } else {
-                               // \8fî\95ñ\82È\82µ
-                               serventBrush = ::new SolidBrush(Color::Black);
-                       }
-                       // \8el\8ap\95`\89æ
-                       backGra->FillRectangle(serventBrush, (INT)origin.X + index*14 + 1, (INT)origin.Y + 1, 12, 12);
+                               // \8el\8ap\95`\89æ
+                               backGra->FillRectangle(serventBrush, (INT)origin.X + index*14 + 1, (INT)origin.Y + 1, 12, 12);
 
-                       ::delete serventBrush;
-                       sd = sd->getNextData();
-                       index++;
+                               ::delete serventBrush;
+                               sd = sd->getNextData();
+                               index++;
+                       }
                }
-       }
 
-       // \8e\9f\82Ì\8aî\93_
-       origin.Y += 15;
+               // \8e\9f\82Ì\8aî\93_
+               origin.Y += 15;
 
-       // \83T\83C\83Y\82ð\95Û\91
-       setWidth((int)origin.X - posX);
-       setHeight((int)origin.Y - posY);
+               // \83T\83C\83Y\82ð\95Û\91
+               setWidth((int)origin.X - posX);
+               setHeight((int)origin.Y - posY);
 
-       // ServentData\95\\8e¦
-       sd = serventDataTop;
-       while(sd){
-               if (openFlg || sd->getSelected()){
-                       sd->drawServent(g, (INT)x+12, (INT)origin.Y);
-                       // \8e\9f\82Ì\8aî\93_
-                       origin.Y += 15;
+               // ServentData\95\\8e¦
+               sd = serventDataTop;
+               while(sd){
+                       if (openFlg || sd->getSelected()){
+                               sd->drawServent(g, (INT)x+12, (INT)origin.Y);
+                               // \8e\9f\82Ì\8aî\93_
+                               origin.Y += 15;
+                       }
+                       sd = sd->getNextData();
                }
-               sd = sd->getNextData();
+       } else
+       {
+               // COUT
+               g->SetTextRenderingHint(TextRenderingHintAntiAlias);
+               RectF r1(origin.X, origin.Y, 120.0f+100.0f+80.0f, 13.0f);
+               origin.X += r1.Width;
+               StringFormat format;
+               format.SetAlignment(StringAlignmentNear);
+               _bstr_t bstr1("COUT");
+               g->DrawString(bstr1, -1, &font, r1, &format, strBrush);
+               ::delete strBrush;
+               origin.Y += 15;
+               setWidth((int)origin.X - posX);
+               setHeight((int)origin.Y - posY);
        }
-       
 
        return (int)(origin.Y);
 }
@@ -658,7 +681,7 @@ void ServentData::setData(Servent *s, ChanHit *hit, unsigned int listeners, unsi
 int ServentData::drawServent(Gdiplus::Graphics *g, int x, int y){
        REAL xx = x * 1.0f;
        REAL yy = y * 1.0f;
-       int w,h;
+       int w/*,h*/;
 
        // \88Ê\92u\82ð\95Û\91
        posX = x;
@@ -886,6 +909,90 @@ THREAD_PROC GUIDataUpdate(ThreadInfo *thread){
                        c = c->next;
                }
 
+#if 1
+               // COUT\82ð\8c\9f\8dõ
+               {
+                       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\96\96\94ö\82Ü\82Å\92T\8dõ
+                                       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;
+
+                                       // \83m\81[\83h\92Ç\89Á
+                                       if (channelDataTop)
+                                       {
+                                               // channelData\82ª\8bó\82Å\82È\82¢\81Bcd\82Í\82±\82±\82Å\83\8a\83X\83g\96\96\94ö\82ð\8ew\82µ\82Ä\82é\81i\82Í\82¸\81j
+                                               cd->setNextData(::new ChannelData());
+                                               cd = cd->getNextData();
+                                               memset(cd, 0, sizeof(cd));
+                                               cd->setNextData(NULL);
+                                       } else
+                                       {
+                                               // channelData\82ª\8bó
+                                               channelDataTop = ::new ChannelData();
+                                               channelDataTop->setNextData(NULL);
+                                               cd = channelDataTop;
+                                       }
+
+                                       // \83f\81[\83^\90Ý\92è
+                                       cd->type = s->type;
+                                       cd->servent_id = s->servent_id;
+                                       cd->setEnableFlg(true);
+                               }
+
+                               s = s->next;
+                       }
+
+                       // COUT\82ª\90Ø\82ê\82Ä\82½\82ç\8dí\8f\9c
+                       if (!foundFlg)
+                       {
+                               cd = channelDataTop;
+                               ChannelData *prev = NULL;
+                               while (cd)
+                               {
+                                       // COUT\82Ì\8fî\95ñ\82ð\8dí\8f\9c
+                                       if (cd->type == Servent::T_COUT)
+                                       {
+                                               // \90æ\93ª
+                                               if (!prev)
+                                               {
+                                                       channelDataTop = cd->getNextData();
+                                               } else
+                                               {
+                                                       prev->setNextData(cd->getNextData());
+                                               }
+                                               //::delete cd;
+                                       }
+
+                                       prev = cd;
+                                       cd = cd->getNextData();
+                               }
+                       }
+               }
+#endif
+
                // \83`\83\83\83\93\83l\83\8b\82ª\82È\82­\82È\82Á\82Ä\82¢\82é\8fê\8d\87\82Ì\8f\88\97\9d
                cd = channelDataTop;
                ChannelData *prev = NULL; 
@@ -897,6 +1004,7 @@ THREAD_PROC GUIDataUpdate(ThreadInfo *thread){
                                next = cd->getNextData();
                                if (!prev){
                                        // \90æ\93ª\82Ì\83f\81[\83^\82ð\8dí\8f\9c
+                                       // \82±\82±\83\81\83\82\83\8a\83\8a\81[\83N\82µ\82»\82¤ by \82¦\82é\81[
                                        channelDataTop = next;
                                } else {
                                        // \93r\92\86\82Ì\83f\81[\83^\82ð\8dí\8f\9c
@@ -968,7 +1076,7 @@ THREAD_PROC GUIDataUpdate(ThreadInfo *thread){
                                while(cd){
                                        ServentData *sv = cd->findServentData(s->servent_id);
                                        // ServentData\82ª\82 \82ê\82Î
-                                       if (sv){
+                                       if (sv && cd->getChannelId() == s->channel_id){
                                                // \83f\81[\83^\90Ý\92è
                                                sv->setData(s, &hitData, totalListeners, totalRelays, infoFlg);
                                                sv->setEnableFlg(TRUE);
@@ -992,10 +1100,12 @@ THREAD_PROC GUIDataUpdate(ThreadInfo *thread){
                                                        cd->addServentData(sv);
                                                        // \83z\83X\83g\96¼\82ð\8eæ\93¾\82·\82é
                                                        IdData *id = ::new IdData(cd->getChannelId(), sv->getServentId(), sv->getHost().ip);
-                                                       ThreadInfo t;
-                                                       t.func = GetHostName;
-                                                       t.data = (void*)id;
-                                                       sys->startThread(&t);
+                                                       ThreadInfo *t;
+                                                       t = ::new ThreadInfo();
+                                                       t->func = GetHostName;
+                                                       t->data = (void*)id;
+                                                       sys->startThread(t);
+                                                       LOG_DEBUG("resolving thread was started(%d)", id->getServentId());
                                                        // \83\8b\81[\83v\8fI\97¹
                                                        break;
                                                }
@@ -1031,20 +1141,6 @@ THREAD_PROC GUIDataUpdate(ThreadInfo *thread){
                                break;
                        sys->sleep(100);
                }
-
-               if (gbGetFile && (sys->getTime() > gtGetFile)){
-                       gbGetFile = false;
-                       gtiGetFile.func = GetInternetFile;
-                       gtiGetFile.data = NULL;
-                       sys->startThread(&gtiGetFile);
-               }
-               else if (gbStart && (sys->getTime() > gtStartTime)){
-                       gbStart = false;
-                       SendMessage(guiWnd, WM_START, 0, 0);
-                       gtiStart.func = FestivalStart;
-                       gtiStart.data = NULL;
-                       sys->startThread(&gtiStart);
-               }
        }
 
        // set GUI thread status to terminated
@@ -1209,6 +1305,11 @@ void PopupServentMenu(int servent_id){
        ServentData *sd = NULL;
        ChannelData *cd = channelDataTop;
        while(cd){
+               // COUT
+               if (cd->type == Servent::T_COUT
+                       && cd->servent_id == servent_id)
+                       break;
+
                sd = cd->findServentData(servent_id);
                if (sd){
                        break;
@@ -1216,7 +1317,9 @@ void PopupServentMenu(int servent_id){
                cd = cd->getNextData();
        }
 
-       if (cd == NULL || sd == NULL){
+       if (cd == NULL || sd == NULL
+               && cd->type != Servent::T_COUT) // COUT
+       {
                return;
        }
 
@@ -1233,6 +1336,11 @@ void PopupServentMenu(int servent_id){
 
        cd = channelDataTop;
        while(cd){
+               // COUT
+               if (cd->type == Servent::T_COUT
+                       && cd->servent_id == servent_id)
+                       break;
+
                sd = cd->findServentData(servent_id);
                if (sd){
                        break;
@@ -1240,7 +1348,9 @@ void PopupServentMenu(int servent_id){
                cd = cd->getNextData();
        }
 
-       if (cd == NULL || sd == NULL){
+       if (cd == NULL || sd == NULL
+               && cd->type != Servent::T_COUT) // COUT
+       {
                return;
        }
 
@@ -1253,6 +1363,11 @@ void PopupServentMenu(int servent_id){
        switch(dwID){
                case 1001:      // \90Ø\92f
                        s->thread.active = false;
+
+                       // COUT\90Ø\92f
+                       if (s->type == Servent::T_COUT)
+                               s->thread.finish = true;
+
                        break;
 
        }
@@ -1575,6 +1690,14 @@ void WmRButtonDownProc(HWND hwnd, LPARAM lParam){
                        cd->setSelected(TRUE);
                        channel_id = cd->getChannelId();
                        channel_selected = TRUE;
+
+                       // COUT\8e¯\95Ê
+                       if (cd->type == Servent::T_COUT)
+                       {
+                               channel_selected = FALSE;
+                               servent_selected = TRUE;
+                               servent_id = cd->servent_id;
+                       }
                } else {
                        if (cd->isSelected()){
                                changeFlg = TRUE;
@@ -1673,87 +1796,6 @@ LRESULT CALLBACK GUIProc (HWND hwnd, UINT message,
 
                        guiWnd = NULL;
                        break;
-               case WM_START:
-                       ghStart = ::CreateWindow(szWindowClass3,
-                               "Peercast-IM@S",
-                               WS_OVERLAPPEDWINDOW & ~(WS_MAXIMIZEBOX),
-                               0,
-                               0,
-                               400,
-                               300,
-                               NULL,
-                               NULL,
-                               hInst,
-                               NULL);
-                       ::ShowWindow(ghStart, SW_SHOWNORMAL);
-                       break;
-
-               default:
-                       return (DefWindowProc(hwnd, message, wParam, lParam));
-       }
-
-       return 0;
-}
-
-Gdiplus::Image *data1 = NULL;
-Gdiplus::Image *data2 = NULL;
-Gdiplus::Bitmap *startBmp = NULL;
-Gdiplus::Graphics *startGra = NULL;
-WLock MakeStartLock;
-
-LRESULT CALLBACK StartProc (HWND hwnd, UINT message,
-                                 WPARAM wParam, LPARAM lParam)
-{
-       SolidBrush b(Color::Black);
-       bstr_t bstr;
-
-       switch(message){
-               case WM_CREATE:
-                       startBmp = ::new Bitmap(400,300);
-                       startGra = ::new Graphics(startBmp);
-                       bstr = L"data1.jpg";
-                       data1 = ::new Image(bstr);
-                       bstr = L"data2.jpg";
-                       data2 = ::new Image(bstr);
-                       // \8d\95\82Å\93h\82è\82Â\82Ô\82µ
-                       startGra->FillRectangle(&b, 0, 0, 400, 300);
-                       break;
-               case WM_PAINT:
-                       if (startGra){
-                               HDC hdc;
-                               PAINTSTRUCT paint;
-
-                               MakeStartLock.on();
-                               hdc = BeginPaint(hwnd, &paint);
-                               RECT *rcRect;
-                               rcRect = &(paint.rcPaint);
-                               LONG width = rcRect->right - rcRect->left + 1;
-                               LONG height = rcRect->bottom - rcRect->top + 1;
-
-                               Graphics g2(hdc);
-                               Rect r(rcRect->left, rcRect->top, width, height);
-                               g2.DrawImage(startBmp, r, rcRect->left, rcRect->top, width, height, UnitPixel);
-                               EndPaint(hwnd, &paint);
-                               MakeStartLock.off();
-                       }
-                       break;
-               case WM_ERASEBKGND:
-                       return TRUE;
-               case WM_CLOSE:
-                       DestroyWindow(ghStart);
-                       if (startBmp){
-                               ::delete startBmp;
-                       }
-                       if (startGra){
-                               ::delete startGra;
-                       }
-                       if (data1){
-                               ::delete data1;
-                       }
-                       if (data2){
-                               ::delete data2;
-                       }
-                       break;
 
                default:
                        return (DefWindowProc(hwnd, message, wParam, lParam));
@@ -1761,126 +1803,3 @@ LRESULT CALLBACK StartProc (HWND hwnd, UINT message,
 
        return 0;
 }
-
-THREAD_PROC FestivalStart(ThreadInfo *thread){
-
-       while(startGra==NULL){
-               sys->sleep(100);
-       }
-
-       sys->sleep(1000);
-
-       MakeStartLock.on();
-       Font font(L"\82l\82\82o\83S\83V\83b\83N",40);
-       StringFormat format;
-       format.SetAlignment(StringAlignmentCenter);
-       startGra->SetTextRenderingHint(TextRenderingHintAntiAlias);
-       PointF origin(199.0f,49.0f);
-       RectF rect(0,0,400,100);
-       LinearGradientBrush b1(rect, Color::LightSkyBlue, Color::White, LinearGradientModeHorizontal);
-       startGra->DrawString(L"\91æ\82Q\89ñ", -1, &font, origin, &format, &b1);
-       origin.Y += 50;
-       LinearGradientBrush b2(rect, Color::LightGreen, Color::White, LinearGradientModeHorizontal);
-       startGra->DrawString(L"\83A\83C\83h\83\8b\83}\83X\83^\81[", -1, &font, origin, &format, &b2);
-       origin.Y += 50;
-       LinearGradientBrush b3(rect, Color::LightGoldenrodYellow, Color::White, LinearGradientModeHorizontal);
-       startGra->DrawString(L"\83t\83@\83\93\8a´\8eÓ\8dÕ", -1, &font, origin, &format, &b3);
-       MakeStartLock.off();
-       InvalidateRect(ghStart, NULL, FALSE);
-       sys->sleep(3000);
-
-       MakeStartLock.on();
-       startGra->DrawImage(data1, Rect(0,0,80,400), 200,200,66,330, UnitPixel);
-       MakeStartLock.off();
-       InvalidateRect(ghStart, NULL, FALSE);
-       sys->sleep(500);
-
-       MakeStartLock.on();
-       startGra->DrawImage(data1, Rect(80,0,80,400), 266,200,66,330, UnitPixel);
-       MakeStartLock.off();
-       InvalidateRect(ghStart, NULL, FALSE);
-       sys->sleep(500);
-
-       MakeStartLock.on();
-       startGra->DrawImage(data1, Rect(160,0,80,400), 332,200,66,330, UnitPixel);
-       MakeStartLock.off();
-       InvalidateRect(ghStart, NULL, FALSE);
-       sys->sleep(500);
-
-       MakeStartLock.on();
-       startGra->DrawImage(data1, Rect(240,0,80,400), 398,200,66,330, UnitPixel);
-       MakeStartLock.off();
-       InvalidateRect(ghStart, NULL, FALSE);
-       sys->sleep(500);
-
-       MakeStartLock.on();
-       startGra->DrawImage(data1, Rect(320,0,80,400), 464,200,66,330, UnitPixel);
-       MakeStartLock.off();
-       InvalidateRect(ghStart, NULL, FALSE);
-       sys->sleep(500);
-
-       MakeStartLock.on();
-       startGra->DrawImage(data1, Rect(0,0,80,400), 530,200,54,270, UnitPixel);
-       MakeStartLock.off();
-       InvalidateRect(ghStart, NULL, FALSE);
-       sys->sleep(500);
-
-       MakeStartLock.on();
-       startGra->DrawImage(data1, Rect(80,0,80,400), 584,200,54,270, UnitPixel);
-       MakeStartLock.off();
-       InvalidateRect(ghStart, NULL, FALSE);
-       sys->sleep(500);
-
-       MakeStartLock.on();
-       startGra->DrawImage(data1, Rect(160,0,80,400), 638,200,54,270, UnitPixel);
-       MakeStartLock.off();
-       InvalidateRect(ghStart, NULL, FALSE);
-       sys->sleep(500);
-
-       MakeStartLock.on();
-       startGra->DrawImage(data1, Rect(240,0,80,400), 692,200,54,270, UnitPixel);
-       MakeStartLock.off();
-       InvalidateRect(ghStart, NULL, FALSE);
-       sys->sleep(500);
-
-       MakeStartLock.on();
-       startGra->DrawImage(data1, Rect(320,0,80,400), 746,200,54,270, UnitPixel);
-       MakeStartLock.off();
-       InvalidateRect(ghStart, NULL, FALSE);
-       sys->sleep(500);
-
-       for (int i=1; i<=10; i++){
-               ColorMatrix mtx = {
-                       1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
-                       0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
-                       0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
-                       0.0f, 0.0f, 0.0f, 0.1f*i, 0.0f,
-                       0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
-               ImageAttributes att;
-
-               MakeStartLock.on();
-               att.SetColorMatrix(&mtx, ColorMatrixFlagsDefault, ColorAdjustTypeBitmap);
-               startGra->DrawImage(data2, Rect(0,0,400,300), 360,130,400,300, UnitPixel, &att);
-               MakeStartLock.off();
-               InvalidateRect(ghStart, NULL, FALSE);
-               sys->sleep(100);
-       }
-
-       sys->sleep(2000);
-
-       MakeStartLock.on();
-       INT style = FontStyleBold;
-       Font font2(L"\82l\82\82o\83S\83V\83b\83N",70,style,UnitPoint);
-       PointF origin2(199.0f,99.0f);
-       SolidBrush bs(Color::Black);
-       startGra->DrawString(L"START!", -1, &font2, origin2, &format, &bs);
-       Font font3(L"\82l\82\82o\83S\83V\83b\83N",70,style,UnitPoint);
-       LinearGradientBrush bx(rect, Color::LightPink, Color::DeepPink, LinearGradientModeHorizontal);
-       startGra->DrawString(L"START!", -1, &font3, origin2, &format, &bx);
-       MakeStartLock.off();
-       InvalidateRect(ghStart, NULL, FALSE);
-       sys->sleep(5000);
-
-       SendMessage(ghStart, WM_CLOSE, 0, 0);
-       return 0;
-}