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 56bdef1325..6df6bcde33 100644 Binary files a/stepmania/src/smlobby/smlobby.aps and b/stepmania/src/smlobby/smlobby.aps differ 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 22559c75dd..7516b2b4bd 100644 Binary files a/stepmania/src/smlobby/smlobby.ncb and b/stepmania/src/smlobby/smlobby.ncb differ diff --git a/stepmania/src/smlobby/smlobby.opt b/stepmania/src/smlobby/smlobby.opt index 60a29eb1d0..f0c42f6e5c 100644 Binary files a/stepmania/src/smlobby/smlobby.opt and b/stepmania/src/smlobby/smlobby.opt differ 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);