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