Anonymous avatar Anonymous committed dbd1154

Telcom - Telephony database, which I wrote when I was 16 for my A-level in CS.

Comments (0)

Files changed (26)

+IEFilter: Entering IEFilterManager object constructor...
+IEFilter: Initial sizing of handle list...
+IEFilter: Request made to count filters in INI file, the count cache was empty
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: IEFilterManager was constructed
+Starting title sequence...
+Splash screen centred in display
+Splash screen has paused
+Splash screen bypassed manually by user
+Can't set bitmap from file
+Splash screen centred in display
+Splash screen has paused
+Splash screen bypassed manually by user
+Splash screen centred in display
+Splash screen has paused
+Splash screen bypassed manually by user
+LogOn: Ready for user to log on
+LogOn: Everyone is authorized to start Telcom
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: GetFilterName will attempt to recover a filter name using the INI
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: The INI file is about to be accessed...
+IEFilter: The INI file was accessed
+IEFilter: GetFilterName() a pointer to a buffer was not sent (normal, expect 2 calls)
+IEFilter: GetFilterName() <-- The DLL name was returned
+IEFilter: GetFilterName will attempt to recover a filter name using the INI
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: The INI file is about to be accessed...
+IEFilter: The INI file was accessed
+IEFilter: GetFilterName() copying DLL name to buffer
+IEFilter: GetFilterName() <-- The DLL name was returned
+IEFilter: Entering LoadFilter()...
+IEFilter: A filter DLL was loaded, stashing handle in list...
+IEFilter: The handle was inserted in the handle list object
+IEFilter: Leaving LoadFilter()...
+IEFilter: A request to return an error number was made (side: not filter)
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+Telcom was shutdown correctly
+IEFilter: Entering IEFilterManager object destructor...
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: Attempting to destruct handle list object...
+IEFilter: IEFilterManager was destructed
+/* NOTES: The on creation event (or on shown, I can't remember) on the main
+form reads some of the toolbar settings (don't confuse with persistant
+positioning) from the registry (or INI etc.) the settings are to do with
+certain controls having been optionally turned off.  The mainform has to
+be created first and it can set these things on the toolbar that is docked
+and part of the main form.  Howver at that point, the floating toolbar has
+not been created, therefore cannot be accessed.  The way to fix this is
+that the first time this floating toolbar is shown it inherits the details
+from the main toolbar, and from then on is kept up to date and in sync with
+that toolbar through TBMSync.  Therefore this inheritance is done once and
+never happens again during the same session of Telcom */
+//---------------------------------------------------------------------------
+#include <Windows.H>
+#include <VCL\VCL.H>
+#include <CString.H>
+#pragma hdrstop
+
+#include "FMainTBUnit.h"
+#include "LFMMUnit.H" // For the benifeit of "TelComUnit.H"
+#include "CObjects\Headers\GenList.H" // Generic list object type
+#include "TelComUnit.H" // Access main form's toolbar
+#include "TBMSync.H" // Access menu / toolbar synronizer interface
+#include "Application specific registry.H"
+//---------------------------------------------------------------------------
+#ifndef BCBVER1
+#pragma package(smart_init)
+#endif /*!BCBVER1*/
+
+#pragma resource "*.dfm"
+TFMainToolBar *FMainToolBar = NULL;
+#pragma warn -par // Turn off warning about unused parameters
+//---------------------------------------------------------------------------
+__fastcall TFMainToolBar::TFMainToolBar(TComponent* Owner)
+  : TForm(Owner),
+    _collectionFlag(false) // Won't be docked when moved onto dock area
+{
+}
+//---------------------------------------------------------------------------
+void __fastcall TFMainToolBar::SpeedNewClick(TObject *Sender)
+{
+  TelComForm->MnuFileNewClick(Sender);
+}
+//---------------------------------------------------------------------------
+void __fastcall TFMainToolBar::SpeedOpenClick(TObject *Sender)
+{
+  TelComForm->MnuFileOpenClick(Sender);
+}
+//---------------------------------------------------------------------------
+void __fastcall TFMainToolBar::SpeedSaveClick(TObject *Sender)
+{
+  TelComForm->MnuFileSaveClick(Sender);
+}
+//---------------------------------------------------------------------------
+void __fastcall TFMainToolBar::SpeedCutClick(TObject *Sender)
+{
+  TelComForm->MnuEditCutClick(Sender);
+}
+//---------------------------------------------------------------------------
+void __fastcall TFMainToolBar::SpeedCopyClick(TObject *Sender)
+{
+  TelComForm->MnuEditCopyClick(Sender);
+}
+//---------------------------------------------------------------------------
+void __fastcall TFMainToolBar::SpeedPasteClick(TObject *Sender)
+{
+  TelComForm->MnuEditPasteClick(Sender);
+}
+//---------------------------------------------------------------------------
+void __fastcall TFMainToolBar::SpeedUndoClick(TObject *Sender)
+{
+  TelComForm->MnuEditUndoClick(Sender);
+}
+//---------------------------------------------------------------------------
+void __fastcall TFMainToolBar::SpeedAddRecClick(TObject *Sender)
+{
+  TelComForm->MnuRecordAddClick(Sender);
+}
+//---------------------------------------------------------------------------
+void __fastcall TFMainToolBar::SpeedDiscardRecClick(TObject *Sender)
+{
+  TelComForm->MnuRecordDiscardClick(Sender);
+}
+//---------------------------------------------------------------------------
+void __fastcall TFMainToolBar::SpeedShiftUpClick(TObject *Sender)
+{
+  TelComForm->SpeedShiftUpClick(Sender);	
+}
+//---------------------------------------------------------------------------
+void __fastcall TFMainToolBar::SpeedShiftDownClick(TObject *Sender)
+{
+  TelComForm->SpeedShiftDownClick(Sender);
+}
+//---------------------------------------------------------------------------
+void __fastcall TFMainToolBar::SpeedShiftSendToTopClick(TObject *Sender)
+{
+  TelComForm->SpeedShiftSendToTopClick(Sender);
+}
+//---------------------------------------------------------------------------
+void __fastcall TFMainToolBar::SpeedShiftSendToEndClick(TObject *Sender)
+{
+  TelComForm->SpeedShiftSendToEndClick(Sender);
+}
+//---------------------------------------------------------------------------
+void __fastcall TFMainToolBar::FormMove(TMessage& /*Msg*/)
+{
+  POINT CursorPos;
+
+  if (GetCursorPos(&CursorPos)) // What's the current dragging position?
+  {
+    if (CursorPos.y <= TelComForm->Top+TelComForm->Height-TelComForm->ClientHeight + TelComForm->MainToolBar->Height) // Dragged floating window to top or above main form?
+    {
+      /* User has dragged floating toolbar onto a dockable position */
+      if (_collectionFlag) /* Ready for collection, has user even moved it out to start with? */
+        DockIt(); // We're out of here boys
+    }
+    else /* Not in dock region? */
+    {
+      _collectionFlag = true; /* Well when they come back I'll dock them */
+    }
+  }
+  return; // Done Windows message processing!
+}
+//---------------------------------------------------------------------------
+void TFMainToolBar::FloatIt(const bool DontHide)
+{
+  POINT ScreenCursorPos;
+
+  if (!DontHide) TelComForm->HideMainToolBar(); // Hide docked version
+  if (GetCursorPos(&ScreenCursorPos)) // Grab the cursor's position on the screen
+  {
+    Left = ScreenCursorPos.x - 8; // Set us window handy
+    Top = ScreenCursorPos.y - 12;
+  }
+  Show(); // Show this floater
+}
+//---------------------------------------------------------------------------
+void TFMainToolBar::DockIt(const bool DontHide)
+{
+  _collectionFlag = false; // Won't be docked when moved onto the dock area
+  if (!DontHide) Hide(); // Hide this floater
+  TelComForm->ShowMainToolBar(); // Show docked version
+}
+//---------------------------------------------------------------------------
+void __fastcall TFMainToolBar::FormClose(TObject *Sender, TCloseAction &Action)
+{
+  /* Now we are closing the floating version, display the docked version */
+  DockIt(true /* But don't hide this as it's closing */);
+}
+//---------------------------------------------------------------------------
+void __fastcall TFMainToolBar::FormShow(TObject *Sender)
+{
+  // See notes at top of file
+  static bool DoneOnce;
+
+  Ctl3D = reg_ShouldUseCtrl3D(); // Load 3D effect option
+
+  if (!DoneOnce) // First time?
+  {
+    InheritAttribs(); // Copy all attributes from settings using TBMSync
+    InheritHints(); // Copy all hints from main toolbar on main form
+    InheritHandlers(); // Copy all event handlers from main toolbar on main form
+    CalcDims(); // Calculates dimentions to hold controls and sizes toolbar appropriately
+    DoneOnce = true; // Don't do this again
+  }
+}
+//---------------------------------------------------------------------------
+void TFMainToolBar::InheritAttribs()
+{
+  /* We need to inherit enablement & visibility attributes from
+  the main form's toolbar, therefore doing everything in different
+  calls is too much.  A little cheat might save us some code size... */
+
+  unsigned int cheat = TOOLBAR_ENABLED; // Start with enablements
+
+NextAttr:
+  ConfigToolBar( TOOLBAR_NEW, cheat, GetToolBarConfig(TOOLBAR_NEW, cheat) );
+  ConfigToolBar( TOOLBAR_OPEN, cheat, GetToolBarConfig(TOOLBAR_OPEN, cheat) );
+  ConfigToolBar( TOOLBAR_SAVE, cheat, GetToolBarConfig(TOOLBAR_SAVE, cheat) );
+  ConfigToolBar( TOOLBAR_CUT, cheat, GetToolBarConfig(TOOLBAR_CUT, cheat) );
+  ConfigToolBar( TOOLBAR_COPY, cheat, GetToolBarConfig(TOOLBAR_COPY, cheat) );
+  ConfigToolBar( TOOLBAR_PASTE, cheat, GetToolBarConfig(TOOLBAR_PASTE, cheat) );
+  ConfigToolBar( TOOLBAR_UNDO, cheat, GetToolBarConfig(TOOLBAR_UNDO, cheat) );
+  ConfigToolBar( TOOLBAR_ADD, cheat, GetToolBarConfig(TOOLBAR_ADD, cheat) );
+  ConfigToolBar( TOOLBAR_DISCARD, cheat, GetToolBarConfig(TOOLBAR_DISCARD, cheat) );
+  ConfigToolBar( TOOLBAR_SHIFTUP, cheat, GetToolBarConfig(TOOLBAR_SHIFTUP, cheat) );
+  ConfigToolBar( TOOLBAR_SHIFTDOWN, cheat, GetToolBarConfig(TOOLBAR_SHIFTDOWN, cheat) );
+  ConfigToolBar( TOOLBAR_SHIFTSENDTOTOP, cheat, GetToolBarConfig(TOOLBAR_SHIFTSENDTOTOP, cheat) );
+  ConfigToolBar( TOOLBAR_SHIFTSENDTOEND, cheat, GetToolBarConfig(TOOLBAR_SHIFTSENDTOEND, cheat) );
+
+  if (cheat == TOOLBAR_ENABLED) // Still doing enablement attributes?
+  {
+    cheat = TOOLBAR_VISIBLE; // Move on to visibilities
+    goto NextAttr; // Get on with them
+  }
+}
+//---------------------------------------------------------------------------
+void TFMainToolBar::InheritHints()
+{
+  // Copy all hints from main form
+  SpeedNew->Hint = TelComForm->SpeedNew->Hint;
+  SpeedOpen->Hint = TelComForm->SpeedOpen->Hint;
+  SpeedSave->Hint = TelComForm->SpeedSave->Hint;
+  SpeedCut->Hint = TelComForm->SpeedCut->Hint;
+  SpeedCopy->Hint = TelComForm->SpeedCopy->Hint;
+  SpeedPaste->Hint = TelComForm->SpeedPaste->Hint;
+  SpeedUndo->Hint = TelComForm->SpeedUndo->Hint;
+  SpeedAddRec->Hint = TelComForm->SpeedAddRec->Hint;
+  SpeedDiscardRec->Hint = TelComForm->SpeedDiscardRec->Hint;
+  SpeedShiftUp->Hint = TelComForm->SpeedShiftUp->Hint;
+  SpeedShiftDown->Hint = TelComForm->SpeedShiftDown->Hint;
+  SpeedShiftSendToTop->Hint = TelComForm->SpeedShiftSendToTop->Hint;
+  SpeedShiftSendToEnd->Hint = TelComForm->SpeedShiftSendToEnd->Hint;
+
+  // Another thing... we should set out flag if to show hints or not
+  ShowHint = TelComForm->MainToolBar->ShowHint; // Copy flag
+}
+//---------------------------------------------------------------------------
+void TFMainToolBar::InheritHandlers()
+{
+  // Copy all handler pointers from mainform
+  SpeedNew->OnClick = TelComForm->SpeedNew->OnClick;
+  SpeedOpen->OnClick = TelComForm->SpeedOpen->OnClick;
+  SpeedSave->OnClick = TelComForm->SpeedSave->OnClick;
+  SpeedCut->OnClick = TelComForm->SpeedCut->OnClick;
+  SpeedCopy->OnClick = TelComForm->SpeedCopy->OnClick;
+  SpeedPaste->OnClick = TelComForm->SpeedPaste->OnClick;
+  SpeedUndo->OnClick = TelComForm->SpeedUndo->OnClick;
+  SpeedAddRec->OnClick = TelComForm->SpeedAddRec->OnClick;
+  SpeedDiscardRec->OnClick = TelComForm->SpeedDiscardRec->OnClick;
+  SpeedShiftUp->OnClick = TelComForm->SpeedShiftUp->OnClick;
+  SpeedShiftDown->OnClick = TelComForm->SpeedShiftDown->OnClick;
+  SpeedShiftSendToTop->OnClick = TelComForm->SpeedShiftSendToTop->OnClick;
+  SpeedShiftSendToEnd->OnClick = TelComForm->SpeedShiftSendToEnd->OnClick;
+}
+//---------------------------------------------------------------------------
+void __fastcall TFMainToolBar::FormDblClick(TObject *Sender)
+{
+  /* A double click on the toolbar in my mind constitues execution of
+  the default on the speedmenu assigned to this position */
+  TelComForm->ToolBarPopupMenu_HintsClick(0); // Execute appropriate handler manually
+}
+//---------------------------------------------------------------------------
+void TFMainToolBar::CalcDims()
+{
+  int ci; // Component iterator (loop control var)
+  TControl* PrightMost = NULL; // Rightmost control, check this later, if NULL then there is nothing on the toolbar
+  TControl* PleftMost = NULL; // First control on the left (for getting margin measure)
+  int hiVal = 0; // Highest value (far right control's left pos)
+  int margin;
+
+  // Go through all controls on toolbar to get the rightmost one
+  for ( ci = 0U;
+        ci < ControlCount;
+        ci++)
+  {
+    if (!ci) // First loop?
+    {
+      PrightMost = Controls[ci]; // Save address
+      hiVal = PrightMost->Left; // Save left pos
+      PleftMost = Controls[ci]; // This is the first control, keep a pointer to it for use later
+    }
+    else // Subsequent loop?
+    {
+      if (Controls[ci]->Left > hiVal) // This control is further right than any other ones we found so far?
+      {
+        PrightMost = Controls[ci]; // Save address
+        hiVal = PrightMost->Left; // Save left pos
+      }
+    }
+  }
+  // If there are no controls PrightMost is NULL, otherwise
+  // PrightMost is the rightmost component on the toolbar
+  if (PrightMost) // Any components?
+  {
+    // Calc margin
+    if (PleftMost) // Leftmost control set?
+      margin = PleftMost->Left; // Use control left relative to form
+    else
+      margin = 10; // Fail safe margin which I should never have to use
+    int farPoint = PrightMost->Left + PrightMost->Width; // Calc rightmost point
+    ClientWidth = farPoint + margin; // Ensure controls may be seen
+    farPoint = PrightMost->Top + PrightMost->Height;
+    ClientHeight = farPoint + margin;
+  }
+
+  // NOTE! An assumption has been made, that all controls are the same height,
+  // therefore the height of the last control is used.
+
+  // Everything is self centering so it will never matter if everything
+  // moves around in design mode.
+}
+//---------------------------------------------------------------------------
+void __fastcall TFMainToolBar::FormResize(TObject *Sender)
+{
+  CalcDims();
+}
+//---------------------------------------------------------------------------
+

