|
|
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.