|
|
1.1 root 1: /* Synchronet Control Panel (GUI Borland C++ Builder Project for Win32) */
2:
3: /* $Id: MainFormUnit.cpp,v 1.157 2006/09/24 19:45:17 deuce 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 2006 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 "sbbs.h" // unixtodstr()
38: #include <vcl.h>
39: #include <vcl/Registry.hpp> /* TRegistry */
40: #pragma hdrstop
41: #include <winsock.h> // IPPORT_TELNET, INADDR_ANY
42: #include <process.h> // _beginthread()
43: #include <io.h>
44: #include <stdio.h>
45: #include <sys/stat.h>
46: #include <sys/locking.h>
47: #include <fcntl.h>
48: #include <share.h>
49:
50: #include "MainFormUnit.h"
51: #include "TelnetFormUnit.h"
52: #include "EventsFormUnit.h"
53: #include "ServicesFormUnit.h"
54: #include "FtpFormUnit.h"
55: #include "WebFormUnit.h"
56: #include "MailFormUnit.h"
57: #include "NodeFormUnit.h"
58:
59: #include "StatsFormUnit.h"
60: #include "ClientFormUnit.h"
61: #include "CtrlPathDialogUnit.h"
62: #include "TelnetCfgDlgUnit.h"
63: #include "MailCfgDlgUnit.h"
64: #include "FtpCfgDlgUnit.h"
65: #include "WebCfgDlgUnit.h"
66: #include "ServicesCfgDlgUnit.h"
67: #include "AboutBoxFormUnit.h"
68: #include "CodeInputFormUnit.h"
69: #include "TextFileEditUnit.h"
70: #include "UserListFormUnit.h"
71: #include "PropertiesDlgUnit.h"
72: #include "ConfigWizardUnit.h"
73: #include "PreviewFormUnit.h"
74:
75: #include "sbbs_ini.h" // sbbs_read_ini()
76: #include "userdat.h" // lastuser()
77: #include "ntsvcs.h" // NTSVC_NAME_*
78:
79: //---------------------------------------------------------------------------
80: #pragma package(smart_init)
81: #pragma link "trayicon"
82: #pragma link "Trayicon"
83: #pragma resource "*.dfm"
84: TMainForm *MainForm;
85:
86: #define LOG_TIME_FMT " m/d hh:mm:ssa/p"
87:
88: /* Service functions are NT-only, must call dynamically :-( */
89: typedef WINADVAPI SC_HANDLE (WINAPI *OpenSCManager_t)(LPCTSTR,LPCTSTR,DWORD);
90: typedef WINADVAPI SC_HANDLE (WINAPI *OpenService_t)(SC_HANDLE,LPCTSTR,DWORD);
91: typedef WINADVAPI BOOL (WINAPI *StartService_t)(SC_HANDLE,DWORD,LPCTSTR*);
92: typedef WINADVAPI BOOL (WINAPI *ControlService_t)(SC_HANDLE,DWORD,LPSERVICE_STATUS);
93: typedef WINADVAPI BOOL (WINAPI *QueryServiceStatus_t)(SC_HANDLE,LPSERVICE_STATUS);
94: typedef WINADVAPI BOOL (WINAPI *QueryServiceConfig_t)(SC_HANDLE,LPQUERY_SERVICE_CONFIG,DWORD,LPDWORD);
95: typedef WINADVAPI BOOL (WINAPI *CloseServiceHandle_t)(SC_HANDLE);
96:
97: OpenSCManager_t openSCManager;
98: OpenService_t openService;
99: StartService_t startService;
100: ControlService_t controlService;
101: QueryServiceStatus_t queryServiceStatus;
102: QueryServiceConfig_t queryServiceConfig;
103: CloseServiceHandle_t closeServiceHandle;
104:
105: SC_HANDLE hSCManager;
106: SC_HANDLE bbs_svc;
107: SC_HANDLE ftp_svc;
108: SC_HANDLE web_svc;
109: SC_HANDLE mail_svc;
110: SC_HANDLE services_svc;
111: SERVICE_STATUS bbs_svc_status;
112: SERVICE_STATUS ftp_svc_status;
113: SERVICE_STATUS web_svc_status;
114: SERVICE_STATUS mail_svc_status;
115: SERVICE_STATUS services_svc_status;
116: QUERY_SERVICE_CONFIG* bbs_svc_config;
117: DWORD bbs_svc_config_size;
118: QUERY_SERVICE_CONFIG* ftp_svc_config;
119: DWORD ftp_svc_config_size;
120: QUERY_SERVICE_CONFIG* web_svc_config;
121: DWORD web_svc_config_size;
122: QUERY_SERVICE_CONFIG* mail_svc_config;
123: DWORD mail_svc_config_size;
124: QUERY_SERVICE_CONFIG* services_svc_config;
125: DWORD services_svc_config_size;
126:
127: DWORD MaxLogLen=20000;
128: int threads=1;
129: time_t initialized=0;
130: static str_list_t recycle_semfiles;
131: static str_list_t shutdown_semfiles;
132: bool terminating=false;
133:
134: static void thread_up(void* p, BOOL up, BOOL setuid)
135: {
136: char str[128];
137: static HANDLE mutex;
138:
139: if(!mutex)
140: mutex=CreateMutex(NULL,false,NULL);
141: WaitForSingleObject(mutex,INFINITE);
142: if(up)
143: threads++;
144: else if(threads>0)
145: threads--;
146: sprintf(str,"Threads: %d",threads);
147: AnsiString Str=AnsiString(str);
148: if(MainForm->StatusBar->Panels->Items[0]->Text!=Str)
149: MainForm->StatusBar->Panels->Items[0]->Text=Str;
150: ReleaseMutex(mutex);
151: }
152:
153: int sockets=0;
154:
155: void socket_open(void* p, BOOL open)
156: {
157: char str[128];
158: static HANDLE mutex;
159:
160: if(!mutex)
161: mutex=CreateMutex(NULL,false,NULL);
162: WaitForSingleObject(mutex,INFINITE);
163: if(open)
164: sockets++;
165: else if(sockets>0)
166: sockets--;
167: sprintf(str,"Sockets: %d",sockets);
168: AnsiString Str=AnsiString(str);
169: if(MainForm->StatusBar->Panels->Items[1]->Text!=Str)
170: MainForm->StatusBar->Panels->Items[1]->Text=Str;
171: ReleaseMutex(mutex);
172: }
173:
174: int clients=0;
175: int total_clients=0;
176:
177: static void client_add(void* p, BOOL add)
178: {
179: char str[128];
180:
181: if(add) {
182: clients++;
183: total_clients++;
184: } else if(clients>0)
185: clients--;
186: sprintf(str,"Clients: %d",clients);
187: AnsiString Str=AnsiString(str);
188: if(MainForm->StatusBar->Panels->Items[2]->Text!=Str)
189: MainForm->StatusBar->Panels->Items[2]->Text=Str;
190:
191: sprintf(str,"Served: %d",total_clients);
192: Str=AnsiString(str);
193: if(MainForm->StatusBar->Panels->Items[3]->Text!=Str)
194: MainForm->StatusBar->Panels->Items[3]->Text=Str;
195: }
196:
197: static void client_on(void* p, BOOL on, int sock, client_t* client, BOOL update)
198: {
199: char str[128];
200: int i,j;
201: time_t t;
202: static HANDLE mutex;
203: TListItem* Item;
204:
205: if(!mutex)
206: mutex=CreateMutex(NULL,false,NULL);
207: WaitForSingleObject(mutex,INFINITE);
208: WaitForSingleObject(ClientForm->ListMutex,INFINITE);
209:
210: /* Search for exising entry for this socket */
211: for(i=0;i<ClientForm->ListView->Items->Count;i++) {
212: if(ClientForm->ListView->Items->Item[i]->Caption.ToIntDef(0)==sock)
213: break;
214: }
215: if(i>=ClientForm->ListView->Items->Count) {
216: if(update) { /* Can't update a non-existing entry */
217: ReleaseMutex(mutex);
218: ReleaseMutex(ClientForm->ListMutex);
219: return;
220: }
221: i=-1;
222: }
223:
224: if(on) {
225: if(!update)
226: client_add(NULL, TRUE);
227: } else { // Off
228: client_add(NULL, FALSE);
229: if(i>=0)
230: ClientForm->ListView->Items->Delete(i);
231: ReleaseMutex(mutex);
232: ReleaseMutex(ClientForm->ListMutex);
233: return;
234: }
235: if(client!=NULL && client->size==sizeof(client_t)) {
236: if(i>=0) {
237: Item=ClientForm->ListView->Items->Item[i];
238: } else {
239: Item=ClientForm->ListView->Items->Add();
240: Item->Data=(void*)client->time;
241: Item->Caption=sock;
242: }
243: Item->SubItems->Clear();
244: Item->SubItems->Add(client->protocol);
245: Item->SubItems->Add(client->user);
246: Item->SubItems->Add(client->addr);
247: Item->SubItems->Add(client->host);
248: Item->SubItems->Add(client->port);
249: t=time(NULL)-(time_t)Item->Data;
250: sprintf(str,"%d:%02d",t/60,t%60);
251: Item->SubItems->Add(str);
252: }
253: ReleaseMutex(mutex);
254: ReleaseMutex(ClientForm->ListMutex);
255: }
256:
257: static int bbs_lputs(void* p, int level, char *str)
258: {
259: static HANDLE mutex;
260:
261: if(!mutex)
262: mutex=CreateMutex(NULL,false,NULL);
263: WaitForSingleObject(mutex,INFINITE);
264:
265: while(MaxLogLen && TelnetForm->Log->Text.Length()>=MaxLogLen)
266: TelnetForm->Log->Lines->Delete(0);
267:
268: AnsiString Line=Now().FormatString(LOG_TIME_FMT)+" ";
269: Line+=AnsiString(str).Trim();
270: TelnetForm->Log->Lines->Add(Line);
271: ReleaseMutex(mutex);
272: return(Line.Length());
273: }
274:
275: static void bbs_status(void* p, char *str)
276: {
277: static HANDLE mutex;
278:
279: if(!mutex)
280: mutex=CreateMutex(NULL,false,NULL);
281: WaitForSingleObject(mutex,INFINITE);
282:
283: TelnetForm->Status->Caption=AnsiString(str);
284:
285: ReleaseMutex(mutex);
286: }
287:
288: static void bbs_clients(void* p, int clients)
289: {
290: static HANDLE mutex;
291: static save_clients;
292:
293: save_clients=clients;
294:
295: if(!mutex)
296: mutex=CreateMutex(NULL,false,NULL);
297: WaitForSingleObject(mutex,INFINITE);
298:
299: TelnetForm->ProgressBar->Max
300: =(MainForm->bbs_startup.last_node
301: -MainForm->bbs_startup.first_node)+1;
302: TelnetForm->ProgressBar->Position=clients;
303:
304: ReleaseMutex(mutex);
305: }
306:
307: static void bbs_terminated(void* p, int code)
308: {
309: Screen->Cursor=crDefault;
310: MainForm->TelnetStart->Enabled=true;
311: MainForm->TelnetStop->Enabled=false;
312: MainForm->TelnetRecycle->Enabled=false;
313: Application->ProcessMessages();
314: }
315: static void bbs_started(void* p)
316: {
317: Screen->Cursor=crDefault;
318: MainForm->TelnetStart->Enabled=false;
319: MainForm->TelnetStop->Enabled=true;
320: MainForm->TelnetRecycle->Enabled=true;
321: Application->ProcessMessages();
322: }
323: static void bbs_start(void)
324: {
325: Screen->Cursor=crAppStart;
326: bbs_status(NULL,"Starting");
327:
328: FILE* fp=fopen(MainForm->ini_file,"r");
329: sbbs_read_ini(fp
330: ,&MainForm->global
331: ,NULL ,&MainForm->bbs_startup
332: ,NULL ,NULL
333: ,NULL ,NULL
334: ,NULL ,NULL
335: ,NULL ,NULL
336: );
337: if(fp!=NULL)
338: fclose(fp);
339:
340: _beginthread((void(*)(void*))bbs_thread,0,&MainForm->bbs_startup);
341: Application->ProcessMessages();
342: }
343:
344: static int event_lputs(int level, char *str)
345: {
346: static HANDLE mutex;
347:
348: if(!mutex)
349: mutex=CreateMutex(NULL,false,NULL);
350: WaitForSingleObject(mutex,INFINITE);
351:
352: while(MaxLogLen && EventsForm->Log->Text.Length()>=MaxLogLen)
353: EventsForm->Log->Lines->Delete(0);
354:
355: AnsiString Line=Now().FormatString(LOG_TIME_FMT)+" ";
356: Line+=AnsiString(str).Trim();
357: EventsForm->Log->Lines->Add(Line);
358: ReleaseMutex(mutex);
359: return(Line.Length());
360: }
361:
362: static int service_lputs(void* p, int level, char *str)
363: {
364: static HANDLE mutex;
365:
366: if(!mutex)
367: mutex=CreateMutex(NULL,false,NULL);
368: WaitForSingleObject(mutex,INFINITE);
369:
370: while(MaxLogLen && ServicesForm->Log->Text.Length()>=MaxLogLen)
371: ServicesForm->Log->Lines->Delete(0);
372:
373: AnsiString Line=Now().FormatString(LOG_TIME_FMT)+" ";
374: Line+=AnsiString(str).Trim();
375: ServicesForm->Log->Lines->Add(Line);
376: ReleaseMutex(mutex);
377: return(Line.Length());
378: }
379:
380: static void services_status(void* p, char *str)
381: {
382: static HANDLE mutex;
383:
384: if(!mutex)
385: mutex=CreateMutex(NULL,false,NULL);
386: WaitForSingleObject(mutex,INFINITE);
387:
388: ServicesForm->Status->Caption=AnsiString(str);
389:
390: ReleaseMutex(mutex);
391: }
392:
393: static void services_terminated(void* p, int code)
394: {
395: Screen->Cursor=crDefault;
396: MainForm->ServicesStart->Enabled=true;
397: MainForm->ServicesStop->Enabled=false;
398: MainForm->ServicesRecycle->Enabled=false;
399: Application->ProcessMessages();
400: }
401: static void services_started(void* p)
402: {
403: Screen->Cursor=crDefault;
404: MainForm->ServicesStart->Enabled=false;
405: MainForm->ServicesStop->Enabled=true;
406: MainForm->ServicesRecycle->Enabled=true;
407: Application->ProcessMessages();
408: }
409:
410: static void services_clients(void* p, int clients)
411: {
412: }
413:
414: static int mail_lputs(void* p, int level, char *str)
415: {
416: static HANDLE mutex;
417: static FILE* LogStream;
418:
419: if(!mutex)
420: mutex=CreateMutex(NULL,false,NULL);
421: WaitForSingleObject(mutex,INFINITE);
422:
423: if(str==NULL) {
424: if(LogStream!=NULL)
425: fclose(LogStream);
426: LogStream=NULL;
427: ReleaseMutex(mutex);
428: return(0);
429: }
430:
431: while(MaxLogLen && MailForm->Log->Text.Length()>=MaxLogLen)
432: MailForm->Log->Lines->Delete(0);
433:
434: AnsiString Line=Now().FormatString(LOG_TIME_FMT)+" ";
435: Line+=AnsiString(str).Trim();
436: MailForm->Log->Lines->Add(Line);
437:
438: if(MainForm->MailLogFile && MainForm->MailStop->Enabled) {
439: AnsiString LogFileName
440: =AnsiString(MainForm->cfg.data_dir)
441: +"LOGS\\MS"
442: +Now().FormatString("mmddyy")
443: +".LOG";
444:
445: if(!FileExists(LogFileName)) {
446: if(LogStream!=NULL) {
447: fclose(LogStream);
448: LogStream=NULL;
449: }
450: }
451: if(LogStream==NULL)
452: LogStream=_fsopen(LogFileName.c_str(),"a",SH_DENYNONE);
453:
454: if(LogStream!=NULL) {
455: Line=Now().FormatString("hh:mm:ss")+" ";
456: Line+=AnsiString(str).Trim();
457: Line+="\n";
458: fwrite(AnsiString(Line).c_str(),1,Line.Length(),LogStream);
459: }
460: }
461:
462: ReleaseMutex(mutex);
463: return(Line.Length());
464: }
465:
466: static void mail_status(void* p, char *str)
467: {
468: static HANDLE mutex;
469:
470: if(!mutex)
471: mutex=CreateMutex(NULL,false,NULL);
472: WaitForSingleObject(mutex,INFINITE);
473:
474: MailForm->Status->Caption=AnsiString(str);
475:
476: ReleaseMutex(mutex);
477: }
478:
479: static void mail_clients(void* p, int clients)
480: {
481: static HANDLE mutex;
482:
483: if(!mutex)
484: mutex=CreateMutex(NULL,false,NULL);
485: WaitForSingleObject(mutex,INFINITE);
486:
487: MailForm->ProgressBar->Max=MainForm->mail_startup.max_clients;
488: MailForm->ProgressBar->Position=clients;
489:
490: ReleaseMutex(mutex);
491: }
492:
493: static void mail_terminated(void* p, int code)
494: {
495: Screen->Cursor=crDefault;
496: MainForm->MailStart->Enabled=true;
497: MainForm->MailStop->Enabled=false;
498: MainForm->MailRecycle->Enabled=false;
499: Application->ProcessMessages();
500: }
501: static void mail_started(void* p)
502: {
503: Screen->Cursor=crDefault;
504: MainForm->MailStart->Enabled=false;
505: MainForm->MailStop->Enabled=true;
506: MainForm->MailRecycle->Enabled=true;
507: Application->ProcessMessages();
508: }
509: static void mail_start(void)
510: {
511: Screen->Cursor=crAppStart;
512: mail_status(NULL, "Starting");
513:
514: FILE* fp=fopen(MainForm->ini_file,"r");
515: sbbs_read_ini(fp
516: ,&MainForm->global
517: ,NULL ,NULL
518: ,NULL ,NULL
519: ,NULL ,NULL
520: ,NULL ,&MainForm->mail_startup
521: ,NULL ,NULL
522: );
523: if(fp!=NULL)
524: fclose(fp);
525:
526: _beginthread((void(*)(void*))mail_server,0,&MainForm->mail_startup);
527: Application->ProcessMessages();
528: }
529:
530: static int ftp_lputs(void* p, int level, char *str)
531: {
532: static HANDLE mutex;
533: static FILE* LogStream;
534:
535: if(!mutex)
536: mutex=CreateMutex(NULL,false,NULL);
537: WaitForSingleObject(mutex,INFINITE);
538:
539: if(str==NULL) {
540: if(LogStream!=NULL)
541: fclose(LogStream);
542: LogStream=NULL;
543: ReleaseMutex(mutex);
544: return(0);
545: }
546:
547: while(MaxLogLen && FtpForm->Log->Text.Length()>=MaxLogLen)
548: FtpForm->Log->Lines->Delete(0);
549:
550: AnsiString Line=Now().FormatString(LOG_TIME_FMT)+" ";
551: Line+=AnsiString(str).Trim();
552: FtpForm->Log->Lines->Add(Line);
553:
554: if(MainForm->FtpLogFile && MainForm->FtpStop->Enabled) {
555: AnsiString LogFileName
556: =AnsiString(MainForm->cfg.data_dir)
557: +"LOGS\\FS"
558: +Now().FormatString("mmddyy")
559: +".LOG";
560:
561: if(!FileExists(LogFileName)) {
562: FileClose(FileCreate(LogFileName));
563: if(LogStream!=NULL) {
564: fclose(LogStream);
565: LogStream=NULL;
566: }
567: }
568: if(LogStream==NULL)
569: LogStream=_fsopen(LogFileName.c_str(),"a",SH_DENYNONE);
570:
571: if(LogStream!=NULL) {
572: Line=Now().FormatString("hh:mm:ss")+" ";
573: Line+=AnsiString(str).Trim();
574: Line+="\n";
575: fwrite(AnsiString(Line).c_str(),1,Line.Length(),LogStream);
576: }
577: }
578:
579: ReleaseMutex(mutex);
580: return(Line.Length());
581: }
582:
583: static void ftp_status(void* p, char *str)
584: {
585: static HANDLE mutex;
586:
587: if(!mutex)
588: mutex=CreateMutex(NULL,false,NULL);
589: WaitForSingleObject(mutex,INFINITE);
590:
591: FtpForm->Status->Caption=AnsiString(str);
592:
593: ReleaseMutex(mutex);
594: }
595:
596: static void ftp_clients(void* p, int clients)
597: {
598: static HANDLE mutex;
599:
600: if(!mutex)
601: mutex=CreateMutex(NULL,false,NULL);
602: WaitForSingleObject(mutex,INFINITE);
603:
604: FtpForm->ProgressBar->Max=MainForm->ftp_startup.max_clients;
605: FtpForm->ProgressBar->Position=clients;
606:
607: ReleaseMutex(mutex);
608: }
609:
610: static void ftp_terminated(void* p, int code)
611: {
612: Screen->Cursor=crDefault;
613: MainForm->FtpStart->Enabled=true;
614: MainForm->FtpStop->Enabled=false;
615: MainForm->FtpRecycle->Enabled=false;
616: Application->ProcessMessages();
617: }
618: static void ftp_started(void* p)
619: {
620: Screen->Cursor=crDefault;
621: MainForm->FtpStart->Enabled=false;
622: MainForm->FtpStop->Enabled=true;
623: MainForm->FtpRecycle->Enabled=true;
624: Application->ProcessMessages();
625: }
626: static void ftp_start(void)
627: {
628: Screen->Cursor=crAppStart;
629: ftp_status(NULL, "Starting");
630:
631: FILE* fp=fopen(MainForm->ini_file,"r");
632: sbbs_read_ini(fp
633: ,&MainForm->global
634: ,NULL ,NULL
635: ,NULL ,&MainForm->ftp_startup
636: ,NULL ,NULL
637: ,NULL ,NULL
638: ,NULL ,NULL
639: );
640: if(fp!=NULL)
641: fclose(fp);
642:
643: _beginthread((void(*)(void*))ftp_server,0,&MainForm->ftp_startup);
644: Application->ProcessMessages();
645: }
646: //---------------------------------------------------------------------------
647: static int web_lputs(void* p, int level, char *str)
648: {
649: static HANDLE mutex;
650: static FILE* LogStream;
651:
652: if(!mutex)
653: mutex=CreateMutex(NULL,false,NULL);
654: WaitForSingleObject(mutex,INFINITE);
655:
656: if(str==NULL) {
657: if(LogStream!=NULL)
658: fclose(LogStream);
659: LogStream=NULL;
660: ReleaseMutex(mutex);
661: return(0);
662: }
663:
664: while(MaxLogLen && WebForm->Log->Text.Length()>=MaxLogLen)
665: WebForm->Log->Lines->Delete(0);
666:
667: AnsiString Line=Now().FormatString(LOG_TIME_FMT)+" ";
668: Line+=AnsiString(str).Trim();
669: WebForm->Log->Lines->Add(Line);
670: #if 0
671: if(MainForm->WebLogFile && MainForm->WebStop->Enabled) {
672: AnsiString LogFileName
673: =AnsiString(MainForm->cfg.data_dir)
674: +"LOGS\\FS"
675: +Now().FormatString("mmddyy")
676: +".LOG";
677:
678: if(!FileExists(LogFileName)) {
679: FileClose(FileCreate(LogFileName));
680: if(LogStream!=NULL) {
681: fclose(LogStream);
682: LogStream=NULL;
683: }
684: }
685: if(LogStream==NULL)
686: LogStream=_fsopen(LogFileName.c_str(),"a",SH_DENYNONE);
687:
688: if(LogStream!=NULL) {
689: Line=Now().FormatString("hh:mm:ss")+" ";
690: Line+=AnsiString(str).Trim();
691: Line+="\n";
692: fwrite(AnsiString(Line).c_str(),1,Line.Length(),LogStream);
693: }
694: }
695: #endif
696: ReleaseMutex(mutex);
697: return(Line.Length());
698: }
699:
700: static void web_status(void* p, char *str)
701: {
702: static HANDLE mutex;
703:
704: if(!mutex)
705: mutex=CreateMutex(NULL,false,NULL);
706: WaitForSingleObject(mutex,INFINITE);
707:
708: WebForm->Status->Caption=AnsiString(str);
709:
710: ReleaseMutex(mutex);
711: }
712:
713: static void web_clients(void* p, int clients)
714: {
715: static HANDLE mutex;
716:
717: if(!mutex)
718: mutex=CreateMutex(NULL,false,NULL);
719: WaitForSingleObject(mutex,INFINITE);
720:
721: WebForm->ProgressBar->Max=MainForm->ftp_startup.max_clients;
722: WebForm->ProgressBar->Position=clients;
723:
724: ReleaseMutex(mutex);
725: }
726:
727: static void web_terminated(void* p, int code)
728: {
729: Screen->Cursor=crDefault;
730: MainForm->WebStart->Enabled=true;
731: MainForm->WebStop->Enabled=false;
732: MainForm->WebRecycle->Enabled=false;
733: Application->ProcessMessages();
734: }
735: static void web_started(void* p)
736: {
737: Screen->Cursor=crDefault;
738: MainForm->WebStart->Enabled=false;
739: MainForm->WebStop->Enabled=true;
740: MainForm->WebRecycle->Enabled=true;
741: Application->ProcessMessages();
742: }
743: static void web_start(void)
744: {
745: Screen->Cursor=crAppStart;
746: web_status(NULL, "Starting");
747:
748: FILE* fp=fopen(MainForm->ini_file,"r");
749: sbbs_read_ini(fp
750: ,&MainForm->global
751: ,NULL ,NULL
752: ,NULL ,NULL
753: ,NULL ,&MainForm->web_startup
754: ,NULL ,NULL
755: ,NULL ,NULL
756: );
757: if(fp!=NULL)
758: fclose(fp);
759:
760: _beginthread((void(*)(void*))web_server,0,&MainForm->web_startup);
761: Application->ProcessMessages();
762: }
763: //---------------------------------------------------------------------------
764: /* Server recycle callback (read relevant startup .ini file section) */
765: static void recycle(void* cbdata)
766: {
767: char str[MAX_PATH*2];
768: FILE* fp=NULL;
769: bbs_startup_t* bbs=NULL;
770: ftp_startup_t* ftp=NULL;
771: web_startup_t* web=NULL;
772: mail_startup_t* mail=NULL;
773: services_startup_t* services=NULL;
774:
775: SAFEPRINTF(str,"Reading %s",MainForm->ini_file);
776: if(cbdata==(void*)&MainForm->bbs_startup) {
777: bbs=&MainForm->bbs_startup;
778: bbs_lputs(cbdata,LOG_INFO,str);
779: } else if(cbdata==(void*)&MainForm->ftp_startup) {
780: ftp=&MainForm->ftp_startup;
781: ftp_lputs(cbdata,LOG_INFO,str);
782: } else if(cbdata==(void*)&MainForm->web_startup) {
783: web=&MainForm->web_startup;
784: web_lputs(cbdata,LOG_INFO,str);
785: } else if(cbdata==(void*)&MainForm->mail_startup) {
786: mail=&MainForm->mail_startup;
787: mail_lputs(cbdata,LOG_INFO,str);
788: } else if(cbdata==(void*)&MainForm->services_startup) {
789: services=&MainForm->services_startup;
790: service_lputs(cbdata,LOG_INFO,str);
791: }
792:
793: fp=fopen(MainForm->ini_file,"r");
794: sbbs_read_ini(fp
795: ,&MainForm->global
796: ,NULL ,bbs
797: ,NULL ,ftp
798: ,NULL ,web
799: ,NULL ,mail
800: ,NULL ,services
801: );
802: if(fp!=NULL)
803: fclose(fp);
804: }
805: //---------------------------------------------------------------------------
806: __fastcall TMainForm::TMainForm(TComponent* Owner)
807: : TForm(Owner)
808: {
809: /* Defaults */
810: SAFECOPY(global.ctrl_dir,"c:\\sbbs\\ctrl\\");
811: global.js.max_bytes=JAVASCRIPT_MAX_BYTES;
812: global.js.cx_stack=JAVASCRIPT_CONTEXT_STACK;
813: global.js.branch_limit=JAVASCRIPT_BRANCH_LIMIT;
814: global.js.gc_interval=JAVASCRIPT_GC_INTERVAL;
815: global.js.yield_interval=JAVASCRIPT_YIELD_INTERVAL;
816: global.sem_chk_freq=5; /* seconds */
817:
818: /* These are SBBSCTRL-specific */
819: LoginCommand="telnet://localhost";
820: ConfigCommand="%sscfg.exe %s -l25";
821: MinimizeToSysTray=false;
822: UndockableForms=false;
823: UseFileAssociations=true;
824: Initialized=false;
825:
826: char* p;
827: if((p=getenv("SBBSCTRL"))!=NULL)
828: SAFECOPY(global.ctrl_dir,p);
829: p=lastchar(global.ctrl_dir);
830: if(*p!='/' && *p!='\\')
831: strcat(global.ctrl_dir,"\\");
832:
833: memset(&bbs_startup,0,sizeof(bbs_startup));
834: bbs_startup.size=sizeof(bbs_startup);
835: bbs_startup.cbdata=&bbs_startup;
836: bbs_startup.first_node=1;
837: bbs_startup.last_node=4;
838: bbs_startup.options=BBS_OPT_XTRN_MINIMIZED|BBS_OPT_SYSOP_AVAILABLE;
839: bbs_startup.telnet_port=IPPORT_TELNET;
840: bbs_startup.telnet_interface=INADDR_ANY;
841: bbs_startup.rlogin_port=513;
842: bbs_startup.rlogin_interface=INADDR_ANY;
843: bbs_startup.lputs=bbs_lputs;
844: bbs_startup.status=bbs_status;
845: bbs_startup.clients=bbs_clients;
846: bbs_startup.started=bbs_started;
847: bbs_startup.recycle=recycle;
848: bbs_startup.terminated=bbs_terminated;
849: bbs_startup.thread_up=thread_up;
850: bbs_startup.client_on=client_on;
851: bbs_startup.socket_open=socket_open;
852: bbs_startup.event_lputs=event_lputs;
853:
854: memset(&mail_startup,0,sizeof(mail_startup));
855: mail_startup.size=sizeof(mail_startup);
856: mail_startup.cbdata=&mail_startup;
857: mail_startup.smtp_port=IPPORT_SMTP;
858: mail_startup.relay_port=IPPORT_SMTP;
859: mail_startup.pop3_port=110;
860: mail_startup.interface_addr=INADDR_ANY;
861: mail_startup.lputs=mail_lputs;
862: mail_startup.status=mail_status;
863: mail_startup.clients=mail_clients;
864: mail_startup.started=mail_started;
865: mail_startup.recycle=recycle;
866: mail_startup.terminated=mail_terminated;
867: mail_startup.options=MAIL_OPT_ALLOW_POP3;
868: mail_startup.thread_up=thread_up;
869: mail_startup.client_on=client_on;
870: mail_startup.socket_open=socket_open;
871: mail_startup.max_delivery_attempts=50;
872: mail_startup.rescan_frequency=3600; /* 60 minutes */
873: mail_startup.lines_per_yield=10;
874: mail_startup.max_clients=10;
875: mail_startup.max_msg_size=10*1024*1024;
876:
877: memset(&ftp_startup,0,sizeof(ftp_startup));
878: ftp_startup.size=sizeof(ftp_startup);
879: ftp_startup.cbdata=&ftp_startup;
880: ftp_startup.port=IPPORT_FTP;
881: ftp_startup.interface_addr=INADDR_ANY;
882: ftp_startup.lputs=ftp_lputs;
883: ftp_startup.status=ftp_status;
884: ftp_startup.clients=ftp_clients;
885: ftp_startup.started=ftp_started;
886: ftp_startup.recycle=recycle;
887: ftp_startup.terminated=ftp_terminated;
888: ftp_startup.thread_up=thread_up;
889: ftp_startup.client_on=client_on;
890: ftp_startup.socket_open=socket_open;
891: ftp_startup.options
892: =FTP_OPT_INDEX_FILE|FTP_OPT_HTML_INDEX_FILE|FTP_OPT_ALLOW_QWK;
893: ftp_startup.max_clients=10;
894: strcpy(ftp_startup.index_file_name,"00index");
895: strcpy(ftp_startup.html_index_file,"00index.html");
896: strcpy(ftp_startup.html_index_script,"ftp-html.js");
897:
898: memset(&web_startup,0,sizeof(web_startup));
899: web_startup.size=sizeof(web_startup);
900: web_startup.cbdata=&web_startup;
901: web_startup.lputs=web_lputs;
902: web_startup.status=web_status;
903: web_startup.clients=web_clients;
904: web_startup.started=web_started;
905: web_startup.recycle=recycle;
906: web_startup.terminated=web_terminated;
907: web_startup.thread_up=thread_up;
908: web_startup.client_on=client_on;
909: web_startup.socket_open=socket_open;
910:
911: memset(&services_startup,0,sizeof(services_startup));
912: services_startup.size=sizeof(services_startup);
913: services_startup.cbdata=&services_startup;
914: services_startup.interface_addr=INADDR_ANY;
915: services_startup.lputs=service_lputs;
916: services_startup.status=services_status;
917: services_startup.clients=services_clients;
918: services_startup.started=services_started;
919: services_startup.recycle=recycle;
920: services_startup.terminated=services_terminated;
921: services_startup.thread_up=thread_up;
922: services_startup.client_on=client_on;
923: services_startup.socket_open=socket_open;
924:
925: bbs_log=INVALID_HANDLE_VALUE;
926: event_log=INVALID_HANDLE_VALUE;
927: ftp_log=INVALID_HANDLE_VALUE;
928: web_log=INVALID_HANDLE_VALUE;
929: mail_log=INVALID_HANDLE_VALUE;
930: services_log=INVALID_HANDLE_VALUE;
931:
932: /* Default local "Spy Terminal" settings */
933: SpyTerminalFont=new TFont;
934: SpyTerminalFont->Name="Terminal";
935: SpyTerminalFont->Size=9;
936: SpyTerminalFont->Pitch=fpFixed;
937: SpyTerminalWidth=434;
938: SpyTerminalHeight=365;
939: SpyTerminalKeyboardActive=true;
940:
941: Application->OnMinimize=FormMinimize;
942:
943: /* Get pointers to NT Service functions */
944: HANDLE hSCMlib = LoadLibrary("ADVAPI32.DLL");
945: if(hSCMlib!=NULL) {
946: openSCManager=(OpenSCManager_t)GetProcAddress(hSCMlib, "OpenSCManagerA");
947: openService=(OpenService_t)GetProcAddress(hSCMlib,"OpenServiceA");
948: startService=(StartService_t)GetProcAddress(hSCMlib,"StartServiceA");
949: controlService=(ControlService_t)GetProcAddress(hSCMlib,"ControlService");
950: queryServiceStatus=(QueryServiceStatus_t)GetProcAddress(hSCMlib,"QueryServiceStatus");
951: queryServiceConfig=(QueryServiceConfig_t)GetProcAddress(hSCMlib,"QueryServiceConfigA");
952: closeServiceHandle=(CloseServiceHandle_t)GetProcAddress(hSCMlib,"CloseServiceHandle");
953: FreeLibrary(hSCMlib);
954: }
955:
956: /* Open Service Manager */
957: if(openSCManager!=NULL)
958: hSCManager = openSCManager(
959: NULL, // machine (NULL == local)
960: NULL, // database (NULL == default)
961: SC_MANAGER_CONNECT // access required
962: );
963:
964: /* Open Synchronet Services */
965: if(hSCManager!=NULL) {
966: bbs_svc = openService(hSCManager, NTSVC_NAME_BBS, GENERIC_READ|GENERIC_EXECUTE);
967: ftp_svc = openService(hSCManager, NTSVC_NAME_FTP, GENERIC_READ|GENERIC_EXECUTE);
968: web_svc = openService(hSCManager, NTSVC_NAME_WEB, GENERIC_READ|GENERIC_EXECUTE);
969: mail_svc = openService(hSCManager, NTSVC_NAME_MAIL, GENERIC_READ|GENERIC_EXECUTE);
970: services_svc = openService(hSCManager, NTSVC_NAME_SERVICES, GENERIC_READ|GENERIC_EXECUTE);
971: }
972: }
973: //---------------------------------------------------------------------------
974: void __fastcall TMainForm::FileExitMenuItemClick(TObject *Sender)
975: {
976: Close();
977: }
978: void __fastcall TMainForm::FormCreate(TObject *Sender)
979: {
980: Height=400; // Just incase we mess it up in the IDE
981: Width=700;
982:
983: // Verify SBBS.DLL version
984: long bbs_ver = bbs_ver_num();
985: if(bbs_ver != VERSION_HEX) {
986: char str[128];
987: sprintf(str,"Incorrect SBBS.DLL Version (%lX)",bbs_ver);
988: Application->MessageBox(str,"ERROR",MB_OK|MB_ICONEXCLAMATION);
989: Application->Terminate();
990: }
991:
992: // Read Registry keys
993: TRegistry* Registry=new TRegistry;
994: if(!Registry->OpenKey(REG_KEY,true)) {
995: Application->MessageBox("Error opening registry key"
996: ,REG_KEY,MB_OK|MB_ICONEXCLAMATION);
997: Application->Terminate();
998: return;
999: }
1000: if(Registry->ValueExists("MainFormTop"))
1001: Top=Registry->ReadInteger("MainFormTop");
1002: if(Registry->ValueExists("MainFormLeft"))
1003: Left=Registry->ReadInteger("MainFormLeft");
1004: if(Registry->ValueExists("MainFormHeight"))
1005: Height=Registry->ReadInteger("MainFormHeight");
1006: if(Registry->ValueExists("MainFormWidth"))
1007: Width=Registry->ReadInteger("MainFormWidth");
1008: else
1009: WindowState=wsMaximized; // Default to fullscreen
1010: if(Registry->ValueExists("SpyTerminalWidth"))
1011: SpyTerminalWidth=Registry->ReadInteger("SpyTerminalWidth");
1012: if(Registry->ValueExists("SpyTerminalHeight"))
1013: SpyTerminalHeight=Registry->ReadInteger("SpyTerminalHeight");
1014: if(Registry->ValueExists("SpyTerminalFontName"))
1015: SpyTerminalFont->Name=Registry->ReadString("SpyTerminalFontName");
1016: if(Registry->ValueExists("SpyTerminalFontSize"))
1017: SpyTerminalFont->Size=Registry->ReadInteger("SpyTerminalFontSize");
1018: if(Registry->ValueExists("SpyTerminalKeyboardActive"))
1019: SpyTerminalKeyboardActive
1020: =Registry->ReadBool("SpyTerminalKeyboardActive");
1021:
1022: Registry->CloseKey();
1023: delete Registry;
1024: }
1025: //---------------------------------------------------------------------------
1026: void __fastcall TMainForm::FormShow(TObject *Sender)
1027: {
1028: StartupTimer->Enabled=true;
1029: }
1030: //---------------------------------------------------------------------------
1031:
1032: void __fastcall TMainForm::ViewToolbarMenuItemClick(TObject *Sender)
1033: {
1034: Toolbar->Visible=ViewToolbarMenuItem->Checked;
1035: }
1036: //---------------------------------------------------------------------------
1037: BOOL NTsvcEnabled(SC_HANDLE svc, QUERY_SERVICE_CONFIG* config, DWORD config_size)
1038: {
1039: if(svc==NULL || startService==NULL || queryServiceStatus==NULL || config==NULL)
1040: return(FALSE);
1041:
1042: DWORD ret;
1043: if(!queryServiceConfig(svc,config,config_size,&ret))
1044: return(FALSE);
1045: if(config->dwStartType==SERVICE_DISABLED)
1046: return(FALSE);
1047: return(TRUE);
1048: }
1049: //---------------------------------------------------------------------------
1050: BOOL __fastcall TMainForm::bbsServiceEnabled(void)
1051: {
1052: return NTsvcEnabled(bbs_svc,bbs_svc_config,bbs_svc_config_size);
1053: }
1054: BOOL __fastcall TMainForm::mailServiceEnabled(void)
1055: {
1056: return NTsvcEnabled(mail_svc,mail_svc_config,mail_svc_config_size);
1057: }
1058: BOOL __fastcall TMainForm::ftpServiceEnabled(void)
1059: {
1060: return NTsvcEnabled(ftp_svc,ftp_svc_config,ftp_svc_config_size);
1061: }
1062: BOOL __fastcall TMainForm::webServiceEnabled(void)
1063: {
1064: return NTsvcEnabled(web_svc,web_svc_config,web_svc_config_size);
1065: }
1066: BOOL __fastcall TMainForm::servicesServiceEnabled(void)
1067: {
1068: return NTsvcEnabled(services_svc,services_svc_config,services_svc_config_size);
1069: }
1070: //---------------------------------------------------------------------------
1071: void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)
1072: {
1073: UpTimer->Enabled=false; /* Stop updating the status bar */
1074: StatsTimer->Enabled=false;
1075:
1076: if(TrayIcon->Visible) /* minimized to tray? */
1077: TrayIcon->Visible=false; /* restore to avoid crash */
1078:
1079: /* This is necessary to save form sizes/positions */
1080: if(Initialized) /* Don't overwrite registry settings with defaults */
1081: SaveRegistrySettings(Sender);
1082:
1083: StatusBar->Panels->Items[4]->Text="Terminating servers...";
1084: time_t start=time(NULL);
1085: while( (TelnetStop->Enabled && !bbsServiceEnabled())
1086: || (MailStop->Enabled && !mailServiceEnabled())
1087: || (FtpStop->Enabled && !ftpServiceEnabled())
1088: || (WebStop->Enabled && !webServiceEnabled())
1089: || (ServicesStop->Enabled && !servicesServiceEnabled())) {
1090: if(time(NULL)-start>30)
1091: break;
1092: Application->ProcessMessages();
1093: YIELD();
1094: }
1095: StatusBar->Panels->Items[4]->Text="Closing...";
1096: Application->ProcessMessages();
1097:
1098: LogTimer->Enabled=false;
1099: ServiceStatusTimer->Enabled=false;
1100: NodeForm->Timer->Enabled=false;
1101: ClientForm->Timer->Enabled=false;
1102: #if 0
1103: /* Extra time for callbacks to be called by child threads */
1104: start=time(NULL);
1105: while(time(NULL)<start+2) {
1106: Application->ProcessMessages();
1107: YIELD();
1108: }
1109: #endif
1110: #if 0
1111: if(hSCManager!=NULL)
1112: closeServiceHandle(hSCManager);
1113: #endif
1114: }
1115: //---------------------------------------------------------------------------
1116: void __fastcall TMainForm::FormCloseQuery(TObject *Sender, bool &CanClose)
1117: {
1118: CanClose=false;
1119:
1120: if(TelnetStop->Enabled && !bbsServiceEnabled()) {
1121: if(!terminating && TelnetForm->ProgressBar->Position
1122: && Application->MessageBox("Shut down the Telnet Server?"
1123: ,"Telnet Server In Use", MB_OKCANCEL)!=IDOK)
1124: return;
1125: TelnetStopExecute(Sender);
1126: }
1127:
1128: if(MailStop->Enabled && !mailServiceEnabled()) {
1129: if(!terminating && MailForm->ProgressBar->Position
1130: && Application->MessageBox("Shut down the Mail Server?"
1131: ,"Mail Server In Use", MB_OKCANCEL)!=IDOK)
1132: return;
1133: MailStopExecute(Sender);
1134: }
1135:
1136: if(FtpStop->Enabled && !ftpServiceEnabled()) {
1137: if(!terminating && FtpForm->ProgressBar->Position
1138: && Application->MessageBox("Shut down the FTP Server?"
1139: ,"FTP Server In Use", MB_OKCANCEL)!=IDOK)
1140: return;
1141: FtpStopExecute(Sender);
1142: }
1143:
1144: if(WebStop->Enabled && !webServiceEnabled()) {
1145: if(!terminating && WebForm->ProgressBar->Position
1146: && Application->MessageBox("Shut down the Web Server?"
1147: ,"Web Server In Use", MB_OKCANCEL)!=IDOK)
1148: return;
1149: WebStopExecute(Sender);
1150: }
1151:
1152: if(ServicesStop->Enabled && !servicesServiceEnabled())
1153: ServicesStopExecute(Sender);
1154:
1155: CanClose=true;
1156: }
1157:
1158: //---------------------------------------------------------------------------
1159: BOOL StartNTsvc(SC_HANDLE svc, SERVICE_STATUS* status, QUERY_SERVICE_CONFIG* config, DWORD config_size)
1160: {
1161: if(svc==NULL || startService==NULL || queryServiceStatus==NULL || config==NULL)
1162: return(FALSE);
1163:
1164: DWORD ret;
1165: if(!queryServiceConfig(svc,config,config_size,&ret))
1166: return(FALSE);
1167: if(config->dwStartType==SERVICE_DISABLED)
1168: return(FALSE);
1169: if(!queryServiceStatus(svc,status))
1170: return(FALSE);
1171: if(status->dwCurrentState!=SERVICE_STOPPED)
1172: return(TRUE);
1173: if(!startService(svc,0,NULL))
1174: Application->MessageBox(AnsiString("ERROR " + IntToStr(GetLastError()) +
1175: " starting " + config->lpDisplayName).c_str()
1176: ,"ERROR"
1177: ,MB_OK|MB_ICONEXCLAMATION);
1178: return(TRUE);
1179: }
1180: //---------------------------------------------------------------------------
1181: void __fastcall TMainForm::TelnetStartExecute(TObject *Sender)
1182: {
1183: if(!StartNTsvc(bbs_svc,&bbs_svc_status,bbs_svc_config,bbs_svc_config_size))
1184: bbs_start();
1185: }
1186: //---------------------------------------------------------------------------
1187: void __fastcall TMainForm::ServicesStartExecute(TObject *Sender)
1188: {
1189: if(StartNTsvc(services_svc,&services_svc_status,services_svc_config,services_svc_config_size))
1190: return;
1191: Screen->Cursor=crAppStart;
1192: services_status(NULL, "Starting");
1193:
1194: FILE* fp=fopen(ini_file,"r");
1195: sbbs_read_ini(fp
1196: ,&MainForm->global
1197: ,NULL ,NULL
1198: ,NULL ,NULL
1199: ,NULL ,NULL
1200: ,NULL ,NULL
1201: ,NULL ,&services_startup
1202: );
1203: if(fp!=NULL)
1204: fclose(fp);
1205:
1206: _beginthread((void(*)(void*))services_thread,0,&services_startup);
1207: Application->ProcessMessages();
1208: }
1209:
1210: //---------------------------------------------------------------------------
1211: BOOL StopNTsvc(SC_HANDLE svc, SERVICE_STATUS* status)
1212: {
1213: if(svc==NULL || controlService==NULL)
1214: return(FALSE);
1215:
1216: return controlService(svc,SERVICE_CONTROL_STOP,status);
1217: }
1218:
1219: //---------------------------------------------------------------------------
1220:
1221: void __fastcall TMainForm::ServicesStopExecute(TObject *Sender)
1222: {
1223: if(StopNTsvc(services_svc,&services_svc_status))
1224: return;
1225: Screen->Cursor=crAppStart;
1226: services_status(NULL, "Terminating");
1227: services_terminate();
1228: Application->ProcessMessages();
1229: }
1230: //---------------------------------------------------------------------------
1231:
1232: void __fastcall TMainForm::TelnetStopExecute(TObject *Sender)
1233: {
1234: if(StopNTsvc(bbs_svc,&bbs_svc_status))
1235: return;
1236: Screen->Cursor=crAppStart;
1237: bbs_status(NULL, "Terminating");
1238: bbs_terminate();
1239: Application->ProcessMessages();
1240: }
1241: //---------------------------------------------------------------------------
1242:
1243: void __fastcall TMainForm::TelnetConfigureExecute(TObject *Sender)
1244: {
1245: static inside;
1246: if(inside) return;
1247: inside=true;
1248:
1249: Application->CreateForm(__classid(TTelnetCfgDlg), &TelnetCfgDlg);
1250: TelnetCfgDlg->ShowModal();
1251: delete TelnetCfgDlg;
1252:
1253: inside=false;
1254: }
1255: //---------------------------------------------------------------------------
1256:
1257:
1258: void __fastcall TMainForm::NodeListStartExecute(TObject *Sender)
1259: {
1260: NodeForm->Timer->Enabled=true;
1261: NodeListStart->Enabled=false;
1262: NodeListStop->Enabled=true;
1263: }
1264: //---------------------------------------------------------------------------
1265:
1266: void __fastcall TMainForm::NodeListStopExecute(TObject *Sender)
1267: {
1268: NodeForm->Timer->Enabled=false;
1269: NodeListStart->Enabled=true;
1270: NodeListStop->Enabled=false;
1271: }
1272: //---------------------------------------------------------------------------
1273:
1274:
1275: void __fastcall TMainForm::MailConfigureExecute(TObject *Sender)
1276: {
1277: static inside;
1278: if(inside) return;
1279: inside=true;
1280:
1281: Application->CreateForm(__classid(TMailCfgDlg), &MailCfgDlg);
1282: MailCfgDlg->ShowModal();
1283: delete MailCfgDlg;
1284:
1285: inside=false;
1286: }
1287: //---------------------------------------------------------------------------
1288:
1289: void __fastcall TMainForm::MailStartExecute(TObject *Sender)
1290: {
1291: if(!StartNTsvc(mail_svc,&mail_svc_status,mail_svc_config,mail_svc_config_size))
1292: mail_start();
1293: }
1294: //---------------------------------------------------------------------------
1295:
1296: void __fastcall TMainForm::MailStopExecute(TObject *Sender)
1297: {
1298: if(StopNTsvc(mail_svc,&mail_svc_status))
1299: return;
1300: Screen->Cursor=crAppStart;
1301: mail_status(NULL, "Terminating");
1302: mail_terminate();
1303: Application->ProcessMessages();
1304: }
1305: //---------------------------------------------------------------------------
1306: void __fastcall TMainForm::ViewTelnetExecute(TObject *Sender)
1307: {
1308: TelnetForm->Visible=ViewTelnet->Checked;
1309: }
1310: //---------------------------------------------------------------------------
1311: void __fastcall TMainForm::ViewEventsExecute(TObject *Sender)
1312: {
1313: EventsForm->Visible=ViewEvents->Checked;
1314: }
1315: //---------------------------------------------------------------------------
1316:
1317: void __fastcall TMainForm::ViewNodesExecute(TObject *Sender)
1318: {
1319: NodeForm->Visible=ViewNodes->Checked;
1320: }
1321: //---------------------------------------------------------------------------
1322:
1323: void __fastcall TMainForm::ViewMailServerExecute(TObject *Sender)
1324: {
1325: MailForm->Visible=ViewMailServer->Checked;
1326: }
1327: //---------------------------------------------------------------------------
1328:
1329: void __fastcall TMainForm::ViewFtpServerExecute(TObject *Sender)
1330: {
1331: FtpForm->Visible=ViewFtpServer->Checked;
1332: }
1333: //---------------------------------------------------------------------------
1334: void __fastcall TMainForm::ViewWebServerExecute(TObject *Sender)
1335: {
1336: WebForm->Visible=ViewWebServer->Checked;
1337: }
1338: //---------------------------------------------------------------------------
1339: void __fastcall TMainForm::ViewServicesExecute(TObject *Sender)
1340: {
1341: ServicesForm->Visible=ViewServices->Checked;
1342: }
1343: //---------------------------------------------------------------------------
1344: void __fastcall TMainForm::ViewStatsExecute(TObject *Sender)
1345: {
1346: StatsForm->Visible=ViewStats->Checked;
1347: }
1348: //---------------------------------------------------------------------------
1349: void __fastcall TMainForm::ViewClientsExecute(TObject *Sender)
1350: {
1351: ClientForm->Visible=ViewClients->Checked;
1352: }
1353: //---------------------------------------------------------------------------
1354: void __fastcall TMainForm::FtpStartExecute(TObject *Sender)
1355: {
1356: if(!StartNTsvc(ftp_svc,&ftp_svc_status,ftp_svc_config,ftp_svc_config_size))
1357: ftp_start();
1358: }
1359: //---------------------------------------------------------------------------
1360:
1361: void __fastcall TMainForm::FtpStopExecute(TObject *Sender)
1362: {
1363: if(StopNTsvc(ftp_svc,&ftp_svc_status))
1364: return;
1365: Screen->Cursor=crAppStart;
1366: ftp_status(NULL, "Terminating");
1367: ftp_terminate();
1368: Application->ProcessMessages();
1369: }
1370: //---------------------------------------------------------------------------
1371:
1372: void __fastcall TMainForm::FtpConfigureExecute(TObject *Sender)
1373: {
1374: static inside;
1375: if(inside) return;
1376: inside=true;
1377:
1378: Application->CreateForm(__classid(TFtpCfgDlg), &FtpCfgDlg);
1379: FtpCfgDlg->ShowModal();
1380: delete FtpCfgDlg;
1381:
1382: inside=false;
1383: }
1384: //---------------------------------------------------------------------------
1385: void __fastcall TMainForm::WebStartExecute(TObject *Sender)
1386: {
1387: if(!StartNTsvc(web_svc,&web_svc_status,web_svc_config,web_svc_config_size))
1388: web_start();
1389: }
1390: //---------------------------------------------------------------------------
1391: void __fastcall TMainForm::WebStopExecute(TObject *Sender)
1392: {
1393: if(StopNTsvc(web_svc,&web_svc_status))
1394: return;
1395: Screen->Cursor=crAppStart;
1396: web_status(NULL, "Terminating");
1397: web_terminate();
1398: Application->ProcessMessages();
1399: }
1400: //---------------------------------------------------------------------------
1401: void __fastcall TMainForm::WebConfigureExecute(TObject *Sender)
1402: {
1403: static inside;
1404: if(inside) return;
1405: inside=true;
1406:
1407: Application->CreateForm(__classid(TWebCfgDlg), &WebCfgDlg);
1408: WebCfgDlg->ShowModal();
1409: delete WebCfgDlg;
1410:
1411: inside=false;
1412: }
1413: //---------------------------------------------------------------------------
1414: void __fastcall TMainForm::BBSConfigureMenuItemClick(TObject *Sender)
1415: {
1416: char str[256];
1417:
1418: sprintf(str,ConfigCommand.c_str()
1419: ,cfg.exec_dir, cfg.ctrl_dir);
1420: STARTUPINFO startup_info={0};
1421: PROCESS_INFORMATION process_info;
1422: startup_info.cb=sizeof(startup_info);
1423: startup_info.lpTitle="Synchronet Configuration Utility";
1424: CreateProcess(
1425: NULL, // pointer to name of executable module
1426: str, // pointer to command line string
1427: NULL, // process security attributes
1428: NULL, // thread security attributes
1429: FALSE, // handle inheritance flag
1430: CREATE_NEW_CONSOLE|CREATE_SEPARATE_WOW_VDM, // creation flags
1431: NULL, // pointer to new environment block
1432: cfg.ctrl_dir, // pointer to current directory name
1433: &startup_info, // pointer to STARTUPINFO
1434: &process_info // pointer to PROCESS_INFORMATION
1435: );
1436: // Resource leak if you don't close these:
1437: CloseHandle(process_info.hThread);
1438: CloseHandle(process_info.hProcess);
1439: }
1440: //---------------------------------------------------------------------------
1441:
1442:
1443:
1444:
1445: void __fastcall TMainForm::NodeCloseButtonClick(TObject *Sender)
1446: {
1447: ViewNodesExecute(Sender);
1448: }
1449: //---------------------------------------------------------------------------
1450:
1451: void __fastcall TMainForm::TelnetCloseButtonClick(TObject *Sender)
1452: {
1453: ViewTelnetExecute(Sender);
1454: }
1455: //---------------------------------------------------------------------------
1456:
1457: void __fastcall TMainForm::MailCloseButtonClick(TObject *Sender)
1458: {
1459: ViewMailServerExecute(Sender);
1460: }
1461: //---------------------------------------------------------------------------
1462:
1463: void __fastcall TMainForm::FtpCloseButtonClick(TObject *Sender)
1464: {
1465: ViewFtpServerExecute(Sender);
1466: }
1467: //---------------------------------------------------------------------------
1468: void __fastcall TMainForm::StatsTimerTick(TObject *Sender)
1469: {
1470: char str[128];
1471: int i;
1472: static stats_t stats;
1473: static users;
1474: static newusers;
1475: static counter;
1476:
1477: if(!StatsForm->Visible)
1478: return;
1479:
1480: getstats(&cfg,0,&stats);
1481:
1482: StatsForm->TotalLogons->Caption=AnsiString(stats.logons);
1483: StatsForm->LogonsToday->Caption=AnsiString(stats.ltoday);
1484: StatsForm->TotalTimeOn->Caption=AnsiString(stats.timeon);
1485: StatsForm->TimeToday->Caption=AnsiString(stats.ttoday);
1486: StatsForm->TotalEMail->Caption=AnsiString(getmail(&cfg,0,0));
1487: StatsForm->EMailToday->Caption=AnsiString(stats.etoday);
1488: StatsForm->TotalFeedback->Caption=AnsiString(getmail(&cfg,1,0));
1489: StatsForm->FeedbackToday->Caption=AnsiString(stats.ftoday);
1490: /* Don't scan a large user database more often than necessary */
1491: if(!counter || users<100 || (counter%(users/100))==0 || stats.nusers!=newusers)
1492: users=total_users(&cfg);
1493: StatsForm->TotalUsers->Caption=AnsiString(users);
1494: StatsForm->NewUsersToday->Caption=AnsiString(newusers=stats.nusers);
1495: StatsForm->PostsToday->Caption=AnsiString(stats.ptoday);
1496: StatsForm->UploadedFiles->Caption=AnsiString(stats.uls);
1497: if(stats.ulb>=1024*1024)
1498: sprintf(str,"%.1fM",stats.ulb/(1024.0*1024.0));
1499: else if(stats.ulb>=1024)
1500: sprintf(str,"%luK",stats.ulb/1024);
1501: else
1502: sprintf(str,"%lu",stats.ulb);
1503: StatsForm->UploadedBytes->Caption=AnsiString(str);
1504: StatsForm->DownloadedFiles->Caption=AnsiString(stats.dls);
1505: if(stats.dlb>=1024*1024)
1506: sprintf(str,"%.1fM",stats.dlb/(1024.0*1024.0));
1507: else if(stats.dlb>=1024)
1508: sprintf(str,"%luK",stats.dlb/1024);
1509: else
1510: sprintf(str,"%lu",stats.dlb);
1511: StatsForm->DownloadedBytes->Caption=AnsiString(str);
1512:
1513: counter++;
1514: }
1515: //---------------------------------------------------------------------------
1516: void __fastcall TMainForm::StatsCloseButtonClick(TObject *Sender)
1517: {
1518: ViewStatsExecute(Sender);
1519: }
1520: //---------------------------------------------------------------------------
1521: enum {
1522: PAGE_UPPERLEFT
1523: ,PAGE_UPPERRIGHT
1524: ,PAGE_LOWERRIGHT
1525: ,PAGE_LOWERLEFT
1526: };
1527: TPageControl* __fastcall TMainForm::PageControl(int num)
1528: {
1529: switch(num)
1530: {
1531: case PAGE_UPPERLEFT:
1532: return(UpperLeftPageControl);
1533: case PAGE_UPPERRIGHT:
1534: return(UpperRightPageControl);
1535: case PAGE_LOWERRIGHT:
1536: return(LowerRightPageControl);
1537: case PAGE_LOWERLEFT:
1538: return(LowerLeftPageControl);
1539: }
1540: return(NULL);
1541: }
1542: int __fastcall TMainForm::PageNum(TPageControl* obj)
1543: {
1544: if(obj==UpperLeftPageControl)
1545: return(PAGE_UPPERLEFT);
1546: if(obj==UpperRightPageControl)
1547: return(PAGE_UPPERRIGHT);
1548: if(obj==LowerRightPageControl)
1549: return(PAGE_LOWERRIGHT);
1550: if(obj==LowerLeftPageControl)
1551: return(PAGE_LOWERLEFT);
1552: return(PAGE_LOWERRIGHT);
1553: }
1554: TColor __fastcall TMainForm::ReadColor(TRegistry* Registry
1555: ,AnsiString name)
1556: {
1557: if(Registry->ValueExists(name + "Color"))
1558: return(StringToColor(Registry->ReadString(name + "Color")));
1559:
1560: return(clWindow); // Default
1561: }
1562: void __fastcall TMainForm::WriteColor(TRegistry* Registry
1563: ,AnsiString name, TColor color)
1564: {
1565: Registry->WriteString(name + "Color", ColorToString(color));
1566: }
1567:
1568: int FontStyleToInt(TFont* Font)
1569: {
1570: int style=0;
1571: for(int i=fsBold;i<=fsStrikeOut;i++)
1572: if(Font->Style.Contains((TFontStyle)i))
1573: style|=(1<<i);
1574: return(style);
1575: }
1576:
1577: void IntToFontStyle(int style, TFont* Font)
1578: {
1579: Font->Style=Font->Style.Clear();
1580: for(int i=fsBold;i<=fsStrikeOut;i++)
1581: if(style&(1<<i))
1582: Font->Style=Font->Style<<(TFontStyle)i;
1583: }
1584:
1585: void __fastcall TMainForm::ReadFont(AnsiString subkey, TFont* Font)
1586: {
1587: // Read Registry keys
1588: TRegistry* Registry=new TRegistry;
1589: AnsiString key = REG_KEY + subkey + "Font";
1590: if(!Registry->OpenKey(key,true)) {
1591: Application->MessageBox("Error opening registry key"
1592: ,key.c_str(),MB_OK|MB_ICONEXCLAMATION);
1593: Application->Terminate();
1594: return;
1595: }
1596: if(Registry->ValueExists("Name"))
1597: Font->Name=Registry->ReadString("Name");
1598: if(Registry->ValueExists("Color"))
1599: Font->Color=StringToColor(Registry->ReadString("Color"));
1600: if(Registry->ValueExists("Height"))
1601: Font->Height=Registry->ReadInteger("Height");
1602: if(Registry->ValueExists("Size"))
1603: Font->Size=Registry->ReadInteger("Size");
1604:
1605: if(Registry->ValueExists("Style"))
1606: IntToFontStyle(Registry->ReadInteger("Style"),Font);
1607:
1608: Registry->CloseKey();
1609: delete Registry;
1610: }
1611: void __fastcall TMainForm::WriteFont(AnsiString subkey, TFont* Font)
1612: {
1613: // Read Registry keys
1614: TRegistry* Registry=new TRegistry;
1615: AnsiString key = REG_KEY + subkey + "Font";
1616: if(!Registry->OpenKey(key,true)) {
1617: Application->MessageBox("Error opening registry key"
1618: ,key.c_str(),MB_OK|MB_ICONEXCLAMATION);
1619: Application->Terminate();
1620: return;
1621: }
1622: Registry->WriteString("Name",Font->Name);
1623: Registry->WriteString("Color",ColorToString(Font->Color));
1624: Registry->WriteInteger("Height",Font->Height);
1625: Registry->WriteInteger("Size",Font->Size);
1626: Registry->WriteInteger("Style",FontStyleToInt(Font));
1627:
1628: Registry->CloseKey();
1629: delete Registry;
1630: }
1631: void __fastcall TMainForm::StartupTimerTick(TObject *Sender)
1632: {
1633: bool TelnetFormFloating=false;
1634: bool EventsFormFloating=false;
1635: bool ServicesFormFloating=false;
1636: bool NodeFormFloating=false;
1637: bool StatsFormFloating=false;
1638: bool ClientFormFloating=false;
1639: bool MailFormFloating=false;
1640: bool FtpFormFloating=false;
1641: bool WebFormFloating=false;
1642: int NodeFormPage=PAGE_UPPERLEFT;
1643: int StatsFormPage=PAGE_UPPERLEFT;
1644: int ClientFormPage=PAGE_UPPERLEFT;
1645: int TelnetFormPage=PAGE_LOWERLEFT;
1646: int EventsFormPage=PAGE_LOWERLEFT;
1647: int MailFormPage=PAGE_UPPERRIGHT;
1648: int FtpFormPage=PAGE_LOWERRIGHT;
1649: int WebFormPage=PAGE_LOWERRIGHT;
1650: int ServicesFormPage=PAGE_LOWERRIGHT;
1651: #if 0 /* not yet working */
1652: bool TelnetFormVisible=true;
1653: bool EventsFormVisible=true;
1654: bool ServicesFormVisible=true;
1655: bool NodeFormVisible=true;
1656: bool StatsFormVisible=true;
1657: bool ClientFormVisible=true;
1658: bool MailFormVisible=true;
1659: bool FtpFormVisible=true;
1660: bool WebFormVisible=true;
1661: #endif
1662:
1663: AnsiString Str;
1664:
1665: delete StartupTimer;
1666:
1667: // Read Registry keys
1668: TRegistry* Registry=new TRegistry;
1669: if(!Registry->OpenKey(REG_KEY,true)) {
1670: Application->MessageBox("Error opening registry key"
1671: ,REG_KEY,MB_OK|MB_ICONEXCLAMATION);
1672: Application->Terminate();
1673: return;
1674: }
1675:
1676: TopPanel->Height=Height/3;
1677: UpperLeftPageControl->Width=Width/2;
1678: LowerLeftPageControl->Width=Width/2;
1679:
1680: if(Registry->ValueExists("TopPanelHeight"))
1681: TopPanel->Height=Registry->ReadInteger("TopPanelHeight");
1682: if(Registry->ValueExists("UpperLeftPageControlWidth"))
1683: UpperLeftPageControl->Width
1684: =Registry->ReadInteger("UpperLeftPageControlWidth");
1685: if(Registry->ValueExists("LowerLeftPageControlWidth"))
1686: LowerLeftPageControl->Width
1687: =Registry->ReadInteger("LowerLeftPageControlWidth");
1688: if(Registry->ValueExists("UndockableForms"))
1689: UndockableForms=Registry->ReadBool("UndockableForms");
1690:
1691: if(UndockableForms) {
1692: if(Registry->ValueExists("TelnetFormFloating"))
1693: TelnetFormFloating=Registry->ReadBool("TelnetFormFloating");
1694: if(Registry->ValueExists("EventsFormFloating"))
1695: EventsFormFloating=Registry->ReadBool("EventsFormFloating");
1696: if(Registry->ValueExists("ServicesFormFloating"))
1697: ServicesFormFloating=Registry->ReadBool("ServicesFormFloating");
1698: if(Registry->ValueExists("NodeFormFloating"))
1699: NodeFormFloating=Registry->ReadBool("NodeFormFloating");
1700: if(Registry->ValueExists("StatsFormFloating"))
1701: StatsFormFloating=Registry->ReadBool("StatsFormFloating");
1702: if(Registry->ValueExists("ClientFormFloating"))
1703: ClientFormFloating=Registry->ReadBool("ClientFormFloating");
1704: if(Registry->ValueExists("MailFormFloating"))
1705: MailFormFloating=Registry->ReadBool("MailFormFloating");
1706: if(Registry->ValueExists("FtpFormFloating"))
1707: FtpFormFloating=Registry->ReadBool("FtpFormFloating");
1708: if(Registry->ValueExists("WebFormFloating"))
1709: WebFormFloating=Registry->ReadBool("WebFormFloating");
1710: }
1711: #if 0
1712: if(Registry->ValueExists("TelnetFormVisible"))
1713: TelnetFormVisible=Registry->ReadBool("TelnetFormVisible");
1714: if(Registry->ValueExists("EventsFormVisible"))
1715: EventsFormVisible=Registry->ReadBool("EventsFormVisible");
1716: if(Registry->ValueExists("ServicesFormVisible"))
1717: ServicesFormVisible=Registry->ReadBool("ServicesFormVisible");
1718: if(Registry->ValueExists("NodeFormVisible"))
1719: NodeFormVisible=Registry->ReadBool("NodeFormVisible");
1720: if(Registry->ValueExists("StatsFormVisible"))
1721: StatsFormVisible=Registry->ReadBool("StatsFormVisible");
1722: if(Registry->ValueExists("ClientFormVisible"))
1723: ClientFormVisible=Registry->ReadBool("ClientFormVisible");
1724: if(Registry->ValueExists("MailFormVisible"))
1725: MailFormVisible=Registry->ReadBool("MailFormVisible");
1726: if(Registry->ValueExists("FtpFormVisible"))
1727: FtpFormVisible=Registry->ReadBool("FtpFormVisible");
1728: if(Registry->ValueExists("WebFormVisible"))
1729: WebFormVisible=Registry->ReadBool("WebFormVisible");
1730: #endif
1731: if(Registry->ValueExists("TelnetFormPage"))
1732: TelnetFormPage=Registry->ReadInteger("TelnetFormPage");
1733: if(Registry->ValueExists("EventsFormPage"))
1734: EventsFormPage=Registry->ReadInteger("EventsFormPage");
1735: if(Registry->ValueExists("ServicesFormPage"))
1736: ServicesFormPage=Registry->ReadInteger("ServicesFormPage");
1737: if(Registry->ValueExists("NodeFormPage"))
1738: NodeFormPage=Registry->ReadInteger("NodeFormPage");
1739: if(Registry->ValueExists("StatsFormPage"))
1740: StatsFormPage=Registry->ReadInteger("StatsFormPage");
1741: if(Registry->ValueExists("ClientFormPage"))
1742: ClientFormPage=Registry->ReadInteger("ClientFormPage");
1743: if(Registry->ValueExists("MailFormPage"))
1744: MailFormPage=Registry->ReadInteger("MailFormPage");
1745: if(Registry->ValueExists("FtpFormPage"))
1746: FtpFormPage=Registry->ReadInteger("FtpFormPage");
1747: if(Registry->ValueExists("WebFormPage"))
1748: WebFormPage=Registry->ReadInteger("WebFormPage");
1749:
1750: TelnetForm->Log->Color=ReadColor(Registry,"TelnetLog");
1751: ReadFont("TelnetLog",TelnetForm->Log->Font);
1752: EventsForm->Log->Color=ReadColor(Registry,"EventsLog");
1753: ReadFont("EventsLog",EventsForm->Log->Font);
1754: ServicesForm->Log->Color=ReadColor(Registry,"ServicesLog");
1755: ReadFont("ServicesLog",ServicesForm->Log->Font);
1756: MailForm->Log->Color=ReadColor(Registry,"MailLog");
1757: ReadFont("MailLog",MailForm->Log->Font);
1758: FtpForm->Log->Color=ReadColor(Registry,"FtpLog");
1759: ReadFont("FtpLog",FtpForm->Log->Font);
1760: WebForm->Log->Color=ReadColor(Registry,"WebLog");
1761: ReadFont("WebLog",WebForm->Log->Font);
1762: NodeForm->ListBox->Color=ReadColor(Registry,"NodeList");
1763: ReadFont("NodeList",NodeForm->ListBox->Font);
1764: ClientForm->ListView->Color=ReadColor(Registry,"ClientList");
1765: ReadFont("ClientList",ClientForm->ListView->Font);
1766:
1767: if(Registry->ValueExists("TelnetFormTop"))
1768: TelnetForm->Top=Registry->ReadInteger("TelnetFormTop");
1769: if(Registry->ValueExists("TelnetFormLeft"))
1770: TelnetForm->Left=Registry->ReadInteger("TelnetFormLeft");
1771: if(Registry->ValueExists("TelnetFormWidth"))
1772: TelnetForm->Width=Registry->ReadInteger("TelnetFormWidth");
1773: if(Registry->ValueExists("TelnetFormHeight"))
1774: TelnetForm->Height=Registry->ReadInteger("TelnetFormHeight");
1775:
1776: if(Registry->ValueExists("EventsFormTop"))
1777: EventsForm->Top=Registry->ReadInteger("EventsFormTop");
1778: if(Registry->ValueExists("EventsFormLeft"))
1779: EventsForm->Left=Registry->ReadInteger("EventsFormLeft");
1780: if(Registry->ValueExists("EventsFormWidth"))
1781: EventsForm->Width=Registry->ReadInteger("EventsFormWidth");
1782: if(Registry->ValueExists("EventsFormHeight"))
1783: EventsForm->Height=Registry->ReadInteger("EventsFormHeight");
1784:
1785: if(Registry->ValueExists("ServicesFormTop"))
1786: ServicesForm->Top=Registry->ReadInteger("ServicesFormTop");
1787: if(Registry->ValueExists("ServicesFormLeft"))
1788: ServicesForm->Left=Registry->ReadInteger("ServicesFormLeft");
1789: if(Registry->ValueExists("ServicesFormWidth"))
1790: ServicesForm->Width=Registry->ReadInteger("ServicesFormWidth");
1791: if(Registry->ValueExists("ServicesFormHeight"))
1792: ServicesForm->Height=Registry->ReadInteger("ServicesFormHeight");
1793:
1794: if(Registry->ValueExists("FtpFormTop"))
1795: FtpForm->Top=Registry->ReadInteger("FtpFormTop");
1796: if(Registry->ValueExists("FtpFormLeft"))
1797: FtpForm->Left=Registry->ReadInteger("FtpFormLeft");
1798: if(Registry->ValueExists("FtpFormWidth"))
1799: FtpForm->Width=Registry->ReadInteger("FtpFormWidth");
1800: if(Registry->ValueExists("FtpFormHeight"))
1801: FtpForm->Height=Registry->ReadInteger("FtpFormHeight");
1802:
1803: if(Registry->ValueExists("WebFormTop"))
1804: WebForm->Top=Registry->ReadInteger("WebFormTop");
1805: if(Registry->ValueExists("WebFormLeft"))
1806: WebForm->Left=Registry->ReadInteger("WebFormLeft");
1807: if(Registry->ValueExists("WebFormWidth"))
1808: WebForm->Width=Registry->ReadInteger("WebFormWidth");
1809: if(Registry->ValueExists("WebFormHeight"))
1810: WebForm->Height=Registry->ReadInteger("WebFormHeight");
1811:
1812: if(Registry->ValueExists("MailFormTop"))
1813: MailForm->Top=Registry->ReadInteger("MailFormTop");
1814: if(Registry->ValueExists("MailFormLeft"))
1815: MailForm->Left=Registry->ReadInteger("MailFormLeft");
1816: if(Registry->ValueExists("MailFormWidth"))
1817: MailForm->Width=Registry->ReadInteger("MailFormWidth");
1818: if(Registry->ValueExists("MailFormHeight"))
1819: MailForm->Height=Registry->ReadInteger("MailFormHeight");
1820:
1821: if(Registry->ValueExists("NodeFormTop"))
1822: NodeForm->Top=Registry->ReadInteger("NodeFormTop");
1823: if(Registry->ValueExists("NodeFormLeft"))
1824: NodeForm->Left=Registry->ReadInteger("NodeFormLeft");
1825: if(Registry->ValueExists("NodeFormWidth"))
1826: NodeForm->Width=Registry->ReadInteger("NodeFormWidth");
1827: if(Registry->ValueExists("NodeFormHeight"))
1828: NodeForm->Height=Registry->ReadInteger("NodeFormHeight");
1829:
1830: if(Registry->ValueExists("StatsFormTop"))
1831: StatsForm->Top=Registry->ReadInteger("StatsFormTop");
1832: if(Registry->ValueExists("StatsFormLeft"))
1833: StatsForm->Left=Registry->ReadInteger("StatsFormLeft");
1834: if(Registry->ValueExists("StatsFormWidth"))
1835: StatsForm->Width=Registry->ReadInteger("StatsFormWidth");
1836: if(Registry->ValueExists("StatsFormHeight"))
1837: StatsForm->Height=Registry->ReadInteger("StatsFormHeight");
1838:
1839: if(Registry->ValueExists("ClientFormTop"))
1840: ClientForm->Top=Registry->ReadInteger("ClientFormTop");
1841: if(Registry->ValueExists("ClientFormLeft"))
1842: ClientForm->Left=Registry->ReadInteger("ClientFormLeft");
1843: if(Registry->ValueExists("ClientFormWidth"))
1844: ClientForm->Width=Registry->ReadInteger("ClientFormWidth");
1845: if(Registry->ValueExists("ClientFormHeight"))
1846: ClientForm->Height=Registry->ReadInteger("ClientFormHeight");
1847:
1848: for(int i=0;i<ClientForm->ListView->Columns->Count;i++) {
1849: char str[128];
1850: sprintf(str,"ClientListColumn%dWidth",i);
1851: if(Registry->ValueExists(str))
1852: ClientForm->ListView->Columns->Items[i]->Width
1853: =Registry->ReadInteger(str);
1854: }
1855:
1856: if(Registry->ValueExists("ToolbarVisible"))
1857: Toolbar->Visible=Registry->ReadBool("ToolbarVisible");
1858:
1859: ViewToolbarMenuItem->Checked=Toolbar->Visible;
1860: ViewStatusBarMenuItem->Checked=StatusBar->Visible;
1861:
1862: if(Registry->ValueExists("MaxLogLen"))
1863: MaxLogLen=Registry->ReadInteger("MaxLogLen");
1864:
1865: if(Registry->ValueExists("LoginCommand"))
1866: LoginCommand=Registry->ReadString("LoginCommand");
1867: if(Registry->ValueExists("ConfigCommand"))
1868: ConfigCommand=Registry->ReadString("ConfigCommand");
1869: if(Registry->ValueExists("Password"))
1870: Password=Registry->ReadString("Password");
1871: if(Registry->ValueExists("MinimizeToSysTray"))
1872: MinimizeToSysTray=Registry->ReadBool("MinimizeToSysTray");
1873: if(Registry->ValueExists("UseFileAssociations"))
1874: UseFileAssociations=Registry->ReadBool("UseFileAssociations");
1875: if(Registry->ValueExists("NodeDisplayInterval"))
1876: NodeForm->Timer->Interval=Registry->ReadInteger("NodeDisplayInterval")*1000;
1877: if(Registry->ValueExists("ClientDisplayInterval"))
1878: ClientForm->Timer->Interval=Registry->ReadInteger("ClientDisplayInterval")*1000;
1879:
1880: if(Registry->ValueExists("MailLogFile"))
1881: MailLogFile=Registry->ReadInteger("MailLogFile");
1882: else
1883: MailLogFile=true;
1884:
1885: if(Registry->ValueExists("FtpLogFile"))
1886: FtpLogFile=Registry->ReadInteger("FtpLogFile");
1887: else
1888: FtpLogFile=true;
1889:
1890: FILE* fp;
1891: if((!Registry->ValueExists("SysAutoStart")
1892: || (Registry->ValueExists("Imported") && Registry->ReadBool("Imported")))
1893: && ini_file[0]) {
1894: if((fp=fopen(ini_file,"r"))==NULL) {
1895: char err[MAX_PATH*2];
1896: sprintf(err,"Error %d opening initialization file: %s",errno,ini_file);
1897: Application->MessageBox(err,"ERROR",MB_OK|MB_ICONEXCLAMATION);
1898: Application->Terminate();
1899: return;
1900: }
1901: sbbs_read_ini(fp
1902: ,&global
1903: ,&SysAutoStart ,&bbs_startup
1904: ,&FtpAutoStart ,&ftp_startup
1905: ,&WebAutoStart ,&web_startup
1906: ,&MailAutoStart ,&mail_startup
1907: ,&ServicesAutoStart ,&services_startup
1908: );
1909: StatusBar->Panels->Items[4]->Text="Read " + AnsiString(ini_file);
1910: fclose(fp);
1911:
1912: } else { /* Legacy (v3.10-3.11) */
1913:
1914: if(Registry->ValueExists("SysAutoStart"))
1915: SysAutoStart=Registry->ReadInteger("SysAutoStart");
1916: else
1917: SysAutoStart=true;
1918:
1919: if(Registry->ValueExists("MailAutoStart"))
1920: MailAutoStart=Registry->ReadInteger("MailAutoStart");
1921: else
1922: MailAutoStart=true;
1923:
1924: if(Registry->ValueExists("FtpAutoStart"))
1925: FtpAutoStart=Registry->ReadInteger("FtpAutoStart");
1926: else
1927: FtpAutoStart=true;
1928:
1929: if(Registry->ValueExists("WebAutoStart"))
1930: WebAutoStart=Registry->ReadInteger("WebAutoStart");
1931: else
1932: WebAutoStart=true;
1933:
1934: if(Registry->ValueExists("ServicesAutoStart"))
1935: ServicesAutoStart=Registry->ReadInteger("ServicesAutoStart");
1936: else
1937: ServicesAutoStart=true;
1938:
1939: if(Registry->ValueExists("Hostname"))
1940: SAFECOPY(global.host_name,Registry->ReadString("Hostname").c_str());
1941: if(Registry->ValueExists("CtrlDirectory"))
1942: SAFECOPY(global.ctrl_dir,Registry->ReadString("CtrlDirectory").c_str());
1943: if(Registry->ValueExists("TempDirectory"))
1944: SAFECOPY(global.temp_dir,Registry->ReadString("TempDirectory").c_str());
1945:
1946: if(Registry->ValueExists("SemFileCheckFrequency"))
1947: global.sem_chk_freq=Registry->ReadInteger("SemFileCheckFrequency");
1948:
1949: /* JavaScript Operating Parameters */
1950: if(Registry->ValueExists("JS_MaxBytes"))
1951: global.js.max_bytes=Registry->ReadInteger("JS_MaxBytes");
1952: if(global.js.max_bytes==0)
1953: global.js.max_bytes=JAVASCRIPT_MAX_BYTES;
1954: if(Registry->ValueExists("JS_ContextStack"))
1955: global.js.cx_stack=Registry->ReadInteger("JS_ContextStack");
1956: if(global.js.cx_stack==0)
1957: global.js.cx_stack=JAVASCRIPT_CONTEXT_STACK;
1958: if(Registry->ValueExists("JS_BranchLimit"))
1959: global.js.branch_limit=Registry->ReadInteger("JS_BranchLimit");
1960: if(Registry->ValueExists("JS_GcInterval"))
1961: global.js.gc_interval=Registry->ReadInteger("JS_GcInterval");
1962: if(Registry->ValueExists("JS_YieldInterval"))
1963: global.js.yield_interval=Registry->ReadInteger("JS_YieldInterval");
1964:
1965: if(Registry->ValueExists("TelnetInterface"))
1966: bbs_startup.telnet_interface=Registry->ReadInteger("TelnetInterface");
1967: if(Registry->ValueExists("RLoginInterface"))
1968: bbs_startup.rlogin_interface=Registry->ReadInteger("RLoginInterface");
1969:
1970: if(Registry->ValueExists("TelnetPort"))
1971: bbs_startup.telnet_port=Registry->ReadInteger("TelnetPort");
1972: if(Registry->ValueExists("RLoginPort"))
1973: bbs_startup.rlogin_port=Registry->ReadInteger("RLoginPort");
1974:
1975: if(Registry->ValueExists("FirstNode"))
1976: bbs_startup.first_node=Registry->ReadInteger("FirstNode");
1977:
1978: if(Registry->ValueExists("LastNode"))
1979: bbs_startup.last_node=Registry->ReadInteger("LastNode");
1980:
1981: if(Registry->ValueExists("OutbufHighwaterMark"))
1982: bbs_startup.outbuf_highwater_mark=Registry->ReadInteger("OutbufHighwaterMark");
1983: else
1984: bbs_startup.outbuf_highwater_mark=1024;
1985: if(Registry->ValueExists("OutbufDrainTimeout"))
1986: bbs_startup.outbuf_drain_timeout=Registry->ReadInteger("OutbufDrainTimeout");
1987: else
1988: bbs_startup.outbuf_drain_timeout=10;
1989:
1990: if(Registry->ValueExists("AnswerSound"))
1991: SAFECOPY(bbs_startup.answer_sound
1992: ,Registry->ReadString("AnswerSound").c_str());
1993:
1994: if(Registry->ValueExists("HangupSound"))
1995: SAFECOPY(bbs_startup.hangup_sound
1996: ,Registry->ReadString("HangupSound").c_str());
1997:
1998: if(Registry->ValueExists("StartupOptions"))
1999: bbs_startup.options=Registry->ReadInteger("StartupOptions");
2000:
2001: if(Registry->ValueExists("MailMaxClients"))
2002: mail_startup.max_clients=Registry->ReadInteger("MailMaxClients");
2003:
2004: if(Registry->ValueExists("MailMaxInactivity"))
2005: mail_startup.max_inactivity=Registry->ReadInteger("MailMaxInactivity");
2006:
2007: if(Registry->ValueExists("MailInterface"))
2008: mail_startup.interface_addr=Registry->ReadInteger("MailInterface");
2009:
2010: if(Registry->ValueExists("MailMaxDeliveryAttempts"))
2011: mail_startup.max_delivery_attempts
2012: =Registry->ReadInteger("MailMaxDeliveryAttempts");
2013:
2014: if(Registry->ValueExists("MailRescanFrequency"))
2015: mail_startup.rescan_frequency
2016: =Registry->ReadInteger("MailRescanFrequency");
2017:
2018: if(Registry->ValueExists("MailLinesPerYield"))
2019: mail_startup.lines_per_yield
2020: =Registry->ReadInteger("MailLinesPerYield");
2021:
2022: if(Registry->ValueExists("MailMaxRecipients"))
2023: mail_startup.max_recipients
2024: =Registry->ReadInteger("MailMaxRecipients");
2025:
2026: if(Registry->ValueExists("MailMaxMsgSize"))
2027: mail_startup.max_msg_size
2028: =Registry->ReadInteger("MailMaxMsgSize");
2029:
2030: if(Registry->ValueExists("MailSMTPPort"))
2031: mail_startup.smtp_port=Registry->ReadInteger("MailSMTPPort");
2032:
2033: if(Registry->ValueExists("MailPOP3Port"))
2034: mail_startup.pop3_port=Registry->ReadInteger("MailPOP3Port");
2035:
2036: if(Registry->ValueExists("MailRelayServer"))
2037: SAFECOPY(mail_startup.relay_server
2038: ,Registry->ReadString("MailRelayServer").c_str());
2039:
2040: if(Registry->ValueExists("MailRelayPort"))
2041: mail_startup.relay_port=Registry->ReadInteger("MailRelayPort");
2042:
2043: if(Registry->ValueExists("MailDefaultUser"))
2044: SAFECOPY(mail_startup.default_user
2045: ,Registry->ReadString("MailDefaultUser").c_str());
2046:
2047: if(Registry->ValueExists("MailDNSBlacklistSubject"))
2048: SAFECOPY(mail_startup.dnsbl_tag
2049: ,Registry->ReadString("MailDNSBlacklistSubject").c_str());
2050: else
2051: SAFECOPY(mail_startup.dnsbl_tag,"SPAM");
2052:
2053: if(Registry->ValueExists("MailDNSBlacklistHeader"))
2054: SAFECOPY(mail_startup.dnsbl_hdr
2055: ,Registry->ReadString("MailDNSBlacklistHeader").c_str());
2056: else
2057: SAFECOPY(mail_startup.dnsbl_hdr,"X-DNSBL");
2058:
2059: if(Registry->ValueExists("MailDNSServer"))
2060: SAFECOPY(mail_startup.dns_server
2061: ,Registry->ReadString("MailDNSServer").c_str());
2062:
2063: if(Registry->ValueExists("MailInboundSound"))
2064: SAFECOPY(mail_startup.inbound_sound
2065: ,Registry->ReadString("MailInboundSound").c_str());
2066:
2067: if(Registry->ValueExists("MailOutboundSound"))
2068: SAFECOPY(mail_startup.outbound_sound
2069: ,Registry->ReadString("MailOutboundSound").c_str());
2070:
2071: if(Registry->ValueExists("MailPOP3Sound"))
2072: SAFECOPY(mail_startup.pop3_sound
2073: ,Registry->ReadString("MailPOP3Sound").c_str());
2074:
2075: if(Registry->ValueExists("MailOptions"))
2076: mail_startup.options=Registry->ReadInteger("MailOptions");
2077:
2078: if(Registry->ValueExists("FtpMaxClients"))
2079: ftp_startup.max_clients=Registry->ReadInteger("FtpMaxClients");
2080:
2081: if(Registry->ValueExists("FtpMaxInactivity"))
2082: ftp_startup.max_inactivity=Registry->ReadInteger("FtpMaxInactivity");
2083:
2084: if(Registry->ValueExists("FtpQwkTimeout"))
2085: ftp_startup.qwk_timeout=Registry->ReadInteger("FtpQwkTimeout");
2086:
2087: if(Registry->ValueExists("FtpInterface"))
2088: ftp_startup.interface_addr=Registry->ReadInteger("FtpInterface");
2089:
2090: if(Registry->ValueExists("FtpPort"))
2091: ftp_startup.port=Registry->ReadInteger("FtpPort");
2092:
2093: if(Registry->ValueExists("FtpAnswerSound"))
2094: SAFECOPY(ftp_startup.answer_sound
2095: ,Registry->ReadString("FtpAnswerSound").c_str());
2096:
2097: if(Registry->ValueExists("FtpHangupSound"))
2098: SAFECOPY(ftp_startup.hangup_sound
2099: ,Registry->ReadString("FtpHangupSound").c_str());
2100:
2101: if(Registry->ValueExists("FtpHackAttemptSound"))
2102: SAFECOPY(ftp_startup.hack_sound
2103: ,Registry->ReadString("FtpHackAttemptSound").c_str());
2104:
2105: if(Registry->ValueExists("FtpIndexFileName"))
2106: SAFECOPY(ftp_startup.index_file_name
2107: ,Registry->ReadString("FtpIndexFileName").c_str());
2108:
2109: if(Registry->ValueExists("FtpHtmlIndexFile"))
2110: SAFECOPY(ftp_startup.html_index_file
2111: ,Registry->ReadString("FtpHtmlIndexFile").c_str());
2112:
2113: if(Registry->ValueExists("FtpHtmlIndexScript"))
2114: SAFECOPY(ftp_startup.html_index_script
2115: ,Registry->ReadString("FtpHtmlIndexScript").c_str());
2116:
2117: if(Registry->ValueExists("FtpOptions"))
2118: ftp_startup.options=Registry->ReadInteger("FtpOptions");
2119:
2120: if(Registry->ValueExists("ServicesInterface"))
2121: services_startup.interface_addr
2122: =Registry->ReadInteger("ServicesInterface");
2123:
2124: if(Registry->ValueExists("ServicesAnswerSound"))
2125: SAFECOPY(services_startup.answer_sound
2126: ,Registry->ReadString("ServicesAnswerSound").c_str());
2127:
2128: if(Registry->ValueExists("ServicesHangupSound"))
2129: SAFECOPY(services_startup.hangup_sound
2130: ,Registry->ReadString("ServicesHangupSound").c_str());
2131:
2132: if(Registry->ValueExists("ServicesOptions"))
2133: services_startup.options=Registry->ReadInteger("ServicesOptions");
2134:
2135: if(SaveIniSettings(Sender))
2136: Registry->WriteBool("Imported",true); /* Use the .ini file for these settings from now on */
2137:
2138: #if 0
2139: /******************************************************/
2140: /* Copy global values into each server startup struct */
2141: /******************************************************/
2142:
2143: /* used to be handled in bbs_start() */
2144: SAFECOPY(bbs_startup.ctrl_dir,global.ctrl_dir);
2145: SAFECOPY(bbs_startup.temp_dir,global.temp_dir);
2146: SAFECOPY(bbs_startup.host_name,global.host_name);
2147: bbs_startup.sem_chk_freq=global.sem_chk_freq;
2148:
2149: /* JavaScript operational parameters */
2150: bbs_startup.js_max_bytes=global.js.max_bytes;
2151: bbs_startup.js_cx_stack=global.js.cx_stack;
2152: bbs_startup.js_branch_limit=global.js.branch_limit;
2153: bbs_startup.js_gc_interval=global.js.gc_interval;
2154: bbs_startup.js_yield_interval=global.js.yield_interval;
2155:
2156: /* used to be handled in mail_start() */
2157: SAFECOPY(mail_startup.ctrl_dir
2158: ,global.ctrl_dir);
2159: SAFECOPY(mail_startup.host_name
2160: ,global.host_name);
2161: mail_startup.sem_chk_freq=global.sem_chk_freq;
2162:
2163: /* used to be handled in ftp_start() */
2164: SAFECOPY(ftp_startup.ctrl_dir
2165: ,global.ctrl_dir);
2166: SAFECOPY(ftp_startup.temp_dir
2167: ,global.temp_dir);
2168: SAFECOPY(ftp_startup.host_name
2169: ,global.host_name);
2170: ftp_startup.sem_chk_freq=global.sem_chk_freq;
2171:
2172: /* JavaScript operational parameters */
2173: ftp_startup.js_max_bytes=global.js.max_bytes;
2174: ftp_startup.js_cx_stack=global.js.cx_stack;
2175:
2176: /* used to be handled in web_start() */
2177: SAFECOPY(web_startup.ctrl_dir,global.ctrl_dir);
2178: SAFECOPY(web_startup.host_name,global.host_name);
2179: web_startup.sem_chk_freq=global.sem_chk_freq;
2180:
2181: /* JavaScript operational parameters */
2182: web_startup.js_max_bytes=global.js.max_bytes;
2183: web_startup.js_cx_stack=global.js.cx_stack;
2184:
2185: /* used to be handled in ServicesStartExecute() */
2186: SAFECOPY(services_startup.ctrl_dir,global.ctrl_dir);
2187: SAFECOPY(services_startup.host_name,global.host_name);
2188: services_startup.sem_chk_freq=global.sem_chk_freq;
2189:
2190: /* JavaScript operational parameters */
2191: services_startup.js_max_bytes=global.js.max_bytes;
2192: services_startup.js_cx_stack=global.js.cx_stack;
2193: services_startup.js_branch_limit=global.js.branch_limit;
2194: services_startup.js_gc_interval=global.js.gc_interval;
2195: services_startup.js_yield_interval=global.js.yield_interval;
2196: #endif
2197: }
2198:
2199: Registry->CloseKey();
2200: delete Registry;
2201:
2202: AnsiString CtrlDirectory = AnsiString(global.ctrl_dir);
2203: if(!FileExists(CtrlDirectory+"MAIN.CNF")) {
2204: Application->CreateForm(__classid(TCtrlPathDialog), &CtrlPathDialog);
2205: if(CtrlPathDialog->ShowModal()!=mrOk) {
2206: Application->Terminate();
2207: return;
2208: }
2209: CtrlDirectory=CtrlPathDialog->Edit->Text;
2210: delete CtrlPathDialog;
2211: }
2212: if(CtrlDirectory.UpperCase().AnsiPos("MAIN.CNF"))
2213: CtrlDirectory.SetLength(CtrlDirectory.Length()-8);
2214: SAFECOPY(global.ctrl_dir,CtrlDirectory.c_str());
2215: memset(&cfg,0,sizeof(cfg));
2216: SAFECOPY(cfg.ctrl_dir,global.ctrl_dir);
2217: cfg.size=sizeof(cfg);
2218: cfg.node_num=bbs_startup.first_node;
2219: char error[256];
2220: SAFECOPY(error,UNKNOWN_LOAD_ERROR);
2221: if(!load_cfg(&cfg, NULL, TRUE, error)) {
2222: Application->MessageBox(error,"ERROR Loading Configuration"
2223: ,MB_OK|MB_ICONEXCLAMATION);
2224: Application->Terminate();
2225: return;
2226: }
2227:
2228: recycle_semfiles=semfile_list_init(cfg.ctrl_dir,"recycle","ctrl");
2229: semfile_list_check(&initialized,recycle_semfiles);
2230:
2231: shutdown_semfiles=semfile_list_init(cfg.ctrl_dir,"shutdown","ctrl");
2232: semfile_list_check(&initialized,shutdown_semfiles);
2233:
2234: if(!(cfg.sys_misc&SM_LOCAL_TZ)) {
2235: if(putenv("TZ=UTC0")) {
2236: Application->MessageBox("Error setting timezone"
2237: ,"ERROR",MB_OK|MB_ICONEXCLAMATION);
2238: Application->Terminate();
2239: }
2240: tzset();
2241: }
2242:
2243: if(cfg.new_install) {
2244: Application->BringToFront();
2245: for(int i=0;i<10;i++) {
2246: Application->ProcessMessages();
2247: Sleep(300); // Let 'em see the logo for a bit
2248: }
2249: BBSConfigWizardMenuItemClick(Sender);
2250: }
2251:
2252: if(bbs_startup.options&BBS_OPT_MUTE)
2253: SoundToggle->Checked=false;
2254: else
2255: SoundToggle->Checked=true;
2256:
2257: if(bbs_startup.options&BBS_OPT_SYSOP_AVAILABLE)
2258: ChatToggle->Checked=true;
2259: else
2260: ChatToggle->Checked=false;
2261:
2262: if(!NodeFormFloating)
2263: NodeForm->ManualDock(PageControl(NodeFormPage),NULL,alClient);
2264: if(!ClientFormFloating)
2265: ClientForm->ManualDock(PageControl(ClientFormPage),NULL,alClient);
2266: if(!StatsFormFloating)
2267: StatsForm->ManualDock(PageControl(StatsFormPage),NULL,alClient);
2268: if(!MailFormFloating)
2269: MailForm->ManualDock(PageControl(MailFormPage),NULL,alClient);
2270: if(!TelnetFormFloating)
2271: TelnetForm->ManualDock(PageControl(TelnetFormPage),NULL,alClient);
2272: if(!EventsFormFloating)
2273: EventsForm->ManualDock(PageControl(EventsFormPage),NULL,alClient);
2274: if(!ServicesFormFloating)
2275: ServicesForm->ManualDock(PageControl(ServicesFormPage),NULL,alClient);
2276: if(!FtpFormFloating)
2277: FtpForm->ManualDock(PageControl(FtpFormPage),NULL,alClient);
2278: if(!WebFormFloating)
2279: WebForm->ManualDock(PageControl(WebFormPage),NULL,alClient);
2280:
2281: NodeForm->Show();
2282: // ViewNodes->Checked=NodeFormVisible, ViewNodesExecute(Sender);
2283: ClientForm->Show();
2284: // ViewClients->Checked=ClientFormVisible, ViewClientsExecute(Sender);
2285: StatsForm->Show();
2286: // ViewStats->Checked=StatsFormVisible, ViewStatsExecute(Sender);
2287: TelnetForm->Show();
2288: // ViewTelnet->Checked=TelnetFormVisible, ViewTelnetExecute(Sender);
2289: EventsForm->Show();
2290: // ViewEvents->Checked=EventsFormVisible, ViewEventsExecute(Sender);
2291: FtpForm->Show();
2292: // ViewFtpServer->Checked=FtpFormVisible, ViewFtpServerExecute(Sender);
2293: WebForm->Show();
2294: // ViewWebServer->Checked=WebFormVisible;
2295: // WebForm->Visible=ViewWebServer->Checked;
2296: MailForm->Show();
2297: // ViewMailServer->Checked=MailFormVisible,ViewMailServerExecute(Sender);
2298: ServicesForm->Show();
2299: // ViewServices->Checked=ServicesFormVisible,ViewServicesExecute(Sender);
2300:
2301: UpperLeftPageControl->Visible=true;
2302: UpperRightPageControl->Visible=true;
2303: LowerLeftPageControl->Visible=true;
2304: LowerRightPageControl->Visible=true;
2305: HorizontalSplitter->Visible=true;
2306: BottomPanel->Visible=true;
2307: TopPanel->Visible=true;
2308:
2309: // Work-around for CB5 PageControl anomaly
2310: int i;
2311:
2312: for(i=1;i<UpperLeftPageControl->PageCount;i++)
2313: UpperLeftPageControl->ActivePageIndex=i;
2314: UpperLeftPageControl->ActivePageIndex=0;
2315:
2316: for(i=1;i<UpperRightPageControl->PageCount;i++)
2317: UpperRightPageControl->ActivePageIndex=i;
2318: UpperRightPageControl->ActivePageIndex=0;
2319:
2320: for(i=1;i<LowerRightPageControl->PageCount;i++)
2321: LowerRightPageControl->ActivePageIndex=i;
2322: LowerRightPageControl->ActivePageIndex=0;
2323:
2324: for(i=1;i<LowerLeftPageControl->PageCount;i++)
2325: LowerLeftPageControl->ActivePageIndex=i;
2326: LowerLeftPageControl->ActivePageIndex=0;
2327:
2328: LogTimerTick(Sender); /* Open Log Mailslots */
2329: ServiceStatusTimerTick(Sender); /* Query service config lengths */
2330:
2331: if(SysAutoStart)
2332: TelnetStartExecute(Sender);
2333: if(MailAutoStart)
2334: MailStartExecute(Sender);
2335: if(FtpAutoStart)
2336: FtpStartExecute(Sender);
2337: if(WebAutoStart)
2338: WebStartExecute(Sender);
2339: if(ServicesAutoStart)
2340: ServicesStartExecute(Sender);
2341:
2342: NodeForm->Timer->Enabled=true;
2343: ClientForm->Timer->Enabled=true;
2344:
2345: SemFileTimer->Interval=global.sem_chk_freq;
2346: SemFileTimer->Enabled=true;
2347:
2348: StatsTimer->Interval=cfg.node_stat_check*1000;
2349: StatsTimer->Enabled=true;
2350: Initialized=true;
2351:
2352: UpTimer->Enabled=true; /* Start updating the status bar */
2353: LogTimer->Enabled=true;
2354: ServiceStatusTimer->Enabled=true;
2355:
2356: if(!Application->Active) /* Starting up minimized? */
2357: FormMinimize(Sender); /* Put icon in systray */
2358: }
2359: //---------------------------------------------------------------------------
2360: void __fastcall TMainForm::SaveRegistrySettings(TObject* Sender)
2361: {
2362: StatusBar->Panels->Items[4]->Text="Saving Registry Settings...";
2363:
2364: // Write Registry keys
2365: TRegistry* Registry=new TRegistry;
2366: if(!Registry->OpenKey(REG_KEY,true)) {
2367: Application->MessageBox("Error creating registry key"
2368: ,REG_KEY,MB_OK|MB_ICONEXCLAMATION);
2369: Application->Terminate();
2370: return;
2371: }
2372: Registry->WriteInteger("MainFormTop",Top);
2373: Registry->WriteInteger("MainFormLeft",Left);
2374: Registry->WriteInteger("MainFormHeight",Height);
2375: Registry->WriteInteger("MainFormWidth",Width);
2376:
2377: Registry->WriteInteger("NodeFormTop",NodeForm->Top);
2378: Registry->WriteInteger("NodeFormLeft",NodeForm->Left);
2379: Registry->WriteInteger("NodeFormHeight",NodeForm->Height);
2380: Registry->WriteInteger("NodeFormWidth",NodeForm->Width);
2381:
2382: Registry->WriteInteger("StatsFormTop",StatsForm->Top);
2383: Registry->WriteInteger("StatsFormLeft",StatsForm->Left);
2384: Registry->WriteInteger("StatsFormHeight",StatsForm->Height);
2385: Registry->WriteInteger("StatsFormWidth",StatsForm->Width);
2386:
2387: Registry->WriteInteger("ClientFormTop",ClientForm->Top);
2388: Registry->WriteInteger("ClientFormLeft",ClientForm->Left);
2389: Registry->WriteInteger("ClientFormHeight",ClientForm->Height);
2390: Registry->WriteInteger("ClientFormWidth",ClientForm->Width);
2391:
2392: for(int i=0;i<ClientForm->ListView->Columns->Count;i++) {
2393: char str[128];
2394: sprintf(str,"ClientListColumn%dWidth",i);
2395: Registry->WriteInteger(str
2396: ,ClientForm->ListView->Columns->Items[i]->Width);
2397: }
2398:
2399: Registry->WriteInteger("TelnetFormTop",TelnetForm->Top);
2400: Registry->WriteInteger("TelnetFormLeft",TelnetForm->Left);
2401: Registry->WriteInteger("TelnetFormHeight",TelnetForm->Height);
2402: Registry->WriteInteger("TelnetFormWidth",TelnetForm->Width);
2403:
2404: Registry->WriteInteger("EventsFormTop",EventsForm->Top);
2405: Registry->WriteInteger("EventsFormLeft",EventsForm->Left);
2406: Registry->WriteInteger("EventsFormHeight",EventsForm->Height);
2407: Registry->WriteInteger("EventsFormWidth",EventsForm->Width);
2408:
2409: Registry->WriteInteger("ServicesFormTop",ServicesForm->Top);
2410: Registry->WriteInteger("ServicesFormLeft",ServicesForm->Left);
2411: Registry->WriteInteger("ServicesFormHeight",ServicesForm->Height);
2412: Registry->WriteInteger("ServicesFormWidth",ServicesForm->Width);
2413:
2414: Registry->WriteInteger("FtpFormTop",FtpForm->Top);
2415: Registry->WriteInteger("FtpFormLeft",FtpForm->Left);
2416: Registry->WriteInteger("FtpFormHeight",FtpForm->Height);
2417: Registry->WriteInteger("FtpFormWidth",FtpForm->Width);
2418:
2419: Registry->WriteInteger("WebFormTop",WebForm->Top);
2420: Registry->WriteInteger("WebFormLeft",WebForm->Left);
2421: Registry->WriteInteger("WebFormHeight",WebForm->Height);
2422: Registry->WriteInteger("WebFormWidth",WebForm->Width);
2423:
2424: Registry->WriteInteger("MailFormTop",MailForm->Top);
2425: Registry->WriteInteger("MailFormLeft",MailForm->Left);
2426: Registry->WriteInteger("MailFormHeight",MailForm->Height);
2427: Registry->WriteInteger("MailFormWidth",MailForm->Width);
2428:
2429: Registry->WriteInteger("TopPanelHeight",TopPanel->Height);
2430: Registry->WriteInteger("UpperLeftPageControlWidth"
2431: ,UpperLeftPageControl->Width);
2432: Registry->WriteInteger("LowerLeftPageControlWidth"
2433: ,LowerLeftPageControl->Width);
2434:
2435: Registry->WriteBool("UndockableForms",UndockableForms);
2436:
2437: Registry->WriteBool("TelnetFormFloating",TelnetForm->Floating);
2438: Registry->WriteBool("EventsFormFloating",EventsForm->Floating);
2439: Registry->WriteBool("ServicesFormFloating",ServicesForm->Floating);
2440: Registry->WriteBool("NodeFormFloating",NodeForm->Floating);
2441: Registry->WriteBool("StatsFormFloating",StatsForm->Floating);
2442: Registry->WriteBool("ClientFormFloating",ClientForm->Floating);
2443: Registry->WriteBool("FtpFormFloating",FtpForm->Floating);
2444: Registry->WriteBool("WebFormFloating",WebForm->Floating);
2445: Registry->WriteBool("MailFormFloating",MailForm->Floating);
2446:
2447: Registry->WriteBool("TelnetFormVisible",TelnetForm->Visible);
2448: Registry->WriteBool("EventsFormVisible",EventsForm->Visible);
2449: Registry->WriteBool("ServicesFormVisible",ServicesForm->Visible);
2450: Registry->WriteBool("NodeFormVisible",NodeForm->Visible);
2451: Registry->WriteBool("StatsFormVisible",StatsForm->Visible);
2452: Registry->WriteBool("ClientFormVisible",ClientForm->Visible);
2453: Registry->WriteBool("FtpFormVisible",FtpForm->Visible);
2454: Registry->WriteBool("WebFormVisible",WebForm->Visible);
2455: Registry->WriteBool("MailFormVisible",MailForm->Visible);
2456:
2457: Registry->WriteInteger("TelnetFormPage"
2458: ,PageNum((TPageControl*)TelnetForm->HostDockSite));
2459: Registry->WriteInteger("EventsFormPage"
2460: ,PageNum((TPageControl*)EventsForm->HostDockSite));
2461: Registry->WriteInteger("ServicesFormPage"
2462: ,PageNum((TPageControl*)ServicesForm->HostDockSite));
2463: Registry->WriteInteger("NodeFormPage"
2464: ,PageNum((TPageControl*)NodeForm->HostDockSite));
2465: Registry->WriteInteger("MailFormPage"
2466: ,PageNum((TPageControl*)MailForm->HostDockSite));
2467: Registry->WriteInteger("FtpFormPage"
2468: ,PageNum((TPageControl*)FtpForm->HostDockSite));
2469: Registry->WriteInteger("WebFormPage"
2470: ,PageNum((TPageControl*)WebForm->HostDockSite));
2471: Registry->WriteInteger("StatsFormPage"
2472: ,PageNum((TPageControl*)StatsForm->HostDockSite));
2473: Registry->WriteInteger("ClientFormPage"
2474: ,PageNum((TPageControl*)ClientForm->HostDockSite));
2475:
2476: WriteColor(Registry,"TelnetLog",TelnetForm->Log->Color);
2477: WriteFont("TelnetLog",TelnetForm->Log->Font);
2478: WriteColor(Registry,"EventsLog",EventsForm->Log->Color);
2479: WriteFont("EventsLog",EventsForm->Log->Font);
2480: WriteColor(Registry,"ServicesLog",ServicesForm->Log->Color);
2481: WriteFont("ServicesLog",ServicesForm->Log->Font);
2482: WriteColor(Registry,"MailLog",MailForm->Log->Color);
2483: WriteFont("MailLog",MailForm->Log->Font);
2484: WriteColor(Registry,"FtpLog",FtpForm->Log->Color);
2485: WriteFont("FtpLog",FtpForm->Log->Font);
2486: WriteColor(Registry,"WebLog",WebForm->Log->Color);
2487: WriteFont("WebLog",WebForm->Log->Font);
2488: WriteColor(Registry,"NodeList",NodeForm->ListBox->Color);
2489: WriteFont("NodeList",NodeForm->ListBox->Font);
2490: WriteColor(Registry,"ClientList",ClientForm->ListView->Color);
2491: WriteFont("ClientList",ClientForm->ListView->Font);
2492:
2493: Registry->WriteBool("ToolBarVisible",Toolbar->Visible);
2494: Registry->WriteBool("StatusBarVisible",StatusBar->Visible);
2495:
2496: Registry->WriteInteger("MaxLogLen",MaxLogLen);
2497:
2498: Registry->WriteString("LoginCommand",LoginCommand);
2499: Registry->WriteString("ConfigCommand",ConfigCommand);
2500: Registry->WriteString("Password",Password);
2501: Registry->WriteBool("MinimizeToSysTray",MinimizeToSysTray);
2502: Registry->WriteBool("UseFileAssociations",UseFileAssociations);
2503: Registry->WriteInteger("NodeDisplayInterval",NodeForm->Timer->Interval/1000);
2504: Registry->WriteInteger("ClientDisplayInterval",ClientForm->Timer->Interval/1000);
2505:
2506: Registry->WriteInteger( "SpyTerminalWidth"
2507: ,SpyTerminalWidth);
2508: Registry->WriteInteger( "SpyTerminalHeight"
2509: ,SpyTerminalHeight);
2510: Registry->WriteString( "SpyTerminalFontName"
2511: ,SpyTerminalFont->Name);
2512: Registry->WriteInteger( "SpyTerminalFontSize"
2513: ,SpyTerminalFont->Size);
2514: Registry->WriteBool( "SpyTerminalKeyboardActive"
2515: ,SpyTerminalKeyboardActive);
2516:
2517: Registry->CloseKey();
2518: delete Registry;
2519: }
2520: //---------------------------------------------------------------------------
2521: void __fastcall TMainForm::SaveSettings(TObject* Sender)
2522: {
2523: SaveIniSettings(Sender);
2524: SaveRegistrySettings(Sender);
2525: }
2526: //---------------------------------------------------------------------------
2527: bool __fastcall TMainForm::SaveIniSettings(TObject* Sender)
2528: {
2529: FILE* fp=NULL;
2530: if(ini_file[0]==0)
2531: return(false);
2532:
2533: if((fp=fopen(ini_file,"r+"))==NULL) {
2534: char err[MAX_PATH*2];
2535: SAFEPRINTF2(err,"Error %d opening initialization file: %s",errno,ini_file);
2536: Application->MessageBox(err,"ERROR",MB_OK|MB_ICONEXCLAMATION);
2537: return(false);
2538: }
2539:
2540: StatusBar->Panels->Items[4]->Text="Saving Settings to " + AnsiString(ini_file) + " ...";
2541:
2542: bool success = sbbs_write_ini(fp
2543: ,&cfg
2544: ,&global
2545: ,SysAutoStart ,&bbs_startup
2546: ,FtpAutoStart ,&ftp_startup
2547: ,WebAutoStart ,&web_startup
2548: ,MailAutoStart ,&mail_startup
2549: ,ServicesAutoStart ,&services_startup
2550: );
2551: fclose(fp);
2552:
2553: if(!success) {
2554: char err[MAX_PATH*2];
2555: SAFEPRINTF(err,"Failure writing initialization file: %s",ini_file);
2556: Application->MessageBox(err,"ERROR",MB_OK|MB_ICONEXCLAMATION);
2557: }
2558:
2559: return(success);
2560: }
2561:
2562: //---------------------------------------------------------------------------
2563: void __fastcall TMainForm::ImportFormSettings(TMemIniFile* IniFile, const char* section, TForm* Form)
2564: {
2565: Form->Top=IniFile->ReadInteger(section,"Top",Form->Top);
2566: Form->Left=IniFile->ReadInteger(section,"Left",Form->Left);
2567: Form->Width=IniFile->ReadInteger(section,"Width",Form->Width);
2568: Form->Height=IniFile->ReadInteger(section,"Height",Form->Height);
2569: }
2570: //---------------------------------------------------------------------------
2571: void __fastcall TMainForm::ExportFormSettings(TMemIniFile* IniFile, const char* section, TForm* Form)
2572: {
2573: IniFile->WriteInteger(section,"Top",Form->Top);
2574: IniFile->WriteInteger(section,"Left",Form->Left);
2575: IniFile->WriteInteger(section,"Width",Form->Width);
2576: IniFile->WriteInteger(section,"Height",Form->Height);
2577: IniFile->WriteInteger(section,"Page",PageNum((TPageControl*)Form->HostDockSite));
2578: IniFile->WriteBool(section,"Floating",Form->Floating);
2579: }
2580: //---------------------------------------------------------------------------
2581: void __fastcall TMainForm::ImportFont(TMemIniFile* IniFile, const char* section, AnsiString prefix, TFont* Font)
2582: {
2583: Font->Name=IniFile->ReadString(section,prefix + "Name",Font->Name);
2584: Font->Color=StringToColor(IniFile->ReadString(section,prefix + "Color",ColorToString(Font->Color)));
2585: Font->Height=IniFile->ReadInteger(section,prefix + "Height",Font->Height);
2586: Font->Size=IniFile->ReadInteger(section,prefix + "Size", Font->Size);
2587: IntToFontStyle(IniFile->ReadInteger(section,prefix + "Style",FontStyleToInt(Font)),Font);
2588: }
2589: //---------------------------------------------------------------------------
2590: void __fastcall TMainForm::ExportFont(TMemIniFile* IniFile, const char* section, AnsiString prefix, TFont* Font)
2591: {
2592: IniFile->WriteString(section,prefix+"Name",Font->Name);
2593: IniFile->WriteString(section,prefix+"Color",ColorToString(Font->Color));
2594: IniFile->WriteInteger(section,prefix+"Height",Font->Height);
2595: IniFile->WriteInteger(section,prefix+"Size",Font->Size);
2596: IniFile->WriteInteger(section,prefix+"Style",FontStyleToInt(Font));
2597: }
2598: //---------------------------------------------------------------------------
2599: void __fastcall TMainForm::ImportSettings(TObject* Sender)
2600: {
2601: OpenDialog->Filter="Settings files (*.ini)|*.ini|All files|*.*";
2602: OpenDialog->FileName=AnsiString(global.ctrl_dir)+"sbbsctrl.ini";
2603: if(!OpenDialog->Execute())
2604: return;
2605:
2606: StatusBar->Panels->Items[4]->Text="Importing Settings...";
2607:
2608: TMemIniFile* IniFile=new TMemIniFile(OpenDialog->FileName);
2609:
2610: const char* section = "Properties";
2611:
2612: LoginCommand=IniFile->ReadString(section,"LoginCommand",LoginCommand);
2613: ConfigCommand=IniFile->ReadString(section,"ConfigCommand",ConfigCommand);
2614: Password=IniFile->ReadString(section,"Password",Password);
2615: MinimizeToSysTray=IniFile->ReadBool(section,"MinimizeToSysTray",MinimizeToSysTray);
2616: UseFileAssociations=IniFile->ReadBool(section,"UseFileAssociations" ,UseFileAssociations);
2617: UndockableForms=IniFile->ReadBool(section,"UndockableForms",UndockableForms);
2618:
2619: ImportFormSettings(IniFile,section="MainForm",MainForm);
2620: TopPanel->Height=IniFile->ReadInteger(section,"TopPanelHeight",TopPanel->Height);
2621: UpperLeftPageControl->Width=IniFile->ReadInteger(section,"UpperLeftPageControlWidth",UpperLeftPageControl->Width);
2622: LowerLeftPageControl->Width=IniFile->ReadInteger(section,"LowerLeftPageControlWidth",LowerLeftPageControl->Width);
2623: Toolbar->Visible=IniFile->ReadBool(section,"ToolBarVisible",Toolbar->Visible);
2624: StatusBar->Visible=IniFile->ReadBool(section,"StatusBarVisible",StatusBar->Visible);
2625:
2626: ImportFormSettings(IniFile,section="TelnetForm",TelnetForm);
2627: ImportFont(IniFile,section,"LogFont",TelnetForm->Log->Font);
2628: TelnetForm->Log->Color=StringToColor(IniFile->ReadString(section,"LogColor",clWindow));
2629:
2630: ImportFormSettings(IniFile,section="EventsForm",EventsForm);
2631: ImportFont(IniFile,section,"LogFont",EventsForm->Log->Font);
2632: EventsForm->Log->Color=StringToColor(IniFile->ReadString(section,"LogColor",clWindow));
2633:
2634: ImportFormSettings(IniFile,section="ServicesForm",ServicesForm);
2635: ImportFont(IniFile,section,"LogFont",ServicesForm->Log->Font);
2636: ServicesForm->Log->Color=StringToColor(IniFile->ReadString(section,"LogColor",clWindow));
2637:
2638: ImportFormSettings(IniFile,section="FtpForm",FtpForm);
2639: ImportFont(IniFile,section,"LogFont",FtpForm->Log->Font);
2640: FtpLogFile=IniFile->ReadInteger(section,"LogFile",true);
2641: FtpForm->Log->Color=StringToColor(IniFile->ReadString(section,"LogColor",clWindow));
2642:
2643: ImportFormSettings(IniFile,section="WebForm",WebForm);
2644: ImportFont(IniFile,section,"LogFont",WebForm->Log->Font);
2645: WebForm->Log->Color=StringToColor(IniFile->ReadString(section,"LogColor",clWindow));
2646:
2647: ImportFormSettings(IniFile,section="MailForm",MailForm);
2648: ImportFont(IniFile,section,"LogFont",MailForm->Log->Font);
2649: MailLogFile=IniFile->ReadInteger(section,"LogFile",true);
2650: MailForm->Log->Color=StringToColor(IniFile->ReadString(section,"LogColor",clWindow));
2651:
2652: ImportFormSettings(IniFile,section="NodeForm",NodeForm);
2653: ImportFont(IniFile,section,"ListFont",NodeForm->ListBox->Font);
2654: NodeForm->Timer->Interval=IniFile->ReadInteger(section,"DisplayInterval"
2655: ,NodeForm->Timer->Interval/1000)*1000;
2656: NodeForm->ListBox->Color=StringToColor(IniFile->ReadString(section,"ListColor",clWindow));
2657:
2658: ImportFormSettings(IniFile,section="StatsForm",StatsForm);
2659:
2660: ImportFormSettings(IniFile,section="ClientForm",ClientForm);
2661: ImportFont(IniFile,section,"ListFont",ClientForm->ListView->Font);
2662: ClientForm->ListView->Color=StringToColor(IniFile->ReadString(section,"ListColor",clWindow));
2663: ClientForm->Timer->Interval=IniFile->ReadInteger(section,"DisplayInterval"
2664: ,ClientForm->Timer->Interval/1000)*1000;
2665: for(int i=0;i<ClientForm->ListView->Columns->Count;i++) {
2666: char str[128];
2667: sprintf(str,"Column%dWidth",i);
2668: if(IniFile->ValueExists(section,str))
2669: ClientForm->ListView->Columns->Items[i]->Width
2670: =IniFile->ReadInteger(section,str,0);
2671: }
2672:
2673: section = "SpyTerminal";
2674: SpyTerminalWidth=IniFile->ReadInteger(section, "Width", SpyTerminalWidth);
2675: SpyTerminalHeight=IniFile->ReadInteger(section, "Height", SpyTerminalHeight);
2676: SpyTerminalFont->Name=IniFile->ReadString(section, "FontName", SpyTerminalFont->Name);
2677: SpyTerminalFont->Size=IniFile->ReadInteger(section, "FontSize", SpyTerminalFont->Size);
2678: SpyTerminalKeyboardActive=IniFile->ReadBool(section, "KeyboardActive", SpyTerminalKeyboardActive);
2679:
2680: delete IniFile;
2681:
2682: Application->MessageBox(AnsiString("Successfully imported SBBSCTRL settings from "
2683: + OpenDialog->FileName).c_str(),"Successful Import",MB_OK);
2684: }
2685: //---------------------------------------------------------------------------
2686: void __fastcall TMainForm::ExportSettings(TObject* Sender)
2687: {
2688: char str[128];
2689:
2690: SaveDialog->Filter="Settings files (*.ini)|*.ini|All files|*.*";
2691: SaveDialog->FileName=AnsiString(global.ctrl_dir)+"sbbsctrl.ini";
2692: if(!SaveDialog->Execute())
2693: return;
2694:
2695: TMemIniFile* IniFile=new TMemIniFile(SaveDialog->FileName);
2696:
2697: StatusBar->Panels->Items[4]->Text="Exporting Settings...";
2698:
2699: const char* section = "Properties";
2700:
2701: IniFile->WriteString(section,"LoginCommand",LoginCommand);
2702: IniFile->WriteString(section,"ConfigCommand",ConfigCommand);
2703: IniFile->WriteString(section,"Password",Password);
2704: IniFile->WriteBool(section,"MinimizeToSysTray",MinimizeToSysTray);
2705: IniFile->WriteBool(section,"UseFileAssociations",UseFileAssociations);
2706: IniFile->WriteBool(section,"UndockableForms",UndockableForms);
2707:
2708: ExportFormSettings(IniFile,section="MainForm",MainForm);
2709: IniFile->WriteInteger(section,"TopPanelHeight",TopPanel->Height);
2710: IniFile->WriteInteger(section,"UpperLeftPageControlWidth",UpperLeftPageControl->Width);
2711: IniFile->WriteInteger(section,"LowerLeftPageControlWidth",LowerLeftPageControl->Width);
2712: IniFile->WriteBool(section,"ToolBarVisible",Toolbar->Visible);
2713: IniFile->WriteBool(section,"StatusBarVisible",StatusBar->Visible);
2714:
2715: ExportFormSettings(IniFile,section = "NodeForm",NodeForm);
2716: ExportFont(IniFile,section,"ListFont",NodeForm->ListBox->Font);
2717: IniFile->WriteString(section,"ListColor",ColorToString(NodeForm->ListBox->Color));
2718: IniFile->WriteInteger(section,"DisplayInterval",NodeForm->Timer->Interval/1000);
2719:
2720: ExportFormSettings(IniFile,section = "StatsForm",StatsForm);
2721:
2722: ExportFormSettings(IniFile,section = "ClientForm",ClientForm);
2723: ExportFont(IniFile,section,"ListFont",ClientForm->ListView->Font);
2724: IniFile->WriteString(section,"ListColor",ColorToString(ClientForm->ListView->Color));
2725: IniFile->WriteInteger(section,"DisplayInterval",ClientForm->Timer->Interval/1000);
2726: for(int i=0;i<ClientForm->ListView->Columns->Count;i++) {
2727: char str[128];
2728: sprintf(str,"Column%dWidth",i);
2729: IniFile->WriteInteger(section,str
2730: ,ClientForm->ListView->Columns->Items[i]->Width);
2731: }
2732:
2733: ExportFormSettings(IniFile,section = "TelnetForm",TelnetForm);
2734: ExportFont(IniFile,section,"LogFont",TelnetForm->Log->Font);
2735:
2736: ExportFormSettings(IniFile,section = "EventsForm",EventsForm);
2737: ExportFont(IniFile,section,"LogFont",EventsForm->Log->Font);
2738:
2739: ExportFormSettings(IniFile,section = "ServicesForm",ServicesForm);
2740: ExportFont(IniFile,section,"LogFont",ServicesForm->Log->Font);
2741:
2742: ExportFormSettings(IniFile,section = "FtpForm",FtpForm);
2743: ExportFont(IniFile,section,"LogFont",FtpForm->Log->Font);
2744:
2745: ExportFormSettings(IniFile,section = "MailForm",MailForm);
2746: ExportFont(IniFile,section,"LogFont",MailForm->Log->Font);
2747:
2748: section = "SpyTerminal";
2749: IniFile->WriteInteger(section, "Width"
2750: ,SpyTerminalWidth);
2751: IniFile->WriteInteger(section, "Height"
2752: ,SpyTerminalHeight);
2753: IniFile->WriteString(section, "FontName"
2754: ,SpyTerminalFont->Name);
2755: IniFile->WriteInteger(section, "FontSize"
2756: ,SpyTerminalFont->Size);
2757: IniFile->WriteBool(section, "KeyboardActive"
2758: ,SpyTerminalKeyboardActive);
2759:
2760: IniFile->UpdateFile();
2761:
2762: delete IniFile;
2763:
2764: Application->MessageBox(AnsiString("Successfully exported SBBSCTRL settings to "
2765: + SaveDialog->FileName).c_str(),"Successful Export",MB_OK);
2766: }
2767: //---------------------------------------------------------------------------
2768:
2769: void __fastcall TMainForm::ViewStatusBarMenuItemClick(TObject *Sender)
2770: {
2771: StatusBar->Visible=!StatusBar->Visible;
2772: ViewStatusBarMenuItem->Checked=StatusBar->Visible;
2773: }
2774: //---------------------------------------------------------------------------
2775: void __fastcall TMainForm::HelpAboutMenuItemClick(TObject *Sender)
2776: {
2777: Application->CreateForm(__classid(TAboutBoxForm), &AboutBoxForm);
2778: AboutBoxForm->ShowModal();
2779: delete AboutBoxForm;
2780: }
2781: //---------------------------------------------------------------------------
2782: BOOL MuteService(SC_HANDLE svc, SERVICE_STATUS* status, BOOL mute)
2783: {
2784: if(svc==NULL || controlService==NULL)
2785: return(FALSE);
2786:
2787: return controlService(svc
2788: ,mute ? SERVICE_CONTROL_MUTE:SERVICE_CONTROL_UNMUTE, status);
2789: }
2790: //---------------------------------------------------------------------------
2791: void __fastcall TMainForm::SoundToggleExecute(TObject *Sender)
2792: {
2793: SoundToggle->Checked=!SoundToggle->Checked;
2794:
2795: if(!SoundToggle->Checked) {
2796: bbs_startup.options|=BBS_OPT_MUTE;
2797: ftp_startup.options|=FTP_OPT_MUTE;
2798: web_startup.options|=FTP_OPT_MUTE;
2799: mail_startup.options|=MAIL_OPT_MUTE;
2800: services_startup.options|=MAIL_OPT_MUTE;
2801: } else {
2802: bbs_startup.options&=~BBS_OPT_MUTE;
2803: ftp_startup.options&=~FTP_OPT_MUTE;
2804: web_startup.options&=~FTP_OPT_MUTE;
2805: mail_startup.options&=~MAIL_OPT_MUTE;
2806: services_startup.options&=~MAIL_OPT_MUTE;
2807: }
2808: MuteService(bbs_svc,&bbs_svc_status,!SoundToggle->Checked);
2809: MuteService(ftp_svc,&ftp_svc_status,!SoundToggle->Checked);
2810: MuteService(web_svc,&web_svc_status,!SoundToggle->Checked);
2811: MuteService(mail_svc,&mail_svc_status,!SoundToggle->Checked);
2812: MuteService(services_svc,&services_svc_status,!SoundToggle->Checked);
2813: }
2814: //---------------------------------------------------------------------------
2815: void __fastcall TMainForm::BBSStatisticsLogMenuItemClick(TObject *Sender)
2816: {
2817: StatsForm->LogButtonClick(Sender);
2818: }
2819: //---------------------------------------------------------------------------
2820:
2821: void __fastcall TMainForm::ForceTimedEventMenuItemClick(TObject *Sender)
2822: {
2823: int i,file;
2824: char str[MAX_PATH+1];
2825:
2826: Application->CreateForm(__classid(TCodeInputForm), &CodeInputForm);
2827: CodeInputForm->Label->Caption="Event Internal Code";
2828: CodeInputForm->ComboBox->Items->Clear();
2829: for(i=0;i<cfg.total_events;i++)
2830: CodeInputForm->ComboBox->Items->Add(
2831: AnsiString(cfg.event[i]->code).UpperCase());
2832: CodeInputForm->ComboBox->ItemIndex=0;
2833: if(CodeInputForm->ShowModal()==mrOk
2834: && CodeInputForm->ComboBox->Text.Length()) {
2835: for(i=0;i<cfg.total_events;i++) {
2836: if(!stricmp(CodeInputForm->ComboBox->Text.c_str(),cfg.event[i]->code)) {
2837: sprintf(str,"%s%s.now",cfg.data_dir,cfg.event[i]->code);
2838: if((file=_sopen(str,O_CREAT|O_TRUNC|O_WRONLY
2839: ,SH_DENYRW,S_IREAD|S_IWRITE))!=-1)
2840: close(file);
2841: break;
2842: }
2843: }
2844: if(i>=cfg.total_events)
2845: Application->MessageBox(CodeInputForm->ComboBox->Text.c_str()
2846: ,"Event Code Not Found",MB_OK|MB_ICONEXCLAMATION);
2847: }
2848: delete CodeInputForm;
2849: }
2850: //---------------------------------------------------------------------------
2851:
2852: void __fastcall TMainForm::ForceNetworkCalloutMenuItemClick(
2853: TObject *Sender)
2854: {
2855: int i,file;
2856: char str[MAX_PATH+1];
2857:
2858: Application->CreateForm(__classid(TCodeInputForm), &CodeInputForm);
2859: CodeInputForm->Label->Caption="Hub QWK-ID";
2860: CodeInputForm->ComboBox->Items->Clear();
2861: for(i=0;i<cfg.total_qhubs;i++)
2862: CodeInputForm->ComboBox->Items->Add(
2863: AnsiString(cfg.qhub[i]->id).UpperCase());
2864: CodeInputForm->ComboBox->ItemIndex=0;
2865: if(CodeInputForm->ShowModal()==mrOk
2866: && CodeInputForm->ComboBox->Text.Length()) {
2867: for(i=0;i<cfg.total_qhubs;i++) {
2868: if(!stricmp(CodeInputForm->ComboBox->Text.c_str(),cfg.qhub[i]->id)) {
2869: sprintf(str,"%sqnet/%s.now",cfg.data_dir,cfg.qhub[i]->id);
2870: if((file=_sopen(str,O_CREAT|O_TRUNC|O_WRONLY
2871: ,SH_DENYRW,S_IREAD|S_IWRITE))!=-1)
2872: close(file);
2873: break;
2874: }
2875: }
2876: if(i>=cfg.total_qhubs)
2877: Application->MessageBox(CodeInputForm->ComboBox->Text.c_str()
2878: ,"QWKnet Hub ID Not Found",MB_OK|MB_ICONEXCLAMATION);
2879: }
2880: delete CodeInputForm;
2881: }
2882: //---------------------------------------------------------------------------
2883:
2884: void __fastcall TMainForm::TextMenuItemEditClick(TObject *Sender)
2885: {
2886: char filename[MAX_PATH+1];
2887:
2888: sprintf(filename,"%s%s"
2889: ,MainForm->cfg.text_dir
2890: ,((TMenuItem*)Sender)->Hint.c_str());
2891: EditFile(filename,((TMenuItem*)Sender)->Caption);
2892: }
2893:
2894: //---------------------------------------------------------------------------
2895: void __fastcall TMainForm::CtrlMenuItemEditClick(TObject *Sender)
2896: {
2897: char filename[MAX_PATH+1];
2898:
2899: iniFileName(filename,sizeof(filename)
2900: ,MainForm->cfg.ctrl_dir
2901: ,((TMenuItem*)Sender)->Hint.c_str());
2902: EditFile(filename,((TMenuItem*)Sender)->Caption);
2903: }
2904: void __fastcall TMainForm::DataMenuItemClick(TObject *Sender)
2905: {
2906: char filename[MAX_PATH+1];
2907:
2908: sprintf(filename,"%s%s"
2909: ,MainForm->cfg.data_dir
2910: ,((TMenuItem*)Sender)->Hint.c_str());
2911: EditFile(filename,((TMenuItem*)Sender)->Caption);
2912: }
2913: //---------------------------------------------------------------------------
2914:
2915: //---------------------------------------------------------------------------
2916:
2917: void __fastcall TMainForm::UpTimerTick(TObject *Sender)
2918: {
2919: char str[128];
2920: char days[64];
2921: static time_t start;
2922: ulong up;
2923:
2924: if(!start)
2925: start=time(NULL);
2926: up=time(NULL)-start;
2927:
2928: days[0]=0;
2929: if((up/(24*60*60))>=2) {
2930: sprintf(days,"%u days ",up/(24*60*60));
2931: up%=(24*60*60);
2932: }
2933: sprintf(str,"Up: %s%u:%02u"
2934: ,days
2935: ,up/(60*60)
2936: ,(up/60)%60
2937: );
2938: AnsiString Str=AnsiString(str);
2939: if(MainForm->StatusBar->Panels->Items[4]->Text!=Str)
2940: MainForm->StatusBar->Panels->Items[4]->Text=Str;
2941: #if 0
2942: THeapStatus hp=GetHeapStatus();
2943: sprintf(str,"Mem Used: %lu bytes",hp.TotalAllocated);
2944: Str=AnsiString(str);
2945: if(MainForm->StatusBar->Panels->Items[5]->Text!=Str)
2946: MainForm->StatusBar->Panels->Items[5]->Text=Str;
2947: #endif
2948: if(TrayIcon->Visible) {
2949: /* Animate TrayIcon when in use */
2950: AnsiString NumClients;
2951: try {
2952: if(clients) {
2953: TrayIcon->IconIndex=(TrayIcon->IconIndex==4) ? 59 : 4;
2954: NumClients=" ("+AnsiString(clients)+" client";
2955: if(clients>1)
2956: NumClients+="s";
2957: NumClients+=")";
2958: } else if(TrayIcon->IconIndex!=4)
2959: TrayIcon->IconIndex=4;
2960: TrayIcon->Hint=AnsiString(APP_TITLE)+NumClients;
2961: } catch(...) { /* ignore exceptions here */ };
2962: }
2963: }
2964: //---------------------------------------------------------------------------
2965:
2966: void __fastcall TMainForm::BBSViewErrorLogMenuItemClick(TObject *Sender)
2967: {
2968: char filename[MAX_PATH+1];
2969:
2970: sprintf(filename,"%sERROR.LOG"
2971: ,MainForm->cfg.logs_dir);
2972: ViewFile(filename,"Error Log");
2973: }
2974: //---------------------------------------------------------------------------
2975:
2976: void __fastcall TMainForm::ChatToggleExecute(TObject *Sender)
2977: {
2978: ChatToggle->Checked=!ChatToggle->Checked;
2979: if(ChatToggle->Checked)
2980: bbs_startup.options|=BBS_OPT_SYSOP_AVAILABLE;
2981: else
2982: bbs_startup.options&=~BBS_OPT_SYSOP_AVAILABLE;
2983:
2984: if(bbs_svc!=NULL && controlService!=NULL)
2985: controlService(bbs_svc
2986: ,ChatToggle->Checked ? SERVICE_CONTROL_SYSOP_AVAILABLE : SERVICE_CONTROL_SYSOP_UNAVAILABLE
2987: ,&bbs_svc_status);
2988: }
2989: //---------------------------------------------------------------------------
2990: void __fastcall TMainForm::UserEditExecute(TObject *Sender)
2991: {
2992: char str[256];
2993:
2994: sprintf(str,"%sUSEREDIT %s",cfg.exec_dir,cfg.data_dir);
2995: WinExec(str,SW_SHOWNORMAL);
2996: }
2997: //---------------------------------------------------------------------------
2998:
2999: void __fastcall TMainForm::BBSPreviewMenuItemClick(TObject *Sender)
3000: {
3001: TOpenDialog* dlg=new TOpenDialog((TComponent*)Sender);
3002:
3003: dlg->Options << ofNoChangeDir;
3004: dlg->Filter = "ANSI/Ctrl-A files (*.asc; *.msg; *.ans)|*.ASC;*.MSG;*.ANS"
3005: "|All files|*.*";
3006: dlg->InitialDir=cfg.text_dir;
3007: if(dlg->Execute()==true) {
3008: Application->CreateForm(__classid(TPreviewForm), &PreviewForm);
3009: PreviewForm->Filename=AnsiString(dlg->FileName);
3010: PreviewForm->ShowModal();
3011: delete PreviewForm;
3012: }
3013: delete dlg;
3014: }
3015: //---------------------------------------------------------------------------
3016: void __fastcall TMainForm::BBSLoginMenuItemClick(TObject *Sender)
3017: {
3018: if(!strnicmp(LoginCommand.c_str(),"start ",6)) /* Doesn't work on NT */
3019: ShellExecute(Handle, "open", LoginCommand.c_str()+6,
3020: NULL,NULL,SW_SHOWDEFAULT);
3021: else if(!strnicmp(LoginCommand.c_str(),"telnet:",7))
3022: ShellExecute(Handle, "open", LoginCommand.c_str(),
3023: NULL,NULL,SW_SHOWDEFAULT);
3024: else
3025: WinExec(LoginCommand.c_str(),SW_SHOWNORMAL);
3026: }
3027: //---------------------------------------------------------------------------
3028: void __fastcall TMainForm::ViewLogClick(TObject *Sender)
3029: {
3030: char str[128];
3031: char filename[MAX_PATH+1];
3032: struct tm* tm;
3033: time_t t;
3034: TModalResult mr;
3035:
3036: if(((TMenuItem*)Sender)->Tag==-1) {
3037: Application->CreateForm(__classid(TCodeInputForm), &CodeInputForm);
3038: CodeInputForm->Label->Caption="Date";
3039: CodeInputForm->ComboBox->Items->Clear();
3040: CodeInputForm->ComboBox->Text=AnsiString(unixtodstr(&cfg,time(NULL),str));
3041: mr=CodeInputForm->ShowModal();
3042: t=dstrtounix(&cfg,CodeInputForm->ComboBox->Text.c_str());
3043: delete CodeInputForm;
3044: if(mr!=mrOk)
3045: return;
3046: } else {
3047: t=time(NULL);
3048: t-=((TMenuItem*)Sender)->Tag*24*60*60;
3049: }
3050: tm=localtime(&t);
3051: if(tm==NULL)
3052: return;
3053:
3054: /* Close Mail/FTP logs */
3055: mail_lputs(NULL,0,NULL);
3056: ftp_lputs(NULL,0,NULL);
3057:
3058: sprintf(filename,"%sLOGS\\%s%02d%02d%02d.LOG"
3059: ,MainForm->cfg.logs_dir
3060: ,((TMenuItem*)Sender)->Hint.c_str()
3061: ,tm->tm_mon+1
3062: ,tm->tm_mday
3063: ,tm->tm_year%100
3064: );
3065: ViewFile(filename,((TMenuItem*)Sender)->Caption);
3066: }
3067: //---------------------------------------------------------------------------
3068: void __fastcall TMainForm::UserListExecute(TObject *Sender)
3069: {
3070: UserListForm->Show();
3071: }
3072: //---------------------------------------------------------------------------
3073:
3074: void __fastcall TMainForm::WebPageMenuItemClick(TObject *Sender)
3075: {
3076: ShellExecute(Handle, "open", ((TMenuItem*)Sender)->Hint.c_str(),
3077: NULL,NULL,SW_SHOWDEFAULT);
3078: }
3079: //---------------------------------------------------------------------------
3080: void __fastcall TMainForm::FormMinimize(TObject *Sender)
3081: {
3082: if(MinimizeToSysTray) {
3083: if(Password.Length()) {
3084: TrayIcon->RestoreOn=imNone;
3085: CloseTrayMenuItem->Enabled=false;
3086: ConfigureTrayMenuItem->Enabled=false;
3087: UserEditTrayMenuItem->Enabled=false;
3088: } else {
3089: TrayIcon->RestoreOn=imLeftClickUp;
3090: CloseTrayMenuItem->Enabled=true;
3091: ConfigureTrayMenuItem->Enabled=true;
3092: UserEditTrayMenuItem->Enabled=true;
3093: }
3094: if(!TrayIcon->Visible)
3095: TrayIcon->Visible=true;
3096: TrayIcon->Minimize();
3097: }
3098: }
3099:
3100: void __fastcall TMainForm::TrayIconRestore(TObject *Sender)
3101: {
3102: TrayIcon->Visible=false;
3103: }
3104:
3105: //---------------------------------------------------------------------------
3106:
3107: void __fastcall TMainForm::PropertiesExecute(TObject *Sender)
3108: {
3109: static inside;
3110: if(inside) return;
3111: inside=true;
3112:
3113: Application->CreateForm(__classid(TPropertiesDlg), &PropertiesDlg);
3114: PropertiesDlg->LoginCmdEdit->Text=LoginCommand;
3115: PropertiesDlg->ConfigCmdEdit->Text=ConfigCommand;
3116: PropertiesDlg->HostnameEdit->Text=global.host_name;
3117: PropertiesDlg->CtrlDirEdit->Text=global.ctrl_dir;
3118: PropertiesDlg->TempDirEdit->Text=global.temp_dir;
3119: PropertiesDlg->NodeIntUpDown->Position=NodeForm->Timer->Interval/1000;
3120: PropertiesDlg->ClientIntUpDown->Position=ClientForm->Timer->Interval/1000;
3121: PropertiesDlg->SemFreqUpDown->Position=global.sem_chk_freq;
3122: PropertiesDlg->TrayIconCheckBox->Checked=MinimizeToSysTray;
3123: PropertiesDlg->UndockableCheckBox->Checked=UndockableForms;
3124: PropertiesDlg->FileAssociationsCheckBox->Checked=UseFileAssociations;
3125: PropertiesDlg->PasswordEdit->Text=Password;
3126: PropertiesDlg->JS_MaxBytesEdit->Text=IntToStr(global.js.max_bytes);
3127: PropertiesDlg->JS_ContextStackEdit->Text=IntToStr(global.js.cx_stack);
3128: PropertiesDlg->JS_ThreadStackEdit->Text=IntToStr(global.js.thread_stack);
3129: PropertiesDlg->JS_BranchLimitEdit->Text=IntToStr(global.js.branch_limit);
3130: PropertiesDlg->JS_GcIntervalEdit->Text=IntToStr(global.js.gc_interval);
3131: PropertiesDlg->JS_YieldIntervalEdit->Text=IntToStr(global.js.yield_interval);
3132:
3133: if(MaxLogLen==0)
3134: PropertiesDlg->MaxLogLenEdit->Text="<unlimited>";
3135: else
3136: PropertiesDlg->MaxLogLenEdit->Text=IntToStr(MaxLogLen);
3137: if(PropertiesDlg->ShowModal()==mrOk) {
3138: LoginCommand=PropertiesDlg->LoginCmdEdit->Text;
3139: ConfigCommand=PropertiesDlg->ConfigCmdEdit->Text;
3140: SAFECOPY(global.host_name,PropertiesDlg->HostnameEdit->Text.c_str());
3141: SAFECOPY(global.ctrl_dir,PropertiesDlg->CtrlDirEdit->Text.c_str());
3142: SAFECOPY(global.temp_dir,PropertiesDlg->TempDirEdit->Text.c_str());
3143: global.sem_chk_freq=PropertiesDlg->SemFreqUpDown->Position;
3144: SemFileTimer->Interval=global.sem_chk_freq;
3145:
3146: /* Copy global values to server startup structs */
3147: /* We don't support per-server unique values here (yet) */
3148: SAFECOPY(bbs_startup.host_name,global.host_name);
3149: SAFECOPY(bbs_startup.ctrl_dir,global.ctrl_dir);
3150: SAFECOPY(bbs_startup.temp_dir,global.temp_dir);
3151: bbs_startup.sem_chk_freq=global.sem_chk_freq;
3152:
3153: SAFECOPY(ftp_startup.host_name,global.host_name);
3154: SAFECOPY(ftp_startup.ctrl_dir,global.ctrl_dir);
3155: SAFECOPY(ftp_startup.temp_dir,global.temp_dir);
3156: ftp_startup.sem_chk_freq=global.sem_chk_freq;
3157:
3158: SAFECOPY(web_startup.host_name,global.host_name);
3159: SAFECOPY(web_startup.ctrl_dir,global.ctrl_dir);
3160: SAFECOPY(web_startup.temp_dir,global.temp_dir);
3161: web_startup.sem_chk_freq=global.sem_chk_freq;
3162:
3163: SAFECOPY(mail_startup.host_name,global.host_name);
3164: SAFECOPY(mail_startup.ctrl_dir,global.ctrl_dir);
3165: SAFECOPY(mail_startup.temp_dir,global.temp_dir);
3166: mail_startup.sem_chk_freq=global.sem_chk_freq;
3167:
3168: SAFECOPY(services_startup.host_name,global.host_name);
3169: SAFECOPY(services_startup.ctrl_dir,global.ctrl_dir);
3170: SAFECOPY(services_startup.temp_dir,global.temp_dir);
3171: services_startup.sem_chk_freq=global.sem_chk_freq;
3172:
3173: Password=PropertiesDlg->PasswordEdit->Text;
3174: NodeForm->Timer->Interval=PropertiesDlg->NodeIntUpDown->Position*1000;
3175: ClientForm->Timer->Interval=PropertiesDlg->ClientIntUpDown->Position*1000;
3176: MinimizeToSysTray=PropertiesDlg->TrayIconCheckBox->Checked;
3177: UndockableForms=PropertiesDlg->UndockableCheckBox->Checked;
3178: UseFileAssociations=PropertiesDlg->FileAssociationsCheckBox->Checked;
3179:
3180: /* JavaScript operating parameters */
3181: js_startup_t js=global.js; // save for later comparison
3182: global.js.max_bytes
3183: =PropertiesDlg->JS_MaxBytesEdit->Text.ToIntDef(JAVASCRIPT_MAX_BYTES);
3184: global.js.cx_stack
3185: =PropertiesDlg->JS_ContextStackEdit->Text.ToIntDef(JAVASCRIPT_CONTEXT_STACK);
3186: global.js.thread_stack
3187: =PropertiesDlg->JS_ThreadStackEdit->Text.ToIntDef(JAVASCRIPT_THREAD_STACK);
3188: global.js.branch_limit
3189: =PropertiesDlg->JS_BranchLimitEdit->Text.ToIntDef(JAVASCRIPT_BRANCH_LIMIT);
3190: global.js.gc_interval
3191: =PropertiesDlg->JS_GcIntervalEdit->Text.ToIntDef(JAVASCRIPT_GC_INTERVAL);
3192: global.js.yield_interval
3193: =PropertiesDlg->JS_YieldIntervalEdit->Text.ToIntDef(JAVASCRIPT_YIELD_INTERVAL);
3194:
3195: /* Copy global settings, if appropriate (not unique) */
3196: if(memcmp(&bbs_startup.js,&js,sizeof(js))==0) bbs_startup.js=global.js;
3197: if(memcmp(&ftp_startup.js,&js,sizeof(js))==0) ftp_startup.js=global.js;
3198: if(memcmp(&web_startup.js,&js,sizeof(js))==0) web_startup.js=global.js;
3199: if(memcmp(&mail_startup.js,&js,sizeof(js))==0) mail_startup.js=global.js;
3200: if(memcmp(&services_startup.js,&js,sizeof(js))==0) services_startup.js=global.js;
3201:
3202: MaxLogLen
3203: =PropertiesDlg->MaxLogLenEdit->Text.ToIntDef(0);
3204: SaveSettings(Sender);
3205: }
3206: delete PropertiesDlg;
3207:
3208: inside=false;
3209: }
3210: //---------------------------------------------------------------------------
3211:
3212: void __fastcall TMainForm::CloseTrayMenuItemClick(TObject *Sender)
3213: {
3214: Close();
3215: }
3216: //---------------------------------------------------------------------------
3217:
3218: void __fastcall TMainForm::RestoreTrayMenuItemClick(TObject *Sender)
3219: {
3220: #if 0
3221: TrayIcon->Visible=false;
3222: Application->Restore();
3223: #else
3224: static inside;
3225: if(inside)
3226: return;
3227: inside=true;
3228:
3229: if(Password.Length()) {
3230: Application->CreateForm(__classid(TCodeInputForm), &CodeInputForm);
3231: CodeInputForm->Label->Caption="Password";
3232: CodeInputForm->Edit->Visible=true;
3233: CodeInputForm->Edit->PasswordChar='*';
3234: if(CodeInputForm->ShowModal()==mrOk
3235: && CodeInputForm->Edit->Text.AnsiCompareIC(Password)==0)
3236: TrayIcon->Restore();
3237: delete CodeInputForm;
3238: } else
3239: TrayIcon->Restore();
3240:
3241: inside=false;
3242: #endif
3243: }
3244: //---------------------------------------------------------------------------
3245: void __fastcall TMainForm::BBSConfigWizardMenuItemClick(TObject *Sender)
3246: {
3247: TConfigWizard* ConfigWizard;
3248: static inside;
3249: if(inside) return;
3250: inside=true;
3251:
3252: Application->CreateForm(__classid(TConfigWizard), &ConfigWizard);
3253: if(ConfigWizard->ShowModal()==mrOk) {
3254: SaveSettings(Sender);
3255: // ReloadConfigExecute(Sender); /* unnecessary since refresh_cfg() is already called */
3256: }
3257: delete ConfigWizard;
3258:
3259: inside=false;
3260: }
3261: //---------------------------------------------------------------------------
3262:
3263: void __fastcall TMainForm::PageControlUnDock(TObject *Sender,
3264: TControl *Client, TWinControl *NewTarget, bool &Allow)
3265: {
3266: if(NewTarget==NULL) /* Desktop */
3267: Allow=UndockableForms;
3268: }
3269: //---------------------------------------------------------------------------
3270: void __fastcall TMainForm::reload_config(void)
3271: {
3272: char error[256];
3273: SAFECOPY(error,UNKNOWN_LOAD_ERROR);
3274: if(!load_cfg(&cfg, NULL, TRUE, error)) {
3275: Application->MessageBox(error,"ERROR Re-loading Configuration"
3276: ,MB_OK|MB_ICONEXCLAMATION);
3277: Application->Terminate();
3278: }
3279: semfile_list_check(&initialized,recycle_semfiles);
3280: }
3281: //---------------------------------------------------------------------------
3282:
3283: void __fastcall TMainForm::ReloadConfigExecute(TObject *Sender)
3284: {
3285: FtpRecycleExecute(Sender);
3286: WebRecycleExecute(Sender);
3287: MailRecycleExecute(Sender);
3288: TelnetRecycleExecute(Sender);
3289: ServicesRecycleExecute(Sender);
3290:
3291: reload_config();
3292: #if 0 /* This appears to be redundant */
3293: node_t node;
3294: for(int i=0;i<cfg.sys_nodes;i++) {
3295: int file;
3296: if(NodeForm->getnodedat(i+1,&node,&file))
3297: break;
3298: node.misc|=NODE_RRUN;
3299: if(NodeForm->putnodedat(i+1,&node,file))
3300: break;
3301: }
3302: #endif
3303: }
3304:
3305: //---------------------------------------------------------------------------
3306:
3307:
3308: void __fastcall TMainForm::ServicesConfigureExecute(TObject *Sender)
3309: {
3310: static inside;
3311: if(inside) return;
3312: inside=true;
3313:
3314: Application->CreateForm(__classid(TServicesCfgDlg), &ServicesCfgDlg);
3315: ServicesCfgDlg->ShowModal();
3316: delete ServicesCfgDlg;
3317:
3318: inside=false;
3319: }
3320: //---------------------------------------------------------------------------
3321:
3322: void __fastcall TMainForm::UserTruncateMenuItemClick(TObject *Sender)
3323: {
3324: int usernumber;
3325: int deleted=0;
3326: user_t user;
3327:
3328: Screen->Cursor=crHourGlass;
3329: while((user.number=lastuser(&cfg))!=0) {
3330: if(getuserdat(&cfg,&user)!=0)
3331: break;
3332: if(!(user.misc&DELETED))
3333: break;
3334: if(!del_lastuser(&cfg))
3335: break;
3336: deleted++;
3337: }
3338: Screen->Cursor=crDefault;
3339: char str[128];
3340: sprintf(str,"%u Deleted User Records Removed",deleted);
3341: Application->MessageBox(str,"Users Truncated",MB_OK);
3342: }
3343:
3344: BOOL RecycleService(SC_HANDLE svc, SERVICE_STATUS* status)
3345: {
3346: if(svc==NULL || controlService==NULL)
3347: return(FALSE);
3348:
3349: return controlService(svc, SERVICE_CONTROL_RECYCLE, status);
3350: }
3351:
3352: //---------------------------------------------------------------------------
3353: void __fastcall TMainForm::MailRecycleExecute(TObject *Sender)
3354: {
3355: if(!RecycleService(mail_svc,&mail_svc_status)) {
3356: mail_startup.recycle_now=true;
3357: MailRecycle->Enabled=false;
3358: }
3359: }
3360: //---------------------------------------------------------------------------
3361: void __fastcall TMainForm::FtpRecycleExecute(TObject *Sender)
3362: {
3363: if(!RecycleService(ftp_svc,&ftp_svc_status)) {
3364: ftp_startup.recycle_now=true;
3365: FtpRecycle->Enabled=false;
3366: }
3367: }
3368: //---------------------------------------------------------------------------
3369: void __fastcall TMainForm::WebRecycleExecute(TObject *Sender)
3370: {
3371: if(!RecycleService(web_svc,&web_svc_status)) {
3372: web_startup.recycle_now=true;
3373: WebRecycle->Enabled=false;
3374: }
3375: }
3376: //---------------------------------------------------------------------------
3377: void __fastcall TMainForm::ServicesRecycleExecute(TObject *Sender)
3378: {
3379: if(!RecycleService(services_svc,&services_svc_status)) {
3380: services_startup.recycle_now=true;
3381: ServicesRecycle->Enabled=false;
3382: }
3383: }
3384: //---------------------------------------------------------------------------
3385:
3386: void __fastcall TMainForm::TelnetRecycleExecute(TObject *Sender)
3387: {
3388: if(!RecycleService(bbs_svc,&bbs_svc_status)) {
3389: bbs_startup.recycle_now=true;
3390: TelnetRecycle->Enabled=false;
3391: }
3392: }
3393: //---------------------------------------------------------------------------
3394:
3395: void __fastcall TMainForm::FileEditTextFilesClick(TObject *Sender)
3396: {
3397: TOpenDialog* dlg=new TOpenDialog((TComponent*)Sender);
3398:
3399: dlg->Options << ofNoChangeDir;
3400: dlg->Filter = "Text files (*.txt)|*.TXT"
3401: "|All files|*.*";
3402: dlg->InitialDir=cfg.text_dir;
3403: if(dlg->Execute()==true)
3404: EditFile(dlg->FileName.c_str());
3405: delete dlg;
3406: }
3407: //---------------------------------------------------------------------------
3408:
3409: void __fastcall TMainForm::BBSEditBajaMenuItemClick(TObject *Sender)
3410: {
3411: TOpenDialog* dlg=new TOpenDialog((TComponent*)Sender);
3412:
3413: dlg->Options << ofNoChangeDir;
3414: dlg->Filter = "Baja Source Code (*.src)|*.SRC";
3415: dlg->InitialDir=cfg.exec_dir;
3416: if(dlg->Execute()==true) {
3417: Application->CreateForm(__classid(TTextFileEditForm), &TextFileEditForm);
3418: TextFileEditForm->Filename=AnsiString(dlg->FileName);
3419: TextFileEditForm->Caption="Edit";
3420: if(TextFileEditForm->ShowModal()==mrOk) {
3421: /* Compile Baja Source File (requires Baja v2.33+) */
3422: char cmdline[512];
3423: sprintf(cmdline,"%sbaja -p %s",cfg.exec_dir,dlg->FileName);
3424: WinExec(cmdline,SW_SHOW);
3425: }
3426: delete TextFileEditForm;
3427: }
3428: delete dlg;
3429: }
3430: //---------------------------------------------------------------------------
3431:
3432: void __fastcall TMainForm::FileEditJavaScriptClick(TObject *Sender)
3433: {
3434: TOpenDialog* dlg=new TOpenDialog((TComponent*)Sender);
3435:
3436: dlg->Options << ofNoChangeDir;
3437: dlg->Filter = "JavaScript Files (*.js)|*.JS";
3438: dlg->InitialDir=cfg.exec_dir;
3439: if(dlg->Execute()==true)
3440: EditFile(dlg->FileName.c_str());
3441: delete dlg;
3442: }
3443: //---------------------------------------------------------------------------
3444:
3445: void __fastcall TMainForm::FileEditConfigFilesClick(TObject *Sender)
3446: {
3447: TOpenDialog* dlg=new TOpenDialog((TComponent*)Sender);
3448:
3449: dlg->Options << ofNoChangeDir;
3450: dlg->Filter = "Configuration Files (*.cfg; *.ini; *.conf)|*.cfg;*.ini;*.conf";
3451: dlg->InitialDir=cfg.ctrl_dir;
3452: if(dlg->Execute()==true)
3453: EditFile(dlg->FileName.c_str());
3454: delete dlg;
3455: }
3456:
3457: void __fastcall TMainForm::BBSEditFileClick(TObject *Sender)
3458: {
3459: TOpenDialog* dlg=new TOpenDialog((TComponent*)Sender);
3460:
3461: dlg->Options << ofNoChangeDir;
3462: dlg->Filter = "ANSI/Ctrl-A files (*.asc; *.msg; *.ans)|*.ASC;*.MSG;*.ANS"
3463: "|All files|*.*";
3464: dlg->InitialDir=cfg.text_dir;
3465: if(dlg->Execute()==true) {
3466: Application->CreateForm(__classid(TTextFileEditForm), &TextFileEditForm);
3467: TextFileEditForm->Filename=AnsiString(dlg->FileName);
3468: TextFileEditForm->Caption="Edit";
3469: if(TextFileEditForm->ShowModal()==mrOk) {
3470: Application->CreateForm(__classid(TPreviewForm), &PreviewForm);
3471: PreviewForm->Filename=AnsiString(dlg->FileName);
3472: PreviewForm->ShowModal();
3473: delete PreviewForm;
3474: }
3475: delete TextFileEditForm;
3476: }
3477: delete dlg;
3478: }
3479: //---------------------------------------------------------------------------
3480: bool GetServerLogLine(HANDLE& log, const char* name, char* line, size_t len)
3481: {
3482: char fname[256];
3483:
3484: if(log==INVALID_HANDLE_VALUE) {
3485: sprintf(fname,"\\\\.\\mailslot\\%s.log",name);
3486: log = CreateMailslot(
3487: fname, // pointer to string for mailslot name
3488: 0, // maximum message size
3489: 0, // milliseconds before read time-out
3490: NULL); // pointer to security structure
3491: if(log==INVALID_HANDLE_VALUE)
3492: return(false);
3493: }
3494: DWORD msgs=0;
3495: if(!GetMailslotInfo(
3496: log, // mailslot handle
3497: NULL, // address of maximum message size
3498: NULL, // address of size of next message
3499: &msgs, // address of number of messages
3500: NULL // address of read time-out
3501: ) || !msgs)
3502: return(false);
3503:
3504: DWORD rd=0;
3505: if(!ReadFile(
3506: log, // handle of file to read
3507: line, // pointer to buffer that receives data
3508: len-1, // number of bytes to read
3509: &rd, // pointer to number of bytes read
3510: NULL // pointer to structure for data
3511: ) || !rd)
3512: return(false);
3513:
3514: line[rd]=0; /* 0-terminate */
3515:
3516: return(true);
3517: }
3518: //---------------------------------------------------------------------------
3519:
3520: void __fastcall TMainForm::LogTimerTick(TObject *Sender)
3521: {
3522: char line[1024];
3523:
3524: while(GetServerLogLine(bbs_log,NTSVC_NAME_BBS,line,sizeof(line)))
3525: bbs_lputs(NULL,LOG_INFO,line);
3526:
3527: while(GetServerLogLine(event_log,NTSVC_NAME_EVENT,line,sizeof(line)))
3528: event_lputs(LOG_INFO,line);
3529:
3530: while(GetServerLogLine(ftp_log,NTSVC_NAME_FTP,line,sizeof(line)))
3531: ftp_lputs(NULL,LOG_INFO,line);
3532:
3533: while(GetServerLogLine(web_log,NTSVC_NAME_WEB,line,sizeof(line)))
3534: web_lputs(NULL,LOG_INFO,line);
3535:
3536: while(GetServerLogLine(mail_log,NTSVC_NAME_MAIL,line,sizeof(line)))
3537: mail_lputs(NULL,LOG_INFO,line);
3538:
3539: while(GetServerLogLine(services_log,NTSVC_NAME_SERVICES,line,sizeof(line)))
3540: service_lputs(NULL,LOG_INFO,line);
3541:
3542: }
3543:
3544: //---------------------------------------------------------------------------
3545: void CheckServiceStatus(
3546: SC_HANDLE svc
3547: ,SERVICE_STATUS* status
3548: ,QUERY_SERVICE_CONFIG* &config
3549: ,DWORD &config_size
3550: ,TStaticText* text
3551: ,TAction* start
3552: ,TAction* stop
3553: ,TAction* recycle
3554: ,TProgressBar* bar
3555: )
3556: {
3557: if(svc==NULL)
3558: return;
3559:
3560: DWORD ret;
3561:
3562: if(!queryServiceConfig(svc,config,config_size,&ret)) {
3563: if(GetLastError()==ERROR_INSUFFICIENT_BUFFER) {
3564: config_size=ret;
3565: if(config!=NULL)
3566: free(config);
3567: config = (QUERY_SERVICE_CONFIG*)malloc(config_size);
3568: }
3569: return;
3570: }
3571:
3572: if(config->dwStartType==SERVICE_DISABLED)
3573: return;
3574:
3575: if(!queryServiceStatus(svc,status)) {
3576: text->Caption="QueryServiceStatus Error "; // + GetLastError());
3577: return;
3578: }
3579:
3580: bool running=false;
3581:
3582: switch(status->dwCurrentState) {
3583: case SERVICE_STOPPED:
3584: text->Caption="Stopped NT Service";
3585: break;
3586: case SERVICE_STOP_PENDING:
3587: text->Caption="Stopping NT Service";
3588: break;
3589: case SERVICE_RUNNING:
3590: text->Caption="Running NT Service";
3591: running=true;
3592: break;
3593: case SERVICE_START_PENDING:
3594: text->Caption="Starting NT Service";
3595: running=true;
3596: break;
3597: default:
3598: text->Caption="!UNKNOWN: " + status->dwCurrentState;
3599: break;
3600: }
3601:
3602: start->Enabled=!running;
3603: stop->Enabled=running;
3604: recycle->Enabled=running;
3605: }
3606: //---------------------------------------------------------------------------
3607:
3608: void __fastcall TMainForm::ServiceStatusTimerTick(TObject *Sender)
3609: {
3610: if(queryServiceStatus==NULL || queryServiceConfig==NULL
3611: || (bbs_svc==NULL
3612: && ftp_svc==NULL
3613: && web_svc==NULL
3614: && mail_svc==NULL
3615: && services_svc==NULL)) {
3616: ServiceStatusTimer->Enabled=false;
3617: return;
3618: }
3619:
3620: CheckServiceStatus(
3621: bbs_svc
3622: ,&bbs_svc_status
3623: ,bbs_svc_config
3624: ,bbs_svc_config_size
3625: ,TelnetForm->Status
3626: ,TelnetStart
3627: ,TelnetStop
3628: ,TelnetRecycle
3629: ,TelnetForm->ProgressBar
3630: );
3631: CheckServiceStatus(
3632: ftp_svc
3633: ,&ftp_svc_status
3634: ,ftp_svc_config
3635: ,ftp_svc_config_size
3636: ,FtpForm->Status
3637: ,FtpStart
3638: ,FtpStop
3639: ,FtpRecycle
3640: ,FtpForm->ProgressBar
3641: );
3642: CheckServiceStatus(
3643: web_svc
3644: ,&web_svc_status
3645: ,web_svc_config
3646: ,web_svc_config_size
3647: ,WebForm->Status
3648: ,WebStart
3649: ,WebStop
3650: ,WebRecycle
3651: ,WebForm->ProgressBar
3652: );
3653: CheckServiceStatus(
3654: mail_svc
3655: ,&mail_svc_status
3656: ,mail_svc_config
3657: ,mail_svc_config_size
3658: ,MailForm->Status
3659: ,MailStart
3660: ,MailStop
3661: ,MailRecycle
3662: ,MailForm->ProgressBar
3663: );
3664: CheckServiceStatus(
3665: services_svc
3666: ,&services_svc_status
3667: ,services_svc_config
3668: ,services_svc_config_size
3669: ,ServicesForm->Status
3670: ,ServicesStart
3671: ,ServicesStop
3672: ,ServicesRecycle
3673: ,NULL
3674: );
3675:
3676: }
3677: //---------------------------------------------------------------------------
3678: void __fastcall TMainForm::EditFile(AnsiString filename, AnsiString Caption)
3679: {
3680: if(!UseFileAssociations
3681: || (int)ShellExecute(Handle, "edit", filename.c_str(), NULL,NULL,SW_SHOWDEFAULT)<=32) {
3682: Application->CreateForm(__classid(TTextFileEditForm), &TextFileEditForm);
3683: TextFileEditForm->Filename=filename;
3684: TextFileEditForm->Caption=Caption;
3685: TextFileEditForm->ShowModal();
3686: delete TextFileEditForm;
3687: }
3688: }
3689: //---------------------------------------------------------------------------
3690: void __fastcall TMainForm::ViewFile(AnsiString filename, AnsiString Caption)
3691: {
3692: if(!UseFileAssociations
3693: || (int)ShellExecute(Handle, "open", filename.c_str(), NULL,NULL,SW_SHOWDEFAULT)<=32) {
3694: Application->CreateForm(__classid(TTextFileEditForm), &TextFileEditForm);
3695: TextFileEditForm->Filename=filename;
3696: TextFileEditForm->Caption=Caption;
3697: TextFileEditForm->Memo->ReadOnly=true;
3698: TextFileEditForm->ShowModal();
3699: delete TextFileEditForm;
3700: }
3701: }
3702: //---------------------------------------------------------------------------
3703: void __fastcall TMainForm::SemFileTimerTick(TObject *Sender)
3704: {
3705: char* p;
3706:
3707: if((p=semfile_list_check(&initialized,shutdown_semfiles))!=NULL) {
3708: StatusBar->Panels->Items[4]->Text=AnsiString(p) + " signaled";
3709: terminating=true;
3710: Close();
3711: }
3712: else if((p=semfile_list_check(&initialized,recycle_semfiles))!=NULL) {
3713: StatusBar->Panels->Items[4]->Text=AnsiString(p) + " signaled";
3714: reload_config();
3715: }
3716: }
3717: //---------------------------------------------------------------------------
3718:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.