Binary file added.

+//---------------------------------------------------------------------------
+#ifndef FMainTBUnitH
+#define FMainTBUnitH
+//---------------------------------------------------------------------------
+#include <vcl\Classes.hpp>
+#include <vcl\Controls.hpp>
+#include <vcl\StdCtrls.hpp>
+#include <vcl\Forms.hpp>
+#include <vcl\Buttons.hpp>
+#include <vcl\Menus.hpp>
+//---------------------------------------------------------------------------
+class TFMainToolBar : public TForm
+{
+__published:	// IDE-managed Components
+	TPopupMenu *FloatToolPopMnu;
+	TSpeedButton *SpeedOpen;
+	TSpeedButton *SpeedNew;
+	TSpeedButton *SpeedSave;
+	TSpeedButton *SpeedCut;
+	TSpeedButton *SpeedCopy;
+	TSpeedButton *SpeedPaste;
+	TSpeedButton *SpeedUndo;
+	TSpeedButton *SpeedAddRec;
+	TSpeedButton *SpeedDiscardRec;
+	TSpeedButton *SpeedShiftUp;
+	TSpeedButton *SpeedShiftDown;
+	TSpeedButton *SpeedShiftSendToTop;
+	TSpeedButton *SpeedShiftSendToEnd;
+	void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
+	void __fastcall SpeedNewClick(TObject *Sender);
+	void __fastcall SpeedOpenClick(TObject *Sender);
+	void __fastcall SpeedSaveClick(TObject *Sender);
+	void __fastcall SpeedCutClick(TObject *Sender);
+	void __fastcall SpeedCopyClick(TObject *Sender);
+	void __fastcall SpeedPasteClick(TObject *Sender);
+	void __fastcall SpeedUndoClick(TObject *Sender);
+	void __fastcall SpeedAddRecClick(TObject *Sender);
+	void __fastcall SpeedDiscardRecClick(TObject *Sender);
+	void __fastcall SpeedShiftUpClick(TObject *Sender);
+	void __fastcall SpeedShiftDownClick(TObject *Sender);
+	void __fastcall SpeedShiftSendToTopClick(TObject *Sender);
+	void __fastcall SpeedShiftSendToEndClick(TObject *Sender);
+	void __fastcall FormShow(TObject *Sender);
+	void __fastcall FormDblClick(TObject *Sender);
+        void __fastcall FormResize(TObject *Sender);
+private:	// User declarations
+	void __fastcall FormMove(TMessage&);
+      bool _collectionFlag; /* This is set when the next time the window is moved onto
+                               the collection area it will dock */
+    void InheritAttribs(); // Inherits attributes from main toolbar
+    void InheritHints(); // Inherits hints from main toolbar
+    void InheritHandlers(); // Inherits event handlers from main toolbar
+    void CalcDims(); // Calcs dims required to hold control and sizes toolbar
+public:		// User declarations
+	__fastcall TFMainToolBar(TComponent* Owner);
+    void FloatIt(const bool DontHide = false); // Floats the window, say DontHide to not hide the docked version
+    void DockIt(const bool DontHide = false); // Docks the window, say DontHide to not hide the floating version
+	BEGIN_MESSAGE_MAP
+	MESSAGE_HANDLER(WM_MOVE,TMessage,FormMove)
+	// Add any number of additional message handlers here.
+	END_MESSAGE_MAP(TForm)
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TFMainToolBar *FMainToolBar;
+//---------------------------------------------------------------------------
+#endif
+When removing a section, the following ones must be renamed so Telcom can see them.

IEFilter load cancelled.txt

+This debug log was created when I clicked cancel on the filters
+loading dialog at the begining of Telcom.  Only 1/3 filters
+loaded.  However not all the filters are zeroed.    ---> Why?
+
+
+
+IEFilter: Entering IEFilterManager object constructor...
+IEFilter: Initial sizing of handle list...
+IEFilter: Request made to count filters in INI file, the count cache was empty
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: IEFilterManager was constructed
+Debug screen mode switch (full screen)
+TelcomNT (C) 1999, David Duncan Ross Palmer, Daybo Logic, all rights reserved.
+Screen log started.
+Starting title sequence...
+Splash screen centred in display
+Splash screen has paused
+Splash screen bypassed manually by user
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: GetFilterName will attempt to recover a filter name using the INI
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: The INI file is about to be accessed...
+IEFilter: The INI file was accessed
+IEFilter: GetFilterName() a pointer to a buffer was not sent (normal, expect 2 calls)
+IEFilter: GetFilterName() <-- The DLL name was returned
+IEFilter: GetFilterName will attempt to recover a filter name using the INI
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: The INI file is about to be accessed...
+IEFilter: The INI file was accessed
+IEFilter: GetFilterName() copying DLL name to buffer
+IEFilter: GetFilterName() <-- The DLL name was returned
+IEFilter: Entering LoadFilter()...
+IEFilter: A filter DLL was loaded, stashing handle in list...
+IEFilter: The handle was inserted in the handle list object
+IEFilter: Leaving LoadFilter()...
+IEFilter: A request to return an error number was made (side: not filter)
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: GetFilterName will attempt to recover a filter name using the INI
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: The INI file is about to be accessed...
+IEFilter: The INI file was accessed
+IEFilter: GetFilterName() a pointer to a buffer was not sent (normal, expect 2 calls)
+IEFilter: GetFilterName() <-- The DLL name was returned
+IEFilter: GetFilterName will attempt to recover a filter name using the INI
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: The INI file is about to be accessed...
+IEFilter: The INI file was accessed
+IEFilter: GetFilterName() copying DLL name to buffer
+IEFilter: GetFilterName() <-- The DLL name was returned
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: GetFilterName will attempt to recover a filter name using the INI
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: The INI file is about to be accessed...
+IEFilter: The INI file was accessed
+IEFilter: GetFilterName() a pointer to a buffer was not sent (normal, expect 2 calls)
+IEFilter: GetFilterName() <-- The DLL name was returned
+IEFilter: GetFilterName will attempt to recover a filter name using the INI
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: The INI file is about to be accessed...
+IEFilter: The INI file was accessed
+IEFilter: GetFilterName() copying DLL name to buffer
+IEFilter: GetFilterName() <-- The DLL name was returned
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: GetFilterName will attempt to recover a filter name using the INI
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: The INI file is about to be accessed...
+IEFilter: The INI file was accessed
+IEFilter: GetFilterName() a pointer to a buffer was not sent (normal, expect 2 calls)
+IEFilter: GetFilterName() <-- The DLL name was returned
+IEFilter: GetFilterName will attempt to recover a filter name using the INI
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: The INI file is about to be accessed...
+IEFilter: The INI file was accessed
+IEFilter: GetFilterName() copying DLL name to buffer
+IEFilter: GetFilterName() <-- The DLL name was returned
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+Telcom was shutdown correctly
+IEFilter: Entering IEFilterManager object destructor...
+IEFilter: Request made to count filters in INI file, CACHE HIT! The count was not really undertaken
+IEFilter: Attempting to destruct handle list object...
+IEFilter: IEFilterManager was destructed

Real TelCom Main Module.cpp

+//---------------------------------------------------------------------------
+#include <Windows.H>
+#include <VCL\VCL.H>
+#include <Mem.H>
+#include <IO.H>
+#include <ErrNo.H>
+#include <FCntl.H>
+#include <Assert.H>
+#include <Dir.H> // For MAX--- macros
+#include <CString.H>
+#include "Stds\DLStdInc.H" // Daybo Logic standard inclusions
+#include "DLUtils\DLUtils.H" // The Daybo Logic Utilities
+#pragma hdrstop
+
+#include "Headers\GenList.H" // Generic list functionallity
+#include "HiddenDummyUnit.h" // Dummy window placeholder for parenting reasons, see inside
+#include "DebugLog.H" // Debugging log interface (portable)
+#include "FilterLoaderNT.H" // for LoadFiltersNT
+#include "SplashUnit.h" // for the splash screen
+#include "PswPromptUnit.H" // PswPromptDlg
+#ifdef __EVALCOPY__ /* Headers included here are in the evaluation copy only */
+#  include "BeginNagUnit.H" // TBeginNagScreen
+#endif /*__EVALCOPY__*/
+#include "Application specific registry.h"
+#include "IEFilter.H" // Filter manager support
+#include "InternalSecurity.h" // For internal security and the like (cool stuff)
+#include "DLLs\Daybo\DLSL.H" // The Daybo Logic shared library
+#include "XArrays.H" // Manages the disk arrays
+#include "DSExplicitStatics.H" // Explicit static data in the data segment
+#include "NTCommon.H" // Common Files directory access
+#ifdef __USERESDLL__
+#  include "TC32Resi.h" // App 32-bit Resource library
+#else
+#  include "TC32Res.RH"
+#endif /*__USERESDLL__*/
+#include "InEXE.RH" // For resources which are always in Telcom.EXE
+#include "WindowingRelocator.H" // TWindowingRelocator & _MainWindowRelocator
+#include "MemMod.H" // For C class for handling memory data modified TRUE/FALSE
+#include "errmsgs.h" // Error messages
+#include "LFMMUnit.H" // For the benifeit of "TelComUnit.H"
+#include "TelComUnit.H" // For MemDatMod_UserProcedure
+#include "Headers\TStr.H" // Portable string macros
+#include "SettNT.H" /* Settings under NT */
+#include "SettNTEx.H" /* Settings for NT extensions for C++Builder */
+#include "TelCom.h" // Main program header
+//---------------------------------------------------------------------------
+#ifdef __BCB__ /* Only Borland C++Builder can read these */
+USEFORM("TelComUnit.cpp", TelComForm);
+USERES("TelCom.res");
+USEFORM("AboutUnit.cpp", AboutBox);
+USEFORM("AddRecUnit.cpp", AddRecDlg);
+USEUNIT("Application specific registry.cpp");
+USEFORM("BasicWordDlgUnit.cpp", BasicWordDlg);
+USEFORM("BiggerFieldEditUnit.cpp", BiggerFieldEditor);
+USEFORM("CreditListUnit.cpp", CreditListBox);
+USEFORM("DlgShadowingUnit.cpp", DlgShadowingWindow);
+USEFORM("EditFiltersUnit.cpp", EditFiltersDlg);
+USEFORM("Eff3DOptUnit.cpp", Eff3DOptDlg);
+USEUNIT("errmsgs.cpp");
+USEUNIT("Exception_ERecordOOF.cpp");
+USEFORM("FileOptionsUnit.cpp", FileOptionsDlg);
+USEUNIT("FilterLoaderNT.cpp");
+USEFORM("FilterLoadErrorUnit.cpp", FilterLoadErrorDlg);
+USEFORM("FindUnit.cpp", FindDlg);
+USEFORM("FindXNameUnit.cpp", FindXNameDlg);
+USEFORM("IEFilterLoadUnit.cpp", IEFilterLoadDlg);
+USEUNIT("InternalSecurity.cpp");
+USEUNIT("MRUman.cpp");
+USEUNIT("NTCommon.cpp");
+USEUNIT("OneWayTripBool.cpp");
+USEFORM("PrefEditorUnit.cpp", PrefEditorDlg);
+USEFORM("ProgCtrlUnit.cpp", ProgCtrlDlg);
+USEFORM("PswPromptUnit.cpp", PswPromptDlg);
+USEFORM("RenameRecUnit.cpp", RenameRecDlg);
+USEFORM("SearchLimitsUnit.cpp", SearchLimitsDlg);
+USEFORM("SearchMatchUnit.cpp", SearchMatchDlg);
+USEFORM("SecurityDlgUnit.cpp", SecurityDlg);
+USEFORM("SndUnit.cpp", SndDlg);
+USEFORM("SplashUnit.cpp", SplashForm);
+USEFORM("SupportedFileUnit.cpp", SupportedFileDlg);
+USEFORM("TechOptsUnit.cpp", TechOptsDlg);
+USEUNIT("WindowingRelocator.cpp");
+USEUNIT("XArrays.c");
+USEUNIT("DSExplicitStatics.C");
+USEUNIT("IEFilter.C");
+USEUNIT("memmod.c");
+USEUNIT("NameSrch.C");
+USEUNIT("OpenSave.c");
+USEUNIT("SDelInt.c");
+USEUNIT("Search.C");
+USEUNIT("TELHelpr.c");
+USEUNIT("TELSort.C");
+USEUNIT("BasSrch.C");
+USELIB("Daybo.lib");
+USEFORM("FilterInstRemUnit.cpp", FilterInstRemDlg);
+USEDEF("TelCom.def");
+USEUNIT("SettNTEx.cpp");
+USEUNIT("InterRef.C");
+USEUNIT("SettNT.cpp");
+USEUNIT("The registry.cpp");
+USEFORM("SortGaugeUnit.cpp", SortGaugeDlg);
+USEFORM("GotoRecordUnit.cpp", GotoRecordDlg);
+USEFORM("PickFieldUnit.cpp", PickFieldDlg);
+USELIB("tc32res.lib");
+USEUNIT("DebugLog.C");
+USEFORM("BeginNagUnit.cpp", BeginNagDlg);
+USEFORM("FMainTBUnit.cpp", FMainToolBar);
+USEFORM("FilterInfoEditor.cpp", FilterInfoEdit);
+USEFORM("LiveTimerUnit.cpp", LiveTimerDlg);
+USEFORM("HiddenDummyUnit.cpp", HiddenDummyWindow);
+USEUNIT("TBMSync.cpp");
+USEUNIT("..\Shared\MiscCs\ansisfnc.c");
+USEUNIT("..\Shared\MiscCs\ExcptHdr.c");
+USEUNIT("..\Shared\MiscCs\RealArr.C");
+USEUNIT("..\Shared\MiscCs\GenStack.c");
+USEUNIT("..\Shared\MiscCs\GenList.C");
+USEUNIT("..\Shared\MiscCs\Logging.c");
+USEUNIT("..\Shared\Replace\TMPPATH.c");
+USEUNIT("..\Shared\MiscCs\CharWork.C");
+USEUNIT("..\Shared\MiscCs\Pathing.c");
+USEUNIT("..\Shared\MiscCs\Sirfirst.c");
+USELIB("..\Shared\DLUtils\dlutils.lib");
+USELIB("..\Shared\Dlls\Area27 Shared Dialogs\Area27 Shared Dialogs.lib");
+USEUNIT("telver.c");
+USEUNIT("LFMMUnit.cpp");
+//---------------------------------------------------------------------------
+#endif /*__BCB__*/
+//---------------------------------------------------------------------------
+// Data
+// (none)
+
+// Functions
+static void GlobalObjectConstructor(void); /* DO NOT CALL THIS FUNCTION IS SOURCE CODE */
+static void GlobalObjectDestructor(void); /* DO NOT CALL THIS FUNCTION IN SOURCE CODE */
+static void CClassGlobalConstruct(void); /* Constructs all global static C classes, it's code must be kept up to date */
+static void CClassGlobalDestruct(void); /* Destructs all global static C classes, it's code must be kept up to date */
+static BOOL IsLockedOut(void); /* Call to determine if Daybo Logic security permits startup of this app. returns true if locked, false if normal otherwise quit */
+static void DoTitleSequence(void); /* Executes the main title logos and does not return until they have all been shown / heard */
+static BOOL GetStartPswFromUser(void); /* Prompts three times for password from user if a password is defined in the registry */
+static BOOL CheckDLSLVer(void); /* Returns false if mapped image in address space of Daybo.DLL is not a version that is recent */
+#ifdef __USERESDLL__
+  static BOOL CheckResDLLVer(void); /* Returns false if mapped image in address space of TC32Res.DLL is not a version that is recent */
+#endif /*__USERESDLL__*/
+static BOOL IsCommonFilesDirOK(void); /* Call to check if common files directory exists, exit if return false please.  Do not call unless _SplashGlobalPtr is valis or you will cause GPF/assertation failure */
+static void DisplayReleaseType(void); /* This displays the release type ALPHA/BETA etc of nothing on the splash screen */
+static void OfficialStartup(void); /* Is called when the program officially starts up, _SplashGlobalPtr MUST be valid before the call because this function might display a message */
+static void OfficialShutdown(void); /* Is called then the program shutsdown correctly.  Both OfficialStatup and shutdown are here to show a notice if the user does not properly close the app */
+//---------------------------------------------------------------------------
+WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR CmdLine, int)
+{
+  try
+  {
+    //Application->Initialize(); /* <-- OLE crap! */
+    /* I want to rediect the standard error stream, but I don't know how! */
+    //stderr =
+
+    Application->Title = "Telcom Database";
+    GlobalObjectConstructor(); // Initialization tasks for global C objects
+    atexit(GlobalObjectDestructor); // This will be called when we exit
+
+    if (!CheckDLSLVer()) // DLSL (Daybo.DLL) too old to use?
+    {
+      /* Display the error */
+      TCHAR msg[512*BYTESPERCHAR];
+      TCHAR tit[64*BYTESPERCHAR];
+      size_t msgmaxlen = sizeof(msg)-BYTESPERCHAR;
+      size_t titmaxlen = sizeof(tit)-BYTESPERCHAR;
+      ZeroMemory(msg, sizeof(msg));
+      ZeroMemory(tit, sizeof(tit));
+      if (_UsingUnicode) { msgmaxlen /= BYTESPERCHAR; titmaxlen /= BYTESPERCHAR; }
+      LoadString(INEXE_STRINGRESOURCESHANDLE, IDS_OLDDLSL_MSG, msg, msgmaxlen+BYTESPERCHAR);
+      LoadString(INEXE_STRINGRESOURCESHANDLE, IDS_OLDDLSL_TIT, tit, titmaxlen+BYTESPERCHAR);
+      MessageBox(NULL, msg, tit, MB_OK | MB_ICONSTOP);
+      return 1; // Quit
+    }
+
+    #ifdef __USERESDLL__
+      if (!CheckResDLLVer()) // TC32Res.DLL to old to use?
+      {
+        /* Display the error */
+        TCHAR msg[512*BYTESPERCHAR];
+        TCHAR tit[512*BYTESPERCHAR];
+        size_t msgmaxlen = sizeof(msg)-BYTESPERCHAR;
+        size_t titmaxlen = sizeof(tit)-BYTESPERCHAR;
+        ZeroMemory(msg, sizeof(msg));
+        ZeroMemory(tit, sizeof(tit));
+        if (_UsingUnicode) { msgmaxlen /= BYTESPERCHAR; titmaxlen /= BYTESPERCHAR; }
+        LoadString(INEXE_STRINGRESOURCESHANDLE, IDS_OLDTCRES_MSG, msg, msgmaxlen+BYTESPERCHAR);
+        LoadString(INEXE_STRINGRESOURCESHANDLE, IDS_OLDTCRES_TIT, tit, titmaxlen+BYTESPERCHAR);
+        MessageBox(NULL, msg, tit, MB_OK | MB_ICONSTOP);
+        return 1; // Quit
+      }
+    #endif /*__USERESDLL__*/
+
+    _SplashFormControl.Load(); // Load the splash form
+
+    try
+    {
+        /* WARNING: Update auto-create forms HERE not in the GUI! */
+        DoTitleSequence();
+        Application->CreateForm(__classid(TFMainToolBar), &FMainToolBar);
+        Application->CreateForm(__classid(TAddRecDlg), &AddRecDlg);
+        Application->CreateForm(__classid(TBasicWordDlg), &BasicWordDlg);
+        Application->CreateForm(__classid(TBiggerFieldEditor), &BiggerFieldEditor);
+        Application->CreateForm(__classid(TEditFiltersDlg), &EditFiltersDlg);
+        Application->CreateForm(__classid(TFileOptionsDlg), &FileOptionsDlg);
+        Application->CreateForm(__classid(TFindXNameDlg), &FindXNameDlg);
+        Application->CreateForm(__classid(TRenameRecDlg), &RenameRecDlg);
+        Application->CreateForm(__classid(TSearchLimitsDlg), &SearchLimitsDlg);
+        Application->CreateForm(__classid(TSearchMatchDlg), &SearchMatchDlg);
+        Application->CreateForm(__classid(TPswPromptDlg), &PswPromptDlg);
+        Application->CreateForm(__classid(TSortGaugeDlg), &SortGaugeDlg);
+        Application->CreateForm(__classid(TGotoRecordDlg), &GotoRecordDlg);
+        Application->CreateForm(__classid(TPickFieldDlg), &PickFieldDlg);
+        Application->CreateForm(__classid(TFindDlg), &FindDlg);
+        }
+    catch (EInvalidOperation& invop)
+    {
+      /* invalid operation - oops */
+      _SplashFormControl.MsgBox("I caused an invalid operation, not being able to focus a disabled or invisible window.  In the FindDlg, the single search page must be default in the DFM file.", "Message for DDRP", MB_OK + MB_ICONSTOP);
+    }
+    catch (...)
+    {
+      _SplashFormControl.MsgBox("Unknown mistake creating the search setup dialog (FindDlg)", "Message for DDRP", MB_OK + MB_ICONSTOP);
+    }
+
+    if (!_MainWindowRelocator.SetWindow((TForm*)TelComForm)) // Set main window
+    {
+      // Cannot set main window!
+      TCHAR Critical[512*BYTESPERCHAR]; /* critical error mess buffer */
+      size_t sizeCritical = sizeof(Critical)-BYTESPERCHAR;
+      if (_UsingUnicode) sizeCritical /= 2;
+      LoadString(STRINGRESOURCESHANDLE, IDS_CRITICAL_NOSETMAINWIN, Critical, sizeCritical+BYTESPERCHAR);
+      MessageBox(NULL, Critical, NULL, MB_OK + MB_ICONSTOP); // Display error
+      return EXIT_FAILURE; // Exit the application
+    }
+    if (IsLockedOut()) // App locked?!
+    {
+      return EXIT_SUCCESS; // Normal exit if locked
+    }
+    if (!GetStartPswFromUser()) // User can't guess password (if one is set)
+    {
+      return EXIT_SUCCESS; // Normal exit in illegal security situation
+    }
+    if (!IsCommonFilesDirOK())
+    {
+      return EXIT_FAILURE;
+    }
+    if (EssentialFileVerify(BadCRC_MsgHandler))
+    {
+      // One or more files failed!
+      return EXIT_FAILURE; // Terminate signaling failure to OS
+    }
+
+    /* Some stuff to do with the evaluation copy has to be done now, NAG! */
+    #ifdef __EVALCOPY__ /* This is an evaluation copy build? */
+    TBeginNagDlg* BeginNagDlg = new TBeginNagDlg(Application); /* Create first nag screen */
+    BeginNagDlg->ShowModal(); /* Show nag screen */
+    if (BeginNagDlg->ModalResult == mrCancel) // User cancelled nag dlg
+    {
+      delete BeginNagDlg; // Remove nag screen
+      return EXIT_SUCCESS; // Terminate
+    }
+    delete BeginNagDlg; /* Remove nag screen */
+    #endif /*__EVALCOPY__*/
+
+    OfficialStartup(); // See description at top of file
+
+    XArray_Create_em(); // Create the loaded database arrays
+
+    /* This next line loads the filters, it can be switched off if the macro is defined */
+    #ifndef __NOUSEIEFILTERS__
+    LoadFiltersNT();
+    #endif /*__NOUSEIEFILTERS__*/
+
+    _SplashFormControl.Unload(); // Unload splash screen
+
+    Application->Run();
+    // Program has ended... so cleanup
+    XArray_Destroy_em(); // Release disk-based arrays (deletes temp files that are used for this)
+    OfficialShutdown(); // Application was shutdown correctly
+  } // try
+  catch (Exception &exception)
+  {
+    char msg[] = "Outer C++ exception gaurd caught an anomoly.  The exception name is\n";
+    char* msgcat = new char[sizeof(msg) + exception.Message.Length()];
+    strcpy(msgcat, msg); strcat(msgcat, exception.Message.c_str());
+    dlutils_FatalTrap(msgcat);
+    delete[] msgcat; /* Hopefully never gets here (unless trapping was removed) */
+  }
+  return 0;
+}
+//---------------------------------------------------------------------------
+BOOL IsLockedOut() // Handles Daybo Logic general lockout or this app lockout
+{
+    settings_SetRoot(EMMULATION_HKEY_LOCAL_MACHINE); // The setting is machine specific, it affects all users
+    settings_SetKey(REGKEY_DDRPLOCALMACHINE); // Go to the Daybo Logic key for the machine
+    if (settings_GetValue_BOOL(REGVAL_DDRPLOCALMACHINE_TOTALLOCKOUT, (BOOL)REGDEFAULT_DDRPLOCALMACHINE_TOTALLOCKOUT)) // All Daybo Logic app.s locked?
+    {
+    	TCHAR str[0x80*BYTESPERCHAR]; // stack mem
+        int numChars = sizeof(str)-BYTESPERCHAR; // number of chars in string
+
+        if (_UsingUnicode) numChars /= 2; // Modify chars in string for Unicode
+
+        ZeroMemory(str, sizeof(str)); // Init stack mem incase LoadString() fails
+        LoadString(STRINGRESOURCESHANDLE, IDS_TOTAL_LOCKOUT, str, numChars+BYTESPERCHAR); // Load resource
+
+        if (!_SplashFormControl.IsLoaded()) /* Ensure splash screen is loaded */
+        {
+          char msg[128];
+          sprintf(msg, "Splash screen not loaded as expected in IsLockedOut().\nLine: %u, File: %s", __LINE__, __FILE__);
+          dlutils_FatalTrap(msg);
+        }
+
+        _SplashFormControl.MsgBox(str,
+        #ifdef UNICODE
+        L"Application locked"
+        #else
+        "Application locked"
+        #endif
+        , MB_OK + MB_ICONSTOP);
+        return TRUE; // Yes it's locked! - Doesn't go on to next test (app specific lock) because this is more important
+    }
+
+    settings_SetKey(REGKEY_TELCOMLOCALMACHINE); // Go to the TelCom key for the machine
+    if (settings_GetValue_BOOL(REGVAL_TELCOMLOCALMACHINE_LOCKOUT, (BOOL)REGDEFAULT_TELCOMLOCALMACHINE_LOCKOUT)) // App. locked?
+    {
+    	TCHAR str[0x80*BYTESPERCHAR]; // Stack mem
+        ZeroMemory(str, sizeof(str)); // Init stack mem incase LoadString() fails
+        int numChars = sizeof(str)-BYTESPERCHAR; // num chars in str
+
+        if (_UsingUnicode)
+        	numChars /= 2; // half the characters that would fit in ANSI
+
+        LoadString(STRINGRESOURCESHANDLE, IDS_LOCKOUT, str, numChars+BYTESPERCHAR); // Load resource
+
+        assert(_SplashFormControl.IsLoaded()); /* Ensure form is loaded */
+
+        _SplashFormControl.MsgBox(str,
+        #ifdef UNICODE
+        L"Application locked"
+        #else
+        "Application locked"
+        #endif
+        , MB_OK + MB_ICONSTOP);
+        return TRUE; // Yes it's locked!
+    }
+    return FALSE; // If got here I guess it's not locked
+}
+//---------------------------------------------------------------------------
+static void GlobalObjectConstructor() // ONLY CALL ONCE
+{
+  static bool Called; /* Tells us if we are called twice */
+
+  if (!Called) /* Only first call */
+  {
+    Called = true; /* Stop us being called again */
+    TELHelpr_InitFileHeader(&_TELFileHeader); // Init data segment memory - the .TEL file header
+    settings_Init();
+    _PDebugLog = (PS_DEBUGLOG)malloc( sizeof(S_DEBUGLOG) ); /* Allocate optional structure for our use (see description in DebugLog.H) */
+    CClassGlobalConstruct();
+  }
+}
+//---------------------------------------------------------------------------
+static void GlobalObjectDestructor() // DO NOT CALL DIRECTLY (USE atexit())
+{
+  static bool Called; /* Tells us if we are called twice... */
+
+  if (!Called) /* Only first call */
+  {
+    Called = true; /* Stops us being called again */
+    CClassGlobalDestruct();
+    free(_PDebugLog); /* Release optional structure (see description in DebugLog.H) */
+    settings_UnInit();
+  }
+}
+//---------------------------------------------------------------------------
+static void CClassGlobalConstruct()
+{
+  static bool Called;
+
+  if (!Called)
+  {
+    Called = true;
+    S_DebugLog_Construct(_PDebugLog); // Construct the debugging log interface
+    #ifdef NDEBUG
+      _PDebugLog->SetMode(_PDebugLog, S_DEBUGLOG_ON); // Turn on debugging immediately
+    #else /* In debug mode */
+      _PDebugLog->SetMode(_PDebugLog, S_DEBUGLOG_DISK); // Turn on debugging with log file support
+    #endif /*NDEBUG*/
+    S_MemDatMod_Construct(GetMemDatMod(), MemDatMod_UserProcedure); // Construct an instance of a C class
+    S_IEFilterManager_Construct(&_IEFilterMan); // Construct filter manager C class
+  }
+}
+//---------------------------------------------------------------------------
+static void CClassGlobalDestruct()
+{
+  static bool Called;
+
+  if (!Called)
+  {
+    Called = true;
+    S_MemDatMod_Destruct(GetMemDatMod()); // Destruct an instance of a C class
+    S_IEFilterManager_Destruct(&_IEFilterMan); // Destruct the filter manager with built in stack
+    S_DebugLog_Destruct(_PDebugLog); // Destroy the debuging log interface
+  }
+}
+//---------------------------------------------------------------------------
+void DoTitleSequence()
+{
+  _PDebugLog->Trace(_PDebugLog, "Starting title sequence...");
+
+  char SndName[MAXPATH+1]; // Buffer to keep sound filenames
+  settings_SetRoot(EMMULATION_HKEY_CURRENT_USER); // User specific settings from registry
+
+  settings_SetKey(REGKEY_MAIN); // For misc settings
+  bool DoLongStart = (bool)settings_GetValue_BOOL(REGVAL_LONGSTART, (BOOL)REGDEFAULT_LONGSTART); // Read whether to do a long start
+  settings_SetKey(REGKEY_SOUND); // Sound settings please
+
+  if (DoLongStart)
+  {
+    char* tmpmem; // For allocating temporary space
+    size_t ss; /* space size */
+
+    _SplashFormControl.SetBmp("IDB16_DAYBO_LOGIC", DLSL_GetInstanceHandle());
+    _SplashFormControl.Show();
+    Application->ProcessMessages();
+    if (!TelComForm) // Main form not created yet?
+    {
+      Application->CreateForm(__classid(TTelComForm), &TelComForm); // Create main form
+      TelComForm->Show(); // Show the main form (behind the splash screen)
+    } // (!TelComForm)
+
+    ss = NTCommon_GetCommonWaveDirectoryNameA(NULL, 0); // Get length of string (make size next line)
+    tmpmem = (char*)malloc(++ss); /* allocate memory to get string */
+    NTCommon_GetCommonWaveDirectoryNameA(tmpmem, ss); // Get the common wave directory into our string
+    strcpy(SndName, tmpmem);
+    free(tmpmem);
+
+    switch (settings_GetValue_Int(REGVAL_SOUND_CARDSUP, REGDEFAULT_SOUND_CARDSUP)) // Evaluate card support
+    {
+      case 1 : // 8-bit card?
+      {
+        strcat(SndName, "\\Lesser Daybo Logic");
+        break;
+      }
+      default : // 16-bit card?
+      {
+        strcat(SndName, "\\Daybo Logic");
+      }
+    }
+    strcat(SndName, ".wav"); // Finish name
+    if (reg_IsSndCardSupported()) // A sound card installed (doesn't matter what type)?
+    {
+      _SplashFormControl.PlayIntroSoundFile(SndName); // Play the sound
+    }
+    _SplashFormControl.Sleep(5000); // Pause for a few seconds or logo will jsut go straight away
+
+    if (_SplashFormControl.SetBmpFromFile("Daybo digital (BLUR).bmp")) // The blurred bitmap exists?
+    {
+      Application->ProcessMessages(); // Splash screen is drawn because of this
+      if (reg_IsSndCardSupported()) // Either type of sound card installed?
+      {
+        _SplashFormControl.PlayIntroSoundRes((PCSTR)MAKELONG(IDW8_8000_LOSTGLASSES,0), WAVERESOURCESHANDLE); // Amuse the user
+      }
+      _SplashFormControl.Sleep(2000); // Pause or logo would appear and go to quickly
+    }
+    _SplashFormControl.SetBmp("IDB16_DAYBO_DIGITAL", DLSL_GetInstanceHandle()); // Correct blur now
+    Application->ProcessMessages(); // Allow redraw with new bitmap
+
+    ss = NTCommon_GetCommonWaveDirectoryNameA(NULL, 0); // Get length
+    tmpmem = (char*)malloc(++ss); // Allocate string
+    NTCommon_GetCommonWaveDirectoryNameA(tmpmem, ss);
+    strcpy(SndName, tmpmem); // Start sound name
+    free(tmpmem); // release string
+
+    switch (settings_GetValue_Int(REGVAL_SOUND_CARDSUP, REGDEFAULT_SOUND_CARDSUP)) // Evaluate card support
+    {
+      case 1 : // 8-bit card?
+      {
+        strcat(SndName, "\\Lesser ProcLab"); // Use 8 bits at 22050 Hz
+        break;
+      }
+      default : // 16-bit card?
+      {
+        strcat(SndName, "\\ProcLab"); // Use 16 bits at 44.1 KHz
+      }
+    }
+    strcat(SndName, ".wav"); // Complete sound name
+    if (reg_IsSndCardSupported()) // Some sort of sound board?
+    {
+      _SplashFormControl.PlayIntroSoundFile(SndName);
+    }
+    _SplashFormControl.Sleep(5000); // Pause to avoid logo flashing up then going
+  } // (DoLongStart)
+
+  _SplashFormControl.SetBmp(IDB_SPLASH_SCREEN, BITMAPRESOURCESHANDLE); // Set to main title bitmap
+  Application->ProcessMessages(); // Splash screen is drawn because of this
+  DisplayReleaseType(); // Displays release type (Alpha/Beta etc. if applicable)
+  _SplashFormControl.SetDivisible(SPLASH_MOVEMENT_DIV); // Movement procedure will be called often (see definition on constant)
+  if (!TelComForm) // Main form not yet created?
+  {
+    Application->CreateForm(__classid(TTelComForm), &TelComForm); // Create main form
+    TelComForm->Show(); // Show the main form (behind the splash screen)
+  } // (!TelComForm)
+
+  if (reg_IsSndCardSupported()) // Either type of sound board installed? (8-bit or 16-bit)
+  {
+    _SplashFormControl.PlayIntroSoundRes((PCSTR)MAKELONG(IDW8_11025_TITLE,0), WAVERESOURCESHANDLE); // Play the intro sound
+  }
+  _SplashFormControl.Sleep(5000); // Sleep so logo does not go too quickly
+  TelComForm->Enabled = true; // Allows user to touch the main form
+}
+//---------------------------------------------------------------------------
+BOOL GetStartPswFromUser()
+{
+  settings_SetRoot(EMMULATION_HKEY_LOCAL_MACHINE); // Computer specific settings
+  settings_SetKey(REGKEY_DDRPLOCALMACHINE); // Daybo Logic machine settings
+  bool UseMasterPassword = (bool)settings_GetValue_BOOL(REGVAL_DDRPLOCALMACHINE_USEMASTERPASSWORD, (BOOL)REGDEFAULT_DDRPLOCALMACHINE_USEMASTERPASSWORD);
+  String MasterPassword = settings_GetValue_AnsiString(REGVAL_DDRPLOCALMACHINE_MASTERPASSWORD, REGDEFAULT_DDRPLOCALMACHINE_MASTERPASSWORD);
+  settings_SetKey(REGKEY_TELCOMLOCALMACHINE); // Telcom's machine specific settings
+  String Password = settings_GetValue_AnsiString(REGVAL_TELCOMLOCALMACHINE_PASSWORD, REGDEFAULT_TELCOMLOCALMACHINE_PASSWORD);
+
+  _PDebugLog->Trace(_PDebugLog, "LogOn: Ready for user to log on");
+  if (Password != "") // A password?
+  {
+    for (BYTE i=0;i<3;i++) // Three chances to get password
+    {
+      TPswPromptDlg* LocalPswDlg = new TPswPromptDlg(_SplashFormControl.GetWindowPtr()); // Dialog will be on splash screen
+      LocalPswDlg->Label1->Caption = "Telcom has been protected, you must be authorized by the system administrator to use it";
+      LocalPswDlg->Caption = "Telcom protection";
+      LocalPswDlg->OpenBtn->Caption = "Try";
+      LocalPswDlg->MoveToScreenCentre();
+      LocalPswDlg->ShowModal(); // Prompt for password now
+      String AttemptedPsw = LocalPswDlg->PswEdit->Text; // Save password
+      TModalResult ModalResult = LocalPswDlg->ModalResult; // and the modal result
+      delete LocalPswDlg; // Destroy the password dialog
+      Application->ProcessMessages(); // Allow splash screen to repaint area where dialog was
+
+      if (ModalResult == mrCancel) // If they cancel they don't want another chance, they just give up and want termination, so let's return false
+      {
+        _PDebugLog->Trace(_PDebugLog, "LogOn: Logon was cancelled by the user");
+        return FALSE; // Caller should terminate
+      }
+
+      if (AttemptedPsw == Password) // Password is correct?
+      {
+        _PDebugLog->Trace(_PDebugLog, "LogOn: Success using standard program password");
+        return TRUE; // Authorized personel
+      }
+
+      if (UseMasterPassword && MasterPassword != "" && AttemptedPsw == MasterPassword) // There is a valid master password in the registry and the user said this?
+      {
+        _PDebugLog->Trace(_PDebugLog, "LogOn: Success using system master password (Daybo Logic)");
+        return TRUE; // Master password used by system admin
+      }
+
+      /* Passwords did not match so keep looping  - oh and tell them off while their at it*/
+      if (i != 2) // If last attempt user doesn't see try again error
+      {
+        Application->MessageBox("The password you entered is not correct, try again", "Bad password", MB_OK + MB_ICONEXCLAMATION);
+        _PDebugLog->Trace(_PDebugLog, "LogOn: Incorrect password");
+      }
+    }
+    // Oh dear, password did not match after three attempts
+    _PDebugLog->Trace(_PDebugLog, "LogOn: All attempts tried, LogOn has failed!");
+    Application->MessageBox("Intruder detected on the system, program shall not run for an intruder\n(as designated by the system administrator).\n\nThe program will now terminate.", "Intruder detected", MB_OK + MB_ICONSTOP);
+    return FALSE; // Unauthorized bastard!
+  }
+  // else - no password set
+  _PDebugLog->Trace(_PDebugLog, "LogOn: Everyone is authorized to start Telcom");
+  return TRUE; // Everyone is authorized
+}
+//---------------------------------------------------------------------------
+BOOL CheckDLSLVer()
+{
+  /* Call this during startup, it will return false if Daybo.DLL is too old to use */
+
+  S_DL_MODVER v; /* Daybo Logic Module version */
+  DLSL_Version(&v); /* Call DLL to read version into structure */
+  if (v.minor < 12 || v.major < 1)
+  {
+    #ifdef __DAYBO_DEBUGGING__
+      _PDebugLog->Trace(_PDebugLog, "Init: Daybo.DLL out of date!"); // Put error in debug log
+    #endif /*__DAYBO_DEBUGGING__*/
+    return FALSE;
+  }
+  return TRUE;
+}
+//---------------------------------------------------------------------------
+#ifdef __USERESDLL__
+BOOL CheckResDLLVer()
+{
+  /* Call this during startup if using the resource DLL type build,
+  it will return false if TC32RES.DLL is too old to use */
+
+  S_DL_MODVER v; /* Daybo Logic Module version */
+  TC32Res_Version(&v); /* Call DLL to read version into structure */
+  if (v.minor < TC32RES_VERSION_MINOR || v.major < TC32RES_VERSION_MAJOR)
+  {
+    #ifdef __DAYBO_DEBUGGING__
+      _PDebugLog->Trace(_PDebugLog, "Init: TC32Res.DLL is too old"); // Put error in debug log
+    #endif /*__DAYBO_DEBUGGING__*/
+    return FALSE;
+  }
+  return TRUE;
+}
+#endif /*__USERESDLL__*/
+//---------------------------------------------------------------------------
+BOOL IsCommonFilesDirOK()
+{
+  bool wasknown;
+
+  assert(_SplashFormControl.IsLoaded()); // Safety
+
+  wasknown = NTCommon_IsDirKnown();
+  if (!wasknown) // Unknown
+  {
+    while (true) // Loop forever (explict break required to stop loop)
+    {
+      wasknown = NTCommon_IsDirKnown();
+      if (!wasknown) // unknown
+      {
+        /* Display an error message */
+        TCHAR msg[256*BYTESPERCHAR];
+        TCHAR tit[32*BYTESPERCHAR];
+        size_t charsmsg, charstit; /* characters max of these messages */
+
+        ZeroMemory(msg, sizeof(msg));
+        ZeroMemory(tit, sizeof(tit));
+        charsmsg = sizeof(msg)-BYTESPERCHAR;
+        if (_UsingUnicode) charsmsg /= 2; // Half the chars of the bytes left if unicode
+        charstit = sizeof(tit)-BYTESPERCHAR;
+        if (_UsingUnicode) charstit /= 2;
+
+        LoadString(STRINGRESOURCESHANDLE, IDS_COMMONDIRMISSING_MSG, msg, charsmsg+BYTESPERCHAR);
+        LoadString(STRINGRESOURCESHANDLE, IDS_COMMONDIRMISSING_TIT, tit, charstit+BYTESPERCHAR);
+        _PDebugLog->Trace(_PDebugLog, "Init: Windows NT / Windows 9x common files directory not registered (system registry)");
+        if (MessageBox(_SplashFormControl.GetWindowPtr()->Handle, msg, tit, MB_RETRYCANCEL + MB_DEFBUTTON2 + MB_ICONSTOP) == IDCANCEL)
+          break; // User cancelled infinite retry loop
+      }
+      else // Found dir on retry
+      {
+        break;
+      }
+    }
+  }
+  return (BOOL)wasknown;
+}
+//---------------------------------------------------------------------------
+static void DisplayReleaseType()
+{
+  int Release = TELCOM_RELEASE; // Look at release type
+
+  if (Release == TELCOM_RELEASE_ALPHA) // Alpha build?
+  {
+    _SplashFormControl.GetReleaseTypeImg()->Picture->Bitmap->
+    LoadFromResourceID((int)BITMAPRESOURCESHANDLE, IDB_RELEASE_ALPHA);
+
+    _SplashFormControl.GetReleaseTypeImg()->Height = _SplashFormControl.GetReleaseTypeImg()->Picture->Bitmap->Height;
+    _SplashFormControl.GetReleaseTypeImg()->Width = _SplashFormControl.GetReleaseTypeImg()->Picture->Bitmap->Width;
+    _SplashFormControl.GetReleaseTypeImg()->Left = (_SplashFormControl.ModWidth() /2) - (_SplashFormControl.GetReleaseTypeImg()->Width /2);
+    _SplashFormControl.GetReleaseTypeImg()->Top = (_SplashFormControl.ModHeight() /2) - (_SplashFormControl.GetReleaseTypeImg()->Height /2);
+    _SplashFormControl.GetReleaseTypeImg()->Repaint(); // Give chance for user to see it
+  }
+}
+//---------------------------------------------------------------------------
+static void OfficialStartup()
+{
+  AnsiString NewStatus("Executing"); /* Prepare a string for later */
+
+  if (!reg_WasShutdownOK()) /* Shutdown was a mess! */
+  {
+    WarnBadShutdown(_SplashFormControl.GetWindowPtr()->Handle); /* Tell user off for not shutting down Telcom properly */
+  }
+  reg_SetShutdownStatus(NewStatus); /* So we can tell if user terminates program badly */
+}
+//---------------------------------------------------------------------------
+static void OfficialShutdown()
+{
+  AnsiString NewStatus("Safe");
+  reg_SetShutdownStatus(NewStatus); /* Remember shutdown was correct */
+  _PDebugLog->Trace(_PDebugLog, "Telcom was shutdown correctly");
+}
+//---------------------------------------------------------------------------

