|
|
1.1 root 1: /* Synchronet Control Panel (GUI Borland C++ Builder Project for Win32) */
2:
3: /* $Id: SpyFormUnit.cpp,v 1.8 2000/11/02 11:31:50 rswindell Exp $ */
4:
5: /****************************************************************************
6: * @format.tab-size 4 (Plain Text/Source Code File Header) *
7: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
8: * *
9: * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html *
10: * *
11: * This program is free software; you can redistribute it and/or *
12: * modify it under the terms of the GNU General Public License *
13: * as published by the Free Software Foundation; either version 2 *
14: * of the License, or (at your option) any later version. *
15: * See the GNU General Public License for more details: gpl.txt or *
16: * http://www.fsf.org/copyleft/gpl.html *
17: * *
18: * Anonymous FTP access to the most recent released source is available at *
19: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net *
20: * *
21: * Anonymous CVS access to the development source and modification history *
22: * is available at cvs.synchro.net:/cvsroot/sbbs, example: *
23: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login *
24: * (just hit return, no password is necessary) *
25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src *
26: * *
27: * For Synchronet coding style and modification guidelines, see *
28: * http://www.synchro.net/source.html *
29: * *
30: * You are encouraged to submit any modifications (preferably in Unix diff *
31: * format) via e-mail to [email protected] *
32: * *
33: * Note: If this box doesn't appear square, then you need to fix your tabs. *
34: ****************************************************************************/
35:
36: #include <vcl.h>
37: #pragma hdrstop
38:
39: #include "MainFormUnit.h"
40: #include "SpyFormUnit.h"
41: #include "telnet.h"
42:
43: #define SPYBUF_LEN 10000
44: //---------------------------------------------------------------------------
45: #pragma package(smart_init)
46: #pragma link "Emulvt"
47: #pragma resource "*.dfm"
48: TSpyForm *SpyForm;
49: //---------------------------------------------------------------------------
50: __fastcall TSpyForm::TSpyForm(TComponent* Owner)
51: : TForm(Owner)
52: {
53: Width=MainForm->SpyTerminalWidth;
54: Height=MainForm->SpyTerminalHeight;
55: KeyboardActive->Checked=MainForm->SpyTerminalKeyboardActive;
56: Terminal = new TEmulVT(this);
57: Terminal->Parent=this;
58: Terminal->Align=alClient;
59: Terminal->OnKeyPress=FormKeyPress;
60: Terminal->OnMouseUp=FormMouseUp;
61: ActiveControl=Terminal;
62: }
63: //---------------------------------------------------------------------------
64: int strip_telnet(uchar *buf, int len)
65: {
66: int i;
67: int telnet_cmd=0;
68: int newlen=0;
69:
70: for(i=0;i<len;i++) {
71: if(buf[i]==TELNET_IAC || telnet_cmd) {
72: if(telnet_cmd==1 && buf[i]==TELNET_IAC) {
73: telnet_cmd=0; /* escape IAC */
74: continue;
75: }
76: if(telnet_cmd==1 && buf[i]<TELNET_WILL) {
77: telnet_cmd=0; /* single byte command */
78: continue;
79: }
80: if(telnet_cmd>=2) {
81: telnet_cmd=0; /* two byte command */
82: continue;
83: }
84: telnet_cmd++;
85: continue;
86: }
87: buf[newlen++]=buf[i];
88: }
89: return(newlen);
90: }
91: //---------------------------------------------------------------------------
92: void __fastcall TSpyForm::SpyTimerTick(TObject *Sender)
93: {
94: uchar buf[1024];
95: int rd;
96:
97: if(*outbuf==NULL)
98: return;
99:
100: rd=RingBufRead(*outbuf,buf,sizeof(buf)-1);
101: if(rd) {
102: rd=strip_telnet(buf,rd);
103: Terminal->WriteBuffer(buf,rd);
104: Timer->Interval=1;
105: } else
106: Timer->Interval=250;
107: }
108: //---------------------------------------------------------------------------
109: void __fastcall TSpyForm::FormShow(TObject *Sender)
110: {
111: if((*outbuf=(RingBuf*)malloc(sizeof(RingBuf)))==NULL) {
112: Terminal->WriteStr("Malloc failure!");
113: return;
114: }
115: RingBufInit(*outbuf,SPYBUF_LEN);
116:
117: Timer->Enabled=true;
118:
119: Terminal->Font=MainForm->SpyTerminalFont;
120: Terminal->Clear();
121: Terminal->WriteStr("*** Synchronet Local Spy ***\r\n\r\n");
122: Terminal->WriteStr("ANSI Terminal Emulation:"+CopyRight+"\r\n\r\n");
123: KeyboardActiveClick(Sender);
124: }
125: //---------------------------------------------------------------------------
126:
127: void __fastcall TSpyForm::FormClose(TObject *Sender, TCloseAction &Action)
128: {
129: Timer->Enabled=false;
130: if(*outbuf!=NULL) {
131: RingBufDispose(*outbuf);
132: free(*outbuf);
133: *outbuf=NULL;
134: }
135: MainForm->SpyTerminalWidth=Width;
136: MainForm->SpyTerminalHeight=Height;
137: MainForm->SpyTerminalKeyboardActive=KeyboardActive->Checked;
138: }
139: //---------------------------------------------------------------------------
140:
141: void __fastcall TSpyForm::ChangeFontClick(TObject *Sender)
142: {
143: TFontDialog *FontDialog=new TFontDialog(this);
144:
145: FontDialog->Font=MainForm->SpyTerminalFont;
146: FontDialog->Execute();
147: MainForm->SpyTerminalFont->Assign(FontDialog->Font);
148: Terminal->Font=MainForm->SpyTerminalFont;
149: delete FontDialog;
150: Terminal->UpdateScreen();
151: }
152: //---------------------------------------------------------------------------
153:
154: void __fastcall TSpyForm::FormKeyPress(TObject *Sender, char &Key)
155: {
156: if(KeyboardActive->Checked && inbuf!=NULL && *inbuf!=NULL)
157: RingBufWrite(*inbuf,&Key,1);
158:
159: }
160: //---------------------------------------------------------------------------
161:
162: void __fastcall TSpyForm::KeyboardActiveClick(TObject *Sender)
163: {
164: KeyboardActive->Checked=!KeyboardActive->Checked;
165: if(KeyboardActive->Checked)
166: Terminal->Cursor=crIBeam;
167: else
168: Terminal->Cursor=crDefault;
169: }
170: //---------------------------------------------------------------------------
171:
172: void __fastcall TSpyForm::FormMouseUp(TObject *Sender, TMouseButton Button,
173: TShiftState Shift, int X, int Y)
174: {
175: if(Button==mbRight)
176: PopupMenu->Popup(ClientOrigin.x+X,ClientOrigin.y+Y);
177: }
178: //---------------------------------------------------------------------------
179:
180:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.