|
|
1.1 root 1: /* Synchronet Control Panel (GUI Borland C++ Builder Project for Win32) */
2:
3: /* $Id: MainFormUnit.cpp,v 1.15 2000/12/06 03:10:08 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: //---------------------------------------------------------------------------
37: #include <vcl.h>
38: #include <vcl\Registry.hpp> /* TRegistry */
39: #pragma hdrstop
40: #include <winsock.h> // IPPORT_TELNET, INADDR_ANY
41: #include <process.h> // _beginthread()
42: #include <io.h>
43: #include <stdio.h>
44: #include <sys\stat.h>
45: #include <sys\locking.h>
46: #include <fcntl.h>
47: #include <share.h>
48:
49: #include "MainFormUnit.h"
50: #include "TelnetFormUnit.h"
51: #include "FtpFormUnit.h"
52: #include "MailFormUnit.h"
53: #include "NodeFormUnit.h"
54: #include "StatsFormUnit.h"
55: #include "ClientFormUnit.h"
56: #include "CtrlPathDialogUnit.h"
57: #include "TelnetCfgDlgUnit.h"
58: #include "MailCfgDlgUnit.h"
59: #include "FtpCfgDlgUnit.h"
60: #include "AboutBoxFormUnit.h"
61: #include "CodeInputFormUnit.h"
62: #include "TextFileEditUnit.h"
63: #include "UserListFormUnit.h"
64:
65: #include "sbbs.h" // unixtodstr()
66: #include "userdat.h" // lastuser()
67:
68: //---------------------------------------------------------------------------
69: #pragma package(smart_init)
70: #pragma resource "*.dfm"
71: TMainForm *MainForm;
72:
73: extern "C" __declspec(dllimport) BOOL __stdcall load_cfg(scfg_t* cfg, char* text[]);
74: extern "C" __declspec(dllimport) BOOL __stdcall getstats(scfg_t* cfg, char node, stats_t* stats);
75: extern "C" __declspec(dllimport) int __stdcall getmail(scfg_t* cfg, int usernumber, BOOL sent);
76: #define MAX_LOGLEN 20000
77:
78: #define LOG_TIME_FMT " m/d hh:mm:ssa/p"
79:
80: int threads=1;
81:
82: static void thread_up(BOOL up)
83: {
84: char str[128];
85: static HANDLE mutex;
86:
87: if(!mutex)
88: mutex=CreateMutex(NULL,false,NULL);
89: WaitForSingleObject(mutex,INFINITE);
90: if(up)
91: threads++;
92: else if(threads>0)
93: threads--;
94: sprintf(str,"Threads: %d",threads);
95: AnsiString Str=AnsiString(str);
96: if(MainForm->StatusBar->Panels->Items[0]->Text!=Str)
97: MainForm->StatusBar->Panels->Items[0]->Text=Str;
98: ReleaseMutex(mutex);
99: }
100:
101: int sockets=0;
102:
103: void socket_open(BOOL open)
104: {
105: char str[128];
106: static HANDLE mutex;
107:
108: if(!mutex)
109: mutex=CreateMutex(NULL,false,NULL);
110: WaitForSingleObject(mutex,INFINITE);
111: if(open)
112: sockets++;
113: else if(sockets>0)
114: sockets--;
115: sprintf(str,"Sockets: %d",sockets);
116: AnsiString Str=AnsiString(str);
117: if(MainForm->StatusBar->Panels->Items[1]->Text!=Str)
118: MainForm->StatusBar->Panels->Items[1]->Text=Str;
119: ReleaseMutex(mutex);
120: }
121:
122: int clients=0;
123: int total_clients=0;
124:
125: static void client_add(BOOL add)
126: {
127: char str[128];
128: static HANDLE mutex;
129:
130: if(!mutex)
131: mutex=CreateMutex(NULL,false,NULL);
132: WaitForSingleObject(mutex,INFINITE);
133: if(add) {
134: clients++;
135: total_clients++;
136: } else if(clients>0)
137: clients--;
138: sprintf(str,"Clients: %d",clients);
139: AnsiString Str=AnsiString(str);
140: if(MainForm->StatusBar->Panels->Items[2]->Text!=Str)
141: MainForm->StatusBar->Panels->Items[2]->Text=Str;
142:
143: sprintf(str,"Served: %d",total_clients);
144: Str=AnsiString(str);
145: if(MainForm->StatusBar->Panels->Items[3]->Text!=Str)
146: MainForm->StatusBar->Panels->Items[3]->Text=Str;
147: ReleaseMutex(mutex);
148: }
149:
150: static void client_on(BOOL on, int sock, client_t* client)
151: {
152: char str[128];
153: int i,j;
154: time_t t;
155: static HANDLE mutex;
156: TListItem* Item;
157:
158: if(!mutex)
159: mutex=CreateMutex(NULL,false,NULL);
160: WaitForSingleObject(mutex,INFINITE);
161: WaitForSingleObject(ClientForm->ListMutex,INFINITE);
162:
163: /* Search for exising entry for this socket */
164: for(i=0;i<ClientForm->ListView->Items->Count;i++) {
165: if(ClientForm->ListView->Items->Item[i]->Caption.ToIntDef(0)==sock)
166: break;
167: }
168: if(i>=ClientForm->ListView->Items->Count)
169: i=-1;
170:
171: if(on==FALSE) { // Off
172: if(i>=0)
173: ClientForm->ListView->Items->Delete(i);
174: ReleaseMutex(mutex);
175: ReleaseMutex(ClientForm->ListMutex);
176: return;
177: }
178: if(client!=NULL && client->size==sizeof(client_t)) {
179: if(i>=0) {
180: Item=ClientForm->ListView->Items->Item[i];
181: } else {
182: Item=ClientForm->ListView->Items->Add();
183: Item->Data=(void*)client->time;
184: Item->Caption=sock;
185: }
186: Item->SubItems->Clear();
187: Item->SubItems->Add(client->protocol);
188: Item->SubItems->Add(client->user);
189: Item->SubItems->Add(client->addr);
190: Item->SubItems->Add(client->host);
191: Item->SubItems->Add(client->port);
192: t=time(NULL)-(time_t)Item->Data;
193: sprintf(str,"%d:%02d",t/60,t%60);
194: Item->SubItems->Add(str);
195: }
196: ReleaseMutex(mutex);
197: ReleaseMutex(ClientForm->ListMutex);
198: }
199:
200: static int bbs_lputs(char *str)
201: {
202: static HANDLE mutex;
203:
204: if(!mutex)
205: mutex=CreateMutex(NULL,false,NULL);
206: WaitForSingleObject(mutex,INFINITE);
207:
208: while(TelnetForm->Log->Text.Length()>=MAX_LOGLEN)
209: TelnetForm->Log->Lines->Delete(0);
210:
211: AnsiString Line=Now().FormatString(LOG_TIME_FMT)+" ";
212: Line+=AnsiString(str).Trim();
213: TelnetForm->Log->Lines->Add(Line);
214: ReleaseMutex(mutex);
215: return(Line.Length());
216: }
217:
218: static void bbs_status(char *str)
219: {
220: static HANDLE mutex;
221:
222: if(!mutex)
223: mutex=CreateMutex(NULL,false,NULL);
224: WaitForSingleObject(mutex,INFINITE);
225:
226: TelnetForm->Status->Caption=AnsiString(str);
227:
228: ReleaseMutex(mutex);
229: }
230:
231: static void bbs_clients(int clients)
232: {
233: static HANDLE mutex;
234: static save_clients;
235:
236: if(clients>save_clients)
237: client_add(TRUE);
238: else if(clients<save_clients)
239: client_add(FALSE);
240: save_clients=clients;
241:
242: if(!mutex)
243: mutex=CreateMutex(NULL,false,NULL);
244: WaitForSingleObject(mutex,INFINITE);
245:
246: TelnetForm->ProgressBar->Max
247: =(MainForm->bbs_startup.last_node
248: -MainForm->bbs_startup.first_node)+1;
249: TelnetForm->ProgressBar->Position=clients;
250:
251: ReleaseMutex(mutex);
252: }
253:
254: static void bbs_terminated(int code)
255: {
256: Screen->Cursor=crDefault;
257: MainForm->TelnetStart->Enabled=true;
258: MainForm->TelnetStop->Enabled=false;
259: }
260: static void bbs_started(void)
261: {
262: Screen->Cursor=crDefault;
263: MainForm->TelnetStart->Enabled=false;
264: MainForm->TelnetStop->Enabled=true;
265: }
266: static void bbs_start(void)
267: {
268: Screen->Cursor=crAppStart;
269: bbs_status("Starting");
270: strcpy(MainForm->bbs_startup.ctrl_dir,MainForm->CtrlDirectory.c_str());
271: _beginthread((void(*)(void*))bbs_thread,0,&MainForm->bbs_startup);
272: }
273:
274: static int mail_lputs(char *str)
275: {
276: static HANDLE mutex;
277: static FILE* LogStream;
278:
279: if(!mutex)
280: mutex=CreateMutex(NULL,false,NULL);
281: WaitForSingleObject(mutex,INFINITE);
282:
283: if(str==NULL) {
284: if(LogStream!=NULL)
285: fclose(LogStream);
286: LogStream=NULL;
287: ReleaseMutex(mutex);
288: return(0);
289: }
290:
291: while(MailForm->Log->Text.Length()>=MAX_LOGLEN)
292: MailForm->Log->Lines->Delete(0);
293:
294: AnsiString Line=Now().FormatString(LOG_TIME_FMT)+" ";
295: Line+=AnsiString(str).Trim();
296: MailForm->Log->Lines->Add(Line);
297:
298: if(MainForm->MailLogFile && MainForm->MailStop->Enabled) {
299: AnsiString LogFileName
300: =AnsiString(MainForm->cfg.data_dir)
301: +"LOGS\\MS"
302: +Now().FormatString("mmddyy")
303: +".LOG";
304:
305: if(!FileExists(LogFileName)) {
306: if(LogStream!=NULL) {
307: fclose(LogStream);
308: LogStream=NULL;
309: }
310: }
311: if(LogStream==NULL)
312: LogStream=fopen(LogFileName.c_str(),"a");
313:
314: if(LogStream!=NULL) {
315: Line=Now().FormatString("hh:mm:ss")+" ";
316: Line+=AnsiString(str).Trim();
317: Line+="\n";
318: fwrite(AnsiString(Line).c_str(),1,Line.Length(),LogStream);
319: }
320: }
321:
322: ReleaseMutex(mutex);
323: return(Line.Length());
324: }
325:
326: static void mail_status(char *str)
327: {
328: static HANDLE mutex;
329:
330: if(!mutex)
331: mutex=CreateMutex(NULL,false,NULL);
332: WaitForSingleObject(mutex,INFINITE);
333:
334: MailForm->Status->Caption=AnsiString(str);
335:
336: ReleaseMutex(mutex);
337: }
338:
339: static void mail_clients(int clients)
340: {
341: static HANDLE mutex;
342: static save_clients;
343:
344: if(clients>save_clients)
345: client_add(TRUE);
346: else if(clients<save_clients)
347: client_add(FALSE);
348: save_clients=clients;
349:
350: if(!mutex)
351: mutex=CreateMutex(NULL,false,NULL);
352: WaitForSingleObject(mutex,INFINITE);
353:
354: MailForm->ProgressBar->Max=MainForm->mail_startup.max_clients;
355: MailForm->ProgressBar->Position=clients;
356:
357: ReleaseMutex(mutex);
358: }
359:
360: static void mail_terminated(int code)
361: {
362: Screen->Cursor=crDefault;
363: MainForm->MailStart->Enabled=true;
364: MainForm->MailStop->Enabled=false;
365: }
366: static void mail_started(void)
367: {
368: Screen->Cursor=crDefault;
369: MainForm->MailStart->Enabled=false;
370: MainForm->MailStop->Enabled=true;
371: }
372: static void mail_start(void)
373: {
374: Screen->Cursor=crAppStart;
375: mail_status("Starting");
376: strcpy(MainForm->mail_startup.ctrl_dir,MainForm->CtrlDirectory.c_str());
377: _beginthread((void(*)(void*))mail_server,0,&MainForm->mail_startup);
378: }
379:
380: static int ftp_lputs(char *str)
381: {
382: static HANDLE mutex;
383: static FILE* LogStream;
384:
385: if(!mutex)
386: mutex=CreateMutex(NULL,false,NULL);
387: WaitForSingleObject(mutex,INFINITE);
388:
389: if(str==NULL) {
390: if(LogStream!=NULL)
391: fclose(LogStream);
392: LogStream=NULL;
393: ReleaseMutex(mutex);
394: return(0);
395: }
396:
397: while(FtpForm->Log->Text.Length()>=MAX_LOGLEN)
398: FtpForm->Log->Lines->Delete(0);
399:
400: AnsiString Line=Now().FormatString(LOG_TIME_FMT)+" ";
401: Line+=AnsiString(str).Trim();
402: FtpForm->Log->Lines->Add(Line);
403:
404: if(MainForm->FtpLogFile && MainForm->FtpStop->Enabled) {
405: AnsiString LogFileName
406: =AnsiString(MainForm->cfg.data_dir)
407: +"LOGS\\FS"
408: +Now().FormatString("mmddyy")
409: +".LOG";
410:
411: if(!FileExists(LogFileName)) {
412: FileClose(FileCreate(LogFileName));
413: if(LogStream!=NULL) {
414: fclose(LogStream);
415: LogStream=NULL;
416: }
417: }
418: if(LogStream==NULL)
419: LogStream=fopen(LogFileName.c_str(),"a");
420:
421: if(LogStream!=NULL) {
422: Line=Now().FormatString("hh:mm:ss")+" ";
423: Line+=AnsiString(str).Trim();
424: Line+="\n";
425: fwrite(AnsiString(Line).c_str(),1,Line.Length(),LogStream);
426: }
427: }
428:
429: ReleaseMutex(mutex);
430: return(Line.Length());
431: }
432:
433: static void ftp_status(char *str)
434: {
435: static HANDLE mutex;
436:
437: if(!mutex)
438: mutex=CreateMutex(NULL,false,NULL);
439: WaitForSingleObject(mutex,INFINITE);
440:
441: FtpForm->Status->Caption=AnsiString(str);
442:
443: ReleaseMutex(mutex);
444: }
445:
446: static void ftp_clients(int clients)
447: {
448: static HANDLE mutex;
449: static save_clients;
450:
451: if(clients>save_clients)
452: client_add(TRUE);
453: else if(clients<save_clients)
454: client_add(FALSE);
455: save_clients=clients;
456:
457: if(!mutex)
458: mutex=CreateMutex(NULL,false,NULL);
459: WaitForSingleObject(mutex,INFINITE);
460:
461: FtpForm->ProgressBar->Max=MainForm->ftp_startup.max_clients;
462: FtpForm->ProgressBar->Position=clients;
463:
464: ReleaseMutex(mutex);
465: }
466:
467: static void ftp_terminated(int code)
468: {
469: Screen->Cursor=crDefault;
470: MainForm->FtpStart->Enabled=true;
471: MainForm->FtpStop->Enabled=false;
472: }
473: static void ftp_started(void)
474: {
475: Screen->Cursor=crDefault;
476: MainForm->FtpStart->Enabled=false;
477: MainForm->FtpStop->Enabled=true;
478: }
479: static void ftp_start(void)
480: {
481: Screen->Cursor=crAppStart;
482: ftp_status("Starting");
483: strcpy(MainForm->ftp_startup.ctrl_dir,MainForm->CtrlDirectory.c_str());
484: _beginthread((void(*)(void*))ftp_server,0,&MainForm->ftp_startup);
485: }
486: //---------------------------------------------------------------------------
487:
488: #define REG_KEY "\\Software\\Swindell\\Synchronet Control Panel\\"
489:
490: //---------------------------------------------------------------------------
491: __fastcall TMainForm::TMainForm(TComponent* Owner)
492: : TForm(Owner)
493: {
494: CtrlDirectory="c:\\sbbs\\ctrl\\";
495: LoginCommand="start telnet://localhost";
496: ConfigCommand="%sSCFG %s /T2";
497:
498: memset(&bbs_startup,0,sizeof(bbs_startup));
499: bbs_startup.size=sizeof(bbs_startup);
500: bbs_startup.first_node=1;
501: bbs_startup.last_node=4;
502: bbs_startup.telnet_port=IPPORT_TELNET;
503: bbs_startup.telnet_interface=INADDR_ANY;
504: bbs_startup.rlogin_port=513;
505: bbs_startup.rlogin_interface=INADDR_ANY;
506: bbs_startup.lputs=bbs_lputs;
507: bbs_startup.status=bbs_status;
508: bbs_startup.clients=bbs_clients;
509: bbs_startup.started=bbs_started;
510: bbs_startup.terminated=bbs_terminated;
511: bbs_startup.thread_up=thread_up;
512: bbs_startup.client_on=client_on;
513: bbs_startup.socket_open=socket_open;
514:
515: memset(&mail_startup,0,sizeof(mail_startup));
516: mail_startup.size=sizeof(mail_startup);
517: mail_startup.smtp_port=IPPORT_SMTP;
518: mail_startup.relay_port=IPPORT_SMTP;
519: mail_startup.pop3_port=110;
520: mail_startup.interface_addr=INADDR_ANY;
521: mail_startup.lputs=mail_lputs;
522: mail_startup.status=mail_status;
523: mail_startup.clients=mail_clients;
524: mail_startup.started=mail_started;
525: mail_startup.terminated=mail_terminated;
526: mail_startup.options=MAIL_OPT_ALLOW_POP3;
527: mail_startup.thread_up=thread_up;
528: mail_startup.client_on=client_on;
529: mail_startup.socket_open=socket_open;
530: mail_startup.max_delivery_attempts=10;
531: mail_startup.rescan_frequency=300; /* 5 minutes */
532:
533: memset(&ftp_startup,0,sizeof(ftp_startup));
534: ftp_startup.size=sizeof(ftp_startup);
535: ftp_startup.port=IPPORT_FTP;
536: ftp_startup.interface_addr=INADDR_ANY;
537: ftp_startup.lputs=ftp_lputs;
538: ftp_startup.status=ftp_status;
539: ftp_startup.clients=ftp_clients;
540: ftp_startup.started=ftp_started;
541: ftp_startup.terminated=ftp_terminated;
542: ftp_startup.thread_up=thread_up;
543: ftp_startup.client_on=client_on;
544: ftp_startup.socket_open=socket_open;
545: ftp_startup.options=FTP_OPT_INDEX_FILE|FTP_OPT_ALLOW_QWK;
546: strcpy(ftp_startup.index_file_name,"00index");
547:
548: /* Default local "Spy Terminal" settings */
549: SpyTerminalFont=new TFont;
550: SpyTerminalFont->Name="Terminal";
551: SpyTerminalFont->Size=9;
552: SpyTerminalFont->Pitch=fpFixed;
553: SpyTerminalWidth=434;
554: SpyTerminalHeight=365;
555: SpyTerminalKeyboardActive=true;
556: }
557: //---------------------------------------------------------------------------
558: void __fastcall TMainForm::FileExitMenuItemClick(TObject *Sender)
559: {
560: Close();
561: }
562: void __fastcall TMainForm::FormCreate(TObject *Sender)
563: {
564: Height=400; // Just incase we mess it up in the IDE
565: Width=700;
566:
567: if(putenv("TZ=UCT0")) {
568: Application->MessageBox("Error settings timezone"
569: ,"ERROR",MB_OK|MB_ICONEXCLAMATION);
570: Application->Terminate();
571: }
572: tzset();
573:
574: // Read Registry keys
575: TRegistry* Registry=new TRegistry;
576: if(!Registry->OpenKey(REG_KEY,true)) {
577: Application->MessageBox("Error opening registry key"
578: ,REG_KEY,MB_OK|MB_ICONEXCLAMATION);
579: Application->Terminate();
580: }
581: if(Registry->ValueExists("MainFormTop"))
582: Top=Registry->ReadInteger("MainFormTop");
583: if(Registry->ValueExists("MainFormLeft"))
584: Left=Registry->ReadInteger("MainFormLeft");
585: if(Registry->ValueExists("MainFormHeight"))
586: Height=Registry->ReadInteger("MainFormHeight");
587: if(Registry->ValueExists("MainFormWidth"))
588: Width=Registry->ReadInteger("MainFormWidth");
589: else
590: WindowState=wsMaximized; // Default to fullscreen
591:
592: if(Registry->ValueExists("SpyTerminalWidth"))
593: SpyTerminalWidth=Registry->ReadInteger("SpyTerminalWidth");
594: if(Registry->ValueExists("SpyTerminalHeight"))
595: SpyTerminalHeight=Registry->ReadInteger("SpyTerminalHeight");
596: if(Registry->ValueExists("SpyTerminalFontName"))
597: SpyTerminalFont->Name=Registry->ReadString("SpyTerminalFontName");
598: if(Registry->ValueExists("SpyTerminalFontSize"))
599: SpyTerminalFont->Size=Registry->ReadInteger("SpyTerminalFontSize");
600: if(Registry->ValueExists("SpyTerminalKeyboardActive"))
601: SpyTerminalKeyboardActive
602: =Registry->ReadBool("SpyTerminalKeyboardActive");
603:
604: Registry->CloseKey();
605: delete Registry;
606: }
607: //---------------------------------------------------------------------------
608: void __fastcall TMainForm::FormShow(TObject *Sender)
609: {
610: StartupTimer->Enabled=true;
611: }
612: //---------------------------------------------------------------------------
613:
614: void __fastcall TMainForm::ViewToolbarMenuItemClick(TObject *Sender)
615: {
616: Toolbar->Visible=!ViewToolbarMenuItem->Checked;
617: ViewToolbarMenuItem->Checked=Toolbar->Visible;
618: }
619: //---------------------------------------------------------------------------
620: void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)
621: {
622: SaveSettings(Sender);
623: }
624: //---------------------------------------------------------------------------
625: void __fastcall TMainForm::SaveSettings(TObject* Sender)
626: {
627: // Write Registry keys
628: TRegistry* Registry=new TRegistry;
629: if(!Registry->OpenKey(REG_KEY,true)) {
630: Application->MessageBox("Error creating registry key"
631: ,REG_KEY,MB_OK|MB_ICONEXCLAMATION);
632: Application->Terminate();
633: }
634:
635: Registry->WriteInteger("MainFormTop",Top);
636: Registry->WriteInteger("MainFormLeft",Left);
637: Registry->WriteInteger("MainFormHeight",Height);
638: Registry->WriteInteger("MainFormWidth",Width);
639:
640: Registry->WriteInteger("NodeFormTop",NodeForm->Top);
641: Registry->WriteInteger("NodeFormLeft",NodeForm->Left);
642: Registry->WriteInteger("NodeFormHeight",NodeForm->Height);
643: Registry->WriteInteger("NodeFormWidth",NodeForm->Width);
644:
645: Registry->WriteInteger("StatsFormTop",StatsForm->Top);
646: Registry->WriteInteger("StatsFormLeft",StatsForm->Left);
647: Registry->WriteInteger("StatsFormHeight",StatsForm->Height);
648: Registry->WriteInteger("StatsFormWidth",StatsForm->Width);
649:
650: Registry->WriteInteger("ClientFormTop",ClientForm->Top);
651: Registry->WriteInteger("ClientFormLeft",ClientForm->Left);
652: Registry->WriteInteger("ClientFormHeight",ClientForm->Height);
653: Registry->WriteInteger("ClientFormWidth",ClientForm->Width);
654:
655: Registry->WriteInteger("TelnetFormTop",TelnetForm->Top);
656: Registry->WriteInteger("TelnetFormLeft",TelnetForm->Left);
657: Registry->WriteInteger("TelnetFormHeight",TelnetForm->Height);
658: Registry->WriteInteger("TelnetFormWidth",TelnetForm->Width);
659:
660: Registry->WriteInteger("FtpFormTop",FtpForm->Top);
661: Registry->WriteInteger("FtpFormLeft",FtpForm->Left);
662: Registry->WriteInteger("FtpFormHeight",FtpForm->Height);
663: Registry->WriteInteger("FtpFormWidth",FtpForm->Width);
664:
665: Registry->WriteInteger("MailFormTop",MailForm->Top);
666: Registry->WriteInteger("MailFormLeft",MailForm->Left);
667: Registry->WriteInteger("MailFormHeight",MailForm->Height);
668: Registry->WriteInteger("MailFormWidth",MailForm->Width);
669:
670: Registry->WriteInteger("TopPanelHeight",TopPanel->Height);
671: Registry->WriteInteger("UpperLeftPageControlWidth"
672: ,UpperLeftPageControl->Width);
673: Registry->WriteInteger("LowerLeftPageControlWidth"
674: ,LowerLeftPageControl->Width);
675:
676: Registry->WriteBool("TelnetFormFloating",TelnetForm->Floating);
677: Registry->WriteBool("NodeFormFloating",NodeForm->Floating);
678: Registry->WriteBool("StatsFormFloating",StatsForm->Floating);
679: Registry->WriteBool("ClientFormFloating",ClientForm->Floating);
680: Registry->WriteBool("FtpFormFloating",FtpForm->Floating);
681: Registry->WriteBool("MailFormFloating",MailForm->Floating);
682:
683: Registry->WriteInteger("TelnetFormPage"
684: ,PageNum((TPageControl*)TelnetForm->HostDockSite));
685: Registry->WriteInteger("NodeFormPage"
686: ,PageNum((TPageControl*)NodeForm->HostDockSite));
687: Registry->WriteInteger("MailFormPage"
688: ,PageNum((TPageControl*)MailForm->HostDockSite));
689: Registry->WriteInteger("FtpFormPage"
690: ,PageNum((TPageControl*)FtpForm->HostDockSite));
691: Registry->WriteInteger("StatsFormPage"
692: ,PageNum((TPageControl*)StatsForm->HostDockSite));
693: Registry->WriteInteger("ClientFormPage"
694: ,PageNum((TPageControl*)ClientForm->HostDockSite));
695:
696: Registry->WriteBool("ToolBarVisible",Toolbar->Visible);
697: Registry->WriteBool("StatusBarVisible",StatusBar->Visible);
698:
699: Registry->WriteString("CtrlDirectory",CtrlDirectory);
700: Registry->WriteString("LoginCommand",LoginCommand);
701: Registry->WriteString("ConfigCommand",ConfigCommand);
702:
703: Registry->WriteInteger("SysAutoStart",SysAutoStart);
704: Registry->WriteInteger("MailAutoStart",MailAutoStart);
705: Registry->WriteInteger("FtpAutoStart",FtpAutoStart);
706: Registry->WriteInteger("MailLogFile",MailLogFile);
707: Registry->WriteInteger("FtpLogFile",FtpLogFile);
708:
709: Registry->WriteInteger("TelnetInterface",bbs_startup.telnet_interface);
710: Registry->WriteInteger("RLoginInterface",bbs_startup.rlogin_interface);
711:
712: Registry->WriteInteger("TelnetPort",bbs_startup.telnet_port);
713: Registry->WriteInteger("RLoginPort",bbs_startup.rlogin_port);
714: Registry->WriteInteger("FirstNode",bbs_startup.first_node);
715: Registry->WriteInteger("LastNode",bbs_startup.last_node);
716:
717: Registry->WriteString("AnswerSound",AnsiString(bbs_startup.answer_sound));
718: Registry->WriteString("HangupSound",AnsiString(bbs_startup.hangup_sound));
719:
720: Registry->WriteInteger("StartupOptions",bbs_startup.options);
721:
722: Registry->WriteInteger("MailMaxClients",mail_startup.max_clients);
723: Registry->WriteInteger("MailMaxInactivity",mail_startup.max_inactivity);
724: Registry->WriteInteger("MailInterface",mail_startup.interface_addr);
725: Registry->WriteInteger("MailMaxDeliveryAttempts"
726: ,mail_startup.max_delivery_attempts);
727: Registry->WriteInteger("MailRescanFrequency"
728: ,mail_startup.rescan_frequency);
729:
730: Registry->WriteInteger("MailSMTPPort",mail_startup.smtp_port);
731: Registry->WriteInteger("MailPOP3Port",mail_startup.pop3_port);
732:
733: Registry->WriteString("MailRelayServer",mail_startup.relay_server);
734: Registry->WriteString("MailDNSServer",mail_startup.dns_server);
735:
736: Registry->WriteString("MailInboundSound",AnsiString(mail_startup.inbound_sound));
737: Registry->WriteString("MailOutboundSound",AnsiString(mail_startup.outbound_sound));
738: Registry->WriteInteger("MailOptions",mail_startup.options);
739:
740: Registry->WriteString("MailPOP3Sound",AnsiString(mail_startup.pop3_sound));
741:
742: Registry->WriteInteger("FtpPort",ftp_startup.port);
743: Registry->WriteInteger("FtpMaxClients",ftp_startup.max_clients);
744: Registry->WriteInteger("FtpMaxInactivity",ftp_startup.max_inactivity);
745: Registry->WriteInteger("FtpInterface",ftp_startup.interface_addr);
746: Registry->WriteString("FtpAnswerSound",AnsiString(ftp_startup.answer_sound));
747: Registry->WriteString("FtpHangupSound",AnsiString(ftp_startup.hangup_sound));
748: Registry->WriteString("FtpIndexFileName"
749: ,AnsiString(ftp_startup.index_file_name));
750: Registry->WriteInteger("FtpOptions",ftp_startup.options);
751:
752: Registry->WriteInteger( "SpyTerminalWidth"
753: ,SpyTerminalWidth);
754: Registry->WriteInteger( "SpyTerminalHeight"
755: ,SpyTerminalHeight);
756: Registry->WriteString( "SpyTerminalFontName"
757: ,SpyTerminalFont->Name);
758: Registry->WriteInteger( "SpyTerminalFontSize"
759: ,SpyTerminalFont->Size);
760: Registry->WriteBool( "SpyTerminalKeyboardActive"
761: ,SpyTerminalKeyboardActive);
762:
763: Registry->CloseKey();
764: delete Registry;
765:
766: }
767: //---------------------------------------------------------------------------
768:
769: void __fastcall TMainForm::FormCloseQuery(TObject *Sender, bool &CanClose)
770: {
771: CanClose=true;
772:
773: if(TelnetStop->Enabled) {
774: CanClose=false;
775: if(TelnetForm->ProgressBar->Position
776: && Application->MessageBox("Shut down the Telnet Server?"
777: ,"Telnet Server In Use", MB_OKCANCEL)!=IDOK)
778: return;
779: TelnetStopExecute(Sender);
780: }
781:
782: if(MailStop->Enabled) {
783: CanClose=false;
784: if(MailForm->ProgressBar->Position
785: && Application->MessageBox("Shut down the Mail Server?"
786: ,"Mail Server In Use", MB_OKCANCEL)!=IDOK)
787: return;
788: MailStopExecute(Sender);
789: }
790:
791: if(FtpStop->Enabled) {
792: CanClose=false;
793: if(FtpForm->ProgressBar->Position
794: && Application->MessageBox("Shut down the FTP Server?"
795: ,"FTP Server In Use", MB_OKCANCEL)!=IDOK)
796: return;
797: FtpStopExecute(Sender);
798: }
799:
800: if(CanClose==false)
801: CloseTimer->Enabled=true;
802: }
803: //---------------------------------------------------------------------------
804:
805: void __fastcall TMainForm::TelnetStartExecute(TObject *Sender)
806: {
807: bbs_start();
808: }
809: //---------------------------------------------------------------------------
810:
811: void __fastcall TMainForm::TelnetStopExecute(TObject *Sender)
812: {
813: Screen->Cursor=crAppStart;
814: bbs_status("Terminating");
815: bbs_terminate();
816: }
817: //---------------------------------------------------------------------------
818:
819: void __fastcall TMainForm::TelnetConfigureExecute(TObject *Sender)
820: {
821: Application->CreateForm(__classid(TTelnetCfgDlg), &TelnetCfgDlg);
822: TelnetCfgDlg->ShowModal();
823: delete TelnetCfgDlg;
824: }
825: //---------------------------------------------------------------------------
826:
827:
828: void __fastcall TMainForm::NodeListStartExecute(TObject *Sender)
829: {
830: NodeForm->Timer->Enabled=true;
831: NodeListStart->Enabled=false;
832: NodeListStop->Enabled=true;
833: }
834: //---------------------------------------------------------------------------
835:
836: void __fastcall TMainForm::NodeListStopExecute(TObject *Sender)
837: {
838: NodeForm->Timer->Enabled=false;
839: NodeListStart->Enabled=true;
840: NodeListStop->Enabled=false;
841: }
842: //---------------------------------------------------------------------------
843:
844:
845: void __fastcall TMainForm::MailConfigureExecute(TObject *Sender)
846: {
847: Application->CreateForm(__classid(TMailCfgDlg), &MailCfgDlg);
848: MailCfgDlg->ShowModal();
849: delete MailCfgDlg;
850: }
851: //---------------------------------------------------------------------------
852:
853: void __fastcall TMainForm::MailStartExecute(TObject *Sender)
854: {
855: mail_start();
856: }
857: //---------------------------------------------------------------------------
858:
859: void __fastcall TMainForm::MailStopExecute(TObject *Sender)
860: {
861: Screen->Cursor=crAppStart;
862: mail_status("Terminating");
863: mail_terminate();
864: }
865: //---------------------------------------------------------------------------
866:
867: void __fastcall TMainForm::ViewTelnetExecute(TObject *Sender)
868: {
869: TelnetForm->Visible=!TelnetForm->Visible;
870: ViewTelnet->Checked=TelnetForm->Visible;
871: }
872: //---------------------------------------------------------------------------
873:
874: void __fastcall TMainForm::ViewNodesExecute(TObject *Sender)
875: {
876: NodeForm->Visible=!NodeForm->Visible;
877: ViewNodes->Checked=NodeForm->Visible;
878: }
879: //---------------------------------------------------------------------------
880:
881: void __fastcall TMainForm::ViewMailServerExecute(TObject *Sender)
882: {
883: MailForm->Visible=!MailForm->Visible;
884: ViewMailServer->Checked=MailForm->Visible;
885: }
886: //---------------------------------------------------------------------------
887:
888: void __fastcall TMainForm::ViewFtpServerExecute(TObject *Sender)
889: {
890: FtpForm->Visible=!FtpForm->Visible;
891: ViewFtpServer->Checked=FtpForm->Visible;
892: }
893: //---------------------------------------------------------------------------
894:
895: void __fastcall TMainForm::FtpStartExecute(TObject *Sender)
896: {
897: ftp_start();
898: }
899: //---------------------------------------------------------------------------
900:
901: void __fastcall TMainForm::FtpStopExecute(TObject *Sender)
902: {
903: Screen->Cursor=crAppStart;
904: ftp_status("Terminating");
905: ftp_terminate();
906: }
907: //---------------------------------------------------------------------------
908:
909: void __fastcall TMainForm::FtpConfigureExecute(TObject *Sender)
910: {
911: Application->CreateForm(__classid(TFtpCfgDlg), &FtpCfgDlg);
912: FtpCfgDlg->ShowModal();
913: delete FtpCfgDlg;
914: }
915: //---------------------------------------------------------------------------
916:
917: void __fastcall TMainForm::CloseTimerTimer(TObject *Sender)
918: {
919: if(!TelnetStop->Enabled && !MailStop->Enabled && !FtpStop->Enabled)
920: Close();
921: }
922: //---------------------------------------------------------------------------
923:
924: void __fastcall TMainForm::BBSConfigureMenuItemClick(TObject *Sender)
925: {
926: char str[256];
927:
928: sprintf(str,ConfigCommand.c_str()
929: ,cfg.exec_dir, cfg.ctrl_dir);
930: STARTUPINFO startup_info={0};
931: PROCESS_INFORMATION process_info;
932: startup_info.cb=sizeof(startup_info);
933: CreateProcess(
934: NULL, // pointer to name of executable module
935: str, // pointer to command line string
936: NULL, // process security attributes
937: NULL, // thread security attributes
938: TRUE, // handle inheritance flag
939: CREATE_NEW_CONSOLE|CREATE_SEPARATE_WOW_VDM, // creation flags
940: NULL, // pointer to new environment block
941: cfg.ctrl_dir, // pointer to current directory name
942: &startup_info, // pointer to STARTUPINFO
943: &process_info // pointer to PROCESS_INFORMATION
944: );
945: }
946: //---------------------------------------------------------------------------
947:
948:
949:
950:
951: void __fastcall TMainForm::NodeCloseButtonClick(TObject *Sender)
952: {
953: ViewNodesExecute(Sender);
954: }
955: //---------------------------------------------------------------------------
956:
957: void __fastcall TMainForm::TelnetCloseButtonClick(TObject *Sender)
958: {
959: ViewTelnetExecute(Sender);
960: }
961: //---------------------------------------------------------------------------
962:
963: void __fastcall TMainForm::MailCloseButtonClick(TObject *Sender)
964: {
965: ViewMailServerExecute(Sender);
966: }
967: //---------------------------------------------------------------------------
968:
969: void __fastcall TMainForm::FtpCloseButtonClick(TObject *Sender)
970: {
971: ViewFtpServerExecute(Sender);
972: }
973: //---------------------------------------------------------------------------
974:
975:
976: #define STAT_DESC_LEN 23
977:
978: void __fastcall TMainForm::StatsTimerTick(TObject *Sender)
979: {
980: char str[128];
981: int i;
982: static stats_t stats;
983:
984: getstats(&cfg,0,&stats);
985:
986: #if 0
987: for(i=0;i<8;i++) {
988: str[0];
989: switch(i) {
990: case 0:
991: sprintf(str,"%*s %lu Total: %lu"
992: ,STAT_DESC_LEN,"Logons Today:"
993: ,stats.ltoday,stats.logons);
994: break;
995: case 1:
996: sprintf(str,"%*s %lu Total: %lu"
997: ,STAT_DESC_LEN,"Time Used Today:"
998: ,stats.ttoday,stats.timeon);
999: break;
1000: case 2:
1001: sprintf(str,"%*s %lu bytes in %lu files"
1002: ,STAT_DESC_LEN,"Uploads Today:"
1003: ,stats.ulb,stats.uls);
1004: break;
1005: case 3:
1006: sprintf(str,"%*s %lu bytes in %lu files"
1007: ,STAT_DESC_LEN,"Downloads Today:"
1008: ,stats.dlb,stats.dls);
1009: break;
1010: case 4:
1011: sprintf(str,"%*s %lu"
1012: ,STAT_DESC_LEN,"Messages Posted Today:"
1013: ,stats.ptoday);
1014: break;
1015: case 5:
1016: sprintf(str,"%*s %lu Total: %lu"
1017: ,STAT_DESC_LEN,"E-mail Sent Today:"
1018: ,stats.etoday,getmail(&cfg,0,0));
1019: break;
1020: case 6:
1021: sprintf(str,"%*s %lu Total: %lu"
1022: ,STAT_DESC_LEN,"Feedback Sent Today:"
1023: ,stats.ftoday,getmail(&cfg,1,0));
1024: break;
1025: case 7:
1026: sprintf(str,"%*s %hu Total: %lu"
1027: ,STAT_DESC_LEN,"New Users Today:"
1028: ,stats.nusers,lastuser(&cfg));
1029: break;
1030: }
1031: if(!str[0])
1032: break;
1033:
1034: AnsiString Str=AnsiString(str);
1035:
1036: if(StatsForm->ListBox->Items->Count<i+1)
1037: StatsForm->ListBox->Items->Add(Str);
1038: else if(StatsForm->ListBox->Items->Strings[i]!=Str)
1039: StatsForm->ListBox->Items->Strings[i]=str;
1040: }
1041: #else
1042:
1043: StatsForm->TotalLogons->Caption=AnsiString(stats.logons);
1044: StatsForm->LogonsToday->Caption=AnsiString(stats.ltoday);
1045: StatsForm->TotalTimeOn->Caption=AnsiString(stats.timeon);
1046: StatsForm->TimeToday->Caption=AnsiString(stats.ttoday);
1047: StatsForm->TotalEMail->Caption=AnsiString(getmail(&cfg,0,0));
1048: StatsForm->EMailToday->Caption=AnsiString(stats.etoday);
1049: StatsForm->TotalFeedback->Caption=AnsiString(getmail(&cfg,1,0));
1050: StatsForm->FeedbackToday->Caption=AnsiString(stats.ftoday);
1051: StatsForm->TotalUsers->Caption=AnsiString(lastuser(&cfg));
1052: StatsForm->NewUsersToday->Caption=AnsiString(stats.nusers);
1053: StatsForm->PostsToday->Caption=AnsiString(stats.ptoday);
1054: StatsForm->UploadedFiles->Caption=AnsiString(stats.uls);
1055: if(stats.ulb>=1024*1024)
1056: sprintf(str,"%.1fM",stats.ulb/(1024.0*1024.0));
1057: else if(stats.ulb>=1024)
1058: sprintf(str,"%luK",stats.ulb/1024);
1059: else
1060: sprintf(str,"%lu",stats.ulb);
1061: StatsForm->UploadedBytes->Caption=AnsiString(str);
1062: StatsForm->DownloadedFiles->Caption=AnsiString(stats.dls);
1063: if(stats.dlb>=1024*1024)
1064: sprintf(str,"%.1fM",stats.dlb/(1024.0*1024.0));
1065: else if(stats.dlb>=1024)
1066: sprintf(str,"%luK",stats.dlb/1024);
1067: else
1068: sprintf(str,"%lu",stats.dlb);
1069: StatsForm->DownloadedBytes->Caption=AnsiString(str);
1070:
1071: #endif
1072: }
1073: //---------------------------------------------------------------------------
1074:
1075: void __fastcall TMainForm::ViewStatsExecute(TObject *Sender)
1076: {
1077: StatsForm->Visible=!StatsForm->Visible;
1078: ViewStats->Checked=StatsForm->Visible;
1079: }
1080: //---------------------------------------------------------------------------
1081:
1082: void __fastcall TMainForm::StatsCloseButtonClick(TObject *Sender)
1083: {
1084: ViewStatsExecute(Sender);
1085: }
1086: //---------------------------------------------------------------------------
1087: enum {
1088: PAGE_UPPERLEFT
1089: ,PAGE_UPPERRIGHT
1090: ,PAGE_LOWERRIGHT
1091: ,PAGE_LOWERLEFT
1092: };
1093: TPageControl* __fastcall TMainForm::PageControl(int num)
1094: {
1095: switch(num)
1096: {
1097: case PAGE_UPPERLEFT:
1098: return(UpperLeftPageControl);
1099: case PAGE_UPPERRIGHT:
1100: return(UpperRightPageControl);
1101: case PAGE_LOWERRIGHT:
1102: return(LowerRightPageControl);
1103: case PAGE_LOWERLEFT:
1104: return(LowerLeftPageControl);
1105: }
1106: return(NULL);
1107: }
1108: int __fastcall TMainForm::PageNum(TPageControl* obj)
1109: {
1110: if(obj==UpperLeftPageControl)
1111: return(PAGE_UPPERLEFT);
1112: if(obj==UpperRightPageControl)
1113: return(PAGE_UPPERRIGHT);
1114: if(obj==LowerRightPageControl)
1115: return(PAGE_LOWERRIGHT);
1116: if(obj==LowerLeftPageControl)
1117: return(PAGE_LOWERLEFT);
1118: return(PAGE_LOWERRIGHT);
1119: }
1120: void __fastcall TMainForm::StartupTimerTick(TObject *Sender)
1121: {
1122: bool TelnetFormFloating=false;
1123: bool NodeFormFloating=false;
1124: bool StatsFormFloating=false;
1125: bool ClientFormFloating=false;
1126: bool MailFormFloating=false;
1127: bool FtpFormFloating=false;
1128: int NodeFormPage=PAGE_UPPERLEFT;
1129: int StatsFormPage=PAGE_UPPERLEFT;
1130: int ClientFormPage=PAGE_UPPERLEFT;
1131: int TelnetFormPage=PAGE_LOWERLEFT;
1132: int MailFormPage=PAGE_UPPERRIGHT;
1133: int FtpFormPage=PAGE_LOWERRIGHT;
1134:
1135: AnsiString Str;
1136:
1137: delete StartupTimer;
1138:
1139: // Read Registry keys
1140: TRegistry* Registry=new TRegistry;
1141: if(!Registry->OpenKey(REG_KEY,true)) {
1142: Application->MessageBox("Error opening registry key"
1143: ,REG_KEY,MB_OK|MB_ICONEXCLAMATION);
1144: Application->Terminate();
1145: }
1146:
1147: TopPanel->Height=Height/3;
1148: UpperLeftPageControl->Width=Width/2;
1149: LowerLeftPageControl->Width=Width/2;
1150:
1151: if(Registry->ValueExists("TopPanelHeight"))
1152: TopPanel->Height=Registry->ReadInteger("TopPanelHeight");
1153: if(Registry->ValueExists("UpperLeftPageControlWidth"))
1154: UpperLeftPageControl->Width
1155: =Registry->ReadInteger("UpperLeftPageControlWidth");
1156: if(Registry->ValueExists("LowerLeftPageControlWidth"))
1157: LowerLeftPageControl->Width
1158: =Registry->ReadInteger("LowerLeftPageControlWidth");
1159:
1160: if(Registry->ValueExists("TelnetFormFloating"))
1161: TelnetFormFloating=Registry->ReadBool("TelnetFormFloating");
1162: if(Registry->ValueExists("NodeFormFloating"))
1163: NodeFormFloating=Registry->ReadBool("NodeFormFloating");
1164: if(Registry->ValueExists("StatsFormFloating"))
1165: StatsFormFloating=Registry->ReadBool("StatsFormFloating");
1166: if(Registry->ValueExists("ClientFormFloating"))
1167: ClientFormFloating=Registry->ReadBool("ClientFormFloating");
1168: if(Registry->ValueExists("MailFormFloating"))
1169: MailFormFloating=Registry->ReadBool("MailFormFloating");
1170: if(Registry->ValueExists("FtpFormFloating"))
1171: FtpFormFloating=Registry->ReadBool("FtpFormFloating");
1172:
1173: if(Registry->ValueExists("TelnetFormPage"))
1174: TelnetFormPage=Registry->ReadInteger("TelnetFormPage");
1175: if(Registry->ValueExists("NodeFormPage"))
1176: NodeFormPage=Registry->ReadInteger("NodeFormPage");
1177: if(Registry->ValueExists("StatsFormPage"))
1178: StatsFormPage=Registry->ReadInteger("StatsFormPage");
1179: if(Registry->ValueExists("ClientFormPage"))
1180: ClientFormPage=Registry->ReadInteger("ClientFormPage");
1181: if(Registry->ValueExists("MailFormPage"))
1182: MailFormPage=Registry->ReadInteger("MailFormPage");
1183: if(Registry->ValueExists("FtpFormPage"))
1184: FtpFormPage=Registry->ReadInteger("FtpFormPage");
1185:
1186: if(Registry->ValueExists("TelnetFormTop"))
1187: TelnetForm->Top=Registry->ReadInteger("TelnetFormTop");
1188: if(Registry->ValueExists("TelnetFormLeft"))
1189: TelnetForm->Left=Registry->ReadInteger("TelnetFormLeft");
1190: if(Registry->ValueExists("TelnetFormWidth"))
1191: TelnetForm->Width=Registry->ReadInteger("TelnetFormWidth");
1192: if(Registry->ValueExists("TelnetFormHeight"))
1193: TelnetForm->Height=Registry->ReadInteger("TelnetFormHeight");
1194:
1195: if(Registry->ValueExists("FtpFormTop"))
1196: FtpForm->Top=Registry->ReadInteger("FtpFormTop");
1197: if(Registry->ValueExists("FtpFormLeft"))
1198: FtpForm->Left=Registry->ReadInteger("FtpFormLeft");
1199: if(Registry->ValueExists("FtpFormWidth"))
1200: FtpForm->Width=Registry->ReadInteger("FtpFormWidth");
1201: if(Registry->ValueExists("FtpFormHeight"))
1202: FtpForm->Height=Registry->ReadInteger("FtpFormHeight");
1203:
1204: if(Registry->ValueExists("MailFormTop"))
1205: MailForm->Top=Registry->ReadInteger("MailFormTop");
1206: if(Registry->ValueExists("MailFormLeft"))
1207: MailForm->Left=Registry->ReadInteger("MailFormLeft");
1208: if(Registry->ValueExists("MailFormWidth"))
1209: MailForm->Width=Registry->ReadInteger("MailFormWidth");
1210: if(Registry->ValueExists("MailFormHeight"))
1211: MailForm->Height=Registry->ReadInteger("MailFormHeight");
1212:
1213: if(Registry->ValueExists("NodeFormTop"))
1214: NodeForm->Top=Registry->ReadInteger("NodeFormTop");
1215: if(Registry->ValueExists("NodeFormLeft"))
1216: NodeForm->Left=Registry->ReadInteger("NodeFormLeft");
1217: if(Registry->ValueExists("NodeFormWidth"))
1218: NodeForm->Width=Registry->ReadInteger("NodeFormWidth");
1219: if(Registry->ValueExists("NodeFormHeight"))
1220: NodeForm->Height=Registry->ReadInteger("NodeFormHeight");
1221:
1222: if(Registry->ValueExists("StatsFormTop"))
1223: StatsForm->Top=Registry->ReadInteger("StatsFormTop");
1224: if(Registry->ValueExists("StatsFormLeft"))
1225: StatsForm->Left=Registry->ReadInteger("StatsFormLeft");
1226: if(Registry->ValueExists("StatsFormWidth"))
1227: StatsForm->Width=Registry->ReadInteger("StatsFormWidth");
1228: if(Registry->ValueExists("StatsFormHeight"))
1229: StatsForm->Height=Registry->ReadInteger("StatsFormHeight");
1230:
1231: if(Registry->ValueExists("ClientFormTop"))
1232: ClientForm->Top=Registry->ReadInteger("ClientFormTop");
1233: if(Registry->ValueExists("ClientFormLeft"))
1234: ClientForm->Left=Registry->ReadInteger("ClientFormLeft");
1235: if(Registry->ValueExists("ClientFormWidth"))
1236: ClientForm->Width=Registry->ReadInteger("ClientFormWidth");
1237: if(Registry->ValueExists("ClientFormHeight"))
1238: ClientForm->Height=Registry->ReadInteger("ClientFormHeight");
1239:
1240: if(Registry->ValueExists("ToolbarVisible"))
1241: Toolbar->Visible=Registry->ReadBool("ToolbarVisible");
1242:
1243: if(Registry->ValueExists("SysAutoStart"))
1244: SysAutoStart=Registry->ReadInteger("SysAutoStart");
1245: else
1246: SysAutoStart=true;
1247:
1248: if(Registry->ValueExists("MailAutoStart"))
1249: MailAutoStart=Registry->ReadInteger("MailAutoStart");
1250: else
1251: MailAutoStart=true;
1252:
1253: if(Registry->ValueExists("FtpAutoStart"))
1254: FtpAutoStart=Registry->ReadInteger("FtpAutoStart");
1255: else
1256: FtpAutoStart=true;
1257:
1258: ViewToolbarMenuItem->Checked=Toolbar->Visible;
1259: ViewStatusBarMenuItem->Checked=StatusBar->Visible;
1260:
1261: if(Registry->ValueExists("CtrlDirectory"))
1262: CtrlDirectory=Registry->ReadString("CtrlDirectory");
1263: if(Registry->ValueExists("LoginCommand"))
1264: LoginCommand=Registry->ReadString("LoginCommand");
1265: if(Registry->ValueExists("ConfigCommand"))
1266: ConfigCommand=Registry->ReadString("ConfigCommand");
1267:
1268: if(Registry->ValueExists("MailLogFile"))
1269: MailLogFile=Registry->ReadInteger("MailLogFile");
1270: else
1271: MailLogFile=true;
1272:
1273: if(Registry->ValueExists("FtpLogFile"))
1274: FtpLogFile=Registry->ReadInteger("FtpLogFile");
1275: else
1276: FtpLogFile=true;
1277:
1278: if(Registry->ValueExists("TelnetInterface"))
1279: bbs_startup.telnet_interface=Registry->ReadInteger("TelnetInterface");
1280: if(Registry->ValueExists("RLoginInterface"))
1281: bbs_startup.rlogin_interface=Registry->ReadInteger("RLoginInterface");
1282:
1283: if(Registry->ValueExists("TelnetPort"))
1284: bbs_startup.telnet_port=Registry->ReadInteger("TelnetPort");
1285: if(Registry->ValueExists("RLoginPort"))
1286: bbs_startup.rlogin_port=Registry->ReadInteger("RLoginPort");
1287:
1288: if(Registry->ValueExists("FirstNode"))
1289: bbs_startup.first_node=Registry->ReadInteger("FirstNode");
1290:
1291: if(Registry->ValueExists("LastNode"))
1292: bbs_startup.last_node=Registry->ReadInteger("LastNode");
1293:
1294: if(Registry->ValueExists("AnswerSound"))
1295: sprintf(bbs_startup.answer_sound,"%.*s"
1296: ,sizeof(bbs_startup.answer_sound)-1
1297: ,Registry->ReadString("AnswerSound").c_str());
1298:
1299: if(Registry->ValueExists("HangupSound"))
1300: sprintf(bbs_startup.hangup_sound,"%.*s"
1301: ,sizeof(bbs_startup.hangup_sound)-1
1302: ,Registry->ReadString("HangupSound").c_str());
1303:
1304: if(Registry->ValueExists("StartupOptions"))
1305: bbs_startup.options=Registry->ReadInteger("StartupOptions");
1306:
1307: if(Registry->ValueExists("MailMaxClients"))
1308: mail_startup.max_clients=Registry->ReadInteger("MailMaxClients");
1309:
1310: if(Registry->ValueExists("MailMaxInactivity"))
1311: mail_startup.max_inactivity=Registry->ReadInteger("MailMaxInactivity");
1312:
1313: if(Registry->ValueExists("MailInterface"))
1314: mail_startup.interface_addr=Registry->ReadInteger("MailInterface");
1315:
1316: if(Registry->ValueExists("MailMaxDeliveryAttempts"))
1317: mail_startup.max_delivery_attempts
1318: =Registry->ReadInteger("MailMaxDeliveryAttempts");
1319:
1320: if(Registry->ValueExists("MailRescanFrequency"))
1321: mail_startup.rescan_frequency
1322: =Registry->ReadInteger("MailRescanFrequency");
1323:
1324: if(Registry->ValueExists("MailSMTPPort"))
1325: mail_startup.smtp_port=Registry->ReadInteger("MailSMTPPort");
1326:
1327: if(Registry->ValueExists("MailPOP3Port"))
1328: mail_startup.pop3_port=Registry->ReadInteger("MailPOP3Port");
1329:
1330: if(Registry->ValueExists("MailRelayServer"))
1331: sprintf(mail_startup.relay_server,"%.*s"
1332: ,sizeof(mail_startup.relay_server)-1
1333: ,Registry->ReadString("MailRelayServer").c_str());
1334:
1335: if(Registry->ValueExists("MailDNSServer"))
1336: sprintf(mail_startup.dns_server,"%.*s"
1337: ,sizeof(mail_startup.dns_server)-1
1338: ,Registry->ReadString("MailDNSServer").c_str());
1339:
1340: if(Registry->ValueExists("MailInboundSound"))
1341: sprintf(mail_startup.inbound_sound,"%.*s"
1342: ,sizeof(mail_startup.inbound_sound)-1
1343: ,Registry->ReadString("MailInboundSound").c_str());
1344:
1345: if(Registry->ValueExists("MailOutboundSound"))
1346: sprintf(mail_startup.outbound_sound,"%.*s"
1347: ,sizeof(mail_startup.outbound_sound)-1
1348: ,Registry->ReadString("MailOutboundSound").c_str());
1349:
1350: if(Registry->ValueExists("MailPOP3Sound"))
1351: sprintf(mail_startup.pop3_sound,"%.*s"
1352: ,sizeof(mail_startup.pop3_sound)-1
1353: ,Registry->ReadString("MailPOP3Sound").c_str());
1354:
1355: if(Registry->ValueExists("MailOptions"))
1356: mail_startup.options=Registry->ReadInteger("MailOptions");
1357:
1358: if(Registry->ValueExists("FtpMaxClients"))
1359: ftp_startup.max_clients=Registry->ReadInteger("FtpMaxClients");
1360:
1361: if(Registry->ValueExists("FtpMaxInactivity"))
1362: ftp_startup.max_inactivity=Registry->ReadInteger("FtpMaxInactivity");
1363:
1364: if(Registry->ValueExists("FtpInterface"))
1365: ftp_startup.interface_addr=Registry->ReadInteger("FtpInterface");
1366:
1367: if(Registry->ValueExists("FtpPort"))
1368: ftp_startup.port=Registry->ReadInteger("FtpPort");
1369:
1370: if(Registry->ValueExists("FtpAnswerSound"))
1371: sprintf(ftp_startup.answer_sound,"%.*s"
1372: ,sizeof(ftp_startup.answer_sound)-1
1373: ,Registry->ReadString("FtpAnswerSound").c_str());
1374:
1375: if(Registry->ValueExists("FtpHangupSound"))
1376: sprintf(ftp_startup.hangup_sound,"%.*s"
1377: ,sizeof(ftp_startup.hangup_sound)-1
1378: ,Registry->ReadString("FtpHangupSound").c_str());
1379:
1380: if(Registry->ValueExists("FtpIndexFileName"))
1381: sprintf(ftp_startup.index_file_name,"%.*s"
1382: ,sizeof(ftp_startup.index_file_name)-1
1383: ,Registry->ReadString("FtpIndexFileName").c_str());
1384:
1385: if(Registry->ValueExists("FtpOptions"))
1386: ftp_startup.options=Registry->ReadInteger("FtpOptions");
1387:
1388: Registry->CloseKey();
1389: delete Registry;
1390:
1391: if(!FileExists(CtrlDirectory+"MAIN.CNF")) {
1392: Sleep(3000); // Let 'em see the logo for a bit
1393: Application->CreateForm(__classid(TCtrlPathDialog), &CtrlPathDialog);
1394: if(CtrlPathDialog->ShowModal()!=mrOk) {
1395: Application->Terminate();
1396: return;
1397: }
1398: CtrlDirectory=CtrlPathDialog->Edit->Text;
1399: delete CtrlPathDialog;
1400: }
1401: if(CtrlDirectory.UpperCase().AnsiPos("MAIN.CNF"))
1402: CtrlDirectory.SetLength(CtrlDirectory.Length()-8);
1403: strcpy(cfg.ctrl_dir,CtrlDirectory.c_str());
1404: if(!load_cfg(&cfg, NULL)) {
1405: Application->MessageBox("Failed to load configuration files.","ERROR"
1406: ,MB_OK|MB_ICONEXCLAMATION);
1407: Application->Terminate();
1408: return;
1409: }
1410:
1411: if(bbs_startup.options&BBS_OPT_MUTE)
1412: SoundToggle->Checked=false;
1413: else
1414: SoundToggle->Checked=true;
1415:
1416: if(bbs_startup.options&BBS_OPT_SYSOP_AVAILABLE)
1417: ChatToggle->Checked=true;
1418: else
1419: ChatToggle->Checked=false;
1420:
1421: if(!NodeFormFloating)
1422: NodeForm->ManualDock(PageControl(NodeFormPage),NULL,alClient);
1423: if(!ClientFormFloating)
1424: ClientForm->ManualDock(PageControl(ClientFormPage),NULL,alClient);
1425: if(!StatsFormFloating)
1426: StatsForm->ManualDock(PageControl(StatsFormPage),NULL,alClient);
1427: if(!MailFormFloating)
1428: MailForm->ManualDock(PageControl(MailFormPage),NULL,alClient);
1429: if(!TelnetFormFloating)
1430: TelnetForm->ManualDock(PageControl(TelnetFormPage),NULL,alClient);
1431: if(!FtpFormFloating)
1432: FtpForm->ManualDock(PageControl(FtpFormPage),NULL,alClient);
1433:
1434: NodeForm->Show();
1435: ClientForm->Show();
1436: StatsForm->Show();
1437: TelnetForm->Show();
1438: FtpForm->Show();
1439: MailForm->Show();
1440:
1441: UpperLeftPageControl->Visible=true;
1442: UpperRightPageControl->Visible=true;
1443: LowerLeftPageControl->Visible=true;
1444: LowerRightPageControl->Visible=true;
1445: HorizontalSplitter->Visible=true;
1446: BottomPanel->Visible=true;
1447: TopPanel->Visible=true;
1448:
1449: // Work-around for CB5 PageControl anomaly
1450: int i;
1451:
1452: for(i=1;i<UpperLeftPageControl->PageCount;i++)
1453: UpperLeftPageControl->ActivePageIndex=i;
1454: UpperLeftPageControl->ActivePageIndex=0;
1455:
1456: for(i=1;i<UpperRightPageControl->PageCount;i++)
1457: UpperRightPageControl->ActivePageIndex=i;
1458: UpperRightPageControl->ActivePageIndex=0;
1459:
1460: for(i=1;i<LowerRightPageControl->PageCount;i++)
1461: LowerRightPageControl->ActivePageIndex=i;
1462: LowerRightPageControl->ActivePageIndex=0;
1463:
1464: for(i=1;i<LowerLeftPageControl->PageCount;i++)
1465: LowerLeftPageControl->ActivePageIndex=i;
1466: LowerLeftPageControl->ActivePageIndex=0;
1467:
1468: if(SysAutoStart) {
1469: bbs_start();
1470: }
1471: if(MailAutoStart) {
1472: mail_start();
1473: }
1474: if(FtpAutoStart) {
1475: ftp_start();
1476: }
1477: NodeForm->Timer->Enabled=true;
1478: StatsTimer->Enabled=true;
1479: }
1480: //---------------------------------------------------------------------------
1481:
1482: void __fastcall TMainForm::ViewStatusBarMenuItemClick(TObject *Sender)
1483: {
1484: StatusBar->Visible=!StatusBar->Visible;
1485: ViewStatusBarMenuItem->Checked=StatusBar->Visible;
1486: }
1487: //---------------------------------------------------------------------------
1488:
1489:
1490: void __fastcall TMainForm::HelpAboutMenuItemClick(TObject *Sender)
1491: {
1492: Application->CreateForm(__classid(TAboutBoxForm), &AboutBoxForm);
1493: AboutBoxForm->ShowModal();
1494: delete AboutBoxForm;
1495: }
1496: //---------------------------------------------------------------------------
1497:
1498:
1499:
1500: void __fastcall TMainForm::SoundToggleExecute(TObject *Sender)
1501: {
1502: SoundToggle->Checked=!SoundToggle->Checked;
1503: if(!SoundToggle->Checked) {
1504: bbs_startup.options|=BBS_OPT_MUTE;
1505: ftp_startup.options|=FTP_OPT_MUTE;
1506: mail_startup.options|=MAIL_OPT_MUTE;
1507: } else {
1508: bbs_startup.options&=~BBS_OPT_MUTE;
1509: ftp_startup.options&=~FTP_OPT_MUTE;
1510: mail_startup.options&=~MAIL_OPT_MUTE;
1511: }
1512: }
1513: //---------------------------------------------------------------------------
1514:
1515:
1516:
1517: void __fastcall TMainForm::BBSStatisticsLogMenuItemClick(TObject *Sender)
1518: {
1519: StatsForm->LogButtonClick(Sender);
1520: }
1521: //---------------------------------------------------------------------------
1522:
1523: void __fastcall TMainForm::ForceTimedEventMenuItemClick(TObject *Sender)
1524: {
1525: int i,file;
1526: char str[MAX_PATH+1];
1527:
1528: Application->CreateForm(__classid(TCodeInputForm), &CodeInputForm);
1529: CodeInputForm->Label->Caption="Event Internal Code";
1530: if(cfg.total_events)
1531: CodeInputForm->Edit->Text=AnsiString(cfg.event[0]->code);
1532: if(CodeInputForm->ShowModal()==mrOk
1533: && CodeInputForm->Edit->Text.Length()) {
1534: for(i=0;i<cfg.total_events;i++) {
1535: if(!stricmp(CodeInputForm->Edit->Text.c_str(),cfg.event[i]->code)) {
1536: sprintf(str,"%s%s.now",cfg.data_dir,cfg.event[i]->code);
1537: if((file=_sopen(str,O_CREAT|O_TRUNC|O_WRONLY
1538: ,SH_DENYRW,S_IREAD|S_IWRITE))!=-1)
1539: close(file);
1540: break;
1541: }
1542: }
1543: if(i>=cfg.total_events)
1544: Application->MessageBox("Event Code Not Found"
1545: ,CodeInputForm->Edit->Text.c_str(),MB_OK|MB_ICONEXCLAMATION);
1546: }
1547: delete CodeInputForm;
1548: }
1549: //---------------------------------------------------------------------------
1550:
1551: void __fastcall TMainForm::ForceNetworkCalloutMenuItemClick(
1552: TObject *Sender)
1553: {
1554: int i,file;
1555: char str[MAX_PATH+1];
1556:
1557: Application->CreateForm(__classid(TCodeInputForm), &CodeInputForm);
1558: CodeInputForm->Label->Caption="Hub QWK-ID";
1559: if(cfg.total_qhubs)
1560: CodeInputForm->Edit->Text=AnsiString(cfg.qhub[0]->id);
1561: if(CodeInputForm->ShowModal()==mrOk
1562: && CodeInputForm->Edit->Text.Length()) {
1563: for(i=0;i<cfg.total_qhubs;i++) {
1564: if(!stricmp(CodeInputForm->Edit->Text.c_str(),cfg.qhub[i]->id)) {
1565: sprintf(str,"%sqnet/%s.now",cfg.data_dir,cfg.qhub[i]->id);
1566: if((file=_sopen(str,O_CREAT|O_TRUNC|O_WRONLY
1567: ,SH_DENYRW,S_IREAD|S_IWRITE))!=-1)
1568: close(file);
1569: break;
1570: }
1571: }
1572: if(i>=cfg.total_qhubs)
1573: Application->MessageBox("QWKnet Hub ID Not Found"
1574: ,CodeInputForm->Edit->Text.c_str(),MB_OK|MB_ICONEXCLAMATION);
1575: }
1576: delete CodeInputForm;
1577: }
1578: //---------------------------------------------------------------------------
1579:
1580: void __fastcall TMainForm::TextMenuItemEditClick(TObject *Sender)
1581: {
1582: char filename[MAX_PATH+1];
1583:
1584: sprintf(filename,"%s%s"
1585: ,MainForm->cfg.text_dir
1586: ,((TMenuItem*)Sender)->Hint.c_str());
1587: Application->CreateForm(__classid(TTextFileEditForm), &TextFileEditForm);
1588: TextFileEditForm->Filename=AnsiString(filename);
1589: TextFileEditForm->Caption=((TMenuItem*)Sender)->Caption;
1590: TextFileEditForm->ShowModal();
1591: delete TextFileEditForm;
1592:
1593: }
1594: //---------------------------------------------------------------------------
1595:
1596: void __fastcall TMainForm::CtrlMenuItemEditClick(TObject *Sender)
1597: {
1598: char filename[MAX_PATH+1];
1599:
1600: sprintf(filename,"%s%s"
1601: ,MainForm->cfg.ctrl_dir
1602: ,((TMenuItem*)Sender)->Hint.c_str());
1603: Application->CreateForm(__classid(TTextFileEditForm), &TextFileEditForm);
1604: TextFileEditForm->Filename=AnsiString(filename);
1605: TextFileEditForm->Caption=((TMenuItem*)Sender)->Caption;
1606: TextFileEditForm->ShowModal();
1607: delete TextFileEditForm;
1608:
1609: }
1610:
1611: //---------------------------------------------------------------------------
1612:
1613: void __fastcall TMainForm::UpTimerTick(TObject *Sender)
1614: {
1615: char str[128];
1616: char days[64];
1617: static time_t start;
1618: ulong up;
1619:
1620: if(!start)
1621: start=time(NULL);
1622: up=time(NULL)-start;
1623:
1624: days[0]=0;
1625: if((up/(24*60*60))>=2) {
1626: sprintf(days,"%u days ",up/(24*60*60));
1627: up%=(24*60*60);
1628: }
1629: sprintf(str,"Up: %s%u:%02u"
1630: ,days
1631: ,up/(60*60)
1632: ,(up/60)%60
1633: );
1634: AnsiString Str=AnsiString(str);
1635: if(MainForm->StatusBar->Panels->Items[4]->Text!=Str)
1636: MainForm->StatusBar->Panels->Items[4]->Text=Str;
1637: }
1638: //---------------------------------------------------------------------------
1639:
1640: void __fastcall TMainForm::BBSViewErrorLogMenuItemClick(TObject *Sender)
1641: {
1642: char filename[MAX_PATH+1];
1643:
1644: sprintf(filename,"%sERROR.LOG"
1645: ,MainForm->cfg.data_dir);
1646: Application->CreateForm(__classid(TTextFileEditForm), &TextFileEditForm);
1647: TextFileEditForm->Filename=AnsiString(filename);
1648: TextFileEditForm->Caption="Error Log (See SYSOP.DOC for help)";
1649: TextFileEditForm->Memo->ReadOnly=true;
1650: TextFileEditForm->ShowModal();
1651: delete TextFileEditForm;
1652: }
1653: //---------------------------------------------------------------------------
1654:
1655: void __fastcall TMainForm::ChatToggleExecute(TObject *Sender)
1656: {
1657: ChatToggle->Checked=!ChatToggle->Checked;
1658: if(ChatToggle->Checked)
1659: bbs_startup.options|=BBS_OPT_SYSOP_AVAILABLE;
1660: else
1661: bbs_startup.options&=~BBS_OPT_SYSOP_AVAILABLE;
1662:
1663: }
1664: //---------------------------------------------------------------------------
1665:
1666: void __fastcall TMainForm::ViewClientsExecute(TObject *Sender)
1667: {
1668: ClientForm->Visible=!ClientForm->Visible;
1669: ViewClients->Checked=ClientForm->Visible;
1670: }
1671: //---------------------------------------------------------------------------
1672:
1673:
1674: void __fastcall TMainForm::UserEditExecute(TObject *Sender)
1675: {
1676: char str[256];
1677:
1678: sprintf(str,"%sUSEREDIT %s",cfg.exec_dir,cfg.data_dir);
1679: WinExec(str,SW_SHOWNORMAL);
1680: }
1681: //---------------------------------------------------------------------------
1682:
1683: void __fastcall TMainForm::FileOpenMenuItemClick(TObject *Sender)
1684: {
1685: TOpenDialog* dlg=new TOpenDialog((TComponent*)Sender);
1686:
1687: dlg->Filter = "Text files (*.txt)|*.TXT"
1688: "|Log files (*.log)|*.LOG"
1689: "|Config files (*.cfg)|*.CFG"
1690: "|Message files (*.msg; *.asc)|*.MSG;*.ASC"
1691: "|Baja Source (*.src)|*.SRC"
1692: "|All files|*.*";
1693: dlg->InitialDir=cfg.text_dir;
1694: if(dlg->Execute()==true) {
1695: Application->CreateForm(__classid(TTextFileEditForm), &TextFileEditForm);
1696: TextFileEditForm->Filename=AnsiString(dlg->FileName);
1697: TextFileEditForm->Caption="Edit";
1698: TextFileEditForm->ShowModal();
1699: delete TextFileEditForm;
1700: }
1701: delete dlg;
1702: }
1703: //---------------------------------------------------------------------------
1704:
1705:
1706: void __fastcall TMainForm::BBSLoginMenuItemClick(TObject *Sender)
1707: {
1708: if(!strnicmp(LoginCommand.c_str(),"start ",6))
1709: WinExec(LoginCommand.c_str(),SW_SHOWMINNOACTIVE);
1710: else
1711: WinExec(LoginCommand.c_str(),SW_SHOWNORMAL);
1712:
1713: }
1714: //---------------------------------------------------------------------------
1715:
1716:
1717: void __fastcall TMainForm::ViewLogClick(TObject *Sender)
1718: {
1719: char str[128];
1720: char filename[MAX_PATH+1];
1721: struct tm* tm;
1722: time_t t;
1723: TModalResult mr;
1724:
1725: if(((TMenuItem*)Sender)->Tag==-1) {
1726: Application->CreateForm(__classid(TCodeInputForm), &CodeInputForm);
1727: CodeInputForm->Label->Caption="Date";
1728: CodeInputForm->Edit->Text=AnsiString(unixtodstr(&cfg,time(NULL),str));
1729: mr=CodeInputForm->ShowModal();
1730: t=dstrtounix(&cfg,CodeInputForm->Edit->Text.c_str());
1731: delete CodeInputForm;
1732: if(mr!=mrOk)
1733: return;
1734: } else {
1735: t=time(NULL);
1736: t-=((TMenuItem*)Sender)->Tag*24*60*60;
1737: }
1738: tm=gmtime(&t);
1739: if(tm==NULL)
1740: return;
1741:
1742: /* Close Mail/FTP logs */
1743: mail_lputs(NULL);
1744: ftp_lputs(NULL);
1745:
1746: sprintf(filename,"%sLOGS\\%s%02d%02d%02d.LOG"
1747: ,MainForm->cfg.data_dir
1748: ,((TMenuItem*)Sender)->Hint.c_str()
1749: ,tm->tm_mon+1
1750: ,tm->tm_mday
1751: ,tm->tm_year%100
1752: );
1753: Application->CreateForm(__classid(TTextFileEditForm), &TextFileEditForm);
1754: TextFileEditForm->Filename=AnsiString(filename);
1755: TextFileEditForm->Caption=((TMenuItem*)Sender)->Caption;
1756: TextFileEditForm->Memo->ReadOnly=true;
1757: TextFileEditForm->ShowModal();
1758: delete TextFileEditForm;
1759: }
1760: //---------------------------------------------------------------------------
1761:
1762:
1763: void __fastcall TMainForm::UserListExecute(TObject *Sender)
1764: {
1765: UserListForm->Show();
1766: }
1767: //---------------------------------------------------------------------------
1768:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.