Add accept connection dialog
This commit is contained in:
		
							parent
							
								
									bd2772ae0e
								
							
						
					
					
						commit
						8435304147
					
				
										
											Binary file not shown.
										
									
								
							| @ -7,6 +7,7 @@ | ||||
| #define IDI_ICONMAIN                    106 | ||||
| #define IDD_DIALOGCONNECTING            107 | ||||
| #define IDD_DIALOGCHAT                  109 | ||||
| #define IDD_DIALOGACCEPTCONNECTION      111 | ||||
| #define IDC_STATICTITLE                 1001 | ||||
| #define IDC_BUTTONEXIT                  1003 | ||||
| #define IDC_BUTTONCONNECT               1005 | ||||
| @ -20,6 +21,7 @@ | ||||
| #define IDC_EDITCHATINPUT               1013 | ||||
| #define IDC_BUTTONSEND                  1014 | ||||
| #define IDC_BUTTONDISCONNECT            1015 | ||||
| #define IDC_STATICREMOTEINFO            1017 | ||||
| #define ID_FILE_EXIT                    40001 | ||||
| #define ID_HELP_ABOUT                   40002 | ||||
| 
 | ||||
| @ -27,9 +29,9 @@ | ||||
| // 
 | ||||
| #ifdef APSTUDIO_INVOKED | ||||
| #ifndef APSTUDIO_READONLY_SYMBOLS | ||||
| #define _APS_NEXT_RESOURCE_VALUE        111 | ||||
| #define _APS_NEXT_RESOURCE_VALUE        113 | ||||
| #define _APS_NEXT_COMMAND_VALUE         40003 | ||||
| #define _APS_NEXT_CONTROL_VALUE         1016 | ||||
| #define _APS_NEXT_CONTROL_VALUE         1018 | ||||
| #define _APS_NEXT_SYMED_VALUE           101 | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| @ -118,6 +118,8 @@ namespace wc { | ||||
| 
 | ||||
| 			m_inAddress = toWideStr(remoteStr); | ||||
| 			m_inSocket = conSock; | ||||
| 
 | ||||
| 			//Wait here until there is no incoming connection anymore before accepting again
 | ||||
| 		} | ||||
| 
 | ||||
| 		closesocket(sock); | ||||
| @ -144,15 +146,13 @@ namespace wc { | ||||
| 					GetMonitorInfo(MonitorFromPoint(pt, MONITOR_DEFAULTTONEAREST), &mi); | ||||
| 					xPos = mi.rcMonitor.left + 100, yPos = mi.rcMonitor.top + 100; | ||||
| 				} | ||||
| 				SetWindowPos(dlg, nullptr, xPos, yPos, 0, 0, SWP_NOSIZE | SWP_NOZORDER); | ||||
| 
 | ||||
| 				SetWindowPos(dlg, nullptr, xPos, yPos, 0, 0, SWP_NOSIZE | SWP_NOZORDER); | ||||
| 				SetDlgItemText(dlg, IDC_STATICTITLE, app->m_appName.c_str()); | ||||
| 				LOGFONT lFont = { .lfHeight = 50 }; | ||||
| 				HFONT font = CreateFontIndirect(&lFont); | ||||
| 				SendMessage(GetDlgItem(dlg, IDC_STATICTITLE), WM_SETFONT, reinterpret_cast<LPARAM>(font), NULL); | ||||
| 
 | ||||
| 				SetDlgItemText(dlg, IDC_STATICDESC, L"A simple Windows chat app"); | ||||
| 
 | ||||
| 				SendDlgItemMessage(dlg, IDC_EDITADDRESS, EM_SETCUEBANNER, TRUE, reinterpret_cast<LPARAM>(L"Address")); | ||||
| 				SendDlgItemMessage(dlg, IDC_EDITSCREENNAME, EM_SETCUEBANNER, TRUE, reinterpret_cast<LPARAM>(L"User")); | ||||
| 
 | ||||
