From e731ee03ed1ecf3a5612d2cec59a2b401d35cd60 Mon Sep 17 00:00:00 2001 From: Brendan Walker Date: Sun, 8 Dec 2002 19:40:18 +0000 Subject: [PATCH] Rewrote DCC server to allow for multiple threads, also added DCC recv. (DCC recv still broken, threading buggy) --- stepmania/src/smlobby/SendFileDialog.cpp | 11 +- stepmania/src/smlobby/SendFileDialog.h | 4 +- stepmania/src/smlobby/irc.cpp | 544 ++++++++---- stepmania/src/smlobby/irc.h | 74 +- stepmania/src/smlobby/smlobby.aps | Bin 40268 -> 40320 bytes stepmania/src/smlobby/smlobby.clw | 1021 +++++++++++++++++++++- stepmania/src/smlobby/smlobby.dsp | 2 +- stepmania/src/smlobby/smlobby.ncb | Bin 82941 -> 132093 bytes stepmania/src/smlobby/smlobby.opt | Bin 49664 -> 50688 bytes stepmania/src/smlobby/smlobby.rc | 3 +- stepmania/src/smlobby/smlobbyDlg.cpp | 107 ++- stepmania/src/smlobby/smlobbyDlg.h | 1 + stepmania/src/smlobby/socket.cpp | 6 + stepmania/src/smlobby/socket.h | 1 + 14 files changed, 1515 insertions(+), 259 deletions(-) diff --git a/stepmania/src/smlobby/SendFileDialog.cpp b/stepmania/src/smlobby/SendFileDialog.cpp index 5db19b3399..27c24c8c05 100644 --- a/stepmania/src/smlobby/SendFileDialog.cpp +++ b/stepmania/src/smlobby/SendFileDialog.cpp @@ -32,7 +32,7 @@ CSendFileDialog::CSendFileDialog(CWnd* pParent /*=NULL*/) m_ToFrom = _T(""); //}}AFX_DATA_INIT - m_pDCCServer = NULL; + m_bIsCanceled = false; } @@ -65,13 +65,8 @@ END_MESSAGE_MAP() void CSendFileDialog::OnCancel() { - //Tell the DCC Server to abort as the file isn't transfering - // or the user has beome impatient :) - if (m_pDCCServer) - { - CIrcDCCServer* pServer = (CIrcDCCServer *)m_pDCCServer; - pServer->Stop(0); - } + //Thread is going to check up on us to see if it's time to bail + m_bIsCanceled = true; CDialog::OnCancel(); } diff --git a/stepmania/src/smlobby/SendFileDialog.h b/stepmania/src/smlobby/SendFileDialog.h index cb838c1bc5..b9213f0fa4 100644 --- a/stepmania/src/smlobby/SendFileDialog.h +++ b/stepmania/src/smlobby/SendFileDialog.h @@ -44,10 +44,10 @@ public: // Implementation public: - void AssignDCCServer(void* pServer) { m_pDCCServer = pServer; } + bool isCanceled() { return m_bIsCanceled; } protected: - void* m_pDCCServer; + bool m_bIsCanceled; protected: diff --git a/stepmania/src/smlobby/irc.cpp b/stepmania/src/smlobby/irc.cpp index 710fd9a64b..60fcce49ba 100644 --- a/stepmania/src/smlobby/irc.cpp +++ b/stepmania/src/smlobby/irc.cpp @@ -469,231 +469,267 @@ DWORD WINAPI CIrcIdentServer::ListenProc(LPVOID pparam) } //////////////////////////////////////////////////////////////////// +std::vector CIrcDCCServer::m_usedPorts; +std::vector CIrcDCCServer::m_hThread; +const unsigned short CIrcDCCServer::kFirstPort = 1024; +const unsigned short CIrcDCCServer::kLastPort = 5000; -CIrcDCCServer::CIrcDCCServer() - : m_uiPort(0), m_hThread(NULL), m_bIsSender(false), - m_ulPartnerIP(0L), m_ulFileSize(0L), - m_pSendFileDialog(NULL), m_ulStartTime(0L), - m_ulBytesSent(0L), m_uiXferRate(0) -{ -} - +//////////////////////////////////////////////////////////////////// CIrcDCCServer::~CIrcDCCServer() { Stop(); } -bool CIrcDCCServer::Start( - const CString fileName, - const CString directory, - const CString partner, - unsigned long ulPartnerIP, - unsigned short uiPort, - unsigned long ulFileSize, - unsigned short uiXferRate, - const bool bIsSender - ) +unsigned short CIrcDCCServer::MakePortReservation() { - //Clean up old send file dialog - if (m_pSendFileDialog) - { - delete m_pSendFileDialog; - m_pSendFileDialog = NULL; - } - - if( m_socket ) - return false; - - //Setup the connection info vars - m_fileName = fileName; - m_directory = directory; - m_partnerName = partner; - m_ulPartnerIP = ulPartnerIP; - m_uiPort = uiPort; - m_ulFileSize = ulFileSize; - m_bIsSender = bIsSender; - m_ulBytesSent = 0L; - m_uiXferRate = uiXferRate; - - //Remember when we started - m_ulStartTime = GetTickCount(); - - //Create a file transfer dialog - m_pSendFileDialog = new CSendFileDialog(AfxGetMainWnd()); - if ( !m_pSendFileDialog->Create(IDD_FILEXFER, AfxGetMainWnd()) ) - return false; - - m_pSendFileDialog->m_BytesSent = "0 bytes"; - m_pSendFileDialog->m_ProgressFile.SetRange(0, 100); - m_pSendFileDialog->m_ProgressFile.SetPos(0); - sprintf(m_pSendFileDialog->m_Filesize.GetBuffer(32), "%lu bytes", m_ulFileSize); - m_pSendFileDialog->m_FolderName = m_directory; - m_pSendFileDialog->m_FileName = m_fileName; - m_pSendFileDialog->m_RecvrName = m_partnerName; - m_pSendFileDialog->m_TimeLeft = "Infinite"; - m_pSendFileDialog->m_XferRate = "0 bytes/sec"; - m_pSendFileDialog->m_XferStatus = "Waiting to Connect..."; + //Assume the first port number is open + unsigned short uiPort = kFirstPort; - //Some fields in the - if (m_bIsSender) - { - m_pSendFileDialog->m_SentRecvd = "Sent:"; - m_pSendFileDialog->m_ToFrom = "To:"; - } + //if there are no used ports in the list use the first one + if (m_usedPorts.size() <= 0) + m_usedPorts.push_back(kFirstPort); + + //next see if the port range is saturated (pigeon hole principal) + else if ((*m_usedPorts.end() - kFirstPort + 1) >= m_usedPorts.size()) + m_usedPorts.push_back(*m_usedPorts.end() + 1); + + //there must be a find a gap in the used port list + //since the list is always sorted else { - m_pSendFileDialog->m_SentRecvd = "Recv'd:"; - m_pSendFileDialog->m_ToFrom = "From:"; + std::vector::iterator iter; + for (iter = m_usedPorts.begin(); iter < m_usedPorts.end(); iter++) + { + //oops, this port is being used, let's try the next one over + if (*iter == uiPort) uiPort++; + //looks like we found a gap, stop here + else break; + } + + //Insert our port number into the gap we just found + m_usedPorts.insert(iter, uiPort); } - //Show the dialog and tell it about this server - m_pSendFileDialog->AssignDCCServer(this); - m_pSendFileDialog->ShowWindow(SW_SHOW); - - //Fire off the thread - m_hThread = CreateThread(NULL, 0, ListenProc, this, 0, NULL); - Sleep(100); - - return true; + return uiPort; } -void CIrcDCCServer::Stop(DWORD timeout) +void CIrcDCCServer::FreePort(unsigned short port) { - if( m_hThread ) + //Tell used port list that this port is now open + std::vector::iterator iter; + for (iter = m_usedPorts.begin(); iter < m_usedPorts.end(); iter++) { - m_socket.Close(); - if( WaitForSingleObject(m_hThread, timeout) != WAIT_OBJECT_0 && m_hThread ) + //Find the port number, remove it + if (*iter == port) { - TerminateThread(m_hThread, 1); - CloseHandle(m_hThread); - m_hThread = NULL; + m_usedPorts.erase(iter); + return; } } } -void CIrcDCCServer::DoThreadRecv() +void CIrcDCCServer::FreeThread(HANDLE pThread) +{ + //If thread list is empty, bail + if (m_hThread.size() <= 0) return; + + //Tell thread ptr list that this thread is done + std::vector::iterator iter; + for (iter = m_hThread.begin(); iter < m_hThread.end(); iter++) + { + //is this the the thread were looking for? + if ( *iter == pThread ) + { + //Now we can forget about the thread + CloseHandle(*iter); + m_hThread.erase(iter); + } + } +} + +bool CIrcDCCServer::Start(DCCTransferInfo dccinfo) +{ + //Make sure we have a port reservation made if were hosting a file + if (dccinfo.m_bIsSender && dccinfo.m_uiPort < kFirstPort) + return false; + + //Remember when we started and who spawned us + dccinfo.m_ulStartTime = GetTickCount(); + dccinfo.m_pDCCSever = this; + + //Create the appropriate thread, but don't start it just yet + /*if (dccinfo.m_bIsSender) + dccinfo.m_pThread = CreateThread(NULL, 0, DoThreadSend, (void *)&dccinfo, + CREATE_SUSPENDED, NULL); + else + dccinfo.m_pThread = CreateThread(NULL, 0, DoThreadRecv, (void *)&dccinfo, + CREATE_SUSPENDED, NULL); + + //Rememeber who what threads we spawned + m_hThread.push_back(dccinfo.m_pThread); + + //Now we can fire off the thread + if (-1 == ResumeThread(dccinfo.m_pThread)) return false; + Sleep(100);*/ + + if (dccinfo.m_bIsSender) + DoThreadSend((void *)&dccinfo); + else + DoThreadRecv((void *)&dccinfo); + + return true; +} + +void CIrcDCCServer::Stop(DWORD timeout, HANDLE hThread) +{ + //make sure we have a threads running + if (m_hThread.size() <= 0) return; + + //Generate an iterator for the thread list + std::vector::iterator iter; + + //if the thread specified is NULL, kill all of the threads in the list + if (hThread == NULL) + { + //Start at the beginning + iter = m_hThread.begin(); + while(m_hThread.size() > 0) + { + //wait for each thread to finish + if( *iter && WaitForSingleObject(*iter, timeout) != WAIT_OBJECT_0 ) + { + TerminateThread(*iter, 1); + CloseHandle(*iter); + } + + //now we can forget about the thread + iter = m_hThread.erase(iter); + } + } + + //otherwise, find all a specific thread to close + else + { + for (iter = m_hThread.begin(); iter < m_hThread.end(); iter++) + { + //is this the the thread were looking for? + if ( *iter == hThread ) + { + //wait for each thread to finish + if( *iter && WaitForSingleObject(*iter, timeout) != WAIT_OBJECT_0 ) + { + TerminateThread(*iter, 1); + CloseHandle(*iter); + } + + //now we can forget about the thread + m_hThread.erase(iter); + } + } + } +} + +DWORD WINAPI CIrcDCCServer::DoThreadRecv(void* dccInfo) { char szBuf[8193]; - unsigned long cbRead, cbSent; + unsigned long cbRead, cbSent, replyTotal; float fracSent; unsigned long seconds, minutes, hours, rate; + //Make a local copy of the dcc info + DCCTransferInfo info = *((DCCTransferInfo*)dccInfo); + + //Create a file transfer dialog + CSendFileDialog* pSendFileDialog = new CSendFileDialog(NULL); + CWnd* pParent= pSendFileDialog->FromHandle( AfxGetMainWnd()->m_hWnd ); + if (!pParent || !pSendFileDialog || !pSendFileDialog->Create(IDD_FILEXFER, pParent) ) + return false; + + //Setup the status info on the dialog + pSendFileDialog->m_BytesSent = "0 bytes"; + pSendFileDialog->m_ProgressFile.SetRange(0, 100); + pSendFileDialog->m_ProgressFile.SetPos(0); + pSendFileDialog->m_FolderName = info.m_directory; + pSendFileDialog->m_FileName = info.m_fileName; + pSendFileDialog->m_RecvrName = info.m_partnerName; + pSendFileDialog->m_TimeLeft = "Infinite"; + pSendFileDialog->m_XferRate = "0 bytes/sec"; + pSendFileDialog->m_XferStatus = "Waiting to Connect..."; + pSendFileDialog->m_SentRecvd = "Recv'd:"; + pSendFileDialog->m_ToFrom = "From:"; + sprintf(pSendFileDialog->m_Filesize.GetBuffer(32), "%lu bytes", + info.m_ulFileSize); + + //Show the dialog and tell it about this server + pSendFileDialog->ShowWindow(SW_SHOW); + //Create an active socket to retrieve data from (close listening socket) InetAddr addr; - addr.host = m_ulPartnerIP; - addr.port = m_uiPort; - m_socket.Connect(addr); - if ( !m_socket ) return; + Socket sock; + addr.host = htonl(info.m_ulPartnerIP); + addr.port = htons(info.m_uiPort); + sock.Connect(addr); + + //bail if we can't open the socket + if ( !sock ) + { + pSendFileDialog->ShowWindow(SW_HIDE); + delete pSendFileDialog; + return 0; + } //Tell user file transfer has started - m_pSendFileDialog->m_XferStatus = "Recieving File..."; + pSendFileDialog->m_XferStatus = "Recieving File..."; //Create a file to write incoming data to - CString filename = m_directory+m_fileName; + CString filename = info.m_directory+info.m_fileName; FILE* fp = fopen(filename, "wb"); - if ( !fp ) return; + + //bail if we can't open the file + if ( !sock ) + { + pSendFileDialog->ShowWindow(SW_HIDE); + delete pSendFileDialog; + return 0; + } //Start grabbing data blocks - while(m_ulBytesSent < m_ulFileSize) + while(info.m_ulBytesSent < info.m_ulFileSize && !pSendFileDialog->isCanceled()) { //Grab the next buffer - cbRead = m_socket.Receive((unsigned char*)szBuf, sizeof(szBuf)-1); - + cbRead = sock.Receive((unsigned char*)szBuf, sizeof(szBuf)-1); + if( cbRead <= 0 ) continue; else szBuf[cbRead] = '\0'; - //Update the file transfer statistics - m_ulBytesSent += cbRead; - fracSent = float(m_ulBytesSent)/float(m_ulFileSize); - seconds = (GetTickCount() - m_ulStartTime)/1000; - rate = m_ulBytesSent / seconds; - seconds = (unsigned long)(float(seconds)/fracSent); - minutes = (seconds/60) % 60; - hours = (seconds/3600); - seconds = seconds % 60; - - //Update the file transfer window - sprintf(m_pSendFileDialog->m_BytesSent.GetBuffer(64), "%lu bytes", m_ulBytesSent); - sprintf(m_pSendFileDialog->m_TimeLeft.GetBuffer(32), "%luh%lum%lus", - hours, minutes, seconds); - sprintf(m_pSendFileDialog->m_XferRate.GetBuffer(64), "%lubytes/sec", rate); - m_pSendFileDialog->m_ProgressFile.SetPos(int(fracSent*100.F)); - //Write it to file fwrite(szBuf, cbRead, 1, fp); - //Tell the sender how many bytes we received - cbRead = htonl(cbRead); - cbSent = 0; - while ( cbSent <= 0 ) - cbSent = m_socket.Send((unsigned char *)&cbRead, 4); - } + //update byte count + info.m_ulBytesSent += cbRead; - //Close our data transfer socket - m_socket.Close(); - - //Close our file - fclose(fp); -} - -void CIrcDCCServer::DoThreadSend() -{ - char szBuf[8193]; - unsigned long cbSend, cbRead, numAck; - float fracSent; - unsigned long seconds, minutes, hours, rate; - - //Wait for someone to connect to us - //on a pre-arranged port - m_socket.Bind(InetAddr(m_uiPort)); - m_socket.Listen(); - - //Create an active socket to write data from (close listening socket) - Socket sock = m_socket.Accept(); - if ( !sock ) return; - m_socket.Close(); - - //Tell user file transfer has started - m_pSendFileDialog->m_XferStatus = "Sending File..."; - - //Create a file to read incoming data from - CString filename = m_directory+"\\"+m_fileName; - FILE* fp = fopen(filename, "rb"); - if ( !fp ) return; - - - //Start grapping data blocks - while( m_ulBytesSent < m_ulFileSize ) - { - //Pull a data block from the file - fread(szBuf, m_uiXferRate, 1, fp); - - //Send the next chunk out - cbSend = 0; - while (cbSend <= 0) - cbSend = sock.Send((unsigned char *)szBuf, m_uiXferRate); - - //Make sure chunk gets acknowledged - cbRead = 0; - while( cbRead <= 0) - cbRead = m_socket.Receive((unsigned char*)&numAck, 4); - - //Update that statistics - m_ulBytesSent += ntohl(numAck); - fracSent = float(m_ulBytesSent)/float(m_ulFileSize); - seconds = (GetTickCount() - m_ulStartTime)/1000; - rate = m_ulBytesSent / seconds; + //Update the file transfer statistics + fracSent = float(info.m_ulBytesSent)/float(info.m_ulFileSize); + seconds = (GetTickCount() - info.m_ulStartTime)/1000; + rate = (seconds > 0) ? info.m_ulBytesSent / seconds : 0; seconds = (unsigned long)(float(seconds)/fracSent); minutes = (seconds/60) % 60; hours = (seconds/3600); seconds = seconds % 60; //Update the file transfer window - sprintf(m_pSendFileDialog->m_BytesSent.GetBuffer(64), "%lu bytes", m_ulBytesSent); - sprintf(m_pSendFileDialog->m_TimeLeft.GetBuffer(32), "%luh%lum%lus", + sprintf(pSendFileDialog->m_BytesSent.GetBuffer(64), "%lu bytes", + info.m_ulBytesSent); + sprintf(pSendFileDialog->m_TimeLeft.GetBuffer(32), "%luh%lum%lus", hours, minutes, seconds); - sprintf(m_pSendFileDialog->m_XferRate.GetBuffer(64), "%lubytes/sec", rate); - m_pSendFileDialog->m_ProgressFile.SetPos(int(fracSent*100.F)); + sprintf(pSendFileDialog->m_XferRate.GetBuffer(64), "%lubytes/sec", rate); + pSendFileDialog->m_ProgressFile.SetPos(int(fracSent*100.F)); + + //Tell the sender how many bytes we received + replyTotal = htonl(info.m_ulBytesSent); + + //Send out response + cbSent = sock.Send((unsigned char *)&replyTotal, 4); } //Close our data transfer socket @@ -701,19 +737,163 @@ void CIrcDCCServer::DoThreadSend() //Close our file fclose(fp); + + //Clean up file dialog + pSendFileDialog->ShowWindow(SW_HIDE); + delete pSendFileDialog; + + //Free this thread from the system + if (info.m_pDCCSever) + info.m_pDCCSever->FreeThread(info.m_pThread); + + return 0; } -DWORD WINAPI CIrcDCCServer::ListenProc(LPVOID pparam) +DWORD WINAPI CIrcDCCServer::DoThreadSend(void* dccInfo) { - CIrcDCCServer* pThis = (CIrcDCCServer*)pparam; + char szBuf[8193]; + unsigned long cbSend, cbRead, numAck; + float fracSent; + unsigned long seconds, minutes, hours, rate; + const k_ulTimeout = 10000; //30 second timeout - if (pThis->IsSender()) - try { pThis->DoThreadSend(); } catch( ... ) {} - else - try { pThis->DoThreadRecv(); } catch( ... ) {} + //Make a local copy of the dcc info + DCCTransferInfo info = *((DCCTransferInfo*)dccInfo); - CloseHandle(pThis->m_hThread); - pThis->m_hThread = NULL; + //Create a file transfer dialog + CSendFileDialog* pSendFileDialog = new CSendFileDialog(NULL); + ASSERT (pSendFileDialog); + + CWnd* pParent= pSendFileDialog->FromHandle( AfxGetMainWnd()->m_hWnd ); + ASSERT (pParent); + + ASSERT (pSendFileDialog->Create(IDD_FILEXFER, pParent) == TRUE); + //if (!pParent || !pSendFileDialog || !pSendFileDialog->Create(IDD_FILEXFER, pParent) ) + // return false; + + //Setup the status info on the dialog + pSendFileDialog->m_BytesSent = "0 bytes"; + pSendFileDialog->m_ProgressFile.SetRange(0, 100); + pSendFileDialog->m_ProgressFile.SetPos(0); + pSendFileDialog->m_FolderName = info.m_directory; + pSendFileDialog->m_FileName = info.m_fileName; + pSendFileDialog->m_RecvrName = info.m_partnerName; + pSendFileDialog->m_TimeLeft = "Infinite"; + pSendFileDialog->m_XferRate = "0 bytes/sec"; + pSendFileDialog->m_XferStatus = "Waiting to Connect..."; + pSendFileDialog->m_SentRecvd = "Sent:"; + pSendFileDialog->m_ToFrom = "To:"; + sprintf(pSendFileDialog->m_Filesize.GetBuffer(32), "%lu bytes", + info.m_ulFileSize); + + //Show the dialog and tell it about this server + pSendFileDialog->ShowWindow(SW_SHOW); + + //Wait for someone to connect to us + //on a pre-arranged port + Socket sockListen; + sockListen.Bind(InetAddr(INADDR_ANY, htons(info.m_uiPort))); + if (!sockListen.Listen()) + { + pSendFileDialog->ShowWindow(SW_HIDE); + delete pSendFileDialog; + return 0; + } + + //Wait for partner to connect to us + Socket sock; + while(!sock && (GetTickCount() - info.m_ulStartTime) < k_ulTimeout) + sock = sockListen.Accept(); + + //Make sure socket is valid (we didn't timeout) + if ( !sock ) + { + pSendFileDialog->ShowWindow(SW_HIDE); + delete pSendFileDialog; + return 0; + } + + //Close the socket we were listening on + sockListen.Close(); + + //Tell user file transfer has started + pSendFileDialog->m_XferStatus = "Sending File..."; + + //Create a file to read incoming data from + CString filename = info.m_directory+info.m_fileName; + FILE* fp = fopen(filename, "rb"); + ASSERT( fp != NULL ); + if ( !fp ) + { + pSendFileDialog->ShowWindow(SW_HIDE); + delete pSendFileDialog; + return 0; + } + + //Start grabbing data blocks + while( info.m_ulBytesSent < info.m_ulFileSize && !pSendFileDialog->isCanceled() ) + { + //Pull a data block from the file + cbRead = fread(szBuf, info.m_uiXferRate, 1, fp); + + //Send the next chunk out + cbSend = 0; + while (cbSend <= 0) + cbSend = sock.Send((unsigned char *)szBuf, cbRead); + + //Update sent byte count + info.m_ulBytesSent += cbSend; + + //Make sure chunk gets acknowledged + cbRead = 0; + while( cbRead <= 0) + cbRead = sock.Receive((unsigned char*)&numAck, 4); + + //Make sure numAck matches current amount of data seny + //Update that statistics + if (info.m_ulBytesSent != ntohl(numAck)) + { + pSendFileDialog->ShowWindow(SW_HIDE); + delete pSendFileDialog; + sock.Close(); + fclose(fp); + + return 0; + } + + fracSent = float(info.m_ulBytesSent)/float(info.m_ulFileSize); + seconds = (GetTickCount() - info.m_ulStartTime)/1000; + rate = info.m_ulBytesSent / seconds; + seconds = (unsigned long)(float(seconds)/fracSent); + minutes = (seconds/60) % 60; + hours = (seconds/3600); + seconds = seconds % 60; + + //Update the file transfer window + sprintf(pSendFileDialog->m_BytesSent.GetBuffer(64), "%lu bytes", + info.m_ulBytesSent); + sprintf(pSendFileDialog->m_TimeLeft.GetBuffer(32), "%luh%lum%lus", + hours, minutes, seconds); + sprintf(pSendFileDialog->m_XferRate.GetBuffer(64), "%lubytes/sec", rate); + pSendFileDialog->m_ProgressFile.SetPos(int(fracSent*100.F)); + } + + //Close our data transfer socket + sock.Close(); + + //Close our file + fclose(fp); + + //Clean up file dialog + pSendFileDialog->ShowWindow(SW_HIDE); + delete pSendFileDialog; + + //Free this thread and port from the system + if (info.m_pDCCSever) + { + info.m_pDCCSever->FreeThread(info.m_pThread); + info.m_pDCCSever->FreePort(info.m_uiPort); + } return 0; } diff --git a/stepmania/src/smlobby/irc.h b/stepmania/src/smlobby/irc.h index cfb46a4fdc..74ed7e0f3d 100644 --- a/stepmania/src/smlobby/irc.h +++ b/stepmania/src/smlobby/irc.h @@ -168,46 +168,56 @@ private : class CIrcDCCServer { +public: + struct DCCTransferInfo + { + bool m_bIsSender; + CString m_fileName; + CString m_directory; + CString m_partnerName; + unsigned long m_ulPartnerIP; + unsigned int m_uiPort; + unsigned long m_ulFileSize; + unsigned long m_ulBytesSent; + unsigned long m_ulStartTime; + unsigned int m_uiXferRate; + CIrcDCCServer* m_pDCCSever; + HANDLE m_pThread; + + DCCTransferInfo() : + m_bIsSender(false), + m_ulPartnerIP(0L), + m_uiPort(0), + m_ulFileSize(0L), + m_ulBytesSent(0L), + m_ulStartTime(0L), + m_uiXferRate(0), + m_pDCCSever(NULL), + m_pThread(NULL) + {} + }; + public : - CIrcDCCServer(); virtual ~CIrcDCCServer(); - bool Start( - const CString fileName, - const CString directory, - const CString partner, - unsigned long ulPartnerIP, - unsigned short uiPort, - unsigned long ulFileSize, - unsigned short uiXferRate, - const bool bIsSender = false - ); + bool Start(DCCTransferInfo dccinfo); + void Stop(DWORD timeout = 0, HANDLE hThread = NULL); - void Stop(DWORD timeout = 5000L); + unsigned short MakePortReservation(); - bool IsSender() { return m_bIsSender; } +protected: + void FreePort(unsigned short port); + void FreeThread(HANDLE pThread); -protected : - bool m_bIsSender; - CString m_fileName; - CString m_directory; - CString m_partnerName; - unsigned long m_ulPartnerIP; - unsigned int m_uiPort; - unsigned long m_ulFileSize; - unsigned long m_ulBytesSent; - unsigned long m_ulStartTime; - unsigned int m_uiXferRate; - CSendFileDialog* m_pSendFileDialog; +protected: + static std::vector m_hThread; + static std::vector m_usedPorts; - void DoThreadSend(); - void DoThreadRecv(); + static const unsigned short kFirstPort; + static const unsigned short kLastPort; -private : - Socket m_socket; - HANDLE m_hThread; - - static DWORD WINAPI ListenProc(LPVOID pparam); + static DWORD WINAPI DoThreadSend(void* dccinfo); + static DWORD WINAPI DoThreadRecv(void* dccinfo); }; //////////////////////////////////////////////////////////////////// diff --git a/stepmania/src/smlobby/smlobby.aps b/stepmania/src/smlobby/smlobby.aps index 56bdef1325f3029af641196678ff2555719701a5..6df6bcde33376e74f1cfc278b1044c998a1252fe 100644 GIT binary patch delta 778 zcmZ{iPiPZC6vp37vfEf{p&nFXx`{?gQzcDoEp#oIxXC6;wXF#~l#o)B6m6A;=Ac3& zMOu`^G=H9jG>M=f9;AordQwPp6w!k{iHG9BgFWcUgMv2B_7DqcW)9!X`+YOt@R;|n z>HHg-F%dC))O^@b0FcB$By{~+G!_ZmoSB`DMJGZLtT>Np09Iby9?`U&cS+;Y(8Y5@ zcCg!eY|x2sHAZ5^kA4&B#(i3Yw#N=Ov}g^)uE^TWGiY{<@MR9*IN+UvfO*GQ+ny2F z?ld$YVW+R2C>5uh)R)!QDmJOR0m6iZXqsQm;0M1CU4C~ zV%DqRQr2ZRA*0B7&E%(I@qXs&S_Eoal=e$KkBlAly)m?8oN;fDzOLve1_#u6Rh9XKdV6{0fJpwm605FGJ zte{)O*5WDZUBvAL0|tu+=|gpC<-bvY!F%|;C{TX_-xUQ?!mXl_eo105spo-x(Uue@ v9_aZE<~*6f3nhV?5T}@|E@N<6&wE+y*F0|LdvUYWN}~9^B#}>Oe{|#@C_n*K delta 684 zcmZ8fO=uHA82x6F-K3x*2o;uQH|;`*sHp}mW{sM3brYqOXz|cefdwtNfUZr>-^k`?GPAi1D)9jqKxz5zSr=+&d}Kc!IqxSSoEq(Oha)hE_0xUi zfRk~rAH`TKMJia06?)q5AMZE~pcxfkQH1o0v*Qg z?Q_}r>kD%iv*FMb==jkXCVWSnk;FE_=y*~kKb%5xO>nM`UKsLtzyn_JI-iOKF9A%I z&rtwumIEAC%M%=el{AON7Hn2t@{_%kr=kmYm;tg251TVXz=o#y=AC<>2mZ3T2V;&j{xrR!TSZ*jnMF4n=%MC?bVI?C5-ZEtI z3!}jVrW3NDM;S$*rP60bTq}k!Z@KBWB1-o|!XpB(595{(-&?(OqlD|0Ous+CKbA}m zq0d&xO+02RwD}Ozwj_$|gS}hA+cpc;@Tn~``wa`dz^}GWqS*gLr_DOPtxNv^DyGc& diff --git a/stepmania/src/smlobby/smlobby.clw b/stepmania/src/smlobby/smlobby.clw index 0bbee9e060..93651a0a71 100644 --- a/stepmania/src/smlobby/smlobby.clw +++ b/stepmania/src/smlobby/smlobby.clw @@ -2,7 +2,7 @@ [General Info] Version=1 -LastClass=CSmlobbyDlg +LastClass=CSmlobbyApp LastTemplate=CDialog NewFileInclude1=#include "stdafx.h" NewFileInclude2=#include "smlobby.h" @@ -11,7 +11,7 @@ ClassCount=2 Class1=CSmlobbyApp Class2=CSmlobbyDlg -ResourceCount=355 +ResourceCount=1337 Resource2=IDR_MAINFRAME Resource3=IDD_CONNECT (Unknown language: 0xD Resource4=IDD_CONNECT (Unknown language: 0xD @@ -362,10 +362,992 @@ Resource348=IDD_CONNECT (Unknown language: 0xD Resource349=IDD_CONNECT (Unknown language: 0xD Resource350=IDD_CONNECT (Unknown language: 0xD Resource351=IDD_CONNECT (Unknown language: 0xD -Resource352=IDD_ABOUTBOX -Resource353=IDD_SMLOBBY_DIALOG -Resource354=IDD_FILEXFER -Resource355=IDD_CONNECT (Unknown language: 0xD, 0x1) +Resource352=IDD_CONNECT (Unknown language: 0xD +Resource353=IDD_CONNECT (Unknown language: 0xD +Resource354=IDD_CONNECT (Unknown language: 0xD +Resource355=IDD_CONNECT (Unknown language: 0xD +Resource356=IDD_CONNECT (Unknown language: 0xD +Resource357=IDD_CONNECT (Unknown language: 0xD +Resource358=IDD_CONNECT (Unknown language: 0xD +Resource359=IDD_CONNECT (Unknown language: 0xD +Resource360=IDD_CONNECT (Unknown language: 0xD +Resource361=IDD_CONNECT (Unknown language: 0xD +Resource362=IDD_CONNECT (Unknown language: 0xD +Resource363=IDD_CONNECT (Unknown language: 0xD +Resource364=IDD_CONNECT (Unknown language: 0xD +Resource365=IDD_CONNECT (Unknown language: 0xD +Resource366=IDD_CONNECT (Unknown language: 0xD +Resource367=IDD_CONNECT (Unknown language: 0xD +Resource368=IDD_CONNECT (Unknown language: 0xD +Resource369=IDD_CONNECT (Unknown language: 0xD +Resource370=IDD_CONNECT (Unknown language: 0xD +Resource371=IDD_CONNECT (Unknown language: 0xD +Resource372=IDD_CONNECT (Unknown language: 0xD +Resource373=IDD_CONNECT (Unknown language: 0xD +Resource374=IDD_CONNECT (Unknown language: 0xD +Resource375=IDD_CONNECT (Unknown language: 0xD +Resource376=IDD_CONNECT (Unknown language: 0xD +Resource377=IDD_CONNECT (Unknown language: 0xD +Resource378=IDD_CONNECT (Unknown language: 0xD +Resource379=IDD_CONNECT (Unknown language: 0xD +Resource380=IDD_CONNECT (Unknown language: 0xD +Resource381=IDD_CONNECT (Unknown language: 0xD +Resource382=IDD_CONNECT (Unknown language: 0xD +Resource383=IDD_CONNECT (Unknown language: 0xD +Resource384=IDD_CONNECT (Unknown language: 0xD +Resource385=IDD_CONNECT (Unknown language: 0xD +Resource386=IDD_CONNECT (Unknown language: 0xD +Resource387=IDD_CONNECT (Unknown language: 0xD +Resource388=IDD_CONNECT (Unknown language: 0xD +Resource389=IDD_CONNECT (Unknown language: 0xD +Resource390=IDD_CONNECT (Unknown language: 0xD +Resource391=IDD_CONNECT (Unknown language: 0xD +Resource392=IDD_CONNECT (Unknown language: 0xD +Resource393=IDD_CONNECT (Unknown language: 0xD +Resource394=IDD_CONNECT (Unknown language: 0xD +Resource395=IDD_CONNECT (Unknown language: 0xD +Resource396=IDD_CONNECT (Unknown language: 0xD +Resource397=IDD_CONNECT (Unknown language: 0xD +Resource398=IDD_CONNECT (Unknown language: 0xD +Resource399=IDD_CONNECT (Unknown language: 0xD +Resource400=IDD_CONNECT (Unknown language: 0xD +Resource401=IDD_CONNECT (Unknown language: 0xD +Resource402=IDD_CONNECT (Unknown language: 0xD +Resource403=IDD_CONNECT (Unknown language: 0xD +Resource404=IDD_CONNECT (Unknown language: 0xD +Resource405=IDD_CONNECT (Unknown language: 0xD +Resource406=IDD_CONNECT (Unknown language: 0xD +Resource407=IDD_CONNECT (Unknown language: 0xD +Resource408=IDD_CONNECT (Unknown language: 0xD +Resource409=IDD_CONNECT (Unknown language: 0xD +Resource410=IDD_CONNECT (Unknown language: 0xD +Resource411=IDD_CONNECT (Unknown language: 0xD +Resource412=IDD_CONNECT (Unknown language: 0xD +Resource413=IDD_CONNECT (Unknown language: 0xD +Resource414=IDD_CONNECT (Unknown language: 0xD +Resource415=IDD_CONNECT (Unknown language: 0xD +Resource416=IDD_CONNECT (Unknown language: 0xD +Resource417=IDD_CONNECT (Unknown language: 0xD +Resource418=IDD_CONNECT (Unknown language: 0xD +Resource419=IDD_CONNECT (Unknown language: 0xD +Resource420=IDD_CONNECT (Unknown language: 0xD +Resource421=IDD_CONNECT (Unknown language: 0xD +Resource422=IDD_CONNECT (Unknown language: 0xD +Resource423=IDD_CONNECT (Unknown language: 0xD +Resource424=IDD_CONNECT (Unknown language: 0xD +Resource425=IDD_CONNECT (Unknown language: 0xD +Resource426=IDD_CONNECT (Unknown language: 0xD +Resource427=IDD_CONNECT (Unknown language: 0xD +Resource428=IDD_CONNECT (Unknown language: 0xD +Resource429=IDD_CONNECT (Unknown language: 0xD +Resource430=IDD_CONNECT (Unknown language: 0xD +Resource431=IDD_CONNECT (Unknown language: 0xD +Resource432=IDD_CONNECT (Unknown language: 0xD +Resource433=IDD_CONNECT (Unknown language: 0xD +Resource434=IDD_CONNECT (Unknown language: 0xD +Resource435=IDD_CONNECT (Unknown language: 0xD +Resource436=IDD_CONNECT (Unknown language: 0xD +Resource437=IDD_CONNECT (Unknown language: 0xD +Resource438=IDD_CONNECT (Unknown language: 0xD +Resource439=IDD_CONNECT (Unknown language: 0xD +Resource440=IDD_CONNECT (Unknown language: 0xD +Resource441=IDD_CONNECT (Unknown language: 0xD +Resource442=IDD_CONNECT (Unknown language: 0xD +Resource443=IDD_CONNECT (Unknown language: 0xD +Resource444=IDD_CONNECT (Unknown language: 0xD +Resource445=IDD_CONNECT (Unknown language: 0xD +Resource446=IDD_CONNECT (Unknown language: 0xD +Resource447=IDD_CONNECT (Unknown language: 0xD +Resource448=IDD_CONNECT (Unknown language: 0xD +Resource449=IDD_CONNECT (Unknown language: 0xD +Resource450=IDD_CONNECT (Unknown language: 0xD +Resource451=IDD_CONNECT (Unknown language: 0xD +Resource452=IDD_CONNECT (Unknown language: 0xD +Resource453=IDD_CONNECT (Unknown language: 0xD +Resource454=IDD_CONNECT (Unknown language: 0xD +Resource455=IDD_CONNECT (Unknown language: 0xD +Resource456=IDD_CONNECT (Unknown language: 0xD +Resource457=IDD_CONNECT (Unknown language: 0xD +Resource458=IDD_CONNECT (Unknown language: 0xD +Resource459=IDD_CONNECT (Unknown language: 0xD +Resource460=IDD_CONNECT (Unknown language: 0xD +Resource461=IDD_CONNECT (Unknown language: 0xD +Resource462=IDD_CONNECT (Unknown language: 0xD +Resource463=IDD_CONNECT (Unknown language: 0xD +Resource464=IDD_CONNECT (Unknown language: 0xD +Resource465=IDD_CONNECT (Unknown language: 0xD +Resource466=IDD_CONNECT (Unknown language: 0xD +Resource467=IDD_CONNECT (Unknown language: 0xD +Resource468=IDD_CONNECT (Unknown language: 0xD +Resource469=IDD_CONNECT (Unknown language: 0xD +Resource470=IDD_CONNECT (Unknown language: 0xD +Resource471=IDD_CONNECT (Unknown language: 0xD +Resource472=IDD_CONNECT (Unknown language: 0xD +Resource473=IDD_CONNECT (Unknown language: 0xD +Resource474=IDD_CONNECT (Unknown language: 0xD +Resource475=IDD_CONNECT (Unknown language: 0xD +Resource476=IDD_CONNECT (Unknown language: 0xD +Resource477=IDD_CONNECT (Unknown language: 0xD +Resource478=IDD_CONNECT (Unknown language: 0xD +Resource479=IDD_CONNECT (Unknown language: 0xD +Resource480=IDD_CONNECT (Unknown language: 0xD +Resource481=IDD_CONNECT (Unknown language: 0xD +Resource482=IDD_CONNECT (Unknown language: 0xD +Resource483=IDD_CONNECT (Unknown language: 0xD +Resource484=IDD_CONNECT (Unknown language: 0xD +Resource485=IDD_CONNECT (Unknown language: 0xD +Resource486=IDD_CONNECT (Unknown language: 0xD +Resource487=IDD_CONNECT (Unknown language: 0xD +Resource488=IDD_CONNECT (Unknown language: 0xD +Resource489=IDD_CONNECT (Unknown language: 0xD +Resource490=IDD_CONNECT (Unknown language: 0xD +Resource491=IDD_CONNECT (Unknown language: 0xD +Resource492=IDD_CONNECT (Unknown language: 0xD +Resource493=IDD_CONNECT (Unknown language: 0xD +Resource494=IDD_CONNECT (Unknown language: 0xD +Resource495=IDD_CONNECT (Unknown language: 0xD +Resource496=IDD_CONNECT (Unknown language: 0xD +Resource497=IDD_CONNECT (Unknown language: 0xD +Resource498=IDD_CONNECT (Unknown language: 0xD +Resource499=IDD_CONNECT (Unknown language: 0xD +Resource500=IDD_CONNECT (Unknown language: 0xD +Resource501=IDD_CONNECT (Unknown language: 0xD +Resource502=IDD_CONNECT (Unknown language: 0xD +Resource503=IDD_CONNECT (Unknown language: 0xD +Resource504=IDD_CONNECT (Unknown language: 0xD +Resource505=IDD_CONNECT (Unknown language: 0xD +Resource506=IDD_CONNECT (Unknown language: 0xD +Resource507=IDD_CONNECT (Unknown language: 0xD +Resource508=IDD_CONNECT (Unknown language: 0xD +Resource509=IDD_CONNECT (Unknown language: 0xD +Resource510=IDD_CONNECT (Unknown language: 0xD +Resource511=IDD_CONNECT (Unknown language: 0xD +Resource512=IDD_CONNECT (Unknown language: 0xD +Resource513=IDD_CONNECT (Unknown language: 0xD +Resource514=IDD_CONNECT (Unknown language: 0xD +Resource515=IDD_CONNECT (Unknown language: 0xD +Resource516=IDD_CONNECT (Unknown language: 0xD +Resource517=IDD_CONNECT (Unknown language: 0xD +Resource518=IDD_CONNECT (Unknown language: 0xD +Resource519=IDD_CONNECT (Unknown language: 0xD +Resource520=IDD_CONNECT (Unknown language: 0xD +Resource521=IDD_CONNECT (Unknown language: 0xD +Resource522=IDD_CONNECT (Unknown language: 0xD +Resource523=IDD_CONNECT (Unknown language: 0xD +Resource524=IDD_CONNECT (Unknown language: 0xD +Resource525=IDD_CONNECT (Unknown language: 0xD +Resource526=IDD_CONNECT (Unknown language: 0xD +Resource527=IDD_CONNECT (Unknown language: 0xD +Resource528=IDD_CONNECT (Unknown language: 0xD +Resource529=IDD_CONNECT (Unknown language: 0xD +Resource530=IDD_CONNECT (Unknown language: 0xD +Resource531=IDD_CONNECT (Unknown language: 0xD +Resource532=IDD_CONNECT (Unknown language: 0xD +Resource533=IDD_CONNECT (Unknown language: 0xD +Resource534=IDD_CONNECT (Unknown language: 0xD +Resource535=IDD_CONNECT (Unknown language: 0xD +Resource536=IDD_CONNECT (Unknown language: 0xD +Resource537=IDD_CONNECT (Unknown language: 0xD +Resource538=IDD_CONNECT (Unknown language: 0xD +Resource539=IDD_CONNECT (Unknown language: 0xD +Resource540=IDD_CONNECT (Unknown language: 0xD +Resource541=IDD_CONNECT (Unknown language: 0xD +Resource542=IDD_CONNECT (Unknown language: 0xD +Resource543=IDD_CONNECT (Unknown language: 0xD +Resource544=IDD_CONNECT (Unknown language: 0xD +Resource545=IDD_CONNECT (Unknown language: 0xD +Resource546=IDD_CONNECT (Unknown language: 0xD +Resource547=IDD_CONNECT (Unknown language: 0xD +Resource548=IDD_CONNECT (Unknown language: 0xD +Resource549=IDD_CONNECT (Unknown language: 0xD +Resource550=IDD_CONNECT (Unknown language: 0xD +Resource551=IDD_CONNECT (Unknown language: 0xD +Resource552=IDD_CONNECT (Unknown language: 0xD +Resource553=IDD_CONNECT (Unknown language: 0xD +Resource554=IDD_CONNECT (Unknown language: 0xD +Resource555=IDD_CONNECT (Unknown language: 0xD +Resource556=IDD_CONNECT (Unknown language: 0xD +Resource557=IDD_CONNECT (Unknown language: 0xD +Resource558=IDD_CONNECT (Unknown language: 0xD +Resource559=IDD_CONNECT (Unknown language: 0xD +Resource560=IDD_CONNECT (Unknown language: 0xD +Resource561=IDD_CONNECT (Unknown language: 0xD +Resource562=IDD_CONNECT (Unknown language: 0xD +Resource563=IDD_CONNECT (Unknown language: 0xD +Resource564=IDD_CONNECT (Unknown language: 0xD +Resource565=IDD_CONNECT (Unknown language: 0xD +Resource566=IDD_CONNECT (Unknown language: 0xD +Resource567=IDD_CONNECT (Unknown language: 0xD +Resource568=IDD_CONNECT (Unknown language: 0xD +Resource569=IDD_CONNECT (Unknown language: 0xD +Resource570=IDD_CONNECT (Unknown language: 0xD +Resource571=IDD_CONNECT (Unknown language: 0xD +Resource572=IDD_CONNECT (Unknown language: 0xD +Resource573=IDD_CONNECT (Unknown language: 0xD +Resource574=IDD_CONNECT (Unknown language: 0xD +Resource575=IDD_CONNECT (Unknown language: 0xD +Resource576=IDD_CONNECT (Unknown language: 0xD +Resource577=IDD_CONNECT (Unknown language: 0xD +Resource578=IDD_CONNECT (Unknown language: 0xD +Resource579=IDD_CONNECT (Unknown language: 0xD +Resource580=IDD_CONNECT (Unknown language: 0xD +Resource581=IDD_CONNECT (Unknown language: 0xD +Resource582=IDD_CONNECT (Unknown language: 0xD +Resource583=IDD_CONNECT (Unknown language: 0xD +Resource584=IDD_CONNECT (Unknown language: 0xD +Resource585=IDD_CONNECT (Unknown language: 0xD +Resource586=IDD_CONNECT (Unknown language: 0xD +Resource587=IDD_CONNECT (Unknown language: 0xD +Resource588=IDD_CONNECT (Unknown language: 0xD +Resource589=IDD_CONNECT (Unknown language: 0xD +Resource590=IDD_CONNECT (Unknown language: 0xD +Resource591=IDD_CONNECT (Unknown language: 0xD +Resource592=IDD_CONNECT (Unknown language: 0xD +Resource593=IDD_CONNECT (Unknown language: 0xD +Resource594=IDD_CONNECT (Unknown language: 0xD +Resource595=IDD_CONNECT (Unknown language: 0xD +Resource596=IDD_CONNECT (Unknown language: 0xD +Resource597=IDD_CONNECT (Unknown language: 0xD +Resource598=IDD_CONNECT (Unknown language: 0xD +Resource599=IDD_CONNECT (Unknown language: 0xD +Resource600=IDD_CONNECT (Unknown language: 0xD +Resource601=IDD_CONNECT (Unknown language: 0xD +Resource602=IDD_CONNECT (Unknown language: 0xD +Resource603=IDD_CONNECT (Unknown language: 0xD +Resource604=IDD_CONNECT (Unknown language: 0xD +Resource605=IDD_CONNECT (Unknown language: 0xD +Resource606=IDD_CONNECT (Unknown language: 0xD +Resource607=IDD_CONNECT (Unknown language: 0xD +Resource608=IDD_CONNECT (Unknown language: 0xD +Resource609=IDD_CONNECT (Unknown language: 0xD +Resource610=IDD_CONNECT (Unknown language: 0xD +Resource611=IDD_CONNECT (Unknown language: 0xD +Resource612=IDD_CONNECT (Unknown language: 0xD +Resource613=IDD_CONNECT (Unknown language: 0xD +Resource614=IDD_CONNECT (Unknown language: 0xD +Resource615=IDD_CONNECT (Unknown language: 0xD +Resource616=IDD_CONNECT (Unknown language: 0xD +Resource617=IDD_CONNECT (Unknown language: 0xD +Resource618=IDD_CONNECT (Unknown language: 0xD +Resource619=IDD_CONNECT (Unknown language: 0xD +Resource620=IDD_CONNECT (Unknown language: 0xD +Resource621=IDD_CONNECT (Unknown language: 0xD +Resource622=IDD_CONNECT (Unknown language: 0xD +Resource623=IDD_CONNECT (Unknown language: 0xD +Resource624=IDD_CONNECT (Unknown language: 0xD +Resource625=IDD_CONNECT (Unknown language: 0xD +Resource626=IDD_CONNECT (Unknown language: 0xD +Resource627=IDD_CONNECT (Unknown language: 0xD +Resource628=IDD_CONNECT (Unknown language: 0xD +Resource629=IDD_CONNECT (Unknown language: 0xD +Resource630=IDD_CONNECT (Unknown language: 0xD +Resource631=IDD_CONNECT (Unknown language: 0xD +Resource632=IDD_CONNECT (Unknown language: 0xD +Resource633=IDD_CONNECT (Unknown language: 0xD +Resource634=IDD_CONNECT (Unknown language: 0xD +Resource635=IDD_CONNECT (Unknown language: 0xD +Resource636=IDD_CONNECT (Unknown language: 0xD +Resource637=IDD_CONNECT (Unknown language: 0xD +Resource638=IDD_CONNECT (Unknown language: 0xD +Resource639=IDD_CONNECT (Unknown language: 0xD +Resource640=IDD_CONNECT (Unknown language: 0xD +Resource641=IDD_CONNECT (Unknown language: 0xD +Resource642=IDD_CONNECT (Unknown language: 0xD +Resource643=IDD_CONNECT (Unknown language: 0xD +Resource644=IDD_CONNECT (Unknown language: 0xD +Resource645=IDD_CONNECT (Unknown language: 0xD +Resource646=IDD_CONNECT (Unknown language: 0xD +Resource647=IDD_CONNECT (Unknown language: 0xD +Resource648=IDD_CONNECT (Unknown language: 0xD +Resource649=IDD_CONNECT (Unknown language: 0xD +Resource650=IDD_CONNECT (Unknown language: 0xD +Resource651=IDD_CONNECT (Unknown language: 0xD +Resource652=IDD_CONNECT (Unknown language: 0xD +Resource653=IDD_CONNECT (Unknown language: 0xD +Resource654=IDD_CONNECT (Unknown language: 0xD +Resource655=IDD_CONNECT (Unknown language: 0xD +Resource656=IDD_CONNECT (Unknown language: 0xD +Resource657=IDD_CONNECT (Unknown language: 0xD +Resource658=IDD_CONNECT (Unknown language: 0xD +Resource659=IDD_CONNECT (Unknown language: 0xD +Resource660=IDD_CONNECT (Unknown language: 0xD +Resource661=IDD_CONNECT (Unknown language: 0xD +Resource662=IDD_CONNECT (Unknown language: 0xD +Resource663=IDD_CONNECT (Unknown language: 0xD +Resource664=IDD_CONNECT (Unknown language: 0xD +Resource665=IDD_CONNECT (Unknown language: 0xD +Resource666=IDD_CONNECT (Unknown language: 0xD +Resource667=IDD_CONNECT (Unknown language: 0xD +Resource668=IDD_CONNECT (Unknown language: 0xD +Resource669=IDD_CONNECT (Unknown language: 0xD +Resource670=IDD_CONNECT (Unknown language: 0xD +Resource671=IDD_CONNECT (Unknown language: 0xD +Resource672=IDD_CONNECT (Unknown language: 0xD +Resource673=IDD_CONNECT (Unknown language: 0xD +Resource674=IDD_CONNECT (Unknown language: 0xD +Resource675=IDD_CONNECT (Unknown language: 0xD +Resource676=IDD_CONNECT (Unknown language: 0xD +Resource677=IDD_CONNECT (Unknown language: 0xD +Resource678=IDD_CONNECT (Unknown language: 0xD +Resource679=IDD_CONNECT (Unknown language: 0xD +Resource680=IDD_CONNECT (Unknown language: 0xD +Resource681=IDD_CONNECT (Unknown language: 0xD +Resource682=IDD_CONNECT (Unknown language: 0xD +Resource683=IDD_CONNECT (Unknown language: 0xD +Resource684=IDD_CONNECT (Unknown language: 0xD +Resource685=IDD_CONNECT (Unknown language: 0xD +Resource686=IDD_CONNECT (Unknown language: 0xD +Resource687=IDD_CONNECT (Unknown language: 0xD +Resource688=IDD_CONNECT (Unknown language: 0xD +Resource689=IDD_CONNECT (Unknown language: 0xD +Resource690=IDD_CONNECT (Unknown language: 0xD +Resource691=IDD_CONNECT (Unknown language: 0xD +Resource692=IDD_CONNECT (Unknown language: 0xD +Resource693=IDD_CONNECT (Unknown language: 0xD +Resource694=IDD_CONNECT (Unknown language: 0xD +Resource695=IDD_CONNECT (Unknown language: 0xD +Resource696=IDD_CONNECT (Unknown language: 0xD +Resource697=IDD_CONNECT (Unknown language: 0xD +Resource698=IDD_CONNECT (Unknown language: 0xD +Resource699=IDD_CONNECT (Unknown language: 0xD +Resource700=IDD_CONNECT (Unknown language: 0xD +Resource701=IDD_CONNECT (Unknown language: 0xD +Resource702=IDD_CONNECT (Unknown language: 0xD +Resource703=IDD_CONNECT (Unknown language: 0xD +Resource704=IDD_CONNECT (Unknown language: 0xD +Resource705=IDD_CONNECT (Unknown language: 0xD +Resource706=IDD_CONNECT (Unknown language: 0xD +Resource707=IDD_CONNECT (Unknown language: 0xD +Resource708=IDD_CONNECT (Unknown language: 0xD +Resource709=IDD_CONNECT (Unknown language: 0xD +Resource710=IDD_CONNECT (Unknown language: 0xD +Resource711=IDD_CONNECT (Unknown language: 0xD +Resource712=IDD_CONNECT (Unknown language: 0xD +Resource713=IDD_CONNECT (Unknown language: 0xD +Resource714=IDD_CONNECT (Unknown language: 0xD +Resource715=IDD_CONNECT (Unknown language: 0xD +Resource716=IDD_CONNECT (Unknown language: 0xD +Resource717=IDD_CONNECT (Unknown language: 0xD +Resource718=IDD_CONNECT (Unknown language: 0xD +Resource719=IDD_CONNECT (Unknown language: 0xD +Resource720=IDD_CONNECT (Unknown language: 0xD +Resource721=IDD_CONNECT (Unknown language: 0xD +Resource722=IDD_CONNECT (Unknown language: 0xD +Resource723=IDD_CONNECT (Unknown language: 0xD +Resource724=IDD_CONNECT (Unknown language: 0xD +Resource725=IDD_CONNECT (Unknown language: 0xD +Resource726=IDD_CONNECT (Unknown language: 0xD +Resource727=IDD_CONNECT (Unknown language: 0xD +Resource728=IDD_CONNECT (Unknown language: 0xD +Resource729=IDD_CONNECT (Unknown language: 0xD +Resource730=IDD_CONNECT (Unknown language: 0xD +Resource731=IDD_CONNECT (Unknown language: 0xD +Resource732=IDD_CONNECT (Unknown language: 0xD +Resource733=IDD_CONNECT (Unknown language: 0xD +Resource734=IDD_CONNECT (Unknown language: 0xD +Resource735=IDD_CONNECT (Unknown language: 0xD +Resource736=IDD_CONNECT (Unknown language: 0xD +Resource737=IDD_CONNECT (Unknown language: 0xD +Resource738=IDD_CONNECT (Unknown language: 0xD +Resource739=IDD_CONNECT (Unknown language: 0xD +Resource740=IDD_CONNECT (Unknown language: 0xD +Resource741=IDD_CONNECT (Unknown language: 0xD +Resource742=IDD_CONNECT (Unknown language: 0xD +Resource743=IDD_CONNECT (Unknown language: 0xD +Resource744=IDD_CONNECT (Unknown language: 0xD +Resource745=IDD_CONNECT (Unknown language: 0xD +Resource746=IDD_CONNECT (Unknown language: 0xD +Resource747=IDD_CONNECT (Unknown language: 0xD +Resource748=IDD_CONNECT (Unknown language: 0xD +Resource749=IDD_CONNECT (Unknown language: 0xD +Resource750=IDD_CONNECT (Unknown language: 0xD +Resource751=IDD_CONNECT (Unknown language: 0xD +Resource752=IDD_CONNECT (Unknown language: 0xD +Resource753=IDD_CONNECT (Unknown language: 0xD +Resource754=IDD_CONNECT (Unknown language: 0xD +Resource755=IDD_CONNECT (Unknown language: 0xD +Resource756=IDD_CONNECT (Unknown language: 0xD +Resource757=IDD_CONNECT (Unknown language: 0xD +Resource758=IDD_CONNECT (Unknown language: 0xD +Resource759=IDD_CONNECT (Unknown language: 0xD +Resource760=IDD_CONNECT (Unknown language: 0xD +Resource761=IDD_CONNECT (Unknown language: 0xD +Resource762=IDD_CONNECT (Unknown language: 0xD +Resource763=IDD_CONNECT (Unknown language: 0xD +Resource764=IDD_CONNECT (Unknown language: 0xD +Resource765=IDD_CONNECT (Unknown language: 0xD +Resource766=IDD_CONNECT (Unknown language: 0xD +Resource767=IDD_CONNECT (Unknown language: 0xD +Resource768=IDD_CONNECT (Unknown language: 0xD +Resource769=IDD_CONNECT (Unknown language: 0xD +Resource770=IDD_CONNECT (Unknown language: 0xD +Resource771=IDD_CONNECT (Unknown language: 0xD +Resource772=IDD_CONNECT (Unknown language: 0xD +Resource773=IDD_CONNECT (Unknown language: 0xD +Resource774=IDD_CONNECT (Unknown language: 0xD +Resource775=IDD_CONNECT (Unknown language: 0xD +Resource776=IDD_CONNECT (Unknown language: 0xD +Resource777=IDD_CONNECT (Unknown language: 0xD +Resource778=IDD_CONNECT (Unknown language: 0xD +Resource779=IDD_CONNECT (Unknown language: 0xD +Resource780=IDD_CONNECT (Unknown language: 0xD +Resource781=IDD_CONNECT (Unknown language: 0xD +Resource782=IDD_CONNECT (Unknown language: 0xD +Resource783=IDD_CONNECT (Unknown language: 0xD +Resource784=IDD_CONNECT (Unknown language: 0xD +Resource785=IDD_CONNECT (Unknown language: 0xD +Resource786=IDD_CONNECT (Unknown language: 0xD +Resource787=IDD_CONNECT (Unknown language: 0xD +Resource788=IDD_CONNECT (Unknown language: 0xD +Resource789=IDD_CONNECT (Unknown language: 0xD +Resource790=IDD_CONNECT (Unknown language: 0xD +Resource791=IDD_CONNECT (Unknown language: 0xD +Resource792=IDD_CONNECT (Unknown language: 0xD +Resource793=IDD_CONNECT (Unknown language: 0xD +Resource794=IDD_CONNECT (Unknown language: 0xD +Resource795=IDD_CONNECT (Unknown language: 0xD +Resource796=IDD_CONNECT (Unknown language: 0xD +Resource797=IDD_CONNECT (Unknown language: 0xD +Resource798=IDD_CONNECT (Unknown language: 0xD +Resource799=IDD_CONNECT (Unknown language: 0xD +Resource800=IDD_CONNECT (Unknown language: 0xD +Resource801=IDD_CONNECT (Unknown language: 0xD +Resource802=IDD_CONNECT (Unknown language: 0xD +Resource803=IDD_CONNECT (Unknown language: 0xD +Resource804=IDD_CONNECT (Unknown language: 0xD +Resource805=IDD_CONNECT (Unknown language: 0xD +Resource806=IDD_CONNECT (Unknown language: 0xD +Resource807=IDD_CONNECT (Unknown language: 0xD +Resource808=IDD_CONNECT (Unknown language: 0xD +Resource809=IDD_CONNECT (Unknown language: 0xD +Resource810=IDD_CONNECT (Unknown language: 0xD +Resource811=IDD_CONNECT (Unknown language: 0xD +Resource812=IDD_CONNECT (Unknown language: 0xD +Resource813=IDD_CONNECT (Unknown language: 0xD +Resource814=IDD_CONNECT (Unknown language: 0xD +Resource815=IDD_CONNECT (Unknown language: 0xD +Resource816=IDD_CONNECT (Unknown language: 0xD +Resource817=IDD_CONNECT (Unknown language: 0xD +Resource818=IDD_CONNECT (Unknown language: 0xD +Resource819=IDD_CONNECT (Unknown language: 0xD +Resource820=IDD_CONNECT (Unknown language: 0xD +Resource821=IDD_CONNECT (Unknown language: 0xD +Resource822=IDD_CONNECT (Unknown language: 0xD +Resource823=IDD_CONNECT (Unknown language: 0xD +Resource824=IDD_CONNECT (Unknown language: 0xD +Resource825=IDD_CONNECT (Unknown language: 0xD +Resource826=IDD_CONNECT (Unknown language: 0xD +Resource827=IDD_CONNECT (Unknown language: 0xD +Resource828=IDD_CONNECT (Unknown language: 0xD +Resource829=IDD_CONNECT (Unknown language: 0xD +Resource830=IDD_CONNECT (Unknown language: 0xD +Resource831=IDD_CONNECT (Unknown language: 0xD +Resource832=IDD_CONNECT (Unknown language: 0xD +Resource833=IDD_CONNECT (Unknown language: 0xD +Resource834=IDD_CONNECT (Unknown language: 0xD +Resource835=IDD_CONNECT (Unknown language: 0xD +Resource836=IDD_CONNECT (Unknown language: 0xD +Resource837=IDD_CONNECT (Unknown language: 0xD +Resource838=IDD_CONNECT (Unknown language: 0xD +Resource839=IDD_CONNECT (Unknown language: 0xD +Resource840=IDD_CONNECT (Unknown language: 0xD +Resource841=IDD_CONNECT (Unknown language: 0xD +Resource842=IDD_CONNECT (Unknown language: 0xD +Resource843=IDD_CONNECT (Unknown language: 0xD +Resource844=IDD_CONNECT (Unknown language: 0xD +Resource845=IDD_CONNECT (Unknown language: 0xD +Resource846=IDD_CONNECT (Unknown language: 0xD +Resource847=IDD_CONNECT (Unknown language: 0xD +Resource848=IDD_CONNECT (Unknown language: 0xD +Resource849=IDD_CONNECT (Unknown language: 0xD +Resource850=IDD_CONNECT (Unknown language: 0xD +Resource851=IDD_CONNECT (Unknown language: 0xD +Resource852=IDD_CONNECT (Unknown language: 0xD +Resource853=IDD_CONNECT (Unknown language: 0xD +Resource854=IDD_CONNECT (Unknown language: 0xD +Resource855=IDD_CONNECT (Unknown language: 0xD +Resource856=IDD_CONNECT (Unknown language: 0xD +Resource857=IDD_CONNECT (Unknown language: 0xD +Resource858=IDD_CONNECT (Unknown language: 0xD +Resource859=IDD_CONNECT (Unknown language: 0xD +Resource860=IDD_CONNECT (Unknown language: 0xD +Resource861=IDD_CONNECT (Unknown language: 0xD +Resource862=IDD_CONNECT (Unknown language: 0xD +Resource863=IDD_CONNECT (Unknown language: 0xD +Resource864=IDD_CONNECT (Unknown language: 0xD +Resource865=IDD_CONNECT (Unknown language: 0xD +Resource866=IDD_CONNECT (Unknown language: 0xD +Resource867=IDD_CONNECT (Unknown language: 0xD +Resource868=IDD_CONNECT (Unknown language: 0xD +Resource869=IDD_CONNECT (Unknown language: 0xD +Resource870=IDD_CONNECT (Unknown language: 0xD +Resource871=IDD_CONNECT (Unknown language: 0xD +Resource872=IDD_CONNECT (Unknown language: 0xD +Resource873=IDD_CONNECT (Unknown language: 0xD +Resource874=IDD_CONNECT (Unknown language: 0xD +Resource875=IDD_CONNECT (Unknown language: 0xD +Resource876=IDD_CONNECT (Unknown language: 0xD +Resource877=IDD_CONNECT (Unknown language: 0xD +Resource878=IDD_CONNECT (Unknown language: 0xD +Resource879=IDD_CONNECT (Unknown language: 0xD +Resource880=IDD_CONNECT (Unknown language: 0xD +Resource881=IDD_CONNECT (Unknown language: 0xD +Resource882=IDD_CONNECT (Unknown language: 0xD +Resource883=IDD_CONNECT (Unknown language: 0xD +Resource884=IDD_CONNECT (Unknown language: 0xD +Resource885=IDD_CONNECT (Unknown language: 0xD +Resource886=IDD_CONNECT (Unknown language: 0xD +Resource887=IDD_CONNECT (Unknown language: 0xD +Resource888=IDD_CONNECT (Unknown language: 0xD +Resource889=IDD_CONNECT (Unknown language: 0xD +Resource890=IDD_CONNECT (Unknown language: 0xD +Resource891=IDD_CONNECT (Unknown language: 0xD +Resource892=IDD_CONNECT (Unknown language: 0xD +Resource893=IDD_CONNECT (Unknown language: 0xD +Resource894=IDD_CONNECT (Unknown language: 0xD +Resource895=IDD_CONNECT (Unknown language: 0xD +Resource896=IDD_CONNECT (Unknown language: 0xD +Resource897=IDD_CONNECT (Unknown language: 0xD +Resource898=IDD_CONNECT (Unknown language: 0xD +Resource899=IDD_CONNECT (Unknown language: 0xD +Resource900=IDD_CONNECT (Unknown language: 0xD +Resource901=IDD_CONNECT (Unknown language: 0xD +Resource902=IDD_CONNECT (Unknown language: 0xD +Resource903=IDD_CONNECT (Unknown language: 0xD +Resource904=IDD_CONNECT (Unknown language: 0xD +Resource905=IDD_CONNECT (Unknown language: 0xD +Resource906=IDD_CONNECT (Unknown language: 0xD +Resource907=IDD_CONNECT (Unknown language: 0xD +Resource908=IDD_CONNECT (Unknown language: 0xD +Resource909=IDD_CONNECT (Unknown language: 0xD +Resource910=IDD_CONNECT (Unknown language: 0xD +Resource911=IDD_CONNECT (Unknown language: 0xD +Resource912=IDD_CONNECT (Unknown language: 0xD +Resource913=IDD_CONNECT (Unknown language: 0xD +Resource914=IDD_CONNECT (Unknown language: 0xD +Resource915=IDD_CONNECT (Unknown language: 0xD +Resource916=IDD_CONNECT (Unknown language: 0xD +Resource917=IDD_CONNECT (Unknown language: 0xD +Resource918=IDD_CONNECT (Unknown language: 0xD +Resource919=IDD_CONNECT (Unknown language: 0xD +Resource920=IDD_CONNECT (Unknown language: 0xD +Resource921=IDD_CONNECT (Unknown language: 0xD +Resource922=IDD_CONNECT (Unknown language: 0xD +Resource923=IDD_CONNECT (Unknown language: 0xD +Resource924=IDD_CONNECT (Unknown language: 0xD +Resource925=IDD_CONNECT (Unknown language: 0xD +Resource926=IDD_CONNECT (Unknown language: 0xD +Resource927=IDD_CONNECT (Unknown language: 0xD +Resource928=IDD_CONNECT (Unknown language: 0xD +Resource929=IDD_CONNECT (Unknown language: 0xD +Resource930=IDD_CONNECT (Unknown language: 0xD +Resource931=IDD_CONNECT (Unknown language: 0xD +Resource932=IDD_CONNECT (Unknown language: 0xD +Resource933=IDD_CONNECT (Unknown language: 0xD +Resource934=IDD_CONNECT (Unknown language: 0xD +Resource935=IDD_CONNECT (Unknown language: 0xD +Resource936=IDD_CONNECT (Unknown language: 0xD +Resource937=IDD_CONNECT (Unknown language: 0xD +Resource938=IDD_CONNECT (Unknown language: 0xD +Resource939=IDD_CONNECT (Unknown language: 0xD +Resource940=IDD_CONNECT (Unknown language: 0xD +Resource941=IDD_CONNECT (Unknown language: 0xD +Resource942=IDD_CONNECT (Unknown language: 0xD +Resource943=IDD_CONNECT (Unknown language: 0xD +Resource944=IDD_CONNECT (Unknown language: 0xD +Resource945=IDD_CONNECT (Unknown language: 0xD +Resource946=IDD_CONNECT (Unknown language: 0xD +Resource947=IDD_CONNECT (Unknown language: 0xD +Resource948=IDD_CONNECT (Unknown language: 0xD +Resource949=IDD_CONNECT (Unknown language: 0xD +Resource950=IDD_CONNECT (Unknown language: 0xD +Resource951=IDD_CONNECT (Unknown language: 0xD +Resource952=IDD_CONNECT (Unknown language: 0xD +Resource953=IDD_CONNECT (Unknown language: 0xD +Resource954=IDD_CONNECT (Unknown language: 0xD +Resource955=IDD_CONNECT (Unknown language: 0xD +Resource956=IDD_CONNECT (Unknown language: 0xD +Resource957=IDD_CONNECT (Unknown language: 0xD +Resource958=IDD_CONNECT (Unknown language: 0xD +Resource959=IDD_CONNECT (Unknown language: 0xD +Resource960=IDD_CONNECT (Unknown language: 0xD +Resource961=IDD_CONNECT (Unknown language: 0xD +Resource962=IDD_CONNECT (Unknown language: 0xD +Resource963=IDD_CONNECT (Unknown language: 0xD +Resource964=IDD_CONNECT (Unknown language: 0xD +Resource965=IDD_CONNECT (Unknown language: 0xD +Resource966=IDD_CONNECT (Unknown language: 0xD +Resource967=IDD_CONNECT (Unknown language: 0xD +Resource968=IDD_CONNECT (Unknown language: 0xD +Resource969=IDD_CONNECT (Unknown language: 0xD +Resource970=IDD_CONNECT (Unknown language: 0xD +Resource971=IDD_CONNECT (Unknown language: 0xD +Resource972=IDD_CONNECT (Unknown language: 0xD +Resource973=IDD_CONNECT (Unknown language: 0xD +Resource974=IDD_CONNECT (Unknown language: 0xD +Resource975=IDD_CONNECT (Unknown language: 0xD +Resource976=IDD_CONNECT (Unknown language: 0xD +Resource977=IDD_CONNECT (Unknown language: 0xD +Resource978=IDD_CONNECT (Unknown language: 0xD +Resource979=IDD_CONNECT (Unknown language: 0xD +Resource980=IDD_CONNECT (Unknown language: 0xD +Resource981=IDD_CONNECT (Unknown language: 0xD +Resource982=IDD_CONNECT (Unknown language: 0xD +Resource983=IDD_CONNECT (Unknown language: 0xD +Resource984=IDD_CONNECT (Unknown language: 0xD +Resource985=IDD_CONNECT (Unknown language: 0xD +Resource986=IDD_CONNECT (Unknown language: 0xD +Resource987=IDD_CONNECT (Unknown language: 0xD +Resource988=IDD_CONNECT (Unknown language: 0xD +Resource989=IDD_CONNECT (Unknown language: 0xD +Resource990=IDD_CONNECT (Unknown language: 0xD +Resource991=IDD_CONNECT (Unknown language: 0xD +Resource992=IDD_CONNECT (Unknown language: 0xD +Resource993=IDD_CONNECT (Unknown language: 0xD +Resource994=IDD_CONNECT (Unknown language: 0xD +Resource995=IDD_CONNECT (Unknown language: 0xD +Resource996=IDD_CONNECT (Unknown language: 0xD +Resource997=IDD_CONNECT (Unknown language: 0xD +Resource998=IDD_CONNECT (Unknown language: 0xD +Resource999=IDD_CONNECT (Unknown language: 0xD +Resource1000=IDD_CONNECT (Unknown language: 0xD +Resource1001=IDD_CONNECT (Unknown language: 0xD +Resource1002=IDD_CONNECT (Unknown language: 0xD +Resource1003=IDD_CONNECT (Unknown language: 0xD +Resource1004=IDD_CONNECT (Unknown language: 0xD +Resource1005=IDD_CONNECT (Unknown language: 0xD +Resource1006=IDD_CONNECT (Unknown language: 0xD +Resource1007=IDD_CONNECT (Unknown language: 0xD +Resource1008=IDD_CONNECT (Unknown language: 0xD +Resource1009=IDD_CONNECT (Unknown language: 0xD +Resource1010=IDD_CONNECT (Unknown language: 0xD +Resource1011=IDD_CONNECT (Unknown language: 0xD +Resource1012=IDD_CONNECT (Unknown language: 0xD +Resource1013=IDD_CONNECT (Unknown language: 0xD +Resource1014=IDD_CONNECT (Unknown language: 0xD +Resource1015=IDD_CONNECT (Unknown language: 0xD +Resource1016=IDD_CONNECT (Unknown language: 0xD +Resource1017=IDD_CONNECT (Unknown language: 0xD +Resource1018=IDD_CONNECT (Unknown language: 0xD +Resource1019=IDD_CONNECT (Unknown language: 0xD +Resource1020=IDD_CONNECT (Unknown language: 0xD +Resource1021=IDD_CONNECT (Unknown language: 0xD +Resource1022=IDD_CONNECT (Unknown language: 0xD +Resource1023=IDD_CONNECT (Unknown language: 0xD +Resource1024=IDD_CONNECT (Unknown language: 0xD +Resource1025=IDD_CONNECT (Unknown language: 0xD +Resource1026=IDD_CONNECT (Unknown language: 0xD +Resource1027=IDD_CONNECT (Unknown language: 0xD +Resource1028=IDD_CONNECT (Unknown language: 0xD +Resource1029=IDD_CONNECT (Unknown language: 0xD +Resource1030=IDD_CONNECT (Unknown language: 0xD +Resource1031=IDD_CONNECT (Unknown language: 0xD +Resource1032=IDD_CONNECT (Unknown language: 0xD +Resource1033=IDD_CONNECT (Unknown language: 0xD +Resource1034=IDD_CONNECT (Unknown language: 0xD +Resource1035=IDD_CONNECT (Unknown language: 0xD +Resource1036=IDD_CONNECT (Unknown language: 0xD +Resource1037=IDD_CONNECT (Unknown language: 0xD +Resource1038=IDD_CONNECT (Unknown language: 0xD +Resource1039=IDD_CONNECT (Unknown language: 0xD +Resource1040=IDD_CONNECT (Unknown language: 0xD +Resource1041=IDD_CONNECT (Unknown language: 0xD +Resource1042=IDD_CONNECT (Unknown language: 0xD +Resource1043=IDD_CONNECT (Unknown language: 0xD +Resource1044=IDD_CONNECT (Unknown language: 0xD +Resource1045=IDD_CONNECT (Unknown language: 0xD +Resource1046=IDD_CONNECT (Unknown language: 0xD +Resource1047=IDD_CONNECT (Unknown language: 0xD +Resource1048=IDD_CONNECT (Unknown language: 0xD +Resource1049=IDD_CONNECT (Unknown language: 0xD +Resource1050=IDD_CONNECT (Unknown language: 0xD +Resource1051=IDD_CONNECT (Unknown language: 0xD +Resource1052=IDD_CONNECT (Unknown language: 0xD +Resource1053=IDD_CONNECT (Unknown language: 0xD +Resource1054=IDD_CONNECT (Unknown language: 0xD +Resource1055=IDD_CONNECT (Unknown language: 0xD +Resource1056=IDD_CONNECT (Unknown language: 0xD +Resource1057=IDD_CONNECT (Unknown language: 0xD +Resource1058=IDD_CONNECT (Unknown language: 0xD +Resource1059=IDD_CONNECT (Unknown language: 0xD +Resource1060=IDD_CONNECT (Unknown language: 0xD +Resource1061=IDD_CONNECT (Unknown language: 0xD +Resource1062=IDD_CONNECT (Unknown language: 0xD +Resource1063=IDD_CONNECT (Unknown language: 0xD +Resource1064=IDD_CONNECT (Unknown language: 0xD +Resource1065=IDD_CONNECT (Unknown language: 0xD +Resource1066=IDD_CONNECT (Unknown language: 0xD +Resource1067=IDD_CONNECT (Unknown language: 0xD +Resource1068=IDD_CONNECT (Unknown language: 0xD +Resource1069=IDD_CONNECT (Unknown language: 0xD +Resource1070=IDD_CONNECT (Unknown language: 0xD +Resource1071=IDD_CONNECT (Unknown language: 0xD +Resource1072=IDD_CONNECT (Unknown language: 0xD +Resource1073=IDD_CONNECT (Unknown language: 0xD +Resource1074=IDD_CONNECT (Unknown language: 0xD +Resource1075=IDD_CONNECT (Unknown language: 0xD +Resource1076=IDD_CONNECT (Unknown language: 0xD +Resource1077=IDD_CONNECT (Unknown language: 0xD +Resource1078=IDD_CONNECT (Unknown language: 0xD +Resource1079=IDD_CONNECT (Unknown language: 0xD +Resource1080=IDD_CONNECT (Unknown language: 0xD +Resource1081=IDD_CONNECT (Unknown language: 0xD +Resource1082=IDD_CONNECT (Unknown language: 0xD +Resource1083=IDD_CONNECT (Unknown language: 0xD +Resource1084=IDD_CONNECT (Unknown language: 0xD +Resource1085=IDD_CONNECT (Unknown language: 0xD +Resource1086=IDD_CONNECT (Unknown language: 0xD +Resource1087=IDD_CONNECT (Unknown language: 0xD +Resource1088=IDD_CONNECT (Unknown language: 0xD +Resource1089=IDD_CONNECT (Unknown language: 0xD +Resource1090=IDD_CONNECT (Unknown language: 0xD +Resource1091=IDD_CONNECT (Unknown language: 0xD +Resource1092=IDD_CONNECT (Unknown language: 0xD +Resource1093=IDD_CONNECT (Unknown language: 0xD +Resource1094=IDD_CONNECT (Unknown language: 0xD +Resource1095=IDD_CONNECT (Unknown language: 0xD +Resource1096=IDD_CONNECT (Unknown language: 0xD +Resource1097=IDD_CONNECT (Unknown language: 0xD +Resource1098=IDD_CONNECT (Unknown language: 0xD +Resource1099=IDD_CONNECT (Unknown language: 0xD +Resource1100=IDD_CONNECT (Unknown language: 0xD +Resource1101=IDD_CONNECT (Unknown language: 0xD +Resource1102=IDD_CONNECT (Unknown language: 0xD +Resource1103=IDD_CONNECT (Unknown language: 0xD +Resource1104=IDD_CONNECT (Unknown language: 0xD +Resource1105=IDD_CONNECT (Unknown language: 0xD +Resource1106=IDD_CONNECT (Unknown language: 0xD +Resource1107=IDD_CONNECT (Unknown language: 0xD +Resource1108=IDD_CONNECT (Unknown language: 0xD +Resource1109=IDD_CONNECT (Unknown language: 0xD +Resource1110=IDD_CONNECT (Unknown language: 0xD +Resource1111=IDD_CONNECT (Unknown language: 0xD +Resource1112=IDD_CONNECT (Unknown language: 0xD +Resource1113=IDD_CONNECT (Unknown language: 0xD +Resource1114=IDD_CONNECT (Unknown language: 0xD +Resource1115=IDD_CONNECT (Unknown language: 0xD +Resource1116=IDD_CONNECT (Unknown language: 0xD +Resource1117=IDD_CONNECT (Unknown language: 0xD +Resource1118=IDD_CONNECT (Unknown language: 0xD +Resource1119=IDD_CONNECT (Unknown language: 0xD +Resource1120=IDD_CONNECT (Unknown language: 0xD +Resource1121=IDD_CONNECT (Unknown language: 0xD +Resource1122=IDD_CONNECT (Unknown language: 0xD +Resource1123=IDD_CONNECT (Unknown language: 0xD +Resource1124=IDD_CONNECT (Unknown language: 0xD +Resource1125=IDD_CONNECT (Unknown language: 0xD +Resource1126=IDD_CONNECT (Unknown language: 0xD +Resource1127=IDD_CONNECT (Unknown language: 0xD +Resource1128=IDD_CONNECT (Unknown language: 0xD +Resource1129=IDD_CONNECT (Unknown language: 0xD +Resource1130=IDD_CONNECT (Unknown language: 0xD +Resource1131=IDD_CONNECT (Unknown language: 0xD +Resource1132=IDD_CONNECT (Unknown language: 0xD +Resource1133=IDD_CONNECT (Unknown language: 0xD +Resource1134=IDD_CONNECT (Unknown language: 0xD +Resource1135=IDD_CONNECT (Unknown language: 0xD +Resource1136=IDD_CONNECT (Unknown language: 0xD +Resource1137=IDD_CONNECT (Unknown language: 0xD +Resource1138=IDD_CONNECT (Unknown language: 0xD +Resource1139=IDD_CONNECT (Unknown language: 0xD +Resource1140=IDD_CONNECT (Unknown language: 0xD +Resource1141=IDD_CONNECT (Unknown language: 0xD +Resource1142=IDD_CONNECT (Unknown language: 0xD +Resource1143=IDD_CONNECT (Unknown language: 0xD +Resource1144=IDD_CONNECT (Unknown language: 0xD +Resource1145=IDD_CONNECT (Unknown language: 0xD +Resource1146=IDD_CONNECT (Unknown language: 0xD +Resource1147=IDD_CONNECT (Unknown language: 0xD +Resource1148=IDD_CONNECT (Unknown language: 0xD +Resource1149=IDD_CONNECT (Unknown language: 0xD +Resource1150=IDD_CONNECT (Unknown language: 0xD +Resource1151=IDD_CONNECT (Unknown language: 0xD +Resource1152=IDD_CONNECT (Unknown language: 0xD +Resource1153=IDD_CONNECT (Unknown language: 0xD +Resource1154=IDD_CONNECT (Unknown language: 0xD +Resource1155=IDD_CONNECT (Unknown language: 0xD +Resource1156=IDD_CONNECT (Unknown language: 0xD +Resource1157=IDD_CONNECT (Unknown language: 0xD +Resource1158=IDD_CONNECT (Unknown language: 0xD +Resource1159=IDD_CONNECT (Unknown language: 0xD +Resource1160=IDD_CONNECT (Unknown language: 0xD +Resource1161=IDD_CONNECT (Unknown language: 0xD +Resource1162=IDD_CONNECT (Unknown language: 0xD +Resource1163=IDD_CONNECT (Unknown language: 0xD +Resource1164=IDD_CONNECT (Unknown language: 0xD +Resource1165=IDD_CONNECT (Unknown language: 0xD +Resource1166=IDD_CONNECT (Unknown language: 0xD +Resource1167=IDD_CONNECT (Unknown language: 0xD +Resource1168=IDD_CONNECT (Unknown language: 0xD +Resource1169=IDD_CONNECT (Unknown language: 0xD +Resource1170=IDD_CONNECT (Unknown language: 0xD +Resource1171=IDD_CONNECT (Unknown language: 0xD +Resource1172=IDD_CONNECT (Unknown language: 0xD +Resource1173=IDD_CONNECT (Unknown language: 0xD +Resource1174=IDD_CONNECT (Unknown language: 0xD +Resource1175=IDD_CONNECT (Unknown language: 0xD +Resource1176=IDD_CONNECT (Unknown language: 0xD +Resource1177=IDD_CONNECT (Unknown language: 0xD +Resource1178=IDD_CONNECT (Unknown language: 0xD +Resource1179=IDD_CONNECT (Unknown language: 0xD +Resource1180=IDD_CONNECT (Unknown language: 0xD +Resource1181=IDD_CONNECT (Unknown language: 0xD +Resource1182=IDD_CONNECT (Unknown language: 0xD +Resource1183=IDD_CONNECT (Unknown language: 0xD +Resource1184=IDD_CONNECT (Unknown language: 0xD +Resource1185=IDD_CONNECT (Unknown language: 0xD +Resource1186=IDD_CONNECT (Unknown language: 0xD +Resource1187=IDD_CONNECT (Unknown language: 0xD +Resource1188=IDD_CONNECT (Unknown language: 0xD +Resource1189=IDD_CONNECT (Unknown language: 0xD +Resource1190=IDD_CONNECT (Unknown language: 0xD +Resource1191=IDD_CONNECT (Unknown language: 0xD +Resource1192=IDD_CONNECT (Unknown language: 0xD +Resource1193=IDD_CONNECT (Unknown language: 0xD +Resource1194=IDD_CONNECT (Unknown language: 0xD +Resource1195=IDD_CONNECT (Unknown language: 0xD +Resource1196=IDD_CONNECT (Unknown language: 0xD +Resource1197=IDD_CONNECT (Unknown language: 0xD +Resource1198=IDD_CONNECT (Unknown language: 0xD +Resource1199=IDD_CONNECT (Unknown language: 0xD +Resource1200=IDD_CONNECT (Unknown language: 0xD +Resource1201=IDD_CONNECT (Unknown language: 0xD +Resource1202=IDD_CONNECT (Unknown language: 0xD +Resource1203=IDD_CONNECT (Unknown language: 0xD +Resource1204=IDD_CONNECT (Unknown language: 0xD +Resource1205=IDD_CONNECT (Unknown language: 0xD +Resource1206=IDD_CONNECT (Unknown language: 0xD +Resource1207=IDD_CONNECT (Unknown language: 0xD +Resource1208=IDD_CONNECT (Unknown language: 0xD +Resource1209=IDD_CONNECT (Unknown language: 0xD +Resource1210=IDD_CONNECT (Unknown language: 0xD +Resource1211=IDD_CONNECT (Unknown language: 0xD +Resource1212=IDD_CONNECT (Unknown language: 0xD +Resource1213=IDD_CONNECT (Unknown language: 0xD +Resource1214=IDD_CONNECT (Unknown language: 0xD +Resource1215=IDD_CONNECT (Unknown language: 0xD +Resource1216=IDD_CONNECT (Unknown language: 0xD +Resource1217=IDD_CONNECT (Unknown language: 0xD +Resource1218=IDD_CONNECT (Unknown language: 0xD +Resource1219=IDD_CONNECT (Unknown language: 0xD +Resource1220=IDD_CONNECT (Unknown language: 0xD +Resource1221=IDD_CONNECT (Unknown language: 0xD +Resource1222=IDD_CONNECT (Unknown language: 0xD +Resource1223=IDD_CONNECT (Unknown language: 0xD +Resource1224=IDD_CONNECT (Unknown language: 0xD +Resource1225=IDD_CONNECT (Unknown language: 0xD +Resource1226=IDD_CONNECT (Unknown language: 0xD +Resource1227=IDD_CONNECT (Unknown language: 0xD +Resource1228=IDD_CONNECT (Unknown language: 0xD +Resource1229=IDD_CONNECT (Unknown language: 0xD +Resource1230=IDD_CONNECT (Unknown language: 0xD +Resource1231=IDD_CONNECT (Unknown language: 0xD +Resource1232=IDD_CONNECT (Unknown language: 0xD +Resource1233=IDD_CONNECT (Unknown language: 0xD +Resource1234=IDD_CONNECT (Unknown language: 0xD +Resource1235=IDD_CONNECT (Unknown language: 0xD +Resource1236=IDD_CONNECT (Unknown language: 0xD +Resource1237=IDD_CONNECT (Unknown language: 0xD +Resource1238=IDD_CONNECT (Unknown language: 0xD +Resource1239=IDD_CONNECT (Unknown language: 0xD +Resource1240=IDD_CONNECT (Unknown language: 0xD +Resource1241=IDD_CONNECT (Unknown language: 0xD +Resource1242=IDD_CONNECT (Unknown language: 0xD +Resource1243=IDD_CONNECT (Unknown language: 0xD +Resource1244=IDD_CONNECT (Unknown language: 0xD +Resource1245=IDD_CONNECT (Unknown language: 0xD +Resource1246=IDD_CONNECT (Unknown language: 0xD +Resource1247=IDD_CONNECT (Unknown language: 0xD +Resource1248=IDD_CONNECT (Unknown language: 0xD +Resource1249=IDD_CONNECT (Unknown language: 0xD +Resource1250=IDD_CONNECT (Unknown language: 0xD +Resource1251=IDD_CONNECT (Unknown language: 0xD +Resource1252=IDD_CONNECT (Unknown language: 0xD +Resource1253=IDD_CONNECT (Unknown language: 0xD +Resource1254=IDD_CONNECT (Unknown language: 0xD +Resource1255=IDD_CONNECT (Unknown language: 0xD +Resource1256=IDD_CONNECT (Unknown language: 0xD +Resource1257=IDD_CONNECT (Unknown language: 0xD +Resource1258=IDD_CONNECT (Unknown language: 0xD +Resource1259=IDD_CONNECT (Unknown language: 0xD +Resource1260=IDD_CONNECT (Unknown language: 0xD +Resource1261=IDD_CONNECT (Unknown language: 0xD +Resource1262=IDD_CONNECT (Unknown language: 0xD +Resource1263=IDD_CONNECT (Unknown language: 0xD +Resource1264=IDD_CONNECT (Unknown language: 0xD +Resource1265=IDD_CONNECT (Unknown language: 0xD +Resource1266=IDD_CONNECT (Unknown language: 0xD +Resource1267=IDD_CONNECT (Unknown language: 0xD +Resource1268=IDD_CONNECT (Unknown language: 0xD +Resource1269=IDD_CONNECT (Unknown language: 0xD +Resource1270=IDD_CONNECT (Unknown language: 0xD +Resource1271=IDD_CONNECT (Unknown language: 0xD +Resource1272=IDD_CONNECT (Unknown language: 0xD +Resource1273=IDD_CONNECT (Unknown language: 0xD +Resource1274=IDD_CONNECT (Unknown language: 0xD +Resource1275=IDD_CONNECT (Unknown language: 0xD +Resource1276=IDD_CONNECT (Unknown language: 0xD +Resource1277=IDD_CONNECT (Unknown language: 0xD +Resource1278=IDD_CONNECT (Unknown language: 0xD +Resource1279=IDD_CONNECT (Unknown language: 0xD +Resource1280=IDD_CONNECT (Unknown language: 0xD +Resource1281=IDD_CONNECT (Unknown language: 0xD +Resource1282=IDD_CONNECT (Unknown language: 0xD +Resource1283=IDD_CONNECT (Unknown language: 0xD +Resource1284=IDD_CONNECT (Unknown language: 0xD +Resource1285=IDD_CONNECT (Unknown language: 0xD +Resource1286=IDD_CONNECT (Unknown language: 0xD +Resource1287=IDD_CONNECT (Unknown language: 0xD +Resource1288=IDD_CONNECT (Unknown language: 0xD +Resource1289=IDD_CONNECT (Unknown language: 0xD +Resource1290=IDD_CONNECT (Unknown language: 0xD +Resource1291=IDD_CONNECT (Unknown language: 0xD +Resource1292=IDD_CONNECT (Unknown language: 0xD +Resource1293=IDD_CONNECT (Unknown language: 0xD +Resource1294=IDD_CONNECT (Unknown language: 0xD +Resource1295=IDD_CONNECT (Unknown language: 0xD +Resource1296=IDD_CONNECT (Unknown language: 0xD +Resource1297=IDD_CONNECT (Unknown language: 0xD +Resource1298=IDD_CONNECT (Unknown language: 0xD +Resource1299=IDD_CONNECT (Unknown language: 0xD +Resource1300=IDD_CONNECT (Unknown language: 0xD +Resource1301=IDD_CONNECT (Unknown language: 0xD +Resource1302=IDD_CONNECT (Unknown language: 0xD +Resource1303=IDD_CONNECT (Unknown language: 0xD +Resource1304=IDD_CONNECT (Unknown language: 0xD +Resource1305=IDD_CONNECT (Unknown language: 0xD +Resource1306=IDD_CONNECT (Unknown language: 0xD +Resource1307=IDD_CONNECT (Unknown language: 0xD +Resource1308=IDD_CONNECT (Unknown language: 0xD +Resource1309=IDD_CONNECT (Unknown language: 0xD +Resource1310=IDD_CONNECT (Unknown language: 0xD +Resource1311=IDD_CONNECT (Unknown language: 0xD +Resource1312=IDD_CONNECT (Unknown language: 0xD +Resource1313=IDD_CONNECT (Unknown language: 0xD +Resource1314=IDD_CONNECT (Unknown language: 0xD +Resource1315=IDD_CONNECT (Unknown language: 0xD +Resource1316=IDD_CONNECT (Unknown language: 0xD +Resource1317=IDD_CONNECT (Unknown language: 0xD +Resource1318=IDD_CONNECT (Unknown language: 0xD +Resource1319=IDD_CONNECT (Unknown language: 0xD +Resource1320=IDD_CONNECT (Unknown language: 0xD +Resource1321=IDD_CONNECT (Unknown language: 0xD +Resource1322=IDD_CONNECT (Unknown language: 0xD +Resource1323=IDD_CONNECT (Unknown language: 0xD +Resource1324=IDD_CONNECT (Unknown language: 0xD +Resource1325=IDD_CONNECT (Unknown language: 0xD +Resource1326=IDD_CONNECT (Unknown language: 0xD +Resource1327=IDD_CONNECT (Unknown language: 0xD +Resource1328=IDD_CONNECT (Unknown language: 0xD +Resource1329=IDD_CONNECT (Unknown language: 0xD +Resource1330=IDD_CONNECT (Unknown language: 0xD +Resource1331=IDD_CONNECT (Unknown language: 0xD +Resource1332=IDD_CONNECT (Unknown language: 0xD +Resource1333=IDD_CONNECT (Unknown language: 0xD +Resource1334=IDD_ABOUTBOX +Resource1335=IDD_SMLOBBY_DIALOG +Resource1336=IDD_FILEXFER +Resource1337=IDD_CONNECT (Unknown language: 0xD, 0x1) [CLS:CSmlobbyApp] Type=0 @@ -416,26 +1398,25 @@ Control4=IDOK,button,1342373889 [DLG:IDD_FILEXFER] Type=1 Class=? -ControlCount=19 +ControlCount=18 Control1=IDCANCEL,button,1342242816 Control2=IDC_STATIC,static,1342308352 Control3=IDC_STATIC,static,1342308352 Control4=IDC_STATIC,static,1342308352 -Control5=IDC_STATIC,static,1342308352 -Control6=IDC_TOFROM,static,1342308352 -Control7=IDC_PROGRESS1,msctls_progress32,1350565888 -Control8=IDC_SENTRECVD,static,1342308352 +Control5=IDC_TOFROM,static,1342308352 +Control6=IDC_PROGRESS1,msctls_progress32,1350565888 +Control7=IDC_SENTRECVD,static,1342308352 +Control8=IDC_STATIC,static,1342308352 Control9=IDC_STATIC,static,1342308352 Control10=IDC_STATIC,static,1342308352 -Control11=IDC_STATIC,static,1342308352 -Control12=IDC_FILENAME,static,1342308352 -Control13=IDC_FILESIZE,static,1342308352 -Control14=IDC_FOLDERNAME,static,1342308352 -Control15=IDC_RECVRNAME,static,1342308352 -Control16=IDC_BYTESSENT,static,1342308352 -Control17=IDC_TIMELEFT,static,1342308352 -Control18=IDC_XFERRATE,static,1342308352 -Control19=IDC_XFERSTATUS,static,1342308352 +Control11=IDC_FILENAME,static,1342308352 +Control12=IDC_FILESIZE,static,1342308352 +Control13=IDC_FOLDERNAME,static,1342308352 +Control14=IDC_RECVRNAME,static,1342308352 +Control15=IDC_BYTESSENT,static,1342308352 +Control16=IDC_TIMELEFT,static,1342308352 +Control17=IDC_XFERRATE,static,1342308352 +Control18=IDC_XFERSTATUS,static,1342308352 [DLG:IDD_CONNECT (Unknown language: 0xD, 0x1)] Type=1 diff --git a/stepmania/src/smlobby/smlobby.dsp b/stepmania/src/smlobby/smlobby.dsp index 72e578deac..3e6a348ad3 100644 --- a/stepmania/src/smlobby/smlobby.dsp +++ b/stepmania/src/smlobby/smlobby.dsp @@ -68,7 +68,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /Yu"stdafx.h" /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /FR /FD /GZ /c # SUBTRACT CPP /YX /Yc /Yu # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 diff --git a/stepmania/src/smlobby/smlobby.ncb b/stepmania/src/smlobby/smlobby.ncb index 22559c75dd7bf62fd69e952a10669afe4a180c6a..7516b2b4bd02e6e1a4783f9869b50278b1dcd974 100644 GIT binary patch literal 132093 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 B^#=d| delta 9338 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 diff --git a/stepmania/src/smlobby/smlobby.opt b/stepmania/src/smlobby/smlobby.opt index 60a29eb1d00e45d0413457a907820ab51ed9fd49..f0c42f6e5c9366d885f598df630d012034a8b2e0 100644 GIT binary patch literal 50688 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 S0!)AjFaajO1eidx1pW=`2qfSD diff --git a/stepmania/src/smlobby/smlobby.rc b/stepmania/src/smlobby/smlobby.rc index 7c3a20c88d..5f7d6feffa 100644 --- a/stepmania/src/smlobby/smlobby.rc +++ b/stepmania/src/smlobby/smlobby.rc @@ -88,7 +88,7 @@ IDD_SMLOBBY_DIALOG DIALOGEX 0, 0, 464, 330 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_APPWINDOW CAPTION "StepMania Lobby" -FONT 8, "MS Sans Serif" +FONT 8, "MS Sans Serif", 0, 0, 0x1 BEGIN EDITTEXT IDC_EDIT_ENTRY,105,281,347,12,ES_AUTOHSCROLL GROUPBOX "Chat",IDC_STATIC,5,140,453,160 @@ -117,7 +117,6 @@ CAPTION "File Transfer" FONT 8, "MS Sans Serif" BEGIN PUSHBUTTON "Cancel",IDCANCEL,129,152,50,14 - LTEXT "Sending File",IDC_STATIC,7,7,41,9 LTEXT "File:",IDC_STATIC,7,21,33,8 LTEXT "Size:",IDC_STATIC,7,30,33,8 LTEXT "Folder:",IDC_STATIC,7,40,33,8 diff --git a/stepmania/src/smlobby/smlobbyDlg.cpp b/stepmania/src/smlobby/smlobbyDlg.cpp index c9bd30c482..c25a7c031a 100644 --- a/stepmania/src/smlobby/smlobbyDlg.cpp +++ b/stepmania/src/smlobby/smlobbyDlg.cpp @@ -22,6 +22,7 @@ static const NetworkInit g_wsInit; static const unsigned short FILE_XFER_RATE = 4096; irc::CIrcSession g_ircSession; +irc::CIrcDCCServer g_DCCServer; ///////////////////////////////////////////////////////////////////////////// @@ -148,6 +149,7 @@ BOOL CSmlobbyDlg::OnInitDialog() IRC_MAP_ENTRY(CSmlobbyDlg, "NICK", OnIrc_NICK) IRC_MAP_ENTRY(CSmlobbyDlg, "PART", OnIrc_PART) IRC_MAP_ENTRY(CSmlobbyDlg, "PRIVMSG", OnIrc_PRIVMSG) + IRC_MAP_ENTRY(CSmlobbyDlg, "DCC", OnIrc_DCC_SEND) IRC_MAP_ENTRY(CSmlobbyDlg, "002", OnIrc_YOURHOST) IRC_MAP_ENTRY(CSmlobbyDlg, "321", OnIrc_RPL_LISTSTART) IRC_MAP_ENTRY(CSmlobbyDlg, "322", OnIrc_RPL_LIST) @@ -311,8 +313,77 @@ bool CSmlobbyDlg::OnIrc_PRIVMSG(const CIrcMessage* pmsg) return true; } +bool CSmlobbyDlg::OnIrc_DCC_SEND(const CIrcMessage *pmsg) +{ + //incoming: + // /DCC SEND + //outgoing: + // PRIVMSG :<0x01>DCC SEND <0x01> + const kRecptParm = 1; + + //Make sure we have a parameter + if ( pmsg->parameters.size() < (kRecptParm + 1) ) + return false; + + //Make sure we're not trying to send a file to ourselves (people can be silly :p) + CString partnerName = pmsg->parameters[kRecptParm].c_str(); + if ( partnerName == g_ircSession.GetInfo().sNick.c_str()) + return false; + + //Make sure partner is currently in the room + if (LB_ERR == m_listUsers.FindString(-1, partnerName)) + return false; + + //open a file dialog box to get the file the user wants to send + CFileDialog fileDialog(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_EXPLORER, + NULL, AfxGetMainWnd()); + if (IDOK != fileDialog.DoModal()) + return false; + + //Setup retrieval params + IPaddress ipaddr; + char szHostName[256]; + gethostname(szHostName, 256); + SDLNet_ResolveHost(&ipaddr, szHostName, 0); + + //Get filename and directory + CString filename = fileDialog.GetFileName(); + CString fullpath = fileDialog.GetPathName(); + CString dirname = fullpath.Left(fullpath.GetLength() - filename.GetLength()); + + //Place all of the connection info into a dcc info structure + irc::CIrcDCCServer::DCCTransferInfo dccInfo; + dccInfo.m_bIsSender = true; + dccInfo.m_fileName = filename; + dccInfo.m_directory = dirname; + dccInfo.m_partnerName = partnerName; + dccInfo.m_uiPort = g_DCCServer.MakePortReservation(); + dccInfo.m_uiXferRate = FILE_XFER_RATE; + dccInfo.m_ulFileSize = GetFileSizeInBytes(fullpath); + dccInfo.m_ulPartnerIP = ipaddr.host; + + //Create a dcc command to send to the user to which our file is going + char szDCCString[512]; + sprintf(szDCCString, "PRIVMSG %s :\001DCC SEND %s %ul %u %ul\001", + dccInfo.m_partnerName, dccInfo.m_fileName, ipaddr.host, + dccInfo.m_uiPort, dccInfo.m_ulFileSize); + + //Send of the dcc command to the other party + g_ircSession << irc::CIrcMessage(szDCCString); + + //We now have enough info to fire off a thread that will + //wait for the other party to connect to us and then + //transfer the file to them + g_DCCServer.Start(dccInfo); + + return true; +} + bool CSmlobbyDlg::OnIrc_DCC_RECV(const CIrcMessage *pmsg) { + //incoming:: + // PRIVMSG :<0x01>DCC SEND <0x01> + //Make sure we have a parameter if ( pmsg->parameters.size() < 1 ) return false; @@ -328,20 +399,29 @@ bool CSmlobbyDlg::OnIrc_DCC_RECV(const CIrcMessage *pmsg) unsigned short uiPartnerPort; unsigned long ulFileSize; + //Snag the dcc info fields from the message string if ( 4 != sscanf(pszRawString, "\001DCC SEND %255s %lu %u %lu", &szFilename, &ulPartnerIP, &uiPartnerPort, &ulFileSize) ) return false; //Open a dialog box so user can decide where to save file CString pathname = SelectFolder(); + if (pathname.GetLength() <= 1) + return false; - //We now have enough info to fire off a thread which downloads the file - CIrcDCCServer DCCServer; - CString filename(szFilename); - CString partner(pmsg->prefix.sNick.c_str()); + //Assemble all of this info into a dcc info structure + irc::CIrcDCCServer::DCCTransferInfo dccInfo; + dccInfo.m_bIsSender = false; + dccInfo.m_directory = pathname; + dccInfo.m_fileName = szFilename; + dccInfo.m_partnerName = pmsg->prefix.sNick.c_str(); + dccInfo.m_uiPort = uiPartnerPort; + dccInfo.m_uiXferRate = FILE_XFER_RATE; + dccInfo.m_ulFileSize = ulFileSize; + dccInfo.m_ulPartnerIP = ulPartnerIP; - DCCServer.Start(filename, pathname, partner, ulPartnerIP, uiPartnerPort, - ulFileSize, FILE_XFER_RATE); + //We now have enough info to fire off a thread that downloads the file + g_DCCServer.Start(dccInfo); return true; } @@ -612,10 +692,18 @@ void CSmlobbyDlg::OnButtonCreateGame() return; } + //Make sure a song is selected + int iIndex = m_comboMusic.GetCurSel(); + if( iIndex <= 0 ) + { + MessageBox("Need to select a song to play!"); + return; + } + //Tell the server that we wanted to create a chat room g_ircSession << irc::CIrcMessage(CString("join ") + "#" + gameName); - //Get the IP address of our machine + //Get the IP address of our machine in network byte order IPaddress ipaddr; char szHostName[256]; gethostname(szHostName, 256); @@ -625,15 +713,10 @@ void CSmlobbyDlg::OnButtonCreateGame() sprintf(host_ip_str, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]); //Insert song name/hash code here - - int iIndex = m_comboMusic.GetCurSel(); - if( iIndex <= 0 ) - ASSERT(0); // what do we do here? CString sSongDir; m_comboMusic.GetLBText( iIndex, sSongDir ); unsigned long hash = GetHashForDirectory( sSongDir ); - //Now tell the server our game info CString sIrcMessage = ssprintf( "topic #%s :%s %s %s %u", gameName, diff --git a/stepmania/src/smlobby/smlobbyDlg.h b/stepmania/src/smlobby/smlobbyDlg.h index 72db976783..07d9268ee6 100644 --- a/stepmania/src/smlobby/smlobbyDlg.h +++ b/stepmania/src/smlobby/smlobbyDlg.h @@ -70,6 +70,7 @@ protected: bool OnIrc_RPL_LIST(const CIrcMessage *pmsg); bool OnIrc_RPL_TOPIC(const CIrcMessage *pmsg); bool OnIrc_RPL_NAMREPLY(const CIrcMessage *pmsg); + bool OnIrc_DCC_SEND(const CIrcMessage *pmsg); bool OnIrc_DCC_RECV(const CIrcMessage *pmsg); bool OnIrc_IgnoreMesg(const CIrcMessage *pmsg) { return true; } diff --git a/stepmania/src/smlobby/socket.cpp b/stepmania/src/smlobby/socket.cpp index dbea26db74..fc691142f9 100644 --- a/stepmania/src/smlobby/socket.cpp +++ b/stepmania/src/smlobby/socket.cpp @@ -35,6 +35,12 @@ InetAddr::InetAddr(short wPort) port = wPort; } +InetAddr::InetAddr(long dwIP, short wPort) +{ + host = dwIP; + port = wPort; +} + InetAddr::InetAddr(const char* lpszAddress, short wPort) { Resolve(lpszAddress, wPort); diff --git a/stepmania/src/smlobby/socket.h b/stepmania/src/smlobby/socket.h index 3b3bf81b96..34d6ffb693 100644 --- a/stepmania/src/smlobby/socket.h +++ b/stepmania/src/smlobby/socket.h @@ -33,6 +33,7 @@ class InetAddr : public IPaddress { public : InetAddr(short wPort = 0); + InetAddr(long dwIP, short wPort); InetAddr(const char* lpszAddress, short wPort = 0); InetAddr& operator = (char* lpszAddress);