From 840caa7a2c2d2066c4d214f67988246003fe8eea Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Mon, 2 Dec 2002 05:44:00 +0000 Subject: [PATCH] moved lobby from separate module to below /src --- stepmania/src/smlobby/ConnectDlg.cpp | 84 + stepmania/src/smlobby/ConnectDlg.h | 53 + .../smlobby/CrossThreadsMessagingDevice.cpp | 98 + .../src/smlobby/CrossThreadsMessagingDevice.h | 36 + stepmania/src/smlobby/DirectoryDialog.cpp | 88 + stepmania/src/smlobby/DirectoryDialog.h | 41 + stepmania/src/smlobby/EditChat.cpp | 96 + stepmania/src/smlobby/EditChat.h | 50 + stepmania/src/smlobby/SendFileDialog.cpp | 77 + stepmania/src/smlobby/SendFileDialog.h | 64 + stepmania/src/smlobby/StdAfx.cpp | 8 + stepmania/src/smlobby/StdAfx.h | 26 + stepmania/src/smlobby/irc.cpp | 830 +++++ stepmania/src/smlobby/irc.h | 304 ++ stepmania/src/smlobby/res/smlobby.ico | Bin 0 -> 1078 bytes stepmania/src/smlobby/res/smlobby.rc2 | 13 + stepmania/src/smlobby/resource2.h | 51 + stepmania/src/smlobby/smlobby.aps | Bin 0 -> 41116 bytes stepmania/src/smlobby/smlobby.clw | 2956 +++++++++++++++++ stepmania/src/smlobby/smlobby.cpp | 67 + stepmania/src/smlobby/smlobby.dsp | 186 ++ stepmania/src/smlobby/smlobby.dsw | 29 + stepmania/src/smlobby/smlobby.h | 54 + stepmania/src/smlobby/smlobby.ncb | 1 + stepmania/src/smlobby/smlobby.opt | Bin 0 -> 49664 bytes stepmania/src/smlobby/smlobby.rc | 329 ++ stepmania/src/smlobby/smlobbyDlg.cpp | 628 ++++ stepmania/src/smlobby/smlobbyDlg.h | 86 + stepmania/src/smlobby/socket.cpp | 127 + stepmania/src/smlobby/socket.h | 71 + 30 files changed, 6453 insertions(+) create mode 100644 stepmania/src/smlobby/ConnectDlg.cpp create mode 100644 stepmania/src/smlobby/ConnectDlg.h create mode 100644 stepmania/src/smlobby/CrossThreadsMessagingDevice.cpp create mode 100644 stepmania/src/smlobby/CrossThreadsMessagingDevice.h create mode 100644 stepmania/src/smlobby/DirectoryDialog.cpp create mode 100644 stepmania/src/smlobby/DirectoryDialog.h create mode 100644 stepmania/src/smlobby/EditChat.cpp create mode 100644 stepmania/src/smlobby/EditChat.h create mode 100644 stepmania/src/smlobby/SendFileDialog.cpp create mode 100644 stepmania/src/smlobby/SendFileDialog.h create mode 100644 stepmania/src/smlobby/StdAfx.cpp create mode 100644 stepmania/src/smlobby/StdAfx.h create mode 100644 stepmania/src/smlobby/irc.cpp create mode 100644 stepmania/src/smlobby/irc.h create mode 100644 stepmania/src/smlobby/res/smlobby.ico create mode 100644 stepmania/src/smlobby/res/smlobby.rc2 create mode 100644 stepmania/src/smlobby/resource2.h create mode 100644 stepmania/src/smlobby/smlobby.aps create mode 100644 stepmania/src/smlobby/smlobby.clw create mode 100644 stepmania/src/smlobby/smlobby.cpp create mode 100644 stepmania/src/smlobby/smlobby.dsp create mode 100644 stepmania/src/smlobby/smlobby.dsw create mode 100644 stepmania/src/smlobby/smlobby.h create mode 100644 stepmania/src/smlobby/smlobby.ncb create mode 100644 stepmania/src/smlobby/smlobby.opt create mode 100644 stepmania/src/smlobby/smlobby.rc create mode 100644 stepmania/src/smlobby/smlobbyDlg.cpp create mode 100644 stepmania/src/smlobby/smlobbyDlg.h create mode 100644 stepmania/src/smlobby/socket.cpp create mode 100644 stepmania/src/smlobby/socket.h diff --git a/stepmania/src/smlobby/ConnectDlg.cpp b/stepmania/src/smlobby/ConnectDlg.cpp new file mode 100644 index 0000000000..155de8b450 --- /dev/null +++ b/stepmania/src/smlobby/ConnectDlg.cpp @@ -0,0 +1,84 @@ +// ConnectDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "resource2.h" +#include "ConnectDlg.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CConnectDlg dialog + + +CConnectDlg::CConnectDlg(CWnd* pParent /*=NULL*/) + : CDialog(CConnectDlg::IDD, pParent) +{ + //{{AFX_DATA_INIT(CConnectDlg) + m_sFullName = _T(""); + m_sNick = _T(""); + m_sPassword = _T(""); + m_uiPort = 0; + m_sServer = _T(""); + m_sUserID = _T(""); + //}}AFX_DATA_INIT +} + + +void CConnectDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CConnectDlg) + DDX_Text(pDX, IDC_FULLNAME, m_sFullName); + DDX_Text(pDX, IDC_NICK, m_sNick); + DDX_Text(pDX, IDC_PASSWORD, m_sPassword); + DDX_Text(pDX, IDC_PORT, m_uiPort); + DDX_Text(pDX, IDC_SERVER, m_sServer); + DDX_Text(pDX, IDC_USERID, m_sUserID); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CConnectDlg, CDialog) + //{{AFX_MSG_MAP(CConnectDlg) + ON_EN_CHANGE(IDC_FULLNAME, OnChange) + ON_EN_CHANGE(IDC_NICK, OnChange) + ON_EN_CHANGE(IDC_PASSWORD, OnChange) + ON_EN_CHANGE(IDC_PORT, OnChange) + ON_EN_CHANGE(IDC_SERVER, OnChange) + ON_EN_CHANGE(IDC_USERID, OnChange) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CConnectDlg message handlers + +void CConnectDlg::OnChange() +{ + UpdateButtons(); +} + +void CConnectDlg::UpdateButtons() +{ + GetDlgItem(IDOK)->EnableWindow( + GetDlgItem(IDC_FULLNAME)->GetWindowTextLength() > 0 && + GetDlgItem(IDC_NICK)->GetWindowTextLength() > 0 && + GetDlgItem(IDC_SERVER)->GetWindowTextLength() > 0 && + GetDlgItem(IDC_USERID)->GetWindowTextLength() > 0 && + GetDlgItemInt(IDC_PORT) != 0 + ); +} + +BOOL CConnectDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + + UpdateButtons(); + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} diff --git a/stepmania/src/smlobby/ConnectDlg.h b/stepmania/src/smlobby/ConnectDlg.h new file mode 100644 index 0000000000..ee72ebf499 --- /dev/null +++ b/stepmania/src/smlobby/ConnectDlg.h @@ -0,0 +1,53 @@ +#if !defined(AFX_CONNECTDLG_H__04D8BFFC_9C8D_4610_8AFF_4736EB7397BE__INCLUDED_) +#define AFX_CONNECTDLG_H__04D8BFFC_9C8D_4610_8AFF_4736EB7397BE__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// ConnectDlg.h : header file +// + +///////////////////////////////////////////////////////////////////////////// +// CConnectDlg dialog + +class CConnectDlg : public CDialog +{ +// Construction +public: + CConnectDlg(CWnd* pParent = NULL); // standard constructor + +// Dialog Data + //{{AFX_DATA(CConnectDlg) + enum { IDD = IDD_CONNECT }; + CString m_sFullName; + CString m_sNick; + CString m_sPassword; + UINT m_uiPort; + CString m_sServer; + CString m_sUserID; + //}}AFX_DATA + + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CConnectDlg) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +protected: + void UpdateButtons(); + + // Generated message map functions + //{{AFX_MSG(CConnectDlg) + afx_msg void OnChange(); + virtual BOOL OnInitDialog(); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_CONNECTDLG_H__04D8BFFC_9C8D_4610_8AFF_4736EB7397BE__INCLUDED_) diff --git a/stepmania/src/smlobby/CrossThreadsMessagingDevice.cpp b/stepmania/src/smlobby/CrossThreadsMessagingDevice.cpp new file mode 100644 index 0000000000..0642603ce8 --- /dev/null +++ b/stepmania/src/smlobby/CrossThreadsMessagingDevice.cpp @@ -0,0 +1,98 @@ +// CrossThreadsMessagingDevice.cpp + +#include "stdafx.h" +#include "CrossThreadsMessagingDevice.h" + + +LPCTSTR CCrossThreadsMessagingDevice::m_lpszClassName = _T("CCrossThreadsMessagingDevice_HiddenWindow"); +int CCrossThreadsMessagingDevice::m_iCount = 0; + + +CCrossThreadsMessagingDevice::CCrossThreadsMessagingDevice() + : m_hWnd(NULL), m_pMonitor(NULL) +{ + if( m_iCount++ == 0 ) + { + const WNDCLASS wc = + { + 0, + HiddenWindowProc, + sizeof(DWORD) * 2, + sizeof(DWORD) * 2, + GetModuleHandle(NULL), + (HICON)NULL, + (HCURSOR)NULL, + (HBRUSH)(COLOR_WINDOW + 1), + (LPCTSTR)NULL, + m_lpszClassName + }; + + if( !RegisterClass(&wc) ) + return; + } + + m_hWnd = CreateWindow( + m_lpszClassName, + _T(""), + WS_OVERLAPPED, + 0, 0, 0, 0, + (HWND)NULL, + (HMENU)NULL, + GetModuleHandle(NULL), + this + ); +} + +CCrossThreadsMessagingDevice::~CCrossThreadsMessagingDevice() +{ + if( ::IsWindow(m_hWnd) ) + DestroyWindow(m_hWnd); + + if( --m_iCount == 0 ) + { + UnregisterClass(m_lpszClassName, GetModuleHandle(NULL)); + } +} + +void CCrossThreadsMessagingDevice::Post(WPARAM wParam, LPARAM lParam) +{ + ASSERT(::IsWindow(m_hWnd)); + PostMessage(m_hWnd, HWM_DATA, wParam, lParam); +} + +LRESULT WINAPI CCrossThreadsMessagingDevice::HiddenWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + LRESULT rc = 0; + + CCrossThreadsMessagingDevice* pThis = + (CCrossThreadsMessagingDevice*)GetWindowLong(hWnd, GWL_USERDATA); + + switch( uMsg ) + { + case WM_NCCREATE : + { + LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam; + ASSERT(lpcs->lpCreateParams != NULL); + SetWindowLong(hWnd, GWL_USERDATA, (LONG)lpcs->lpCreateParams); + rc = TRUE; + break; + } + + case HWM_DATA : + { + ASSERT(pThis != NULL); + if( pThis->m_pMonitor ) + pThis->m_pMonitor->OnCrossThreadsMessage(wParam, lParam); + break; + } + + default : + { + rc = DefWindowProc(hWnd, uMsg, wParam, lParam); + break; + } + } + + return rc; +} + diff --git a/stepmania/src/smlobby/CrossThreadsMessagingDevice.h b/stepmania/src/smlobby/CrossThreadsMessagingDevice.h new file mode 100644 index 0000000000..16f38ff553 --- /dev/null +++ b/stepmania/src/smlobby/CrossThreadsMessagingDevice.h @@ -0,0 +1,36 @@ +// CrossThreadsMessagingDevice.h + +#ifndef _CrossThreadsMessagingDevice_H_ +#define _CrossThreadsMessagingDevice_H_ + + +class CCrossThreadsMessagingDevice +{ +public : + struct ICrossThreadsMessagingDeviceMonitor + { + virtual void OnCrossThreadsMessage(WPARAM wParam, LPARAM lParam) = 0; + }; + + CCrossThreadsMessagingDevice(); + virtual ~CCrossThreadsMessagingDevice(); + + void SetMonitor(ICrossThreadsMessagingDeviceMonitor* pMonitor) { m_pMonitor = pMonitor; } + void Post(WPARAM wParam, LPARAM lParam); + + operator bool() const { return ::IsWindow(m_hWnd)==TRUE; } + +private : + enum { HWM_DATA = WM_USER + 1000 }; + static LPCTSTR m_lpszClassName; + static int m_iCount; + HWND m_hWnd; + ICrossThreadsMessagingDeviceMonitor* m_pMonitor; + + static LRESULT WINAPI HiddenWindowProc(HWND, UINT, WPARAM, LPARAM); +}; + + + +#endif // _CrossThreadsMessagingDevice_H_ + diff --git a/stepmania/src/smlobby/DirectoryDialog.cpp b/stepmania/src/smlobby/DirectoryDialog.cpp new file mode 100644 index 0000000000..d573ecc244 --- /dev/null +++ b/stepmania/src/smlobby/DirectoryDialog.cpp @@ -0,0 +1,88 @@ +// DirectoryDialog.cpp : implementation file +// + +#include "stdafx.h" +#include "smlobby.h" +#include "DirectoryDialog.h" +#include "dlgs.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CDirectoryDialog + +IMPLEMENT_DYNAMIC(CDirectoryDialog, CFileDialog) + +CDirectoryDialog::CDirectoryDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefExt, LPCTSTR lpszFileName, + DWORD dwFlags, LPCTSTR lpszFilter, CWnd* pParentWnd) : + CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, pParentWnd) +{ +} + + +BEGIN_MESSAGE_MAP(CDirectoryDialog, CFileDialog) + //{{AFX_MSG_MAP(CDirectoryDialog) + ON_WM_PAINT() + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + + +void CDirectoryDialog::OnPaint() +{ + CPaintDC dc(this); // device context for painting + + // TODO: Add your message handler code here + +//This code makes the directory listbox "highlight" an entry when it first +//comes up. W/O this code, the focus is on the directory listbox, but no +//focus rectangle is drawn and no entries are selected. Ho hum. + + if (m_bDlgJustCameUp) + { + m_bDlgJustCameUp=FALSE; + SendDlgItemMessage(lst2, LB_SETCURSEL, 0, 0L); + } + + // Do not call CFileDialog::OnPaint() for painting messages +} + +BOOL CDirectoryDialog::OnInitDialog() +{ + CenterWindow(); + +//Let's hide these windows so the user cannot tab to them. Note that in +//the private template (in cddemo.dlg) the coordinates for these guys are +//*outside* the coordinates of the dlg window itself. Without the following +//ShowWindow()'s you would not see them, but could still tab to them. + + GetDlgItem(stc2)->ShowWindow(SW_HIDE); + GetDlgItem(stc3)->ShowWindow(SW_HIDE); + GetDlgItem(edt1)->ShowWindow(SW_HIDE); + GetDlgItem(lst1)->ShowWindow(SW_HIDE); + GetDlgItem(cmb1)->ShowWindow(SW_HIDE); + +//We must put something in this field, even though it is hidden. This is +//because if this field is empty, or has something like "*.txt" in it, +//and the user hits OK, the dlg will NOT close. We'll jam something in +//there (like "Junk") so when the user hits OK, the dlg terminates. +//Note that we'll deal with the "Junk" during return processing (see below) + + SetDlgItemText(edt1, "Junk"); + +//Now set the focus to the directories listbox. Due to some painting +//problems, we *must* also process the first WM_PAINT that comes through +//and set the current selection at that point. Setting the selection +//here will NOT work. See comment below in the on paint handler. + + GetDlgItem(lst2)->SetFocus(); + + m_bDlgJustCameUp=TRUE; + + CFileDialog::OnInitDialog(); + + return(FALSE); +} diff --git a/stepmania/src/smlobby/DirectoryDialog.h b/stepmania/src/smlobby/DirectoryDialog.h new file mode 100644 index 0000000000..be111f469b --- /dev/null +++ b/stepmania/src/smlobby/DirectoryDialog.h @@ -0,0 +1,41 @@ +#if !defined(AFX_DIRECTORYDIALOG_H__1692F649_A71E_4EA5_9DE0_0A3F2A30B1E6__INCLUDED_) +#define AFX_DIRECTORYDIALOG_H__1692F649_A71E_4EA5_9DE0_0A3F2A30B1E6__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// DirectoryDialog.h : header file +// + +#include "resource2.h" + +///////////////////////////////////////////////////////////////////////////// +// CDirectoryDialog dialog + +class CDirectoryDialog : public CFileDialog +{ + DECLARE_DYNAMIC(CDirectoryDialog) + +public: + BOOL m_bDlgJustCameUp; + +public: + CDirectoryDialog(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs + LPCTSTR lpszDefExt = NULL, + LPCTSTR lpszFileName = NULL, + DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, + LPCTSTR lpszFilter = NULL, + CWnd* pParentWnd = NULL); + +protected: + //{{AFX_MSG(CDirectoryDialog) + afx_msg void OnPaint(); + virtual BOOL OnInitDialog(); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_DIRECTORYDIALOG_H__1692F649_A71E_4EA5_9DE0_0A3F2A30B1E6__INCLUDED_) diff --git a/stepmania/src/smlobby/EditChat.cpp b/stepmania/src/smlobby/EditChat.cpp new file mode 100644 index 0000000000..045914cf5b --- /dev/null +++ b/stepmania/src/smlobby/EditChat.cpp @@ -0,0 +1,96 @@ +// EditChat.cpp : implementation file +// + +#include "stdafx.h" +#include "smlobby.h" +#include "EditChat.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +//external object +extern irc::CIrcSession g_ircSession; + +///////////////////////////////////////////////////////////////////////////// +// CEditChat + +CEditChat::CEditChat() +{ +} + +CEditChat::~CEditChat() +{ +} + + +BEGIN_MESSAGE_MAP(CEditChat, CEdit) + //{{AFX_MSG_MAP(CEditChat) + ON_WM_GETDLGCODE() + ON_WM_KEYUP() + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CEditChat message handlers + +UINT CEditChat::OnGetDlgCode() +{ + UINT code = CEdit::OnGetDlgCode(); + + code |= DLGC_WANTMESSAGE; + + return code; +} + +void CEditChat::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) +{ + switch (nChar) + { + //User presses the return key + case VK_RETURN: + SendChatMesg(); + break; + } + + CEdit::OnKeyUp(nChar, nRepCnt, nFlags); +} + +void CEditChat::SendChatMesg() +{ + CString s, name; + bool isIncoming = false; + + this->GetWindowText(s); + + if( s.GetLength() == 0 ) return; + + if( s[0] != '/' ) + { + //Make sure were in a chat room + if( g_ircSession.GetInfo().sCurrentChatRoom.length() == 0) + { + s = "You are not currently in a chat room"; + name = g_ircSession.GetInfo().sNick.c_str(); + isIncoming = true; + } + else + { + name = g_ircSession.GetInfo().sCurrentChatRoom.c_str(); + } + + s = "PRIVMSG " + name + " :" + s; + } + else + { + s = s.Mid(1); + } + + if( g_ircSession ) + g_ircSession << irc::CIrcMessage(s, isIncoming); + + this->SetWindowText(_T("")); +} \ No newline at end of file diff --git a/stepmania/src/smlobby/EditChat.h b/stepmania/src/smlobby/EditChat.h new file mode 100644 index 0000000000..1c0643719c --- /dev/null +++ b/stepmania/src/smlobby/EditChat.h @@ -0,0 +1,50 @@ +#if !defined(AFX_EDITCHAT_H__68A3B363_25AE_45B1_8519_9FE70839EFC4__INCLUDED_) +#define AFX_EDITCHAT_H__68A3B363_25AE_45B1_8519_9FE70839EFC4__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// EditChat.h : header file +// + +///////////////////////////////////////////////////////////////////////////// +// CEditChat window + +class CEditChat : public CEdit +{ +// Construction +public: + CEditChat(); + +// Attributes +public: + +// Operations +public: + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CEditChat) + //}}AFX_VIRTUAL + +// Implementation +public: + virtual ~CEditChat(); + void SendChatMesg(); + + // Generated message map functions +protected: + //{{AFX_MSG(CEditChat) + afx_msg UINT OnGetDlgCode(); + afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags); + //}}AFX_MSG + + DECLARE_MESSAGE_MAP() +}; + +///////////////////////////////////////////////////////////////////////////// + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_EDITCHAT_H__68A3B363_25AE_45B1_8519_9FE70839EFC4__INCLUDED_) diff --git a/stepmania/src/smlobby/SendFileDialog.cpp b/stepmania/src/smlobby/SendFileDialog.cpp new file mode 100644 index 0000000000..5db19b3399 --- /dev/null +++ b/stepmania/src/smlobby/SendFileDialog.cpp @@ -0,0 +1,77 @@ +// SendFileDialog.cpp : implementation file +// + +#include "stdafx.h" +#include "smlobby.h" +#include "SendFileDialog.h" +#include "irc.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CSendFileDialog dialog + + +CSendFileDialog::CSendFileDialog(CWnd* pParent /*=NULL*/) + : CDialog(CSendFileDialog::IDD, pParent) +{ + //{{AFX_DATA_INIT(CSendFileDialog) + m_BytesSent = _T(""); + m_Filesize = _T(""); + m_FolderName = _T(""); + m_FileName = _T(""); + m_RecvrName = _T(""); + m_TimeLeft = _T(""); + m_XferRate = _T(""); + m_XferStatus = _T(""); + m_SentRecvd = _T(""); + m_ToFrom = _T(""); + //}}AFX_DATA_INIT + + m_pDCCServer = NULL; +} + + +void CSendFileDialog::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CSendFileDialog) + DDX_Control(pDX, IDC_PROGRESS1, m_ProgressFile); + DDX_Text(pDX, IDC_BYTESSENT, m_BytesSent); + DDX_Text(pDX, IDC_FILESIZE, m_Filesize); + DDX_Text(pDX, IDC_FOLDERNAME, m_FolderName); + DDX_Text(pDX, IDC_FILENAME, m_FileName); + DDX_Text(pDX, IDC_RECVRNAME, m_RecvrName); + DDX_Text(pDX, IDC_TIMELEFT, m_TimeLeft); + DDX_Text(pDX, IDC_XFERRATE, m_XferRate); + DDX_Text(pDX, IDC_XFERSTATUS, m_XferStatus); + DDX_Text(pDX, IDC_SENTRECVD, m_SentRecvd); + DDX_Text(pDX, IDC_TOFROM, m_ToFrom); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CSendFileDialog, CDialog) + //{{AFX_MSG_MAP(CSendFileDialog) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CSendFileDialog message handlers + +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); + } + + CDialog::OnCancel(); +} diff --git a/stepmania/src/smlobby/SendFileDialog.h b/stepmania/src/smlobby/SendFileDialog.h new file mode 100644 index 0000000000..cb838c1bc5 --- /dev/null +++ b/stepmania/src/smlobby/SendFileDialog.h @@ -0,0 +1,64 @@ +#if !defined(AFX_SENDFILEDIALOG_H__6AA4B205_EDA8_4960_9424_1C5743093120__INCLUDED_) +#define AFX_SENDFILEDIALOG_H__6AA4B205_EDA8_4960_9424_1C5743093120__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// SendFileDialog.h : header file +// + +#include "resource2.h" + +///////////////////////////////////////////////////////////////////////////// +// CSendFileDialog dialog + +class CSendFileDialog : public CDialog +{ +// Construction +public: + CSendFileDialog(CWnd* pParent = NULL); // standard constructor + +// Dialog Data + //{{AFX_DATA(CSendFileDialog) + enum { IDD = IDD_FILEXFER }; + CProgressCtrl m_ProgressFile; + CString m_BytesSent; + CString m_Filesize; + CString m_FolderName; + CString m_FileName; + CString m_RecvrName; + CString m_TimeLeft; + CString m_XferRate; + CString m_XferStatus; + CString m_SentRecvd; + CString m_ToFrom; + //}}AFX_DATA + + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CSendFileDialog) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +public: + void AssignDCCServer(void* pServer) { m_pDCCServer = pServer; } + +protected: + void* m_pDCCServer; + +protected: + + // Generated message map functions + //{{AFX_MSG(CSendFileDialog) + virtual void OnCancel(); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_SENDFILEDIALOG_H__6AA4B205_EDA8_4960_9424_1C5743093120__INCLUDED_) diff --git a/stepmania/src/smlobby/StdAfx.cpp b/stepmania/src/smlobby/StdAfx.cpp new file mode 100644 index 0000000000..11c469b42f --- /dev/null +++ b/stepmania/src/smlobby/StdAfx.cpp @@ -0,0 +1,8 @@ +// stdafx.cpp : source file that includes just the standard includes +// gimplobby.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + + + diff --git a/stepmania/src/smlobby/StdAfx.h b/stepmania/src/smlobby/StdAfx.h new file mode 100644 index 0000000000..1f4f59565a --- /dev/null +++ b/stepmania/src/smlobby/StdAfx.h @@ -0,0 +1,26 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#if !defined(AFX_STDAFX_H__FDE20029_172C_49E9_9553_68F48CF8C2BF__INCLUDED_) +#define AFX_STDAFX_H__FDE20029_172C_49E9_9553_68F48CF8C2BF__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers + +#include // MFC core and standard components +#include // MFC extensions +#include // MFC support for Internet Explorer 4 Common Controls +#ifndef _AFX_NO_AFXCMN_SUPPORT +#include // MFC support for Windows Common Controls +#endif // _AFX_NO_AFXCMN_SUPPORT + + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STDAFX_H__FDE20029_172C_49E9_9553_68F48CF8C2BF__INCLUDED_) diff --git a/stepmania/src/smlobby/irc.cpp b/stepmania/src/smlobby/irc.cpp new file mode 100644 index 0000000000..204edceb9a --- /dev/null +++ b/stepmania/src/smlobby/irc.cpp @@ -0,0 +1,830 @@ +// irc.cpp + +#include "stdafx.h" +#include "irc.h" + +using namespace irc; + +//////////////////////////////////////////////////////////////////// + +CIrcMessage::CIrcMessage(const char* lpszCmdLine, bool bIncoming) + : m_bIncoming(bIncoming) +{ + ParseIrcCommand(lpszCmdLine); +} + +CIrcMessage::CIrcMessage(const CIrcMessage& m) + : sCommand(m.sCommand), + parameters(m.parameters), + m_bIncoming(m.m_bIncoming) +{ + prefix.sNick = m.prefix.sNick; + prefix.sUser = m.prefix.sUser; + prefix.sHost = m.prefix.sHost; +} + +void CIrcMessage::Reset() +{ + prefix.sNick = prefix.sUser = prefix.sHost = sCommand = ""; + m_bIncoming = false; + parameters.clear(); +} + +CIrcMessage& CIrcMessage::operator = (const CIrcMessage& m) +{ + if( &m != this ) + { + sCommand = m.sCommand; + parameters = m.parameters; + prefix.sNick = m.prefix.sNick; + prefix.sUser = m.prefix.sUser; + prefix.sHost = m.prefix.sHost; + m_bIncoming = m.m_bIncoming; + } + return *this; +} + +CIrcMessage& CIrcMessage::operator = (const char* lpszCmdLine) +{ + Reset(); + ParseIrcCommand(lpszCmdLine); + return *this; +} + +void CIrcMessage::ParseIrcCommand(const char* lpszCmdLine) +{ + const char* p1 = lpszCmdLine; + const char* p2 = lpszCmdLine; + + ASSERT(lpszCmdLine != NULL); + ASSERT(*lpszCmdLine); + + // prefix exists ? + if( *p1 == ':' ) + { // break prefix into its components (nick!user@host) + p2 = ++p1; + while( *p2 && !strchr(" !", *p2) ) + ++p2; + prefix.sNick.assign(p1, p2 - p1); + if( *p2 != '!' ) + goto end_of_prefix; + p1 = ++p2; + while( *p2 && !strchr(" @", *p2) ) + ++p2; + prefix.sUser.assign(p1, p2 - p1); + if( *p2 != '@' ) + goto end_of_prefix; + p1 = ++p2; + while( *p2 && !isspace(*p2) ) + ++p2; + prefix.sHost.assign(p1, p2 - p1); +end_of_prefix : + while( *p2 && isspace(*p2) ) + ++p2; + p1 = p2; + } + + // get command + ASSERT(*p1 != '\0'); + p2 = p1; + while( *p2 && !isspace(*p2) ) + ++p2; + sCommand.assign(p1, p2 - p1); + _strupr((char*)sCommand.c_str()); + while( *p2 && isspace(*p2) ) + ++p2; + p1 = p2; + + // get parameters + while( *p1 ) + { + if( *p1 == ':' ) + { + ++p1; + // seek end-of-message + while( *p2 ) + ++p2; + parameters.push_back(String(p1, p2 - p1)); + break; + } + else + { + // seek end of parameter + while( *p2 && !isspace(*p2) ) + ++p2; + parameters.push_back(String(p1, p2 - p1)); + // see next parameter + while( *p2 && isspace(*p2) ) + ++p2; + p1 = p2; + } + } // end parameters loop +} + +String CIrcMessage::AsString() const +{ + String s; + + if( prefix.sNick.length() ) + { + s += ":" + prefix.sNick; + if( prefix.sUser.length() && prefix.sHost.length() ) + s += "!" + prefix.sUser + "@" + prefix.sHost; + s += " "; + } + + s += sCommand; + + for(int i=0; i < parameters.size(); i++) + { + s += " "; + if( i == parameters.size() - 1 ) // is last parameter ? + s += ":"; + s += parameters[i]; + } + + s += endl; + + return s; +} + +//////////////////////////////////////////////////////////////////// + +CIrcSession::CIrcSession(IIrcSessionMonitor* pMonitor) + : m_hThread(NULL) +{ + InitializeCriticalSection(&m_cs); +} + +CIrcSession::~CIrcSession() +{ + Disconnect(); + DeleteCriticalSection(&m_cs); +} + +bool CIrcSession::Connect(const CIrcSessionInfo& info) +{ + ASSERT(m_hThread==NULL && !m_socket); + + try + { +// if( !m_socket.Create() ) +// throw "Failed to create socket!"; + + InetAddr addr(info.sServer.c_str(), info.iPort); + if( !m_socket.Connect(addr) ) + { + m_socket.Close(); + throw "Failed to connect to host!"; + } + + m_info = info; + + // start receiving messages from host + m_hThread = CreateThread(NULL, 0, ThreadProc, this, 0, NULL); + Sleep(100); + + if( info.sPassword.length() ) + m_socket.Send("PASS %s\r\n", info.sPassword.c_str()); + + m_socket.Send("NICK %s\r\n", info.sNick.c_str()); + + TCHAR szHostName[MAX_PATH]; + DWORD cbHostName = sizeof(szHostName); + GetComputerName(szHostName, &cbHostName); + + m_socket.Send("USER %s %s %s :%s\r\n", + info.sUserID.c_str(), szHostName, "server", info.sFullName.c_str()); + } + catch( const char* ) + { + Disconnect(); + } + catch( ... ) + { + Disconnect(); + } + + return (bool)m_socket; +} + +void CIrcSession::Disconnect(const char* lpszMessage) +{ + static const DWORD dwServerTimeout = 5 * 1000; + + if( !m_hThread ) + return; + + m_socket.Send("QUIT :%s\r\n", lpszMessage ? lpszMessage : "Bye!"); + + if( m_hThread && WaitForSingleObject(m_hThread, dwServerTimeout) != WAIT_OBJECT_0 ) + { + m_socket.Close(); + Sleep(100); + if( m_hThread && WaitForSingleObject(m_hThread, dwServerTimeout) != WAIT_OBJECT_0 ) + { + TerminateThread(m_hThread, 1); + CloseHandle(m_hThread); + m_hThread = NULL; + m_info.Reset(); + } + } +} + +void CIrcSession::Notify(const CIrcMessage* pmsg) +{ + // forward message to monitor objects + EnterCriticalSection(&m_cs); + for(std::set::iterator it = m_monitors.begin(); + it != m_monitors.end(); + it++ + ) + { + (*it)->OnIrcMessage(pmsg); + } + LeaveCriticalSection(&m_cs); +} + +void CIrcSession::DoReceive() +{ + CIrcIdentServer m_identServer; + char chBuf[1024*4+1]; + int cbInBuf = 0; + + if( m_info.bIdentServer ) + m_identServer.Start(m_info.sUserID.c_str()); + + while( m_socket ) + { + int cbRead; + int nLinesProcessed = 0; + + cbRead = m_socket.Receive((unsigned char*)chBuf+cbInBuf, sizeof(chBuf)-cbInBuf-1); + if( cbRead <= 0 ) + break; + cbInBuf += cbRead; + chBuf[cbInBuf] = '\0'; + + char* pStart = chBuf; + while( *pStart ) + { + char* pEnd; + + // seek end-of-line + for(pEnd=pStart; *pEnd && *pEnd != '\r' && *pEnd != '\n'; ++pEnd) + ; + if( *pEnd == '\0' ) + break; // uncomplete message. stop parsing. + + ++nLinesProcessed; + + // replace end-of-line with NULLs and skip + while( *pEnd == '\r' || *pEnd == '\n' ) + *pEnd++ = '\0'; + + if( *pStart ) + { + // process single message by monitor objects + CIrcMessage msg(pStart, true); + Notify(&msg); + } + + cbInBuf -= pEnd - pStart; + ASSERT(cbInBuf >= 0); + + pStart = pEnd; + } + + // discard processed messages + if( nLinesProcessed != 0 ) + memmove(chBuf, pStart, cbInBuf+1); + } + + if( m_socket ) + m_socket.Close(); + + if( m_info.bIdentServer ) + m_identServer.Stop(); + + // notify monitor objects that the connection has been closed + Notify(NULL); +} + +DWORD WINAPI CIrcSession::ThreadProc(LPVOID pparam) +{ + CIrcSession* pThis = (CIrcSession*)pparam; + try { pThis->DoReceive(); } catch( ... ) {} + pThis->m_info.Reset(); + CloseHandle(pThis->m_hThread); + pThis->m_hThread = NULL; + return 0; +} + +void CIrcSession::AddMonitor(IIrcSessionMonitor* pMonitor) +{ + ASSERT(pMonitor != NULL); + EnterCriticalSection(&m_cs); + m_monitors.insert(pMonitor); + LeaveCriticalSection(&m_cs); +} + +void CIrcSession::RemoveMonitor(IIrcSessionMonitor* pMonitor) +{ + ASSERT(pMonitor != NULL); + EnterCriticalSection(&m_cs); + m_monitors.erase(pMonitor); + LeaveCriticalSection(&m_cs); +} + +//////////////////////////////////////////////////////////////////// + +CIrcSessionInfo::CIrcSessionInfo() + : iPort(0), bIdentServer(false), iIdentServerPort(0) +{ +} + +CIrcSessionInfo::CIrcSessionInfo(const CIrcSessionInfo& si) + : sServer(si.sServer), + sServerName(si.sServerName), + iPort(si.iPort), + sNick(si.sNick), + sUserID(si.sUserID), + sFullName(si.sFullName), + sPassword(si.sPassword), + bIdentServer(si.bIdentServer), + sIdentServerType(si.sIdentServerType), + iIdentServerPort(si.iIdentServerPort) +{ +} + +void CIrcSessionInfo::Reset() +{ + sServer = ""; + sServerName = ""; + iPort = 0; + sNick = ""; + sUserID = ""; + sFullName = ""; + sPassword = ""; + bIdentServer = false; + sIdentServerType = ""; + iIdentServerPort = 0; +} + +//////////////////////////////////////////////////////////////////// + +CIrcIdentServer::CIrcIdentServer() + : m_uiPort(0), m_hThread(NULL) +{ +} + +CIrcIdentServer::~CIrcIdentServer() +{ + Stop(); +} + +bool CIrcIdentServer::Start( + const char* lpszUserID, + unsigned int uiPort, + const char* lpszResponseType + ) +{ + if( m_socket ) + return false; + + if( !m_socket.Bind(InetAddr(uiPort)) ) + { + m_socket.Close(); + return false; + } + + m_sResponseType = lpszResponseType; + m_sUserID = lpszUserID; + m_uiPort = uiPort; + + m_hThread = CreateThread(NULL, 0, ListenProc, this, 0, NULL); + Sleep(100); + + return true; +} + +void CIrcIdentServer::Stop() +{ + if( m_hThread ) + { + m_socket.Close(); + if( WaitForSingleObject(m_hThread, 5000) != WAIT_OBJECT_0 && m_hThread ) + { + TerminateThread(m_hThread, 1); + CloseHandle(m_hThread); + m_hThread = NULL; + } + } +} + +void CIrcIdentServer::DoThread() +{ + m_socket.Listen(); + + while( (bool)m_socket ) + { + Socket s = m_socket.Accept(); + if( !s ) + break; + + char szBuf[1024]; + int cbRead = s.Receive((unsigned char*)szBuf, sizeof(szBuf)-1); + if( cbRead <= 0 ) + continue; + szBuf[cbRead] = '\0'; + + // strip CRLF from query + for(char* p = szBuf; *p && *p != '\r' && *p != '\n'; ++p) + ; + *p = '\0'; + + s.Send("%s : USERID : %s : %s\r\n", + szBuf, m_sResponseType.c_str(), m_sUserID.c_str()); + Sleep(500); + s.Close(); + } + + m_socket.Close(); +} + +DWORD WINAPI CIrcIdentServer::ListenProc(LPVOID pparam) +{ + CIrcIdentServer* pThis = (CIrcIdentServer*)pparam; + + try { pThis->DoThread(); } catch( ... ) {} + + pThis->m_sResponseType = ""; + pThis->m_sUserID = ""; + pThis->m_uiPort = 0; + + CloseHandle(pThis->m_hThread); + pThis->m_hThread = NULL; + + return 0; +} + +//////////////////////////////////////////////////////////////////// + +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 + ) +{ + //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()); + 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..."; + + //Some fields in the + if (m_bIsSender) + { + m_pSendFileDialog->m_SentRecvd = "Sent:"; + m_pSendFileDialog->m_ToFrom = "To:"; + } + else + { + m_pSendFileDialog->m_SentRecvd = "Recv'd:"; + m_pSendFileDialog->m_ToFrom = "From:"; + } + + //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; +} + +void CIrcDCCServer::Stop(DWORD timeout) +{ + if( m_hThread ) + { + m_socket.Close(); + if( WaitForSingleObject(m_hThread, timeout) != WAIT_OBJECT_0 && m_hThread ) + { + TerminateThread(m_hThread, 1); + CloseHandle(m_hThread); + m_hThread = NULL; + } + } +} + +void CIrcDCCServer::DoThreadRecv() +{ + char szBuf[8193]; + unsigned long cbRead, cbSent; + float fracSent; + unsigned long seconds, minutes, hours, rate; + + //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; + + //Tell user file transfer has started + m_pSendFileDialog->m_XferStatus = "Recieving File..."; + + //Create a file to write incoming data to + CString filename = m_directory+"\\"+m_fileName; + FILE* fp = fopen(filename, "wb"); + if ( !fp ) return; + + //Start grabbing data blocks + while(m_ulBytesSent < m_ulFileSize) + { + //Grab the next buffer + cbRead = m_socket.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); + } + + //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; + 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)); + } + + //Close our data transfer socket + sock.Close(); + + //Close our file + fclose(fp); +} + +DWORD WINAPI CIrcDCCServer::ListenProc(LPVOID pparam) +{ + CIrcDCCServer* pThis = (CIrcDCCServer*)pparam; + + if (pThis->IsSender()) + try { pThis->DoThreadSend(); } catch( ... ) {} + else + try { pThis->DoThreadRecv(); } catch( ... ) {} + + CloseHandle(pThis->m_hThread); + pThis->m_hThread = NULL; + + return 0; +} + +//////////////////////////////////////////////////////////////////// + +CIrcMonitor::HandlersMap CIrcMonitor::m_handlers; +CIrcMonitor::IrcCommandsMapsListEntry CIrcMonitor::m_handlersMapsListEntry + = { &CIrcMonitor::m_handlers, NULL }; + + +CIrcMonitor::CIrcMonitor(CIrcSession& session) + : m_session(session) +{ + m_xPost.SetMonitor(this); +} + +CIrcMonitor::~CIrcMonitor() +{ +} + +void CIrcMonitor::OnIrcMessage(const CIrcMessage* pmsg) +{ + CIrcMessage* pMsgCopy = NULL; + if( pmsg ) + pMsgCopy = new CIrcMessage(*pmsg); + m_xPost.Post(0, (LPARAM)pMsgCopy); +} + +void CIrcMonitor::OnCrossThreadsMessage(WPARAM wParam, LPARAM lParam) +{ + CIrcMessage* pmsg = (CIrcMessage*)lParam; + + OnIrcAll(pmsg); + + if( pmsg ) + { + PfnIrcMessageHandler pfn = FindMethod(pmsg->sCommand.c_str()); + if( pfn ) + { + // call member function. if it returns 'false', + // call the default handling + if( !(this->*pfn)(pmsg) ) + OnIrcDefault(pmsg); + } + else // handler not found. call default handler + OnIrcDefault(pmsg); + delete pmsg; + } + else + OnIrcDisconnected(); +} + +CIrcMonitor::PfnIrcMessageHandler CIrcMonitor::FindMethod(const char* lpszName) +{ + // call the recursive version with the most derived map + return FindMethod(GetIrcCommandsMap(), lpszName); +} + +CIrcMonitor::PfnIrcMessageHandler CIrcMonitor::FindMethod(IrcCommandsMapsListEntry* pMapsList, const char* lpszName) +{ + HandlersMap::iterator it = pMapsList->pHandlersMap->find(lpszName); + if( it != pMapsList->pHandlersMap->end() ) + return it->second; // found ! + else if( pMapsList->pBaseHandlersMap ) + return FindMethod(pMapsList->pBaseHandlersMap, lpszName); // try at base class + return NULL; // not found in any map +} + +//////////////////////////////////////////////////////////////////// + +DECLARE_IRC_MAP(CIrcDefaultMonitor, CIrcMonitor) + +CIrcDefaultMonitor::CIrcDefaultMonitor(CIrcSession& session) + : CIrcMonitor(session) +{ + IRC_MAP_ENTRY(CIrcDefaultMonitor, "NICK", OnIrc_NICK) + IRC_MAP_ENTRY(CIrcDefaultMonitor, "PING", OnIrc_PING) + IRC_MAP_ENTRY(CIrcDefaultMonitor, "002", OnIrc_YOURHOST) + IRC_MAP_ENTRY(CIrcDefaultMonitor, "005", OnIrc_BOUNCE) +} + +bool CIrcDefaultMonitor::OnIrc_NICK(const CIrcMessage* pmsg) +{ + if( (m_session.GetInfo().sNick == pmsg->prefix.sNick) && (pmsg->parameters.size() > 0) ) + m_session.m_info.sNick = pmsg->parameters[0]; + return false; +} + +bool CIrcDefaultMonitor::OnIrc_PING(const CIrcMessage* pmsg) +{ + char szResponse[100]; + sprintf(szResponse, "PONG %s", pmsg->parameters[0].c_str()); + m_session << CIrcMessage(szResponse); + return false; +} + +bool CIrcDefaultMonitor::OnIrc_YOURHOST(const CIrcMessage* pmsg) +{ + static const char* lpszFmt = "Your host is %[^ \x5b,], running version %s"; + char szHostName[100], szVersion[100]; + if( sscanf(pmsg->parameters[1].c_str(), lpszFmt, &szHostName, &szVersion) > 0 ) + m_session.m_info.sServerName = szHostName; + + return false; +} + +bool CIrcDefaultMonitor::OnIrc_BOUNCE(const CIrcMessage* pmsg) +{ + static const char* lpszFmt = "Try server %[^ ,], port %d"; + char szAltServer[100]; + int iAltPort = 0; + if( sscanf(pmsg->parameters[1].c_str(), lpszFmt, &szAltServer, &iAltPort) == 2 ) + { + } + return false; +} diff --git a/stepmania/src/smlobby/irc.h b/stepmania/src/smlobby/irc.h new file mode 100644 index 0000000000..cfb46a4fdc --- /dev/null +++ b/stepmania/src/smlobby/irc.h @@ -0,0 +1,304 @@ +// irc.h + +#ifndef _IRC_H_ +#define _IRC_H_ + +/* + IRC (RFC #1459) Client Implementation +*/ + +#pragma warning (disable: 4786) + +#include "socket.h" +#include +#include +#include +#include +#include "CrossThreadsMessagingDevice.h" +#include "SendFileDialog.h" + +//////////////////////////////////////////////////////////////////// +namespace irc { +//////////////////////////////////////////////////////////////////// + +typedef std::string String; + +static const char* endl = "\r\n"; + +//////////////////////////////////////////////////////////////////// + +class CIrcMessage +{ +public : + struct Prefix + { + String sNick, sUser, sHost; + } prefix; + String sCommand; + std::vector parameters; + bool m_bIncoming; + + CIrcMessage() : m_bIncoming(false) {} // default constructor + CIrcMessage(const char* lpszCmdLine, bool bIncoming=false); // parser constructor + CIrcMessage(const CIrcMessage& m); // copy constructor + + void Reset(); + + CIrcMessage& operator = (const CIrcMessage& m); + CIrcMessage& operator = (const char* lpszCmdLine); + + String AsString() const; + +private : + void ParseIrcCommand(const char* lpszCmdLine); +}; + +//////////////////////////////////////////////////////////////////// + +struct IIrcSessionMonitor +{ + virtual void OnIrcMessage(const CIrcMessage* pmsg) = 0; +}; + +//////////////////////////////////////////////////////////////////// + +struct CIrcSessionInfo +{ + String sServer; + String sServerName; + unsigned int iPort; + String sNick; + String sUserID; + String sFullName; + String sPassword; + String sCurrentChatRoom; + bool bIdentServer; + String sIdentServerType; + unsigned int iIdentServerPort; + + CIrcSessionInfo(); + CIrcSessionInfo(const CIrcSessionInfo& si); + + void Reset(); +}; + +//////////////////////////////////////////////////////////////////// + +class CIrcDefaultMonitor; // foreward + +class CIrcSession +{ +public : + friend class CIrcDefaultMonitor; + + CIrcSession(IIrcSessionMonitor* pMonitor = NULL); + virtual ~CIrcSession(); + + void AddMonitor(IIrcSessionMonitor* pMonitor); + void RemoveMonitor(IIrcSessionMonitor* pMonitor); + + bool Connect(const CIrcSessionInfo& info); + void Disconnect(const char* lpszMessage = "Bye!"); + + CIrcSessionInfo& GetInfo() const + { return (CIrcSessionInfo&)m_info; } + + operator bool() const { return (bool)m_socket; } + + // send-to-stream operators + friend CIrcSession& operator << (CIrcSession& os, const CIrcMessage& m); + +protected : + Socket m_socket; + CIrcSessionInfo m_info; + + void DoReceive(); + +private : + std::set m_monitors; + HANDLE m_hThread; + CRITICAL_SECTION m_cs; // protect m_monitors + + void Notify(const CIrcMessage* pmsg); + static DWORD WINAPI ThreadProc(LPVOID pparam); +}; + + +__inline CIrcSession& operator << (CIrcSession& os, const CIrcMessage& m) +{ + if( os ) + { + os.m_socket.Send(m.AsString().c_str()); + os.Notify(&m); + } + return os; +} + +//////////////////////////////////////////////////////////////////// + +// RFC's Identity Server (RFC #1413) +class CIrcIdentServer +{ +public : + CIrcIdentServer(); + virtual ~CIrcIdentServer(); + + bool Start( + const char* lpszUserID, + unsigned int uiPort = 113, + const char* lpszResponseType = "UNIX" + ); + void Stop(); + +protected : + String m_sResponseType; + unsigned int m_uiPort; + String m_sUserID; + + void DoThread(); + +private : + Socket m_socket; + HANDLE m_hThread; + + static DWORD WINAPI ListenProc(LPVOID pparam); +}; + +//////////////////////////////////////////////////////////////////// + +class CIrcDCCServer +{ +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 + ); + + void Stop(DWORD timeout = 5000L); + + bool IsSender() { return m_bIsSender; } + +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; + + void DoThreadSend(); + void DoThreadRecv(); + +private : + Socket m_socket; + HANDLE m_hThread; + + static DWORD WINAPI ListenProc(LPVOID pparam); +}; + +//////////////////////////////////////////////////////////////////// + +class CIrcMonitor : + public IIrcSessionMonitor, + private CCrossThreadsMessagingDevice::ICrossThreadsMessagingDeviceMonitor +{ +public : + typedef bool (CIrcMonitor::*PfnIrcMessageHandler)(const CIrcMessage* pmsg); + struct LessString + { + bool operator()(const char* s1, const char* s2) const + { return stricmp(s1, s2) < 0; } + }; + typedef std::map HandlersMap; + struct IrcCommandsMapsListEntry + { + HandlersMap* pHandlersMap; + IrcCommandsMapsListEntry* pBaseHandlersMap; + }; + + CIrcMonitor(CIrcSession& session); + virtual ~CIrcMonitor(); + + virtual void OnIrcMessage(const CIrcMessage* pmsg); + +protected : + CIrcSession& m_session; + + virtual IrcCommandsMapsListEntry* GetIrcCommandsMap() + { return &m_handlersMapsListEntry; } + + virtual void OnIrcAll(const CIrcMessage* pmsg) {} + virtual void OnIrcDefault(const CIrcMessage* pmsg) {} + virtual void OnIrcDisconnected() {} + +private : + CCrossThreadsMessagingDevice m_xPost; + static IrcCommandsMapsListEntry m_handlersMapsListEntry; + static HandlersMap m_handlers; + + PfnIrcMessageHandler FindMethod(const char* lpszName); + PfnIrcMessageHandler FindMethod(IrcCommandsMapsListEntry* pMapsList, const char* lpszName); + + virtual void OnCrossThreadsMessage(WPARAM wParam, LPARAM lParam); +}; + +// define an IRC command-to-member map. +// put that macro inside the class definition (.H file) +#define DEFINE_IRC_MAP() \ +protected : \ + virtual IrcCommandsMapsListEntry* GetIrcCommandsMap() \ + { return &m_handlersMapsListEntry; } \ +protected : \ + static CIrcMonitor::IrcCommandsMapsListEntry m_handlersMapsListEntry; \ + static CIrcMonitor::HandlersMap m_handlers; \ +protected : + +// IRC command-to-member map's declaration. +// add this macro to the class's .CPP file +#define DECLARE_IRC_MAP(this_class, base_class) \ + CIrcMonitor::HandlersMap this_class##::m_handlers; \ + CIrcMonitor::IrcCommandsMapsListEntry this_class##::m_handlersMapsListEntry \ + = { &this_class##::m_handlers, &base_class##::m_handlersMapsListEntry }; + +// map actual member functions to their associated IRC command. +// put any number of this macro in the class's constructor. +#define IRC_MAP_ENTRY(class_name, name, member) \ + m_handlers[(name)] = (PfnIrcMessageHandler)&class_name##::member; + +//////////////////////////////////////////////////////////////////// + +class CIrcDefaultMonitor : public CIrcMonitor +{ +public : + CIrcDefaultMonitor(CIrcSession& session); + + DEFINE_IRC_MAP() + +protected : + bool OnIrc_NICK(const CIrcMessage* pmsg); + bool OnIrc_PING(const CIrcMessage* pmsg); + bool OnIrc_YOURHOST(const CIrcMessage* pmsg); + bool OnIrc_BOUNCE(const CIrcMessage* pmsg); +}; + +//////////////////////////////////////////////////////////////////// +}; // end of namespace irc +//////////////////////////////////////////////////////////////////// + +#endif // _IRC_H_ + + diff --git a/stepmania/src/smlobby/res/smlobby.ico b/stepmania/src/smlobby/res/smlobby.ico new file mode 100644 index 0000000000000000000000000000000000000000..7eef0bcbe6580a6f464d688906172c2d9de44262 GIT binary patch literal 1078 zcmc&zF>b>!3}jLb9s)T}@Kod(893@u8ajANzT`op9^o+)S?=nU(FD@%0s)Sg^oyC8{H z9myetc;MEP)59v(LMa~xK8Yu^jIR*H22uCFiq5%C{s7(PJi>o15i^bmX4(vPxWAio z9ryY#AU_jfnd047-@`)XzL?%iS$gQyFP{44kS9X)fN{{QoL~hO-&=q&20Zr*cxFAt PkaNE{wR~2C$NfnjhSXWT literal 0 HcmV?d00001 diff --git a/stepmania/src/smlobby/res/smlobby.rc2 b/stepmania/src/smlobby/res/smlobby.rc2 new file mode 100644 index 0000000000..218cb33942 --- /dev/null +++ b/stepmania/src/smlobby/res/smlobby.rc2 @@ -0,0 +1,13 @@ +// +// GIMPLOBBY.RC2 - resources Microsoft Visual C++ does not edit directly +// + +#ifdef APSTUDIO_INVOKED + #error this file is not editable by Microsoft Visual C++ +#endif //APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// Add manually edited resources here... + +///////////////////////////////////////////////////////////////////////////// diff --git a/stepmania/src/smlobby/resource2.h b/stepmania/src/smlobby/resource2.h new file mode 100644 index 0000000000..4d9e72dad7 --- /dev/null +++ b/stepmania/src/smlobby/resource2.h @@ -0,0 +1,51 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by smlobby.rc +// +#define IDM_ABOUTBOX 0x0010 +#define IDD_ABOUTBOX 100 +#define IDS_ABOUTBOX 101 +#define IDD_GIMPLOBBY_DIALOG 102 +#define IDR_MAINFRAME 128 +#define IDD_SMLOBBY_DIALOG 129 +#define IDD_CONNECT 130 +#define IDD_FILEXFER 131 +#define IDC_SERVER 1000 +#define IDC_PORT 1001 +#define IDC_EDIT_ENTRY 1001 +#define IDC_NICK 1002 +#define IDC_USERID 1003 +#define IDC_LIST_GAMES 1003 +#define IDC_FULLNAME 1004 +#define IDC_EDIT_GAME_INFO 1004 +#define IDC_PASSWORD 1005 +#define IDC_COMBO_MUSIC 1005 +#define IDC_BUTTON_CREATE_GAME 1006 +#define IDC_LIST_USERS 1007 +#define IDC_EDIT_GAME_NAME 1008 +#define IDC_BUTTON_BEGIN_GAME 1009 +#define IDC_EDIT_CHAT_MESSAGES 1012 +#define IDC_BUTTON_SEND 1013 +#define IDC_PROGRESS1 1014 +#define IDC_FILENAME 1015 +#define IDC_FILESIZE 1016 +#define IDC_FOLDERNAME 1017 +#define IDC_RECVRNAME 1018 +#define IDC_BYTESSENT 1019 +#define IDC_TIMELEFT 1020 +#define IDC_XFERRATE 1021 +#define IDC_XFERSTATUS 1022 +#define IDC_TOFROM 1023 +#define IDC_SENTRECVD 1024 +#define IDD_DIRECTORY 1536 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 136 +#define _APS_NEXT_COMMAND_VALUE 32771 +#define _APS_NEXT_CONTROL_VALUE 1029 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/stepmania/src/smlobby/smlobby.aps b/stepmania/src/smlobby/smlobby.aps new file mode 100644 index 0000000000000000000000000000000000000000..ba2cdfca1b01ff9f8134203dc12181be0fde59f6 GIT binary patch literal 41116 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 Ya2N;Cupju?DoModal(); + + m_dlg->DestroyWindow(); + delete m_dlg; + + // Since the dialog has been closed, return FALSE so that we exit the + // application, rather than start the application's message pump. + return FALSE; + +} diff --git a/stepmania/src/smlobby/smlobby.dsp b/stepmania/src/smlobby/smlobby.dsp new file mode 100644 index 0000000000..188bae0303 --- /dev/null +++ b/stepmania/src/smlobby/smlobby.dsp @@ -0,0 +1,186 @@ +# Microsoft Developer Studio Project File - Name="smlobby" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=smlobby - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "smlobby.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "smlobby.mak" CFG="smlobby - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "smlobby - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "smlobby - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "smlobby - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 + +!ELSEIF "$(CFG)" == "smlobby - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "smlobby - Win32 Release" +# Name "smlobby - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\ConnectDlg.cpp +# End Source File +# Begin Source File + +SOURCE=.\CrossThreadsMessagingDevice.cpp +# End Source File +# Begin Source File + +SOURCE=.\DirectoryDialog.cpp +# End Source File +# Begin Source File + +SOURCE=.\EditChat.cpp +# End Source File +# Begin Source File + +SOURCE=.\irc.cpp +# End Source File +# Begin Source File + +SOURCE=.\SendFileDialog.cpp +# End Source File +# Begin Source File + +SOURCE=.\smlobby.cpp +# End Source File +# Begin Source File + +SOURCE=.\smlobby.rc +# End Source File +# Begin Source File + +SOURCE=.\smlobbyDlg.cpp +# End Source File +# Begin Source File + +SOURCE=.\socket.cpp +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\ConnectDlg.h +# End Source File +# Begin Source File + +SOURCE=.\CrossThreadsMessagingDevice.h +# End Source File +# Begin Source File + +SOURCE=.\DirectoryDialog.h +# End Source File +# Begin Source File + +SOURCE=.\EditChat.h +# End Source File +# Begin Source File + +SOURCE=.\irc.h +# End Source File +# Begin Source File + +SOURCE=.\SendFileDialog.h +# End Source File +# Begin Source File + +SOURCE=.\smlobby.h +# End Source File +# Begin Source File + +SOURCE=.\smlobbyDlg.h +# End Source File +# Begin Source File + +SOURCE=.\socket.h +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/stepmania/src/smlobby/smlobby.dsw b/stepmania/src/smlobby/smlobby.dsw new file mode 100644 index 0000000000..bd2ae194e1 --- /dev/null +++ b/stepmania/src/smlobby/smlobby.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "smlobby"=.\smlobby.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/stepmania/src/smlobby/smlobby.h b/stepmania/src/smlobby/smlobby.h new file mode 100644 index 0000000000..e278cfdf7d --- /dev/null +++ b/stepmania/src/smlobby/smlobby.h @@ -0,0 +1,54 @@ +// smlobby.h : main header file for the Smlobby application +// + +#if !defined(AFX_Smlobby_H__0D0E3C89_DD15_4558_AEA0_3711BD2EC0AA__INCLUDED_) +#define AFX_Smlobby_H__0D0E3C89_DD15_4558_AEA0_3711BD2EC0AA__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#ifndef __AFXWIN_H__ + #error include 'stdafx.h' before including this file for PCH +#endif + +#include "resource2.h" // main symbols + +#include "smlobbyDlg.h" + +///////////////////////////////////////////////////////////////////////////// +// CSmlobbyApp: +// See smlobby.cpp for the implementation of this class +// + +class CSmlobbyApp : public CWinApp +{ +private: + CSmlobbyDlg *m_dlg; + +public: + CSmlobbyApp(); + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CSmlobbyApp) + public: + virtual BOOL InitInstance(); + //}}AFX_VIRTUAL + +// Implementation + + //{{AFX_MSG(CSmlobbyApp) + // NOTE - the ClassWizard will add and remove member functions here. + // DO NOT EDIT what you see in these blocks of generated code ! + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + + +///////////////////////////////////////////////////////////////////////////// + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_Smlobby_H__0D0E3C89_DD15_4558_AEA0_3711BD2EC0AA__INCLUDED_) diff --git a/stepmania/src/smlobby/smlobby.ncb b/stepmania/src/smlobby/smlobby.ncb new file mode 100644 index 0000000000..954d0534b5 --- /dev/null +++ b/stepmania/src/smlobby/smlobby.ncb @@ -0,0 +1 @@ +Microsoft C/C++ program database 2.00 diff --git a/stepmania/src/smlobby/smlobby.opt b/stepmania/src/smlobby/smlobby.opt new file mode 100644 index 0000000000000000000000000000000000000000..4d3cb3d2eb5cb3d65fe4cbfa575bfd6e92f295ff GIT binary patch literal 49664 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 literal 0 HcmV?d00001 diff --git a/stepmania/src/smlobby/smlobby.rc b/stepmania/src/smlobby/smlobby.rc new file mode 100644 index 0000000000..de5dfbf9d4 --- /dev/null +++ b/stepmania/src/smlobby/smlobby.rc @@ -0,0 +1,329 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource2.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource2.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "#define _AFX_NO_SPLITTER_RESOURCES\r\n" + "#define _AFX_NO_OLE_RESOURCES\r\n" + "#define _AFX_NO_TRACKER_RESOURCES\r\n" + "#define _AFX_NO_PROPERTY_RESOURCES\r\n" + "\r\n" + "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n" + "#ifdef _WIN32\r\n" + "LANGUAGE 9, 1\r\n" + "#pragma code_page(1252)\r\n" + "#endif //_WIN32\r\n" + "#include ""res\\smlobby.rc2"" // non-Microsoft Visual C++ edited resources\r\n" + "#include ""afxres.rc"" // Standard components\r\n" + "#endif\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDR_MAINFRAME ICON DISCARDABLE "res\\smlobby.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_ABOUTBOX DIALOG DISCARDABLE 0, 0, 235, 55 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "About smlobby" +FONT 8, "MS Sans Serif" +BEGIN + ICON IDR_MAINFRAME,IDC_STATIC,11,17,20,20 + LTEXT "smlobby Version 1.0",IDC_STATIC,40,10,119,8,SS_NOPREFIX + LTEXT "Copyright (C) 2002",IDC_STATIC,40,25,119,8 + DEFPUSHBUTTON "OK",IDOK,178,7,50,14,WS_GROUP +END + +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", 0, 0, 0x1 +BEGIN + EDITTEXT IDC_EDIT_ENTRY,105,281,347,12,ES_AUTOHSCROLL + GROUPBOX "Chat",IDC_STATIC,5,140,453,160 + GROUPBOX "Waiting Games",IDC_STATIC,5,5,117,130 + LISTBOX IDC_LIST_GAMES,15,20,100,105,LBS_SORT | + LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + GROUPBOX "Game Information",IDC_STATIC,143,5,107,130 + EDITTEXT IDC_EDIT_GAME_INFO,153,20,90,105,ES_MULTILINE + GROUPBOX "Create New Game",IDC_STATIC,271,5,185,130 + COMBOBOX IDC_COMBO_MUSIC,278,35,170,15,CBS_DROPDOWN | CBS_SORT | + WS_VSCROLL | WS_TABSTOP + LTEXT "Select Music:",IDC_STATIC,278,25,44,10 + PUSHBUTTON "Create Game",IDC_BUTTON_CREATE_GAME,338,100,56,20 + LISTBOX IDC_LIST_USERS,10,155,85,140,LBS_SORT | + LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + EDITTEXT IDC_EDIT_GAME_NAME,277,70,171,15,ES_AUTOHSCROLL + LTEXT "Game Name:",IDC_STATIC,278,60,87,10 + PUSHBUTTON "Begin Game",IDC_BUTTON_BEGIN_GAME,213,305,49,20 + EDITTEXT IDC_EDIT_CHAT_MESSAGES,105,155,347,120,ES_MULTILINE | + ES_AUTOVSCROLL | WS_VSCROLL +END + +IDD_FILEXFER DIALOG DISCARDABLE 0, 0, 186, 173 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +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 + LTEXT "To:",IDC_TOFROM,7,49,33,8 + CONTROL "Progress1",IDC_PROGRESS1,"msctls_progress32",WS_BORDER, + 7,70,172,13 + LTEXT "Sent:",IDC_SENTRECVD,7,89,21,9 + LTEXT "Time left:",IDC_STATIC,7,98,33,8 + LTEXT "Rate:",IDC_STATIC,7,107,33,8 + LTEXT "Status:",IDC_STATIC,7,117,33,8 + LTEXT "",IDC_FILENAME,43,21,136,8 + LTEXT "",IDC_FILESIZE,43,30,136,8 + LTEXT "",IDC_FOLDERNAME,43,40,136,8 + LTEXT "",IDC_RECVRNAME,43,49,136,8 + LTEXT "",IDC_BYTESSENT,43,89,39,8 + LTEXT "",IDC_TIMELEFT,43,98,80,8 + LTEXT "",IDC_XFERRATE,43,107,71,8 + LTEXT "",IDC_XFERSTATUS,43,117,77,36 +END + +IDD_DIRECTORY DIALOG DISCARDABLE 109, 35, 165, 134 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Open" +FONT 8, "Helv" +BEGIN + LTEXT "File &Name:",1090,168,0,76,10 + EDITTEXT 1152,168,10,90,12,ES_AUTOHSCROLL | ES_OEMCONVERT + LISTBOX 1120,168,26,90,68,LBS_SORT | LBS_OWNERDRAWFIXED | + LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL | + WS_TABSTOP + LTEXT "&Directories:",-1,7,6,92,9 + LTEXT "",1088,7,18,92,9,SS_NOPREFIX + LISTBOX 1121,7,32,92,68,LBS_SORT | LBS_OWNERDRAWFIXED | + LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL | + WS_TABSTOP + LTEXT "List Files of &Type:",1089,168,98,90,9 + COMBOBOX 1136,168,108,90,36,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | + WS_BORDER | WS_VSCROLL | WS_TABSTOP + LTEXT "Dri&ves:",1091,7,104,92,9 + COMBOBOX 1137,7,114,92,68,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | + CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | + WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "OK",IDOK,105,6,50,14,WS_GROUP + PUSHBUTTON "Cancel",IDCANCEL,105,24,50,14,WS_GROUP + PUSHBUTTON "&Help",1038,105,46,50,14,WS_GROUP + CONTROL "&Read Only",1040,"Button",BS_AUTOCHECKBOX | WS_GROUP | + WS_TABSTOP,105,68,50,12 +END + + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904B0" + BEGIN + VALUE "CompanyName", "\0" + VALUE "FileDescription", "smlobby MFC Application\0" + VALUE "FileVersion", "1, 0, 0, 1\0" + VALUE "InternalName", "smlobby\0" + VALUE "LegalCopyright", "Copyright (C) 2002\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "smlobby.EXE\0" + VALUE "ProductName", "smlobby Application\0" + VALUE "ProductVersion", "1, 0, 0, 1\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // !_MAC + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO DISCARDABLE +BEGIN + IDD_FILEXFER, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 179 + TOPMARGIN, 7 + BOTTOMMARGIN, 166 + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_ABOUTBOX "&About smlobby..." +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// Unknown language: 0xD, 0x1 resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_HEB) +#ifdef _WIN32 +LANGUAGE 0xD, 0x1 +#pragma code_page(1255) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_CONNECT DIALOG DISCARDABLE 0, 0, 185, 161 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Connect" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "&Server",IDC_STATIC,7,9,22,8 + EDITTEXT IDC_SERVER,67,7,92,14,ES_AUTOHSCROLL + LTEXT "&Port",IDC_STATIC,7,26,14,8 + EDITTEXT IDC_PORT,67,24,54,14,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,7,46,171,1 + LTEXT "&Nick",IDC_STATIC,7,55,16,8 + EDITTEXT IDC_NICK,67,53,92,14,ES_AUTOHSCROLL + LTEXT "User &ID",IDC_STATIC,7,74,25,8 + EDITTEXT IDC_USERID,67,72,92,14,ES_AUTOHSCROLL + LTEXT "&Full Name",IDC_STATIC,7,92,32,8 + EDITTEXT IDC_FULLNAME,67,90,92,14,ES_AUTOHSCROLL + LTEXT "Pass&word",IDC_STATIC,7,111,32,8 + EDITTEXT IDC_PASSWORD,67,108,92,14,ES_AUTOHSCROLL + CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,7,131,171,1 + DEFPUSHBUTTON "Connect",IDOK,26,140,50,14 + PUSHBUTTON "Cancel",IDCANCEL,109,140,50,14 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO DISCARDABLE +BEGIN + IDD_CONNECT, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 178 + TOPMARGIN, 7 + BOTTOMMARGIN, 154 + END +END +#endif // APSTUDIO_INVOKED + +#endif // Unknown language: 0xD, 0x1 resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +#define _AFX_NO_SPLITTER_RESOURCES +#define _AFX_NO_OLE_RESOURCES +#define _AFX_NO_TRACKER_RESOURCES +#define _AFX_NO_PROPERTY_RESOURCES + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE 9, 1 +#pragma code_page(1252) +#endif //_WIN32 +#include "res\smlobby.rc2" // non-Microsoft Visual C++ edited resources +#include "afxres.rc" // Standard components +#endif + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/stepmania/src/smlobby/smlobbyDlg.cpp b/stepmania/src/smlobby/smlobbyDlg.cpp new file mode 100644 index 0000000000..8128f2a5a5 --- /dev/null +++ b/stepmania/src/smlobby/smlobbyDlg.cpp @@ -0,0 +1,628 @@ +// smlobbyDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "smlobby.h" +#include "smlobbyDlg.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + + +#pragma comment(lib, "wsock32.lib") + + +#include "ConnectDlg.h" +#include "DirectoryDialog.h" + + +///////////////////////////////////////////////////////////////////////////// +// global objects +static const NetworkInit g_wsInit; +static const unsigned short FILE_XFER_RATE = 4096; + +irc::CIrcSession g_ircSession; + + +///////////////////////////////////////////////////////////////////////////// +// CAboutDlg dialog used for App About + +class CAboutDlg : public CDialog +{ +public: + CAboutDlg(); + +// Dialog Data + //{{AFX_DATA(CAboutDlg) + enum { IDD = IDD_ABOUTBOX }; + //}}AFX_DATA + + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CAboutDlg) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +protected: + //{{AFX_MSG(CAboutDlg) + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) +{ + //{{AFX_DATA_INIT(CAboutDlg) + //}}AFX_DATA_INIT +} + +void CAboutDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CAboutDlg) + //}}AFX_DATA_MAP +} + +BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) + //{{AFX_MSG_MAP(CAboutDlg) + // No message handlers + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CSmlobbyDlg dialog + +CSmlobbyDlg::CSmlobbyDlg(CWnd* pParent /*=NULL*/) + : CDialog(CSmlobbyDlg::IDD, pParent), irc::CIrcDefaultMonitor(g_ircSession) +{ + //{{AFX_DATA_INIT(CSmlobbyDlg) + //}}AFX_DATA_INIT + // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 + m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); +} + +void CSmlobbyDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CSmlobbyDlg) + DDX_Control(pDX, IDC_EDIT_GAME_NAME, m_editGameName); + DDX_Control(pDX, IDC_EDIT_GAME_INFO, m_editGameInfo); + DDX_Control(pDX, IDC_LIST_USERS, m_listUsers); + DDX_Control(pDX, IDC_EDIT_ENTRY, m_editEntry); + DDX_Control(pDX, IDC_EDIT_CHAT_MESSAGES, m_editChatMessages); + DDX_Control(pDX, IDC_LIST_GAMES, m_listGames); + //}}AFX_DATA_MAP +} + +BEGIN_MESSAGE_MAP(CSmlobbyDlg, CDialog) + //{{AFX_MSG_MAP(CSmlobbyDlg) + ON_WM_SYSCOMMAND() + ON_WM_QUERYDRAGICON() + ON_WM_PAINT() + ON_WM_DESTROY() + ON_LBN_DBLCLK(IDC_LIST_GAMES, OnDblclkListGames) + ON_LBN_SELCHANGE(IDC_LIST_GAMES, OnSelchangeListGames) + ON_BN_CLICKED(IDC_BUTTON_CREATE_GAME, OnButtonCreateGame) + //}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CSmlobbyDlg message handlers + +BOOL CSmlobbyDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + + //Tell windows we have no default push button + SetDefID(-1); + + // Add "About..." menu item to system menu. + + // IDM_ABOUTBOX must be in the system command range. + ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); + ASSERT(IDM_ABOUTBOX < 0xF000); + + CMenu* pSysMenu = GetSystemMenu(FALSE); + if (pSysMenu != NULL) + { + CString strAboutMenu; + strAboutMenu.LoadString(IDS_ABOUTBOX); + if (!strAboutMenu.IsEmpty()) + { + pSysMenu->AppendMenu(MF_SEPARATOR); + pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); + } + } + + // Set the icon for this dialog. The framework does this automatically + // when the application's main window is not a dialog + SetIcon(m_hIcon, TRUE); // Set big icon + SetIcon(m_hIcon, FALSE); // Set small icon + + + //Add IRC reply call backs + IRC_MAP_ENTRY(CSmlobbyDlg, "JOIN", OnIrc_JOIN) + IRC_MAP_ENTRY(CSmlobbyDlg, "KICK", OnIrc_KICK) + IRC_MAP_ENTRY(CSmlobbyDlg, "MODE", OnIrc_MODE) + 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, "002", OnIrc_YOURHOST) + IRC_MAP_ENTRY(CSmlobbyDlg, "321", OnIrc_RPL_LISTSTART) + IRC_MAP_ENTRY(CSmlobbyDlg, "322", OnIrc_RPL_LIST) + IRC_MAP_ENTRY(CSmlobbyDlg, "323", OnIrc_IgnoreMesg) //RPL_LISTEND + IRC_MAP_ENTRY(CSmlobbyDlg, "331", OnIrc_IgnoreMesg) //RPL_NOTOPIC + IRC_MAP_ENTRY(CSmlobbyDlg, "332", OnIrc_RPL_TOPIC) + IRC_MAP_ENTRY(CSmlobbyDlg, "353", OnIrc_RPL_NAMREPLY) + IRC_MAP_ENTRY(CSmlobbyDlg, "366", OnIrc_IgnoreMesg) //RPL_ENDOFNAMES + IRC_MAP_ENTRY(CSmlobbyDlg, "376", OnIrc_IgnoreMesg) //RPL_ENDOFMOTD + + + //Initialize IRC Server connection dialog + CConnectDlg dlg; + + dlg.m_sServer = _T("128.208.46.94"); + dlg.m_uiPort = 6667; + dlg.m_sNick = _T("smuser"); + dlg.m_sUserID = _T("vm"); + dlg.m_sFullName = _T("vm"); + + if( dlg.DoModal() != IDOK ) + return TRUE; + + // set this document object as the session's monitor + g_ircSession.AddMonitor(this); + + CIrcSessionInfo si; + si.sServer = dlg.m_sServer; + si.iPort = dlg.m_uiPort; + si.sNick = dlg.m_sNick; + si.sUserID = dlg.m_sUserID; + si.sFullName = dlg.m_sFullName; + si.sPassword = dlg.m_sPassword; + si.bIdentServer = true; + si.iIdentServerPort = 113; + si.sIdentServerType = "UNIX"; + si.sCurrentChatRoom = ""; + + bool m_bOk = g_ircSession.Connect(si); + if( !m_bOk ) + return FALSE; + + + return TRUE; // return TRUE unless you set the focus to a control +} + +void CSmlobbyDlg::OnSysCommand(UINT nID, LPARAM lParam) +{ + if ((nID & 0xFFF0) == IDM_ABOUTBOX) + { + CAboutDlg dlgAbout; + dlgAbout.DoModal(); + } + else + { + CDialog::OnSysCommand(nID, lParam); + } +} + +// If you add a minimize button to your dialog, you will need the code below +// to draw the icon. For MFC applications using the document/view model, +// this is automatically done for you by the framework. + +void CSmlobbyDlg::OnPaint() +{ + if (IsIconic()) + { + CPaintDC dc(this); // device context for painting + + SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); + + // Center icon in client rectangle + int cxIcon = GetSystemMetrics(SM_CXICON); + int cyIcon = GetSystemMetrics(SM_CYICON); + CRect rect; + GetClientRect(&rect); + int x = (rect.Width() - cxIcon + 1) / 2; + int y = (rect.Height() - cyIcon + 1) / 2; + + // Draw the icon + dc.DrawIcon(x, y, m_hIcon); + } + else + { + CDialog::OnPaint(); + } +} + +// The system calls this to obtain the cursor to display while the user drags +// the minimized window. +HCURSOR CSmlobbyDlg::OnQueryDragIcon() +{ + return (HCURSOR) m_hIcon; +} + + +bool CSmlobbyDlg::OnIrc_YOURHOST(const CIrcMessage* pmsg) +{ + CIrcDefaultMonitor::OnIrc_YOURHOST(pmsg); + + //query the server for a list of chat rooms + g_ircSession << irc::CIrcMessage(CString("list")); + + return false; +} + +bool CSmlobbyDlg::OnIrc_NICK(const CIrcMessage* pmsg) +{ + CIrcDefaultMonitor::OnIrc_NICK(pmsg); + + if( pmsg->prefix.sNick == m_session.GetInfo().sNick && (pmsg->parameters.size() > 0) ) + { + } + + return false; +} + +bool CSmlobbyDlg::OnIrc_PRIVMSG(const CIrcMessage* pmsg) +{ + //See if were being sent a DCC command + //STIL UNDER DEVELOPMENT! + //if (OnIrc_DCC_RECV(pmsg)) + // return true; + + UpdateChatMessages( pmsg ); + + return true; +} + +bool CSmlobbyDlg::OnIrc_DCC_RECV(const CIrcMessage *pmsg) +{ + //Make sure we have a parameter + if ( pmsg->parameters.size() < 1 ) + return false; + + //Make sure it's a DCC send + if ( std::string::npos == pmsg->parameters[1].find("\001DCC SEND") ) + return false; + + //Make sure we can read out the dcc send fields + const char* pszRawString = pmsg->parameters[1].c_str(); + char szFilename[256]; + unsigned long ulPartnerIP; + unsigned short uiPartnerPort; + unsigned long ulFileSize; + + 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 + CDirectoryDialog DirDlg(FALSE, NULL, NULL, OFN_SHOWHELP | OFN_HIDEREADONLY | + OFN_OVERWRITEPROMPT | OFN_ENABLETEMPLATE, NULL, + NULL); + DirDlg.m_ofn.hInstance = AfxGetInstanceHandle(); + DirDlg.m_ofn.lpTemplateName = MAKEINTRESOURCE(IDD_DIRECTORY); + + if ( IDOK != DirDlg.DoModal()) + 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()); + + //DCCServer.Start(filename, DirDlg.GetPathName(), partner, + // ulPartnerIP, uiPartnerPort, ulFileSize, FILE_XFER_RATE); + DCCServer.Start(filename, "C:", partner, + ulPartnerIP, uiPartnerPort, ulFileSize, FILE_XFER_RATE); + + return true; +} + +bool CSmlobbyDlg::OnIrc_JOIN(const CIrcMessage* pmsg) +{ + //Put update on message window + UpdateChatMessages( pmsg ); + + //Remember which chat room we joined + String chatRoomName(pmsg->parameters[0].c_str()); + g_ircSession.GetInfo().sCurrentChatRoom = chatRoomName; + + //query the server for a list of names in this room + g_ircSession << irc::CIrcMessage(CString("names ") + CString(chatRoomName.c_str())); + + //query the server for a list of rooms (could have changed) + g_ircSession << irc::CIrcMessage(CString("list")); + + return true; +} + +bool CSmlobbyDlg::OnIrc_PART(const CIrcMessage* pmsg) +{ + if( !pmsg->prefix.sNick.length() || pmsg->prefix.sNick == m_session.GetInfo().sNick ) + return false; + + //make sure to reset the names lists since were leaving current room + m_listUsers.ResetContent(); + + //forget which chat room we joined + g_ircSession.GetInfo().sCurrentChatRoom = ""; + + //query the server for a list of chat rooms + g_ircSession << irc::CIrcMessage(CString("list")); + + UpdateChatMessages( pmsg ); + + return true; +} + +bool CSmlobbyDlg::OnIrc_KICK(const CIrcMessage* pmsg) +{ + if( !pmsg->prefix.sNick.length() ) + return false; + + UpdateChatMessages( pmsg ); + + return true; +} + +bool CSmlobbyDlg::OnIrc_MODE(const CIrcMessage* pmsg) +{ + if( !pmsg->prefix.sNick.length() ) + return false; + if( pmsg->prefix.sNick == m_session.GetInfo().sNick ) + return false; + + UpdateChatMessages( pmsg ); + + return true; +} + +bool CSmlobbyDlg::OnIrc_RPL_LISTSTART(const CIrcMessage *pmsg) +{ + //Were going to be getting a new list of rooms + //so clear out the old ones + m_listGames.ResetContent(); + + return true; +} + +bool CSmlobbyDlg::OnIrc_RPL_LIST(const CIrcMessage *pmsg) +{ + //Add the current game to the list + //msg Format: " <# visible> :" + String name = pmsg->parameters[1] + " (" + pmsg->parameters[2] + ")"; + m_listGames.AddString(name.c_str()); + + return true; +} + +bool CSmlobbyDlg::OnIrc_RPL_TOPIC(const CIrcMessage *pmsg) +{ + //Clean out the game info box + m_editGameInfo.SetSel(0, -1); + m_editGameInfo.Clear(); + + //Put the info for a game up in the game info box + //msg Format: " :" + //topic format: "GameName\nserverIP\nServerIRCName\nSongHash" + std::vector vecGameParams; + const char* p1 = pmsg->parameters[2].c_str(); + const char* p2 = p1; + + //Extract all of the topic params + while( *p1 ) + { + // seek end of name + while( *p2 && *p2!=' ' ) p2++; + + //add name to the list + vecGameParams.push_back(String(p1, p2 - p1)); + + // eat white space + while( *p2 && *p2==' ' ) p2++; + p1 = p2; + } + + //somehow we lost some game info + if (vecGameParams.size() != 4) return false; + + //Display game info + m_editGameInfo.SetSel(-1, 0); + m_editGameInfo.ReplaceSel(("Game Name: " + vecGameParams[0] + "\n").c_str()); + m_editGameInfo.ReplaceSel(("Server IP: " + vecGameParams[1] + "\n").c_str()); + m_editGameInfo.ReplaceSel(("Host IRC Name: " + vecGameParams[2] + "\n").c_str()); + m_editGameInfo.ReplaceSel(("Song Hash: " + vecGameParams[3] + "\n").c_str()); + + return true; +} + +bool CSmlobbyDlg::OnIrc_RPL_NAMREPLY(const CIrcMessage *pmsg) +{ + //Reset the names list + m_listUsers.ResetContent(); + + //now dump all of the users into the user list + //msg format: " :[[@|+] [[@|+] [...]]]" + const char* p1 = pmsg->parameters[3].c_str(); + const char* p2 = p1; + + //keep trying to read off names while the list isn't null + while( *p1 ) + { + // seek end of name + while( *p2 && !isspace(*p2) ) p2++; + + //add name to the list + m_listUsers.AddString(String(p1, p2 - p1).c_str()); + + // eat white space + while( *p2 && isspace(*p2) ) p2++; + p1 = p2; + } + + return true; +} + +void CSmlobbyDlg::OnIrcDefault(const CIrcMessage* pmsg) +{ + CIrcDefaultMonitor::OnIrcDefault(pmsg); + + if( pmsg && m_session.GetInfo().sServerName.length() ) + { + UpdateChatMessages( pmsg ); + } +} + +void CSmlobbyDlg::OnIrcDisconnected() +{ + AfxGetMainWnd()->PostMessage(WM_COMMAND, ID_FILE_CLOSE); +} + + +void CSmlobbyDlg::OnDestroy() +{ + CDialog::OnDestroy(); + + g_ircSession.Disconnect(); + g_ircSession.RemoveMonitor(this); + + //Close the parent application + AfxGetApp()->ExitInstance(); +} + + +void CSmlobbyDlg::UpdateChatMessages( const CIrcMessage* p ) +{ + if( p ) + { + m_editChatMessages.SetSel(-1, 0); + m_editChatMessages.SendMessage(EM_SCROLLCARET); + + #ifdef _DEBUG + m_editChatMessages.ReplaceSel((p->sCommand + " ").c_str()); + #endif + + if (p->sCommand == "NOTICE") + { + String param = p->parameters[1]; + + const char *c_param = param.c_str(); + p=p; + } + + if( p->prefix.sNick.length() ) + { + m_editChatMessages.ReplaceSel(("<" + p->prefix.sNick + "> ").c_str()); + } + + for(int i=1; i < p->parameters.size(); i++) + { + m_editChatMessages.ReplaceSel((p->parameters[i] + " ").c_str()); + } + m_editChatMessages.ReplaceSel("\r\n"); + } +} + + +void CSmlobbyDlg::OnDblclkListGames() +{ + //Get the game name that was currently selected + int nIndex = m_listGames.GetCurSel(); + CString strGameName; + + if (nIndex != LB_ERR) + { + m_listGames.GetText(nIndex, strGameName); + + //Tell the server that we wanted to join a chat room + g_ircSession << irc::CIrcMessage(CString("join ") + strGameName); + } +} + +void CSmlobbyDlg::OnSelchangeListGames() +{ + //Get the game name that was currently selected + int nIndex = m_listGames.GetCurSel(); + char szGameName[128]; + int nDummy; + + if (nIndex != LB_ERR) + { + m_listGames.GetText(nIndex, szGameName); + sscanf(szGameName, "%s (%d)", &szGameName, &nDummy); + + //Tell the server that we wanted to join a chat room + g_ircSession << irc::CIrcMessage(CString("topic ") + CString(szGameName)); + } +} + +void CSmlobbyDlg::OnButtonCreateGame() +{ + //Strip all non alphanumeric characters from the name + // so irc will be ok with it as a chat room name + CString gameName; + char szRawGameName[256]; + m_editGameName.GetLine(0, szRawGameName, 255); + + for (int i = 0; i < strlen(szRawGameName); i++) + { + if ( isalnum(szRawGameName[i]) ) + gameName += szRawGameName[i]; + } + + //Make sure user has given us a game name + if (gameName.GetLength() <= 0) + { + MessageBox("You need some letters or numbers in your name!"); + return; + } + + //Make sure no one else has this name + if (!IsUniqueGameName(gameName)) + { + MessageBox("Game already exists with that name!"); + 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 + IPaddress ipaddr; + char szHostName[256]; + gethostname(szHostName, 256); + SDLNet_ResolveHost(&ipaddr, szHostName, 0); + unsigned char *ip = (unsigned char *)&(ipaddr.host); + char host_ip_str[20]; + sprintf(host_ip_str, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]); + + //Insert song name/hash code here + char songHash[12] = "0x00000000"; + + //Now tell the server our game info + g_ircSession << irc::CIrcMessage(CString("topic #") + gameName + CString(" :") + + gameName + CString(" ") + + CString(host_ip_str) + CString(" ") + + CString(g_ircSession.GetInfo().sNick.c_str()) + CString(" ") + + CString(songHash)); +} + +bool CSmlobbyDlg::IsUniqueGameName(const CString GameName) +{ + CString aName; + + //Search list of games to make sure ours is unique + for (int i = 0; i < m_listGames.GetCount(); i++) + { + m_listGames.GetText(i, aName); + if (aName == GameName) + return false; + } + + return true; +} diff --git a/stepmania/src/smlobby/smlobbyDlg.h b/stepmania/src/smlobby/smlobbyDlg.h new file mode 100644 index 0000000000..4549be748c --- /dev/null +++ b/stepmania/src/smlobby/smlobbyDlg.h @@ -0,0 +1,86 @@ +// smlobbyDlg.h : header file +// + +#if !defined(AFX_SmlobbyDLG_H__B8E7A228_8094_4516_894C_9E613B74B27F__INCLUDED_) +#define AFX_SmlobbyDLG_H__B8E7A228_8094_4516_894C_9E613B74B27F__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include "irc.h" +#include "EditChat.h" +#include + +using namespace irc; + +///////////////////////////////////////////////////////////////////////////// +// CSmlobbyDlg dialog + +class CSmlobbyDlg : public CDialog, public CIrcDefaultMonitor +{ +// Construction +public: + CSmlobbyDlg(CWnd* pParent = NULL); // standard constructor + +// Dialog Data + //{{AFX_DATA(CSmlobbyDlg) + enum { IDD = IDD_SMLOBBY_DIALOG }; + CEdit m_editGameName; + CEdit m_editGameInfo; + CListBox m_listUsers; + CEditChat m_editEntry; + CEdit m_editChatMessages; + CListBox m_listGames; + //}}AFX_DATA + + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CSmlobbyDlg) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation +protected: + HICON m_hIcon; + + // Generated message map functions + //{{AFX_MSG(CSmlobbyDlg) + afx_msg void OnSysCommand(UINT nID, LPARAM lParam); + afx_msg HCURSOR OnQueryDragIcon(); + virtual BOOL OnInitDialog(); + virtual void OnPaint(); + virtual void OnDestroy(); + afx_msg void OnDblclkListGames(); + afx_msg void OnSelchangeListGames(); + afx_msg void OnButtonCreateGame(); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() + + + bool OnIrc_YOURHOST(const CIrcMessage* pmsg); + bool OnIrc_NICK(const CIrcMessage* pmsg); + bool OnIrc_PRIVMSG(const CIrcMessage* pmsg); + bool OnIrc_JOIN(const CIrcMessage* pmsg); + bool OnIrc_PART(const CIrcMessage* pmsg); + bool OnIrc_KICK(const CIrcMessage* pmsg); + bool OnIrc_MODE(const CIrcMessage* pmsg); + bool OnIrc_RPL_LISTSTART(const CIrcMessage *pmsg); + bool OnIrc_RPL_LIST(const CIrcMessage *pmsg); + bool OnIrc_RPL_TOPIC(const CIrcMessage *pmsg); + bool OnIrc_RPL_NAMREPLY(const CIrcMessage *pmsg); + bool OnIrc_DCC_RECV(const CIrcMessage *pmsg); + bool OnIrc_IgnoreMesg(const CIrcMessage *pmsg) { return true; } + + virtual void OnIrcDefault(const CIrcMessage* pmsg); + virtual void OnIrcDisconnected(); + + void UpdateChatMessages( const CIrcMessage* p ); + + bool IsUniqueGameName(const CString GameName); +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_SmlobbyDLG_H__B8E7A228_8094_4516_894C_9E613B74B27F__INCLUDED_) diff --git a/stepmania/src/smlobby/socket.cpp b/stepmania/src/smlobby/socket.cpp new file mode 100644 index 0000000000..dbea26db74 --- /dev/null +++ b/stepmania/src/smlobby/socket.cpp @@ -0,0 +1,127 @@ +// socket.cpp + +#include "StdAfx.h" +#include +#include "socket.h" + +////////////////////////////////////////////////////////////////////////// + +NetworkInit::NetworkInit() +{ + if (-1==SDL_Init(0)) + { + printf("SDL_Init: %s\n", SDL_GetError()); + exit(1); + } + + if (-1==SDLNet_Init()) + { + printf("SDLNet_Init: %s\n", SDLNet_GetError()); + exit(2); + } +} + +NetworkInit::~NetworkInit() +{ + SDLNet_Quit(); + SDL_Quit(); +} + +////////////////////////////////////////////////////////////////////////// + +InetAddr::InetAddr(short wPort) +{ + host = 0xFFFFFFFFL; + port = wPort; +} + +InetAddr::InetAddr(const char* lpszAddress, short wPort) +{ + Resolve(lpszAddress, wPort); +} + +InetAddr& InetAddr::operator = (char* lpszAddress) +{ + Resolve(lpszAddress); + return *this; +} + +void InetAddr::Resolve(const char* lpszAddress, short wPort) +{ + SDLNet_ResolveHost((IPaddress*)this, (char *)lpszAddress, wPort); +} + +////////////////////////////////////////////////////////////////////////// + +Socket::Socket() + : m_sock(NULL), m_bOwnSocket(false) +{ +} + +Socket::Socket(const Socket& s) + : m_sock(s.m_sock), m_bOwnSocket(false) +{ +} + +Socket::Socket(TCPsocket s) + : m_sock(s), m_bOwnSocket(false) +{ +} + +Socket::~Socket() +{ + if( m_bOwnSocket && m_sock != NULL ) + Close(); +} + +void Socket::Close() +{ + if (m_sock) SDLNet_TCP_Close(m_sock); + m_sock = NULL; +} + +bool Socket::Bind(const InetAddr& addr) +{ + m_bind_addr = addr; + return true; +} + +bool Socket::Connect(const InetAddr& ip) +{ + m_sock = SDLNet_TCP_Open((IPaddress *)&ip); + return m_sock != NULL; +} + +bool Socket::Listen() +{ + m_sock = SDLNet_TCP_Open((IPaddress *)&m_bind_addr); + return m_sock != NULL; +} + +Socket Socket::Accept() +{ + return Socket(SDLNet_TCP_Accept(m_sock)); +} + +int Socket::Send(const unsigned char* buf, int cbBuf) +{ + return SDLNet_TCP_Send(m_sock, (void *)buf, cbBuf); +} + +int Socket::Send(const char* fmt, ...) +{ + va_list marker; + va_start(marker, fmt); + + char szBuf[1024*4]; + vsprintf(szBuf, fmt, marker); + + va_end(marker); + + return Send((unsigned char*)szBuf, strlen(szBuf)); +} + +int Socket::Receive(unsigned char* buf, int cbBuf) +{ + return SDLNet_TCP_Recv(m_sock, (char*)buf, cbBuf); +} \ No newline at end of file diff --git a/stepmania/src/smlobby/socket.h b/stepmania/src/smlobby/socket.h new file mode 100644 index 0000000000..9d09dedee9 --- /dev/null +++ b/stepmania/src/smlobby/socket.h @@ -0,0 +1,71 @@ +// socket.h + +#ifndef SOCKET_H +#define SOCKET_H + +#pragma comment(lib, "sdl_net/lib/SDL.lib") +#pragma comment(lib, "sdl_net/lib/SDL_net.lib") + +#include "sdl_net/include/SDL_net.h" + +//HACK: SDL_net doesn't appear to have a way to get the host name +// which I need to resolve the machine's ip address +// (no. using "localhost" doesn't work. you'll get 127.0.0.1 @_@) +#ifdef WIN32 + //int FAR PASCAL gethostname(char FAR * name, int namelen); + #undef INADDR_ANY + #undef INADDR_NONE + #include +#elif UNIX + #include + #include +#endif + +class NetworkInit +{ +public : + NetworkInit(); + ~NetworkInit(); +}; + + +class InetAddr : public IPaddress +{ +public : + InetAddr(short wPort = 0); + InetAddr(const char* lpszAddress, short wPort = 0); + InetAddr& operator = (char* lpszAddress); + +protected : + void Resolve(const char* lpszAddress, short wPort = 0); +}; + +class Socket +{ +public : + Socket(); + Socket(TCPsocket s); + Socket(const Socket& s); + virtual ~Socket(); + + void Close(); + bool Bind(const InetAddr& addr); + bool Connect(const InetAddr& addr); + bool Listen(); + Socket Accept(); + int Send(const unsigned char* buf, int cbBuf); + int Send(const char* fmt, ...); + int Receive(unsigned char* buf, int cbBuf); + operator TCPsocket& () const { return (TCPsocket&)m_sock; } + operator bool() const { return m_sock != NULL; } + +protected: + InetAddr m_bind_addr; + TCPsocket m_sock; + +private : + bool m_bOwnSocket; +}; + + +#endif