SearchMatchUnit.cpp

+//---------------------------------------------------------------------------
+#include <vcl\vcl.h>
+#include <Windows.H>
+#include <CString.H>
+#include "Stds\DLStdInc.H"
+#pragma hdrstop
+
+#include "Application specific registry.H"
+#include "SearchMatchUnit.h"
+//---------------------------------------------------------------------------
+#pragma resource "*.dfm"
+TSearchMatchDlg *SearchMatchDlg;
+//---------------------------------------------------------------------------
+__fastcall TSearchMatchDlg::TSearchMatchDlg(TComponent* Owner)
+	: TForm(Owner),
+      _choice(0)
+{
+}
+//---------------------------------------------------------------------------
+void __fastcall TSearchMatchDlg::FindAgainBtnClick(TObject *Sender)
+{
+	_choice = SEARCHMATCH_CHOICE_FINDAGAIN;
+    Close(); // User has dismissed dlg so close it
+}
+//---------------------------------------------------------------------------
+void __fastcall TSearchMatchDlg::StopBtnClick(TObject *Sender)
+{
+	_choice = SEARCHMATCH_CHOICE_STOP;
+    Close();
+}
+//---------------------------------------------------------------------------
+void __fastcall TSearchMatchDlg::ViewBtnClick(TObject *Sender)
+{
+	_choice = SEARCHMATCH_CHOICE_VIEW;
+    Close();
+}
+//---------------------------------------------------------------------------
+BYTE TSearchMatchDlg::GetChoice() const
+{
+	return _choice;
+}
+//---------------------------------------------------------------------------
+BYTE TSearchMatchDlg::Execute(bool ifmodal) // Displays dialog
+{
+    if (ifmodal)
+    {
+    	ShowModal();
+    }
+    else
+    {
+    	Show();
+    }
+
+    return _choice;
+}
+//---------------------------------------------------------------------------
+void TSearchMatchDlg::SetMsg(const unsigned char* Pnewmsg)
+{
+	msg->Caption = (const AnsiString)(const char*)Pnewmsg;
+}
+//---------------------------------------------------------------------------
+void TSearchMatchDlg::SetMsg(const signed char* Pnewmsg)
+{
+	msg->Caption = (const AnsiString)(const char*)Pnewmsg;
+}
+//---------------------------------------------------------------------------
+void TSearchMatchDlg::SetMsg(const char* Pnewmsg)
+{
+	msg->Caption = (const AnsiString)Pnewmsg;
+}
+//---------------------------------------------------------------------------
+void TSearchMatchDlg::SetMsg(const string& newmsg)
+{
+	msg->Caption = (const AnsiString)newmsg.c_str();
+}
+//---------------------------------------------------------------------------
+void TSearchMatchDlg::SetMsg(const string* Pnewmsg)
+{
+	msg->Caption = (const AnsiString)Pnewmsg->c_str();
+}
+//---------------------------------------------------------------------------
+void TSearchMatchDlg::SetMsg(const AnsiString& newmsg)
+{
+	msg->Caption = newmsg;
+}
+//---------------------------------------------------------------------------
+void TSearchMatchDlg::SetMsg(const AnsiString* Pnewmsg)
+{
+	msg->Caption = *Pnewmsg;
+}
+//---------------------------------------------------------------------------
+void TSearchMatchDlg::SetMsg(const wchar_t* PWnewmsg)
+{
+	msg->Caption = (const AnsiString)PWnewmsg;
+}
+//---------------------------------------------------------------------------
+void __fastcall TSearchMatchDlg::MoveToScreenCentre()
+{
+	Left = (Screen->Width /2) - (Width /2);
+    Top = (Screen->Height /2) - (Height /2);
+}
+//---------------------------------------------------------------------------
+void __fastcall TSearchMatchDlg::MoveToFormCentre(TForm* CentreOfForm)
+{
+	Left = CentreOfForm->Left;
+    Top = CentreOfForm->Top;
+    Left += (CentreOfForm->Width /2) - (Width /2);
+    Top += (CentreOfForm->Height /2) - (Height /2);
+}
+//---------------------------------------------------------------------------
+void __fastcall TSearchMatchDlg::FormShow(TObject *Sender)
+{
+  Ctl3D = reg_ShouldUseCtrl3D();
+}
+//---------------------------------------------------------------------------
+

