From 0b9d6b98498375292e81e71ea23881abf308e5c6 Mon Sep 17 00:00:00 2001 From: rswindell <> Date: Sun, 25 Oct 2009 05:07:50 +0000 Subject: [PATCH] Added errormsg() callback, counter, and optional error sound file support. --- src/sbbs3/ctrl/MainFormUnit.cpp | 91 ++++++++++++++++++++------------- src/sbbs3/ctrl/MainFormUnit.dfm | 14 +++-- 2 files changed, 66 insertions(+), 39 deletions(-) diff --git a/src/sbbs3/ctrl/MainFormUnit.cpp b/src/sbbs3/ctrl/MainFormUnit.cpp index 107a0f6444..708f5a5127 100644 --- a/src/sbbs3/ctrl/MainFormUnit.cpp +++ b/src/sbbs3/ctrl/MainFormUnit.cpp @@ -84,6 +84,7 @@ TMainForm *MainForm; #define LOG_TIME_FMT " m/d hh:mm:ssa/p" +#define STATUSBAR_LAST_PANEL 5 /* Service functions are NT-only, must call dynamically :-( */ typedef WINADVAPI SC_HANDLE (WINAPI *OpenSCManager_t)(LPCTSTR,LPCTSTR,DWORD); @@ -157,18 +158,16 @@ time_t initialized=0; static str_list_t recycle_semfiles; static str_list_t shutdown_semfiles; bool terminating=false; +ulong errors; +AnsiString ErrorSoundFile; -/* crash here (Nov-26-08): - -SBBSCTRL! 004f9350() -SBBSCTRL! 004f9bd3() -SBBSCTRL! 00401cc0() -thread_up(int 0x00000001) line 203 + 26 bytes -send_thread(void * 0x013550d0) line 1323 + 7 bytes -_threadstart(void * 0x01352298) line 187 + 13 bytes -KERNEL32! 7c57b3bc() +static void errormsg(void* p, int level, const char* msg) +{ + errors++; -*/ + if(MainForm->SoundToggle->Checked) + PlaySound(ErrorSoundFile.c_str(), NULL, SND_ASYNC|SND_FILENAME); +} static void thread_up(void* p, BOOL up, BOOL setuid) { @@ -873,6 +872,7 @@ __fastcall TMainForm::TMainForm(TComponent* Owner) bbs_startup.rlogin_interface=INADDR_ANY; bbs_startup.lputs=lputs; bbs_startup.event_lputs=lputs; + bbs_startup.errormsg=errormsg; bbs_startup.status=bbs_status; bbs_startup.clients=bbs_clients; bbs_startup.started=bbs_started; @@ -890,6 +890,7 @@ __fastcall TMainForm::TMainForm(TComponent* Owner) mail_startup.pop3_port=110; mail_startup.interface_addr=INADDR_ANY; mail_startup.lputs=lputs; + mail_startup.errormsg=errormsg; mail_startup.status=mail_status; mail_startup.clients=mail_clients; mail_startup.started=mail_started; @@ -911,6 +912,7 @@ __fastcall TMainForm::TMainForm(TComponent* Owner) ftp_startup.port=IPPORT_FTP; ftp_startup.interface_addr=INADDR_ANY; ftp_startup.lputs=lputs; + ftp_startup.errormsg=errormsg; ftp_startup.status=ftp_status; ftp_startup.clients=ftp_clients; ftp_startup.started=ftp_started; @@ -930,6 +932,7 @@ __fastcall TMainForm::TMainForm(TComponent* Owner) web_startup.size=sizeof(web_startup); web_startup.cbdata=&web_log_list; web_startup.lputs=lputs; + web_startup.errormsg=errormsg; web_startup.status=web_status; web_startup.clients=web_clients; web_startup.started=web_started; @@ -944,6 +947,7 @@ __fastcall TMainForm::TMainForm(TComponent* Owner) services_startup.cbdata=&services_log_list; services_startup.interface_addr=INADDR_ANY; services_startup.lputs=lputs; + services_startup.errormsg=errormsg; services_startup.status=services_status; services_startup.clients=services_clients; services_startup.started=services_started; @@ -1135,7 +1139,7 @@ void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action) if(Initialized) /* Don't overwrite registry settings with defaults */ SaveRegistrySettings(Sender); - StatusBar->Panels->Items[4]->Text="Terminating servers..."; + StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text="Terminating servers..."; time_t start=time(NULL); while( (TelnetStop->Enabled && !bbsServiceEnabled()) || (MailStop->Enabled && !mailServiceEnabled()) @@ -1147,7 +1151,7 @@ void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action) Application->ProcessMessages(); YIELD(); } - StatusBar->Panels->Items[4]->Text="Closing..."; + StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text="Closing..."; Application->ProcessMessages(); LogTimer->Enabled=false; @@ -1939,6 +1943,8 @@ void __fastcall TMainForm::StartupTimerTick(TObject *Sender) NodeForm->Timer->Interval=Registry->ReadInteger("NodeDisplayInterval")*1000; if(Registry->ValueExists("ClientDisplayInterval")) ClientForm->Timer->Interval=Registry->ReadInteger("ClientDisplayInterval")*1000; + if(Registry->ValueExists("ErrorSoundFile")) + ErrorSoundFile=Registry->ReadString("ErrorSoundFile"); if(Registry->ValueExists("MailLogFile")) MailLogFile=Registry->ReadInteger("MailLogFile"); @@ -1969,7 +1975,7 @@ void __fastcall TMainForm::StartupTimerTick(TObject *Sender) ,&MailAutoStart ,&mail_startup ,&ServicesAutoStart ,&services_startup ); - StatusBar->Panels->Items[4]->Text="Read " + AnsiString(ini_file); + StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text="Read " + AnsiString(ini_file); fclose(fp); } else { /* Legacy (v3.10-3.11) */ @@ -2282,14 +2288,14 @@ void __fastcall TMainForm::StartupTimerTick(TObject *Sender) char error[256]; SAFECOPY(error,UNKNOWN_LOAD_ERROR); - StatusBar->Panels->Items[4]->Text="Loading configuration..."; + StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text="Loading configuration..."; if(!load_cfg(&cfg, NULL, TRUE, error)) { Application->MessageBox(error,"ERROR Loading Configuration" ,MB_OK|MB_ICONEXCLAMATION); Application->Terminate(); return; } - StatusBar->Panels->Items[4]->Text="Configuration loaded"; + StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text="Configuration loaded"; recycle_semfiles=semfile_list_init(cfg.ctrl_dir,"recycle","ctrl"); semfile_list_check(&initialized,recycle_semfiles); @@ -2431,7 +2437,7 @@ void __fastcall TMainForm::StartupTimerTick(TObject *Sender) //--------------------------------------------------------------------------- void __fastcall TMainForm::SaveRegistrySettings(TObject* Sender) { - StatusBar->Panels->Items[4]->Text="Saving Registry Settings..."; + StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text="Saving Registry Settings..."; // Write Registry keys TRegistry* Registry=new TRegistry; @@ -2581,6 +2587,7 @@ void __fastcall TMainForm::SaveRegistrySettings(TObject* Sender) Registry->WriteBool("UseFileAssociations",UseFileAssociations); Registry->WriteInteger("NodeDisplayInterval",NodeForm->Timer->Interval/1000); Registry->WriteInteger("ClientDisplayInterval",ClientForm->Timer->Interval/1000); + Registry->WriteString("ErrorSoundFile",ErrorSoundFile); Registry->WriteInteger( "SpyTerminalWidth" ,SpyTerminalWidth); @@ -2616,7 +2623,7 @@ bool __fastcall TMainForm::SaveIniSettings(TObject* Sender) return(false); } - StatusBar->Panels->Items[4]->Text="Saving Settings to " + AnsiString(ini_file) + " ..."; + StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text="Saving Settings to " + AnsiString(ini_file) + " ..."; bool success = sbbs_write_ini(fp ,&cfg @@ -2682,7 +2689,7 @@ void __fastcall TMainForm::ImportSettings(TObject* Sender) if(!OpenDialog->Execute()) return; - StatusBar->Panels->Items[4]->Text="Importing Settings..."; + StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text="Importing Settings..."; TMemIniFile* IniFile=new TMemIniFile(OpenDialog->FileName); @@ -2773,7 +2780,7 @@ void __fastcall TMainForm::ExportSettings(TObject* Sender) TMemIniFile* IniFile=new TMemIniFile(SaveDialog->FileName); - StatusBar->Panels->Items[4]->Text="Exporting Settings..."; + StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text="Exporting Settings..."; const char* section = "Properties"; @@ -3024,29 +3031,34 @@ void __fastcall TMainForm::UpTimerTick(TObject *Sender) ,(up/60)%60 ); AnsiString Str=AnsiString(str); - if(MainForm->StatusBar->Panels->Items[4]->Text!=Str) - MainForm->StatusBar->Panels->Items[4]->Text=Str; + if(MainForm->StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text!=Str) + MainForm->StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text=Str; - sprintf(str,"Threads: %d",threads); + sprintf(str,"Threads: %u",threads); Str=AnsiString(str); if(MainForm->StatusBar->Panels->Items[0]->Text!=Str) MainForm->StatusBar->Panels->Items[0]->Text=Str; - sprintf(str,"Sockets: %d",sockets); + sprintf(str,"Sockets: %u",sockets); Str=AnsiString(str); if(MainForm->StatusBar->Panels->Items[1]->Text!=Str) MainForm->StatusBar->Panels->Items[1]->Text=Str; - sprintf(str,"Clients: %d",clients); + sprintf(str,"Clients: %u",clients); Str=AnsiString(str); if(MainForm->StatusBar->Panels->Items[2]->Text!=Str) MainForm->StatusBar->Panels->Items[2]->Text=Str; - sprintf(str,"Served: %d",total_clients); + sprintf(str,"Served: %u",total_clients); Str=AnsiString(str); if(MainForm->StatusBar->Panels->Items[3]->Text!=Str) MainForm->StatusBar->Panels->Items[3]->Text=Str; + sprintf(str,"Errors: %u",errors); + Str=AnsiString(str); + if(MainForm->StatusBar->Panels->Items[4]->Text!=Str) + MainForm->StatusBar->Panels->Items[4]->Text=Str; + #if 0 THeapStatus hp=GetHeapStatus(); sprintf(str,"Mem Used: %lu bytes",hp.TotalAllocated); @@ -3164,12 +3176,18 @@ void __fastcall TMainForm::ViewLogClick(TObject *Sender) mail_log_msg(NULL); ftp_log_msg(NULL); - sprintf(filename,"%sLOGS\\%s%02d%02d%02d.LOG" - ,MainForm->cfg.logs_dir - ,((TMenuItem*)Sender)->Hint.c_str() - ,tm->tm_mon+1 - ,tm->tm_mday - ,tm->tm_year%100 + if(strchr(((TMenuItem*)Sender)->Hint.c_str(),'.')==NULL) + sprintf(filename,"%sLOGS\\%s%02d%02d%02d.LOG" + ,MainForm->cfg.logs_dir + ,((TMenuItem*)Sender)->Hint.c_str() + ,tm->tm_mon+1 + ,tm->tm_mday + ,tm->tm_year%100 + ); + else + sprintf(filename,"%s\\%s" + ,MainForm->cfg.data_dir + ,((TMenuItem*)Sender)->Hint.c_str() ); ViewFile(filename,((TMenuItem*)Sender)->Caption); } @@ -3239,6 +3257,7 @@ void __fastcall TMainForm::PropertiesExecute(TObject *Sender) PropertiesDlg->JS_GcIntervalEdit->Text=IntToStr(global.js.gc_interval); PropertiesDlg->JS_YieldIntervalEdit->Text=IntToStr(global.js.yield_interval); PropertiesDlg->JS_LoadPathEdit->Text=global.js.load_path; + PropertiesDlg->ErrorSoundEdit->Text=ErrorSoundFile; if(MaxLogLen==0) PropertiesDlg->MaxLogLenEdit->Text="<unlimited>"; @@ -3286,6 +3305,7 @@ void __fastcall TMainForm::PropertiesExecute(TObject *Sender) MinimizeToSysTray=PropertiesDlg->TrayIconCheckBox->Checked; UndockableForms=PropertiesDlg->UndockableCheckBox->Checked; UseFileAssociations=PropertiesDlg->FileAssociationsCheckBox->Checked; + ErrorSoundFile=PropertiesDlg->ErrorSoundEdit->Text; /* JavaScript operating parameters */ js_startup_t js=global.js; // save for later comparison @@ -3382,13 +3402,13 @@ void __fastcall TMainForm::reload_config(void) { char error[256]; SAFECOPY(error,UNKNOWN_LOAD_ERROR); - StatusBar->Panels->Items[4]->Text="Reloading configuration..."; + StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text="Reloading configuration..."; if(!load_cfg(&cfg, NULL, TRUE, error)) { Application->MessageBox(error,"ERROR Re-loading Configuration" ,MB_OK|MB_ICONEXCLAMATION); Application->Terminate(); } - StatusBar->Panels->Items[4]->Text="Configuration reloaded"; + StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text="Configuration reloaded"; semfile_list_check(&initialized,recycle_semfiles); } //--------------------------------------------------------------------------- @@ -3852,12 +3872,12 @@ void __fastcall TMainForm::SemFileTimerTick(TObject *Sender) char* p; if((p=semfile_list_check(&initialized,shutdown_semfiles))!=NULL) { - StatusBar->Panels->Items[4]->Text=AnsiString(p) + " signaled"; + StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text=AnsiString(p) + " signaled"; terminating=true; Close(); } else if((p=semfile_list_check(&initialized,recycle_semfiles))!=NULL) { - StatusBar->Panels->Items[4]->Text=AnsiString(p) + " signaled"; + StatusBar->Panels->Items[STATUSBAR_LAST_PANEL]->Text=AnsiString(p) + " signaled"; reload_config(); } } @@ -3876,3 +3896,4 @@ TFont* __fastcall TMainForm::LogAttributes(int log_level, TColor Color, TFont* F + diff --git a/src/sbbs3/ctrl/MainFormUnit.dfm b/src/sbbs3/ctrl/MainFormUnit.dfm index 2de9bfafc0..96fa3693d4 100644 --- a/src/sbbs3/ctrl/MainFormUnit.dfm +++ b/src/sbbs3/ctrl/MainFormUnit.dfm @@ -13599,6 +13599,10 @@ object MainForm: TMainForm Text = 'Served: 0' Width = 100 end + item + Text = 'Errors: 0' + Width = 100 + end item Text = 'Starting up...' Width = 100 @@ -13986,7 +13990,7 @@ object MainForm: TMainForm object MailViewSpamLog: TMenuItem Caption = 'Spam Log' Hint = 'SPAM.LOG' - OnClick = DataMenuItemClick + OnClick = ViewLogClick end object MailViewTodaysLog: TMenuItem Caption = 'Today'#39's Log' @@ -14056,7 +14060,7 @@ object MainForm: TMainForm end end object FtpMenuItem: TMenuItem - Caption = 'FTP' + Caption = 'FT&P' object FtpConfigureMenuItem: TMenuItem Action = FtpConfigure Caption = '&Configure' @@ -14208,6 +14212,7 @@ object MainForm: TMainForm end end object ViewMenuItem: TMenuItem + AutoHotkeys = maManual Caption = '&View' object ViewNodesMenuItem: TMenuItem Action = ViewNodes @@ -14257,16 +14262,17 @@ object MainForm: TMainForm OnClick = ViewStatusBarMenuItemClick end object ViewErrorLogMenuItem: TMenuItem + AutoHotkeys = maManual Caption = 'Error Log...' Hint = 'ERROR.LOG' ImageIndex = 29 - OnClick = DataMenuItemClick + OnClick = ViewLogClick end object ViewHackAttemptLogMenuItem: TMenuItem AutoHotkeys = maManual Caption = 'Hack Attempt Log...' Hint = 'HACK.LOG' - OnClick = DataMenuItemClick + OnClick = ViewLogClick end end object HelpMenuItem: TMenuItem -- GitLab