/* * Copyright (c) 1991 Darryl Collins. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that the above copyright notice and this paragraph are * duplicated in all such forms and that any documentation, * advertising materials, and other materials related to such * distribution and use acknowledge that the software was developed * by Darryl Collins, University of western Australia. The name of the * University may not be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * This program is intended only as an example of the use of the NetBIOS DLL * * Please send questions, comments and bug-reports to * * darryl@fibula.surgery.uwa.oz.au * */ #include "windows.h" #include "talk.h" #include "netbios.h" #define LINELENGTH 200 #define HISTORY 30 HANDLE hInst; HANDLE hWnd; HANDLE hRecBox; HANDLE hSendDlg; HANDLE hSysMenu; char cRemoteName[16]; char cLocalName[16]; LPSTR lpSendBuffer; LPSTR lpReceiveBuffer; LPSTR lpLocalName=cLocalName; LPSTR lpRemoteName=cRemoteName; FARPROC lpProcSendBox; unsigned char nLsn; unsigned char nNum; SESSIONSTATUS ssStatBuf; void ClearBuffer(LPSTR lpBuffer, int nLength); int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevious, LPSTR lpCmdLine, int nCmdShow) { MSG msgCurrent; lstrcpy(lpLocalName,lpCmdLine); if (!hPrevious) if (!InitApplication(hInstance)) return(FALSE); if (!InitInstance(hInstance, nCmdShow)) return(FALSE); while(GetMessage(&msgCurrent, NULL, NULL, NULL)) { if(!hSendDlg || !IsDialogMessage(hSendDlg,&msgCurrent)) { TranslateMessage(&msgCurrent); DispatchMessage(&msgCurrent); } } return(msgCurrent.wParam); } BOOL InitApplication(HANDLE hInstance) { WNDCLASS wcDefinition; wcDefinition.style = NULL; wcDefinition.lpfnWndProc = MainWndProc; wcDefinition.cbClsExtra = 0; wcDefinition.cbWndExtra = 0; wcDefinition.hInstance = hInstance; wcDefinition.hIcon = LoadIcon(hInstance,"Icon"); wcDefinition.hCursor = LoadCursor(NULL, IDC_ARROW); wcDefinition.hbrBackground = GetStockObject(WHITE_BRUSH); wcDefinition.lpszMenuName = NULL; wcDefinition.lpszClassName = "TalkClass"; if(!(RegisterClass(&wcDefinition))) return(FALSE); wcDefinition.style = NULL; wcDefinition.lpfnWndProc = TTYProc; wcDefinition.cbClsExtra = 0; wcDefinition.cbWndExtra = 0; wcDefinition.hInstance = hInstance; wcDefinition.hIcon = LoadIcon(NULL,IDI_APPLICATION); wcDefinition.hCursor = LoadCursor(NULL, IDC_ARROW); wcDefinition.hbrBackground = GetStockObject(WHITE_BRUSH); wcDefinition.lpszMenuName = NULL; wcDefinition.lpszClassName = "TTYClass"; return(RegisterClass(&wcDefinition)); } BOOL InitInstance(HANDLE hInstance, int nCmdShow) { LPNCB lpNcb; hInst = hInstance; hWnd = CreateWindow( "TalkClass", "Talk", WS_OVERLAPPED|WS_ICONIC|WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); if(!hWnd) return(FALSE); hSysMenu = GetSystemMenu(hWnd,0); InsertMenu(hSysMenu,0,MF_SEPARATOR,(WORD)0,(LPSTR)0); InsertMenu(hSysMenu,0,MF_STRING|MF_ENABLED,IDC_CALL,(LPSTR)"C&all"); EnableWindow(hWnd,FALSE); ShowWindow(hWnd,nCmdShow|SW_MINIMIZE); UpdateWindow(hWnd); lpNcb = AddName(hWnd, lpLocalName, NB_NOWAIT); if(!lpNcb) { MessageBox(hWnd,"Failed to add name", NULL, MB_OK); DestroyWindow(hWnd); return(FALSE); } SendMessage(hWnd,WM_SETTEXT,0,(DWORD)(LPSTR)"Wait ..."); return(TRUE); } LONG FAR PASCAL MainWndProc(HWND hWnd, unsigned uMessage, WORD wParam, LONG lParam) { FARPROC lpRemoteProc; HDC hDC; PAINTSTRUCT ps; unsigned char nRetCode; LPNCB lpNcb; register int i,j; switch(uMessage) { case NB_COMMAND: lpNcb = (LPNCB)lParam; nRetCode = lpNcb->NcbRetCode; switch(wParam) { case NB_ADDNAME: EnableWindow(hWnd,TRUE); nNum = lpNcb->NcbNum; ReleaseNcb(lpNcb); if(nRetCode) { MessageBox(hWnd,"Failed to Add Name",NULL,MB_OK|MB_ICONSTOP); DestroyWindow(hWnd); break; } lpNcb = Listen(hWnd, (LPSTR)"*", lpLocalName, NB_NOWAIT); if(!lpNcb) { MessageBox(hWnd,"Listen Failed", NULL, MB_OK|MB_ICONSTOP); DestroyWindow(hWnd); return(FALSE); } SendMessage(hWnd,WM_SETTEXT,0,(DWORD)(LPSTR)"Talk"); break; case NB_LISTEN: nLsn = lpNcb->NcbLsn; ReleaseNcb(lpNcb); if(nRetCode) { MessageBox(hWnd,"Listen Failed",NULL,MB_OK|MB_ICONSTOP); DestroyWindow(hWnd); break; } EnableMenuItem(hSysMenu,0,MF_BYPOSITION|MF_DISABLED|MF_GRAYED); lpNcb = SessionStatus(hWnd, (LPSTR)&ssStatBuf, 364, lpLocalName, NB_WAIT); ReleaseNcb(lpNcb); for(i=0; i<10; i++) if(ssStatBuf.ss[i].ssLsn == nLsn) break; if(i == 10) break; lstrcpy(lpRemoteName,&ssStatBuf.ss[i].ssRemoteName[0]); lpProcSendBox = MakeProcInstance(SendBoxProc,hInst); hSendDlg = CreateDialog(hInst, "SendBox", hWnd, lpProcSendBox); break; case NB_CALL: nLsn = lpNcb->NcbLsn; ReleaseNcb(lpNcb); if(nRetCode) { MessageBox(hWnd,"Call Failed",NULL,MB_OK|MB_ICONSTOP); break; } EnableMenuItem(hSysMenu,0,MF_BYPOSITION|MF_DISABLED|MF_GRAYED); lpProcSendBox = MakeProcInstance(SendBoxProc,hInst); hSendDlg = CreateDialog(hInst, "SendBox", hWnd, lpProcSendBox); break; default: ReleaseNcb(lpNcb); break; } break; case WM_SYSCOMMAND: switch(wParam&0xfff0) { case IDC_CALL: lpRemoteProc = MakeProcInstance(RemoteDlgProc,hInst); if(DialogBox(hInst,"CallBox",hWnd,lpRemoteProc)) { lpNcb = Call(hWnd,lpRemoteName,lpLocalName,NB_NOWAIT); if(!lpNcb) { FreeProcInstance(lpRemoteProc); MessageBox(hWnd,"Call Failed",NULL,MB_OK|MB_ICONSTOP); break; } } FreeProcInstance(lpRemoteProc); break; case SC_CLOSE: DestroyWindow(hWnd); break; default: return(DefWindowProc(hWnd,uMessage,wParam,lParam)); } break; case WM_CLOSE: DestroyWindow(hWnd); break; case WM_DESTROY: if(nLsn) { lpNcb = HangUp(hWnd,nLsn,NB_WAIT); ReleaseNcb(lpNcb); } if(nNum) { lpNcb = DeleteName(hWnd,lpLocalName,NB_WAIT); ReleaseNcb(lpNcb); } if(lpReceiveBuffer) FreeFixedBuffer(lpReceiveBuffer); PostQuitMessage(0); break; default: return(DefWindowProc(hWnd, uMessage, wParam, lParam)); } return(NULL); } LONG FAR PASCAL TTYProc(HWND hWnd, unsigned uMessage, WORD wParam, LONG lParam) { register int i,j,k; HDC hDC; PAINTSTRUCT ps; static RECT rcClient; static int X,Y; static char cHistory[HISTORY][LINELENGTH]; static BOOL bHistory[HISTORY]; static int nLine=0; static int nScroll; static BOOL bScroll; long lUnits; switch(uMessage) { case WM_CREATE: nLine = 0; lUnits = GetDialogBaseUnits(); X = LOWORD(lUnits); Y = HIWORD(lUnits)/2; GetClientRect(hWnd,&rcClient); nScroll = (rcClient.bottom-rcClient.top)/Y/2; break; case WM_COMMAND: switch(wParam) { case TTY_ADDLINE: lstrcpy((LPSTR)&cHistory[nLine][0],(LPSTR)lParam); bHistory[nLine] = ((LPSTR)lParam == lpReceiveBuffer); nLine++; nLine %= HISTORY; if(nLine > nScroll) bScroll = TRUE; InvalidateRect(hWnd,NULL,TRUE); break; } break; case WM_PAINT: hDC = BeginPaint(hWnd,&ps); if(bScroll) { j = nLine-nScroll; if(j < 0) j += HISTORY; } else { j = 0; } for(i=j,k=0; iNcbRetCode; switch(wParam) { case NB_RECEIVE: ReleaseNcb(lpNcb); if(nRetCode) { if(nRetCode == 0x0a) { PostMessage(hDlg,WM_COMMAND,IDC_HANGUP,(DWORD)NULL); return(TRUE); } return(TRUE); } SendMessage(hRecBox,WM_COMMAND,TTY_ADDLINE,(DWORD)lpReceiveBuffer); ClearBuffer(lpReceiveBuffer,LINELENGTH); lpNcb = Receive(hDlg,nLsn,lpReceiveBuffer,LINELENGTH,NB_NOWAIT); return(TRUE); case NB_SEND: FreeFixedBuffer(lpNcb->NcbBuffer); ReleaseNcb(lpNcb); if(nRetCode) { if(nRetCode == 0x0a) { PostMessage(hDlg,WM_COMMAND,IDC_HANGUP,(DWORD)NULL); return(TRUE); } } return(TRUE); default: ReleaseNcb(lpNcb); if(nRetCode) { if(nRetCode == 0x0a) { PostMessage(hDlg,WM_COMMAND,IDC_HANGUP,(DWORD)NULL); return(TRUE); } } return(TRUE); } case WM_COMMAND: switch(wParam) { case IDC_OK: j = SendDlgItemMessage(hDlg,IDC_SENDBOX,EM_GETLINECOUNT,(WORD)0,(DWORD)0); for(i=0; i