Binary file added.

SearchMatchUnit.h

+//---------------------------------------------------------------------------
+#ifndef SearchMatchUnitH
+#define SearchMatchUnitH
+//---------------------------------------------------------------------------
+#include <vcl\Classes.hpp>
+#include <vcl\Controls.hpp>
+#include <vcl\StdCtrls.hpp>
+#include <vcl\Forms.hpp>
+//---------------------------------------------------------------------------
+class TSearchMatchDlg : public TForm
+{
+__published:	// IDE-managed Components
+	TLabel *msg;
+	TButton *FindAgainBtn;
+	TButton *StopBtn;
+	TButton *ViewBtn;
+	void __fastcall FindAgainBtnClick(TObject *Sender);
+	void __fastcall StopBtnClick(TObject *Sender);
+	void __fastcall ViewBtnClick(TObject *Sender);
+	
+    void __fastcall FormShow(TObject *Sender);
+private:	// User declarations
+		BYTE _choice; // There's no setter for outside the class on purpose
+public:		// User declarations
+	__fastcall TSearchMatchDlg(TComponent* Owner);
+    BYTE GetChoice() const; // Returns _choice
+    BYTE Execute(bool ifmodal=true); // Displays dialog
+
+    /* Lots of functions to set the message for compatibility with everyone,
+    this is what I refer to as superoverloading */
+    void SetMsg(const unsigned char* Pnewmsg);
+    void SetMsg(const signed char* Pnewmsg);
+    void SetMsg(const char* Pnewmsg);
+    void SetMsg(const string& newmsg);
+    void SetMsg(const string* Pnewmsg);
+    void SetMsg(const AnsiString& newmsg);
+    void SetMsg(const AnsiString* Pnewmsg);
+    void SetMsg(const wchar_t* PWnewmsg);
+
+    void __fastcall MoveToScreenCentre(void); // Moves form to centre of screen
+    void __fastcall MoveToFormCentre(TForm* CentreOfForm); // Moves form to centre of another form
+};
+
+#define SEARCHMATCH_CHOICE_FINDAGAIN 0
+#define SEARCHMATCH_CHOICE_STOP 1
+#define SEARCHMATCH_CHOICE_VIEW 2
+//---------------------------------------------------------------------------
+extern TSearchMatchDlg *SearchMatchDlg;
+//---------------------------------------------------------------------------
+#endif
+14030 - Telcom, the add some shared Cs
+16492 - including shared libs I have written
Add a comment to this file