| @ -202,10 +202,23 @@ namespace wc { | ||||
| 			case WM_TIMER: | ||||
| 				if (wParam == IDT_CHECKINCONN && app->m_inSocket != INVALID_SOCKET) { | ||||
| 					KillTimer(dlg, IDT_CHECKINCONN); | ||||
| 					//Ask if to connect and for screen name here
 | ||||
| 					RECT dlgRect = { }; | ||||
| 					GetWindowRect(dlg, &dlgRect); | ||||
| 					EndDialog(dlg, reinterpret_cast<INT_PTR>(new MainDlgOutput{ app->m_inAddress, L"Temp screen name", dlgRect.left, dlgRect.top, app->m_inSocket })); | ||||
| 					MainDlgInput acceptInput = { app, dlgRect.left, dlgRect.top }; | ||||
| 
 | ||||
| 					INT_PTR result = DialogBoxParam(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOGACCEPTCONNECTION), dlg, reinterpret_cast<DLGPROC>(acceptDlgProc), reinterpret_cast<LPARAM>(&acceptInput)); | ||||
| 
 | ||||
| 					if (result == IDCANCEL) { | ||||
| 						closesocket(app->m_inSocket); | ||||
| 						app->m_inSocket = INVALID_SOCKET; | ||||
| 						SetTimer(dlg, IDT_CHECKINCONN, 100, nullptr); | ||||
| 						return TRUE; | ||||
| 					} | ||||
| 
 | ||||
| 					MainDlgOutput* out = reinterpret_cast<MainDlgOutput*>(result); | ||||
| 
 | ||||
| 					EndDialog(dlg, reinterpret_cast<INT_PTR>(new MainDlgOutput{ app->m_inAddress, out->screenname, dlgRect.left, dlgRect.top, app->m_inSocket })); | ||||
| 					delete out; | ||||
| 					app->m_inSocket = INVALID_SOCKET; | ||||
| 					return TRUE; | ||||
| 				} | ||||
| @ -220,6 +233,50 @@ namespace wc { | ||||
| 		return FALSE; | ||||
| 	} | ||||
| 
 | ||||
| 	BOOL CALLBACK Application::acceptDlgProc(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam) { | ||||
| 		static Application* app = nullptr; | ||||
| 
 | ||||
| 		switch (msg) { | ||||
| 			case WM_INITDIALOG: { | ||||
| 				MainDlgInput* in = reinterpret_cast<MainDlgInput*>(lParam); | ||||
| 				app = in->appPtr; | ||||
| 
 | ||||
| 				SendMessage(dlg, WM_SETICON, ICON_BIG, reinterpret_cast<LPARAM>(LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICONMAIN)))); | ||||
| 				SetWindowPos(dlg, nullptr, in->xPos + 30, in->yPos + 30, 0, 0, SWP_NOSIZE | SWP_NOZORDER); | ||||
| 
 | ||||
| 				SetDlgItemText(dlg, IDC_STATICREMOTEINFO, app->m_inAddress.c_str()); | ||||
| 				SendDlgItemMessage(dlg, IDC_EDITSCREENNAME, EM_SETCUEBANNER, TRUE, reinterpret_cast<LPARAM>(L"User")); | ||||
| 
 | ||||
| 				return TRUE; | ||||
| 			} | ||||
| 
 | ||||
| 			case WM_COMMAND: | ||||
| 				switch (LOWORD(wParam)) { | ||||
| 					case IDOK: { | ||||
| 						int inputLength = GetWindowTextLength(GetDlgItem(dlg, IDC_EDITSCREENNAME)); | ||||
| 						if (!inputLength) { | ||||
| 							EDITBALLOONTIP balloon = { .cbStruct = sizeof(balloon), .pszTitle = L"Alert", .pszText = L"You must enter a screen name." }; | ||||
| 							SendDlgItemMessage(dlg, IDC_EDITSCREENNAME, EM_SHOWBALLOONTIP, NULL, reinterpret_cast<LPARAM>(&balloon)); | ||||
| 							return TRUE; | ||||
| 						} | ||||
| 
 | ||||
| 						std::wstring buffer(inputLength, 0); | ||||
| 						GetDlgItemText(dlg, IDC_EDITSCREENNAME, buffer.data(), static_cast<int>(buffer.size() + 1)); | ||||
| 						EndDialog(dlg, reinterpret_cast<INT_PTR>(new MainDlgOutput{ std::wstring(), buffer, NULL, NULL, INVALID_SOCKET})); | ||||
| 						return TRUE; | ||||
| 					} | ||||
| 
 | ||||
| 					case IDCANCEL: | ||||
| 						EndDialog(dlg, wParam); | ||||
| 						return TRUE; | ||||
| 				} | ||||
| 
 | ||||
| 				return FALSE; | ||||
| 		} | ||||
| 
 | ||||
| 		return FALSE; | ||||
| 	} | ||||
| 
 | ||||
| 	Application::~Application() { | ||||
| 		WSACleanup(); | ||||
| 	} | ||||
|  | ||||
| @ -15,6 +15,7 @@ namespace wc { | ||||
| 	private: | ||||
| 		void startListen(); | ||||
| 		static BOOL CALLBACK mainDlgProc(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam); | ||||
| 		static BOOL CALLBACK acceptDlgProc(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam); | ||||
| 
 | ||||
| 		const std::wstring m_appName; | ||||
| 		const std::wstring m_appVersion; | ||||
|  | ||||
| @ -77,7 +77,16 @@ namespace wc { | ||||
| 
 | ||||
| 		//Send and receive screen names
 | ||||
| 		send(sock, reinterpret_cast<const char*>(m_screenname.c_str()), static_cast<int>(m_screenname.size()) * sizeof(wchar_t), NULL); | ||||
| 		m_remoteScreenname.resize(recv(sock, reinterpret_cast<char*>(m_remoteScreenname.data()), 1000, NULL) / 2); | ||||
| 		int bytesRemoteScreenname = recv(sock, reinterpret_cast<char*>(m_remoteScreenname.data()), 1000, NULL); | ||||
| 
 | ||||
| 		if (!bytesRemoteScreenname || WSAGetLastError() == WSAECONNRESET) { | ||||
| 			MessageBox(nullptr, L"The remote host denied the connection.", L"Error", MB_ICONERROR); | ||||
| 			m_connectionError = true; | ||||
| 			closesocket(sock); | ||||
| 			return; | ||||
| 		} | ||||
| 
 | ||||
| 		m_remoteScreenname.resize(bytesRemoteScreenname / 2); | ||||
| 		ioctlsocket(sock, FIONBIO, &yes); | ||||
| 
 | ||||
| 		m_connected = true; | ||||
| @ -85,7 +94,7 @@ namespace wc { | ||||
| 		std::wstring recvBuffer(2000, 0); | ||||
| 		std::wstring sendStr; | ||||
| 		int bytesRecvd = 0; | ||||
| 		while (m_connected) { | ||||
| 		while (m_connected && !m_connectionError) { | ||||
| 			while (!m_sendQueue.empty()) { | ||||
| 				sendStr = m_sendQueue.pop(); | ||||
| 				send(sock, reinterpret_cast<const char*>(sendStr.c_str()), static_cast<int>(sendStr.size()) * sizeof(wchar_t), NULL); | ||||
| @ -147,9 +156,11 @@ namespace wc { | ||||
| 				ChatDlgInput* in = reinterpret_cast<ChatDlgInput*>(lParam); | ||||
| 				chat = in->chatPtr; | ||||
| 
 | ||||
| 				SendMessage(dlg, WM_SETICON, ICON_BIG, reinterpret_cast<LPARAM>(LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICONMAIN)))); | ||||
| 				SetWindowPos(dlg, nullptr, in->xPos + 100, in->yPos + 100, 0, 0, SWP_NOSIZE | SWP_NOZORDER); | ||||
| 				SetDlgItemText(dlg, IDC_STATICADDRESS, chat->m_address.c_str()); | ||||
| 				SendDlgItemMessage(dlg, IDC_PROGRESS, PBM_SETMARQUEE, TRUE, NULL); | ||||
| 
 | ||||
| 				SetTimer(dlg, IDT_CHECKCONN, 100, nullptr); | ||||
| 
 | ||||
| 				return TRUE; | ||||
| @ -175,9 +186,7 @@ namespace wc { | ||||
| 
 | ||||
| 				SetWindowText(dlg, std::format(L"{} - WinChat", chat->m_remoteScreenname).c_str()); | ||||
| 				SendMessage(dlg, WM_SETICON, ICON_BIG, reinterpret_cast<LPARAM>(LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICONMAIN)))); | ||||
| 
 | ||||
| 				SetWindowPos(dlg, nullptr, in->xPos - 50, in->yPos - 50, 0, 0, SWP_NOSIZE | SWP_NOZORDER); | ||||
| 
 | ||||
| 				SendDlgItemMessage(dlg, IDC_EDITCHATINPUT, EM_SETCUEBANNER, TRUE, reinterpret_cast<LPARAM>(L"Message")); | ||||
| 
 | ||||
| 				SetDlgItemText(dlg, IDC_EDITCHATDISPLAY, std::format(L"Connected to {} at {}", chat->m_remoteScreenname, chat->m_address).c_str()); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user