unknown1/TELCOM/WINNT/32RTM.EXE

Binary file added.

Add a comment to this file

unknown1/TELCOM/WINNT/DAYBO.DLL

Binary file added.

Add a comment to this file

unknown1/TELCOM/WINNT/DAYBOD~1.BMP

Added
New image
Add a comment to this file

unknown1/TELCOM/WINNT/DAYBOL~1.RTF

Binary file added.

Add a comment to this file

unknown1/TELCOM/WINNT/DPMI32VM.OVL

Binary file added.

Add a comment to this file

unknown1/TELCOM/WINNT/LICENSE.RTF

Binary file added.

unknown1/TELCOM/WINNT/MANUAL.DOC

+
+                                 Welcome to
+                  TelCom (the telecommunications database)
+
+                         Version 1.11 (April 1999)
+
+
+                    R E F E R E N C E       M A N U A L
+                    - - - - - - - - -       - - - - - -
+
+                          David Duncan Ross Palmer,
+                          Daybo Logic,
+                          26 Wilton Road,
+                          Shanklin,
+                          Isle of Wight.
+
+                          PO37 7BZ
+
+                     Telephone (voice): (01983) 864891
+
+              Sorry, no other communications protocols supported.
+
+Advice on phoning: An old man called Chalie might answer the phone, he
+won't be much help I'm afraid.  Advice: Try to persist and make your
+meaning clear that you wish to speak to DAVID.
+
+
+Copyright 1998-1999 David Duncan Ross Palmer, Daybo Logic, all rights
+reserved.
+
+This software embodies valuable trade secrets propriatary to Daybo
+Logic.
+
+All trademarks referenced in this document are the property of their
+respective owners.
+
+Specifications subject to change without notice.
+
+
+                        TELCOM SOFTWARE LICENSE
+                        =======================
+
+Copyright, Proprietary Rights
+-----------------------------
+The TelCom software is owned by Daybo Logic or it's suppliers and is
+protected by United Kingdom copyright laws and international treaty
+provisions.  You may not reverse engineer, decompile, disassemble or
+create derivative works based on the software for any purpose other than
+creating an adaptation to the software as an essential step in it's
+utilization for your own use.  This software embodies valuable trade
+secrets proprietary to Daybo Logic; you may not disclose any information
+regarding the internal operations of this software to others.
+
+
+                           WARRANTY DISCLAIMER
+                           ===================
+DAYBO LOGIC PROVIDES TELCOM "AS IS" AND WITHOUT ANY WARRANTY.  TO THE
+EXTENT PERMITTED UNDER APPLICABLE LAW, DAYBO LOGIC DISCLAIMS ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, ANY
+IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+SPECIFICALLY, DAYBO LOGIC MAKES NO REPRESENTATION OR WARRANTY THAT THE
+SOFTWARE IS FIR FOR ANY PARTICULAR PURPOSE.
+
+DAYBO LOGIC SHALL NOT BE LIABLE FOR ANY DAMAGES RESULTING FROM THE USE
+OR INABILITY TO USE THIS SOFTWARE, INCLUDING BUT NOT LIMITED TO, LOSS OF
+PROFIT, DATA OR USE OF THE SOFTWARE, OR SPECIAL, INCIDENTAL OR
+CONSEQENTIAL DAMAGES OR OTHER SIMILAR CLAIMS, EVEN IF DAYBO LOGIC HAS
+BEEN SPECIFICALLY ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.  SOME
+COUNTRIES/STATES DO NOT ALLOW THE EXCLUSION OF INCIDENTAL OR
+CONSEQUNTIAL DAMAGES, SO THE FOREGOING LIMITATION MAY NOT APPLY TO YOU.
+
+SITE LICENSES AND QUANTITY PURCHASES
+------------------------------------
+All corporate, business, government or other commercial, public or
+private users of TelCom must be licensed.  Please call or write for more
+information.
+
+ORDERS OUTSIDE THE U.K.
+-----------------------
+Please use your MasterCard, VISA, American Express, Carte Blanche,
+Diners Club or Discover card when ordering, or send a cheque drawn on a
+UK bank payable in UK sterling.  Please ass �5 for each copy to cover
+overseas shipping.
+
+If you wish to order further copies, you can use the order form supplied
+in ORDER.FRM.
+
+
+*********************************************************************
+* Table of contents                                   Page numbers  *
+*********************************************************************
+* Acknowledgements                                              1   *
+* Inverse acknowledgements!                                     1   *
+* Design goals                                                  2   *
+* Description of the program                                    3   *
+* Available versions of the program                             4   *
+* Installation                                                  5   *
+* Getting started (a jump start)                                6   *
+* Converting from old versions                                  7   *
+* Automatic backup feature                                      8   *
+* Accelerator keys                                              9   *
+* Editing fields                                               10   *
+* Restoring backup files                                       10   *
+* Identifier naming rules                                      10   *
+* Adding an entry                                              11   *
+* Removing / Deleting / Discarding an entry                    11   *
+* Opening a database                                           12   *
+* Closing a database                                           12   *
+* Most recently used                                           12   *
+* Error list                                                   13   *
+* Skipping the into                                            14   *
+* Shifting records up and down                                 14   *
+* Technical RLE problem                                        14   *
+* How to sort a database                                       14   *
+* Calling up a record by number (goto)                         15   *
+* Read-only mode                                               15   *
+*********************************************************************
+
+
+TelCom - Acknowledgements                                  Page 1
+
+A few months of work have gone into TelCom so far, I haven't got to many
+people to credit because I've had to do nearly everything myself
+(BLAST).
+
+I must thank the Nigel Crouch for his mathematical greatness, the
+algorithm for seqential file access that had some buggers in that were
+my fault really.  He helped me to debug the routine months later.  I
+must congratulate him for the ease he picks things up with, there are so
+many people at whom I get fustrated because I have to explain myself
+over and over and over again.  Thanks for offering to help test TelCom,
+Nigel but you'd better get a computer first!
+
+Thanks also goes to Sue Chorley.
+
+...and as I work here at 02:03 hrs in the morning, I think to myself.  I
+suppose there's one good thing about not having a woman, well there's
+probally lots of good things really but the immediate point is, I don't
+have to aknowledge anyone like that for having to put up with the late
+nights and night sessions where I don't sleep but work through a night,
+improving and enhancing features of TelCom.  A lot of programmers seem
+to work at night.  What's all that about then?  I know I do it but I'd
+like to know why it is more enjoyable.
+
+Inverse acknowledgements!
+-------------------------
+This must go to the people who shall remain nameless, who have interrupted
+the development of Telcom twice and shall probally try again by
+interfering with my power supply so I must seek alternative arrangments to
+work at other people's houses.
+
+
+TelCom - Design goals                                      Page 2
+
+I wanted to create a database here that I could store my personal
+telephone directory in (links etc., I don't the whole thing that might
+come through one's door).  I wanted to be able to see all my phone
+numbers in a list and all the details would be under them.
+"How useful that would be", I though to myself.  If I wanted to find out
+Nigel Crouch's phone number, for example, I could just search for "Nigel
+Crouch" and his details would come up.  This was the only design goal I
+imposed.
+
+Mrs. Chorley, on the other hand had other ideas and even if she does not
+ultimately use the database, her ideas are useful.  She wanted to be
+able to print labels for snail-mail.  She needed to affix EMail
+addresses to people's records for example (which I hann't considered at
+all).  I had to change the record format, which invalidated older
+databases.  However, the program had never been released to the public
+so the change to the record format did not warrant the need for a
+conversion utility.  Hey, I might even need to change it again at some
+point.  Don't worry though, once I have relased the program, conversion
+tools will be supplied!
+
+I did not specifically want to make the access fast or create a super-fast
+search engine, no.
+
+One thing that I really did want was a user friendly user-interface.  I
+am no expert at GUI design or researching into what people like to type
+to do certain things, no... I just stuffed the place with hints.
+Anything you are not sure about isn't hard to figure out, just hover the
+mouse above the item and a description will appear in the status bar.
+If you hover for long enough a tooltip will appear to prompt you.
+
+These were my only goals, everything else developed gradually.
+
+
+TelCom - Description of the program                        Page 3
+
+TelCom can manage a huge telephone directory.  One can add all
+the people one knows to it, so long as they have a phone number or
+equivilant identifying number or line ID of some type.  For example, a
+web address can be added.  Note: If one does add domething like a web
+address, the web address field inside the record should not be used, it
+becomes redundant.  TelCom provides one with search, sort, add, delete
+and rename for managing records.  One can even reorder them manually.
+TelCom really is THE telephone directory management system and it's
+available for MS-DOS and most flavors of MS Windows.
+
+The maximum database limit was made 2,147,483,648 entries, or course
+such a limit could not be reached.  Other resources would expire first.
+This limit will be acheived!  But in version 1.11 the limit is 32,767
+entries - and it's not my fault!  The Windows listbox entries is 16-bit
+and that messed me up, so I'll have to write another listbox control
+before next version.  So don't expand your databases too far yet!
+
+
+TelCom - Available versions of the program                 Page 4
+
+These versions of TelCom are available:
+
+TelCom 1.1 for MS-DOS (8086 real) - This is for all you old 8086 users
+out there it's very cut-down due to memory restrictions.  It has to use
+older instructions as well, which means it takes longer to get things
+done (allegedly).  This has not been released with this release.
+
+TelCom 1.1 for MS-DOS (80286 DPMI16) - This is for the people who have
+286s and won't make the move to the 386 (which I now think is the
+minimum standard we should have to worry about).  This has not been
+released with this release.
+
+TelCom 1.1 for MS-DOS (80386 DPMI32) - This is for the people with the
+first 32-bit processor in the 80x86 family.  This uses flat addressing
+and so can use up to 4 Gigs of RAM or swapfile space.  This has not been
+released with release.
+
+TelCom 1.1 for Windows 3.0 (80286) - This is for Win 286/386 3.0 users,
+it is designed for protected mode only so don't try to run it in real
+mode.  Done't worry it won't crash, it will just tell you off.  This has
+not been released with this release.
+
+TelCom 1.1 for Windows NT (i486) - This is for 80486-based computers
+only running Windows NT 3.51+ or Windows 95 or later.
+This is going to be the first released GUI.
+
+Note that Windows 95 users should use the Windows NT version unless at a
+later stage a version is released specifically for Windows 95.
+
+No specific catering has been made for Windows 98.  We don't believe in 95's
+expansion here at Daybo Logic.  NT will now become the top OS due to the
+product renaming of Windows NT 5 to Windows 2000.
+
+Maximum database size is 2,147,483,648 entries in versions 1.2 or later.
+
+
+TelCom - Installation                                      Page 5
+
+The version for MS-DOS is supplied often on one 3�" disk.
+These instructions are for that.  Otherwise if you have the CD, all
+possible versions are supplied and you have free choice of which to
+install.
+
+Switch to drive A: (or whatever the letter of the appropriate disk drive
+that TelCom the disk is in is).
+
+CD A: [ENTER]
+
+(don't type "[ENTER]")
+
+Now type : INSTALL <drive>: [ENTER].  Replace <drive> with the letter of
+you fixed disk drive, or whatever disk you wish to install TelCom to.
+Instructions are given as you go along with the installation procedure
+from here on.  You will be asked questions, the main one being which
+path do you wish to install to.  So you'd better decide where you want
+to put the thing on your fixed disk drive.  Paths have special formats,
+the installation procedure might refuse your path if it doesn't meet the
+format.  Read your DOS manual for more information.
+
+Windows 3.0 16-bit installation:  Run the INSTALL.EXE program on the CD
+in under the directory \Install\tcwin16.  The Installation program only
+runs under Windows but it behaves very similarly to the DOS installation
+discribed before.
+
+Windows NT 32-bit installation: Run SETUP.EXE located on the CD under
+the directory \Install\tcwinnt.  This installation is automated and
+windowed.  It's the proper article: Install Shield.  It's interface will
+inform you as it progresses.
+
+
+TelCom - Getting started (a jump start)                    Page 6
+
+Start by loading the GUI by running the program that has been installed
+into your designated path called TELCOM.EXE, it doesn't matter whether
+you installed for Windows NT, Windows 3 or DOS, the main executable
+file is always called TELCOM.EXE.
+
+Get yourself a person to add first of all (or make one up).  Click on
+the menu called "Record".  Then click on "Add...".  A dialog will
+appear, type the phonenumber of the person and press [ENTER].  There you
+are, your first person is added, see on the right hand side of the
+screen/window how there are lots of pieces of information (fields), you
+can edit information about ther person in these boxes.
+
+Continue to add your people in this way.  When you wish to do something
+more specific, look at more specific sections in this manual.
+
+Hint: If one is using the Windows versions of the application, videos
+are supplied on the CD that one can watch to see exactly what one must
+do to achive a result.  Better than reading this stuffy old manual, eh?
+
+
+TelCom - Converting from old versions                      Page 7
+
+If you were a test user of version 1.1 (builds < #17) then you will be
+subject to the structure alignment problem.  The header of the file will
+report an incorrect checksum as the program no longer reads it from the
+same place.  The structure no longer relies on alignment in memory when
+written to disk or read back.  To convert your databases to the new
+format run CVT1117.EXE contained within the \TCTools\WinNT directory on
+the CD.  You will be prompted for two files, the input and the output.
+
+Remember to replace the old one with the converted one afterwards.
+
+Read CVT1117.DOC for more information, this is in the directory:
+
+\TCTools\WinNT\Docs
+
+If you were a test user for the Alpha build (#35) (or more specifically
+builds #17 to #39 then you will need to update databases to the
+build #40 format which reduced the size of one field per record and
+added another field aswell per record.  Readback of the old format is
+prevented in build #40 due to the use of one of the reserved fields in
+the file header so you will be told by build #40 plus, if you need to
+convert the database.  The database conversion program is CVT1740.EXE
+contained within the \TCTools\WinNT directory on the CD.  You will be
+prompted for two files, input and output.
+
+Remember to replace the old one with the converted on afterwards.
+
+Read CVT1740.DOC for more information, this is the directory:
+
+\TCTools\WinNT\Docs
+
+
+TelCom - Automatic backup feature                          Page 8
+
+When you save a file in TelCom the old copy is always copied to a backup
+file.  The file has the same name as the original but a different
+extension.  The extension is .BAK.  TelCom will not open files with the
+extension .BAK to avoid conflicts.  If you ever need to restore backups
+you should delete the original (ensuring there is a backup first of
+course) and then rename the .BAK file with the .TEL extension.  For even
+more data security you might want to copy the backup to the original.
+Here are the commands needed for DOS to do this:
+
+IF EXIST DATABASE.BAK ERASE DATABASE.TEL
+REN DATABASE.BAK *.TEL
+
+for the renaming version, or for the copying version:
+
+COPY DATABASE.BAK DATABASE.TEL
+
+the last version will prompt you.  Note that in these example DOS
+commands "DATABASE" should be replaced by the name of your database
+file's main filename (not extension).  If you are using the Windows NT
+version and your database uses a long filename (or contains spaces) you
+should surround the name of your database (without extension in this
+example) with quotations ("").
+
+Eg.:
+IF EXIST "Long name".BAK ERASE "Long name".TEL
+REN "Long name".BAK *.TEL
+
+or:
+
+COPY "Long name".BAK "Long name.TEL"
+
+NOTE:  This automatic backup file exists only in the same directory as
+the database file.  I reconmend you copy your database to disk or other
+ackup medium also incase of fixed disk corruption or accidental
+deletion.  To ensure that you data is safe it is reconmended that you
+copy your backups to other locations as well incase of natural disasters
+like floods and fire.
+
+Build #26 test users: a bugger in this feature stops new databases being
+saved to disk, you must update to save anything normally.  Here is a
+small work-around:  Use the DOS command COPY CON to make an empty file
+with the same name as the one that you are going to save.  Telcom can
+now rename this one to the backup and your problem is sorted.
+
+
+TelCom - Accelerator Keys                                  Page 9
+
+This table lists all the special shortcut keyboard sequences that have
+been made public, use them when they are relavent.  ^ means CTRL key.
+If the sequence is not relavent then perhaps no action will take place
+or the computer will beep:
+
+^N - New file, same as menu File|New
+^O - Open file, same as menu File|Open
+^S - Save file, same as menu File|Save
+^Z - Undo, same as menu Edit|Undo
+^X - Cut, same as menu Edit|Cut
+^C - Copy, same as menu Edit|Copy
+^V - Paste, same as menu Edit|Paste
+Del - Delete/Clear, same as menu Edit|Delete.  This doesn't delete a
+      record, for that use Record|Discard... or click the minus sign.
+
+F2 - Search for text in file, same as menu Search|Basic Word Search...
+^F - Find (more sophisticated), same as menu Search|Find text...
+F3 - Find next text, same as menu Search|Find next text
+^L - Setup search limits, same as menu Search|Set limits...
+F5 - Set preferred editor name, same as menu Options|Preferred editor
+F4 - This edits the current edit field in a much bigger edit field in a
+     popup dialog.  Only works for viewing it in readonly mode.
+application...
+
+F1 - Read this manual
+
+
+TelCom - Editing fields                                    Page 10
+
+When I say editing fields, I mean a situation where, for example one wishes
+to change a person's name, address etc.  Here is what one must do:
+
+1. Of course the database file must be open!
+2. Scroll to the person using the scroll box on the listbox until their
+   ID is in view or use the find features to find them.  If one uses the
+   find features, step 3 becomes unneccesary.
+3. Click the person's ID with the mouse to select them.
+4. Their information is now displayed, click on the field in the record
+   details (on the right).
+4. Change the details with the keyboard/mouse.
+
+That's it, one does not need to inform Telcom that one has finished editing
+the details.
+
+TelCom - Restoring backup files
+
+Restoring backup files
+----------------------
+There is no feature in Telcom to allow the restoration of backup files yet.
+It will be included in the next version.
+
+To do this manually, close the database by choosing 'File | New' and then
+(ensuring there is a backup first) delete the DATABASE.TEL file (where
+DATABASE is obviously the real name of your database) and rename the
+DATABASE.BAK file DATABASE.TEL.  If you can't understand these simple
+instructions see the section entitled "Automatic backup feature" for a
+detailed explanation.
+
+Identifier naming rules
+-----------------------
+When one adds an entity or person (in any case a phonenumber or URL) to
+the database.  The identifier such as "(10983) 000000" or "www.pcplus.co.uk"
+must conform to the identifier naming rules defined here.
+
+1: The identifier should not consist wholey of spaces as the user will
+not be able to it.
+
+2: The identifer cannot have leading or trailing spaces (they are removed
+automatically by Telcom however).
+
+
+TelCom - Adding an entry                                   Page 11
+
+There are three different ways to start the process of adding an entry
+to the database.
+
+1. Click on the '+' button in the toolbar.
+2. Goto the menu 'Record | Add...'.
+3. Right click on the list of identifiers and select 'Add...'.
+
+When the dialog appears, type the identifier name.  The name must comply
+with the rules for naming an identifier, the rules can be found in the
+section entitled "Identifier naming rules".  The name that you type must
+not conflict with any other identifiers in the same database.  Identifiers
+are case sensitive, so "person" and "PERson" differ.
+
+Click on "Add" and the person is added.  See the section entitled
+"Editing fields" on how to customize this person.  After all, this new
+person has just a phone number and not even a name until you customize him.
+
+Removing / Deleting / Discarding an entry
+-----------------------------------------
+Note that these three terms are all equal.  I have just given them
+separate keywords for searching to make it easier for you users who
+may use different terms for discarding a record (as I refer to as in
+Telcom).
+
+To discard a record the user should select the record my making it
+active (clicking on it in the identifer listbox) and then selecting
+one of these three metohds of removal:
+
+1. Right click and select 'Discard...'
+2. Select the option from the menu 'Record | Discard...'
+3. Click the '-' button in the toolbar.
+
+The user is now prompted to confirm the action.  One must click on
+'YES' to remove the entry from the database.  This prompting for confirmation
+may have been disabled via the menu option
+'Options | Confirmation | On record discard', if there is a checkmark here
+it's on otherwise the user won't be prompted.  To toggle prompting just
+choose these options from the menu.  This is persistant, which means that if
+the user decides to disable/enable the options they are saved and retain
+the new information for next session.
+
+The record is now discarded from the database.  Sorry, there's no undo
+for discarding a record.  If someone does this accidently though, they
+may restore the backup file.  See the section entitled "Automatic backup
+feature" for more information on restoring backups.
+
+
+TelCom - Opening a database                                Page 12
+
+To open a database, click on the open folder of in the toolbar, or choose
+open 'File | Open'.   I know that most applications support drag 'n' drog
+techniques and starting the program from running the file, sorry, man...
+next version.  We do support the Windows 95 MRU standard though, for all
+Windows versions.  MRU is Most Recently Used.  See the section on this for
+more information.
+
+Closing a database
+------------------
+There isn't a command called close in Telcom, as one might notice.  To
+close the current database, simply open another as described in the para-
+graph above.  Alternatively one might choose to click NEW.  It would close
+the current database.  This will only be of great use though when the
+datbases are encrypted with a password.  It could act as security
+measure.  To click on NEW, either click on the sparkling file in the
+toolbar or choose 'File | New'.
+
+Most recently used
+------------------
+The MRU (Most Recently Used) file list is used in lots of programs that
+are designed for Windows 95's style.  Telcom supports a slightly crude
+version of MRU.  It may not be fully refined at the moment but it does
+offer the functionallity that one would expect.  It keeps up to eight
+different recently used files.  If the user uses the same databases
+often (which is likely the case), they only need to look for it on the
+end of the file menu instead of searching for it with the open dialog.
+
+For the paranoid amongst us (I include myself) one can cover ones tracks
+to a certain extent by deleting the current contents of the MRU list.
+Goto the menu called 'Special'.  There is an option here that says
+'Clear recent file list...'.  Click this to cover your tracks!
+
+MRU, while being a Windows 95 feature is used in the other versions of
+Telcom as well.
+
+MRU under the NT version is stored in the registry.  In other versions
+of Windows, (excluding 95/98) it is kept in an .INI file in the same
+directory as Telcom.  The DOS version hasn't been relesed yet and I haven't
+decided where the configuration info will be stored.
+
+
+TelCom - Error list                                        Page 13
+
+These are a list of errors (similarities perhaps) that can (and if they
+can they will) occur in Telcom.  These errors don't include things like
+"Can't paste while in readonly mode" or straight-forward ones, only those
+which are rarely seen in the wild.
+
+Header checksum incorrect
+=========================
+Oh-no, you've really fallen into a nasty one
+here, this means that the header of the database which contains lots of
+useful things such as the entries count, possibly your name and all sorts
+of other essential information has become corrupt.  For most users this
+means : BACKUPS AT THE READY (HOPEFULLY).  Try sending the database to me
+so I can tell you if it's fixable or not, if so I shall.  Don't send it
+to me if it contains secrets though, or if your just paranoid!
+
+This is not a Telcom database 
+=============================
+The file you just opened was not one created
+by Telcom, or was it?  If it was then this means : BACKUPS AT THE READY!
+
+For both of the above errors, a go with the TelHdrEd program on the CD
+wouldn't be a bad idea actually.  If you didn't order the CD or it was not
+available at your time of purchase call me for a copy.
+
+Sorry, can't clear the MRU at the moment 
+========================================
+This is only likely to happen
+if the you click on 'Special | Clear recent file list...' at the same time
+as part of Telcom is accessing it.  Highly unlikely.  Try again, restart
+Telcom and try again and then finally if it still happens.  I want to
+know about it.  I can't see it happening myself.
+
+Daybo Logic Shared Library (Daybo.DLL) is too old to use!
+=========================================================
+Your copy of Daybo.DLL (normally installed into the Windows System
+directory) has been installed by an older Daybo Logic application.
+Normally when the installer is functioning correctly this can't happen.
+It is possible that perhaps somebody copied an older version from a backup
+disk made before Telcom was installed if Daybo.DLL the updated version
+was accidently destroyed, or something like this.  If you have the CD,
+just look for the file in the expanded set and copy it back.  If your copy
+of Telcom does not include the expanded set, just the installation package
+(ie. like on the floppy disk version) then you will need to re-install
+Telcom.
+
+Can't rename backup file, file can not be saved
+===============================================
+First of all, if this was build #26 which was not released to the public
+but to the test team before ALPHA then this is a bug which was sifted.
+See section about "Automatic backup feature" for more information.
+
+For the end users this means that Telcom is trying to copy your database
+to the backup but one of the files is locked by another program or perhaps
+you're a little too low on disk space!  Delete some data that you no longer
+need if you KNOW that's the problem or use a different disk.  Try
+shutting down other programs which you might have inadvertly opened the
+backup or primary file in.  Try restarting Windows.  Call me if you run into
+difficulties (but ONLY if you are sure it's not the dreaded build #26 that
+is causing the problem).
+
+Telcom has been disabled by the system administrator
+====================================================
+In 'Options | Security...' it is simple to lock the program to anyone,
+someone has (maybe the administrator?) and unless he has let you use
+registry editing tools it isn't possible to get back in (allegedly).
+
+All Daybo Logic applications have been disabled
+===============================================
+Here at Daybo Logic we are coming under attack from all sides, what with
+power cut-offs and information spys.  It is useful to have a shutdown all
+Daybo Logic apps feature.  I can't discuss here how it works because the
+wrong people might read this.  If Daybo Logic comes under attack we may
+choose to disable our applications.  This shouldn't effect users machines.
+I don't understand why you might be getting the error, dear user.  Perhaps
+you installed a Daybo Logic application at a later date that noticed
+pirated copies of one or more Daybo Logic applications and decided to stop
+them all!  Useful little feature that, don't you agree?
+
+You do not have an appropriate license to use this software
+===========================================================
+Most likely you are a pirate.  You didn't get all the files that
+Telcom is supplied with you fool.  Ha!
+
+Other possibilities which if ever contact me you are more likely to use:
+Started from wrong directory, (some versions)
+Accidently deleted license agreement, (oh yeah!)
+I changed the license slightly, only by a letter but now Telcom won't start!
+Sounds like you should re-install or get it from a backup.  Changing the
+letter back again doesn't always work.
+
+
+TelCom - Skipping the intro                                Page 14
+
+If you get irriatated by the long intro sequence (as one person who was
+conducting an Alpha test did), you can prevent the leading ones with the
+company name on appearing), there is an option in the Options menu
+called 'Lengthy Intro Squence', click it and if the check mark
+has disappeared next time you bring up the same menu this means that
+only the main splash screen will now appear.  Simply click this option
+again to reverse this change.
+
+Also you may skip each splash screen individually as they appear by
+clicking on them or by pressing a key.
+
+TelCom - Shifting records up and down
+-------------------------------------
+If you want to manually move someone up or down the list in Telcom, it
+is now quite simple, just click on the up and down arrows on the toolbar
+to move them up or down by one, or the hands pointing up and down to
+sent them to the top or end of the database respectively.  If you cannot
+find the features to do this or the menu is missing, check that they are
+enabled.  Right-click on the toolbar and make sure that there is a
+checkmark by the side of the item "I want to see shift operations".
+
+Technical RLE problem
+---------------------
+Telcom uses RLE compression in it's pictures to reduce overhead in memory,
+these images (along with other stuff) is kept in a DLL for exactly this
+problem:  Not all display drivers support RLE expansion.  I don't know
+exactly what will happen if your display driver does not support RLE
+expansion but if you suspect this as a problem then look under the
+directory on the CD under \Stuff and read the the Readme.TXT file's
+discussion on this subject.  There is a fix which this document will
+describe and it's not difficult to do.
+
+How to sort a database
+----------------------
+It is simple to sort a database, by any field, simply click on
+"Sort!..." in the menu.  You might be wondering what "!..." means, part
+by part this is "!" meaning no popup menu appears it does the action
+straight away and the "..." means that a dialog box is displayed wanting
+input.
+
+When you click this you will get a dialog asking you to pick a field,
+this is the field by which the records will be sorted.  In the case of
+name (the default) names are swapped during the sort (ie. David Duncan
+Ross Palmer becomes Palmer David Duncan Ross).
+
+
+TelCom - Calling up a record by number (goto)              Page 15
+
+If you know the specific index of a record into the database, you can go
+there directly by right-clicking on the list of identifiers (on the
+left) or selecting the 'Record' menu and clicking on 'Goto...' and then
+typing the number or using the spin edit control to select the number
+and clicking on OK or pressing ENTER.  If you input a negative number or
+the record is out of range a further message box will appear to inform
+you of your grave error.
+
+Read-only mode
+--------------
+Abot this mode: This mode will stop any changes being made to the
+contents of the database.
+
+How to turn it on:  The option is in the file menu, just click it to
+toggle the mode, it is easy to determine if the mode is active because
+of the look of the edit boxes (NT version only).
+
+WARNING:  Don't set the actual file attributes of a database to readonly
+because this really screws things up.  You might find it filters through
+the automatic backup file and Telcom can no longer rename the backup
+even when you switch off the attribute of the backup.  The general
+purpose cure to this is (assuming you do want to keep your current data
+from your current session, otherwise skip step one):
+
+1. Use Save As to save the database with a different name which you can
+recover later.
+2. Close Telcom ignoring the error about renaming the backup.
+3. Remove the readonly attribute from both the database and it's backup.
+4. This only applies if you followed step 1: Delete the database and
+   rename the one you saved with a different name the database.

unknown1/TELCOM/WINNT/PACKAGE.TXT