/*++

Copyright (c) 1994  Microsoft Corporation

Module Name:

    LlsDbg.c

Abstract:

Author:

    Arthur Hanson       (arth)      Dec 07, 1994

Environment:

Revision History:

--*/

#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include "resource.h"
#include "..\..\inc\debug.h"
#include "..\common\llsdbg.h"


HINSTANCE hInst;                        // current instance

TCHAR szAppName[] = TEXT("LlsDbg");     // The name of this application
TCHAR ProgPath[MAX_PATH + 1];

HICON MyIcon;
HWND hDlgMain;


DWORD DebugFlags = 0;
LRESULT CALLBACK DlgMain( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam );

#define ITEM_DATA_SIZE 60
TCHAR ItemData[ITEM_DATA_SIZE + 1];

/////////////////////////////////////////////////////////////////////////
int APIENTRY 
WinMain( 
   HINSTANCE hInstance, 
   HINSTANCE hPrevInstance, 
   LPSTR lpCmdLine, 
   int nCmdShow
   ) 

/*++

Routine Description:


Arguments:


Return Value:

   None.

--*/

{
   LPTSTR ptr;
   DLGPROC lpproc;
   HACCEL haccel;
   MSG msg;

   hInst = hInstance;

   MyIcon = LoadIcon(hInst, szAppName);

   if (!hPrevInstance) {
   }

   lpproc = MakeProcInstance((DLGPROC) DlgMain, hInst);
   hDlgMain = CreateDialog(hInst, szAppName, NULL, lpproc);

   ShowWindow(hDlgMain, nCmdShow);

   while (GetMessage(&msg, NULL, 0, 0)) {
      if ((hDlgMain == 0) || !IsDialogMessage(hDlgMain, &msg)) {
         TranslateMessage(&msg);
         DispatchMessage(&msg);
      }
   }

   FreeProcInstance(lpproc);

   DestroyIcon(MyIcon);

   return msg.wParam;

} // WinMain


/////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK 
DlgTrace(
   HWND hDlg, 
   UINT message, 
   WPARAM wParam, 
   LPARAM lParam
   ) 

/*++

Routine Description:


Arguments:


Return Value:

   None.

--*/

{
   int wmId, wmEvent;
   PAINTSTRUCT ps;
   HDC hDC;
   RECT rc;

   switch (message) {
      case WM_INITDIALOG:
         PostMessage(hDlg, WM_COMMAND, ID_INIT, 0L);
         break;

      case WM_ERASEBKGND:

         // Process so icon background isn't painted grey by CTL3D - main dlg
         // can't be DS_MODALFRAME either, or else a frame is painted around
         // the icon.
         if (IsIconic(hDlg))
            return TRUE;

         break;

      case WM_COMMAND:
         wmId    = LOWORD(wParam);
         wmEvent = HIWORD(wParam);

         switch (wmId) {
            case ID_INIT:

            case ID_UPDATE:
               if (DebugFlags & TRACE_FUNCTION_TRACE)
                  SendDlgItemMessage(hDlg, IDC_FUNCTION, BM_SETCHECK, 1, 0);
               else
                  SendDlgItemMessage(hDlg, IDC_FUNCTION, BM_SETCHECK, 0, 0);

               if (DebugFlags & TRACE_WARNINGS)
                  SendDlgItemMessage(hDlg, IDC_WARNINGS, BM_SETCHECK, 1, 0);
               else
                  SendDlgItemMessage(hDlg, IDC_WARNINGS, BM_SETCHECK, 0, 0);

               if (DebugFlags & TRACE_PACK)
                  SendDlgItemMessage(hDlg, IDC_PACK, BM_SETCHECK, 1, 0);
               else
                  SendDlgItemMessage(hDlg, IDC_PACK, BM_SETCHECK, 0, 0);

               if (DebugFlags & TRACE_LICENSE_REQUEST)
                  SendDlgItemMessage(hDlg, IDC_REQUEST, BM_SETCHECK, 1, 0);
               else
                  SendDlgItemMessage(hDlg, IDC_REQUEST, BM_SETCHECK, 0, 0);

               if (DebugFlags & TRACE_LICENSE_FREE)
                  SendDlgItemMessage(hDlg, IDC_FREE, BM_SETCHECK, 1, 0);
               else
                  SendDlgItemMessage(hDlg, IDC_FREE, BM_SETCHECK, 0, 0);

               if (DebugFlags & TRACE_REGISTRY)
                  SendDlgItemMessage(hDlg, IDC_REGISTRY, BM_SETCHECK, 1, 0);
               else
                  SendDlgItemMessage(hDlg, IDC_REGISTRY, BM_SETCHECK, 0, 0);

               if (DebugFlags & TRACE_REPLICATION)
                  SendDlgItemMessage(hDlg, IDC_REPLICATION, BM_SETCHECK, 1, 0);
               else
                  SendDlgItemMessage(hDlg, IDC_REPLICATION, BM_SETCHECK, 0, 0);

               if (DebugFlags & TRACE_RPC)
                  SendDlgItemMessage(hDlg, IDC_RPC, BM_SETCHECK, 1, 0);
               else
                  SendDlgItemMessage(hDlg, IDC_RPC, BM_SETCHECK, 0, 0);

               if (DebugFlags & TRACE_INIT)
                  SendDlgItemMessage(hDlg, IDC_INIT, BM_SETCHECK, 1, 0);
               else
                  SendDlgItemMessage(hDlg, IDC_INIT, BM_SETCHECK, 0, 0);

               if (DebugFlags & TRACE_DATABASE)
                  SendDlgItemMessage(hDlg, IDC_DATABASE, BM_SETCHECK, 1, 0);
               else
                  SendDlgItemMessage(hDlg, IDC_DATABASE, BM_SETCHECK, 0, 0);

               break;

            case IDC_SET:
               DebugFlags = 0;

               if (SendDlgItemMessage(hDlg, IDC_FUNCTION, BM_GETCHECK, 0, 0) == 1)
                  DebugFlags |= TRACE_FUNCTION_TRACE;

               if (SendDlgItemMessage(hDlg, IDC_WARNINGS, BM_GETCHECK, 0, 0) == 1)
                  DebugFlags |= TRACE_WARNINGS;

               if (SendDlgItemMessage(hDlg, IDC_PACK, BM_GETCHECK, 0, 0) == 1)
                  DebugFlags |= TRACE_PACK;

               if (SendDlgItemMessage(hDlg, IDC_REQUEST, BM_GETCHECK, 0, 0) == 1)
                  DebugFlags |= TRACE_LICENSE_REQUEST;

               if (SendDlgItemMessage(hDlg, IDC_FREE, BM_GETCHECK, 0, 0) == 1)
                  DebugFlags |= TRACE_LICENSE_FREE;

               if (SendDlgItemMessage(hDlg, IDC_REGISTRY, BM_GETCHECK, 0, 0) == 1)
                  DebugFlags |= TRACE_REGISTRY;

               if (SendDlgItemMessage(hDlg, IDC_REPLICATION, BM_GETCHECK, 0, 0) == 1)
                  DebugFlags |= TRACE_REPLICATION;

               if (SendDlgItemMessage(hDlg, IDC_RPC, BM_GETCHECK, 0, 0) == 1)
                  DebugFlags |= TRACE_RPC;

               if (SendDlgItemMessage(hDlg, IDC_INIT, BM_GETCHECK, 0, 0) == 1)
                  DebugFlags |= TRACE_INIT;

               if (SendDlgItemMessage(hDlg, IDC_DATABASE, BM_GETCHECK, 0, 0) == 1)
                  DebugFlags |= TRACE_DATABASE;

               LlsDbgTraceSet( DebugFlags );
               break;

            case IDC_RESET:
               DebugFlags = 0;
               PostMessage(hDlg, WM_COMMAND, ID_UPDATE, 0L);
               break;

            case IDCANCEL:
               EndDialog(hDlg, 0);
               return (TRUE);
               break;

         }

         break;

      default:
         break;
   }


   return (FALSE); // Didn't process the message

} // DlgTrace


/////////////////////////////////////////////////////////////////////////
VOID
DlgTrace_Do(HWND hDlg) {
   DLGPROC lpfnDlg;

   lpfnDlg = MakeProcInstance((DLGPROC)DlgTrace, hInst);
   DialogBox(hInst, TEXT("LlsTrace"), hDlg, lpfnDlg) ;
   FreeProcInstance(lpfnDlg);

} // DlgTrace_Do


/////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK 
DlgMain(
   HWND hDlg, 
   UINT message, 
   WPARAM wParam, 
   LPARAM lParam
   ) 

/*++

Routine Description:


Arguments:


Return Value:

   None.

--*/

{
   HWND hCtrl;
   int wmId, wmEvent;
   DWORD dwData, dwIndex;
   PAINTSTRUCT ps;
   HDC hDC;
   RECT rc;

   switch (message) {
      case WM_INITDIALOG:
         PostMessage(hDlg, WM_COMMAND, ID_INIT, 0L);

         break;

      case WM_DESTROY:
         PostQuitMessage(0);
         break;

      case WM_PAINT:
         hDC = BeginPaint(hDlg, &ps);
         if (IsIconic(hDlg)) {
            GetClientRect(hDlg, &rc);
            DrawIcon(hDC, rc.left, rc.top, MyIcon);
         }

         EndPaint(hDlg, &ps);
         break;

      case WM_ERASEBKGND:

         // Process so icon background isn't painted grey by CTL3D - main dlg
         // can't be DS_MODALFRAME either, or else a frame is painted around
         // the icon.
         if (IsIconic(hDlg))
            return TRUE;

         break;

      case WM_COMMAND:
         wmId    = LOWORD(wParam);
         wmEvent = HIWORD(wParam);

         switch (wmId) {
            case ID_INIT:
               LlsDebugInit( );

               //
               // Limit edit box to some reasonable value
               //
               hCtrl = GetDlgItem(hDlg, IDC_EDIT1);
               PostMessage(hCtrl, EM_LIMITTEXT, (WPARAM) ITEM_DATA_SIZE, 0);

               //
               // Fill up the combo box with our tables
               //
               hCtrl = GetDlgItem(hDlg, IDC_COMBO1);
               dwIndex = SendMessage(hCtrl, CB_ADDSTRING, (WPARAM) 0, (LPARAM) TEXT("Service"));
               SendMessage(hCtrl, CB_SETITEMDATA, (WPARAM) dwIndex, (LPARAM) SERVICE_TABLE_NUM);

               dwIndex = SendMessage(hCtrl, CB_ADDSTRING, (WPARAM) 0, (LPARAM) TEXT("User"));
               SendMessage(hCtrl, CB_SETITEMDATA, (WPARAM) dwIndex, (LPARAM) USER_TABLE_NUM);

               dwIndex = SendMessage(hCtrl, CB_ADDSTRING, (WPARAM) 0, (LPARAM) TEXT("SID"));
               SendMessage(hCtrl, CB_SETITEMDATA, (WPARAM) dwIndex, (LPARAM) SID_TABLE_NUM);

               dwIndex = SendMessage(hCtrl, CB_ADDSTRING, (WPARAM) 0, (LPARAM) TEXT("License"));
               SendMessage(hCtrl, CB_SETITEMDATA, (WPARAM) dwIndex, (LPARAM) LICENSE_TABLE_NUM);

               dwIndex = SendMessage(hCtrl, CB_ADDSTRING, (WPARAM) 0, (LPARAM) TEXT("Add Cache"));
               SendMessage(hCtrl, CB_SETITEMDATA, (WPARAM) dwIndex, (LPARAM) ADD_CACHE_TABLE_NUM);

               dwIndex = SendMessage(hCtrl, CB_ADDSTRING, (WPARAM) 0, (LPARAM) TEXT("Master Service"));
               SendMessage(hCtrl, CB_SETITEMDATA, (WPARAM) dwIndex, (LPARAM) MASTER_SERVICE_TABLE_NUM);

               dwIndex = SendMessage(hCtrl, CB_ADDSTRING, (WPARAM) 0, (LPARAM) TEXT("Service Family"));
               SendMessage(hCtrl, CB_SETITEMDATA, (WPARAM) dwIndex, (LPARAM) SERVICE_FAMILY_TABLE_NUM);

               dwIndex = SendMessage(hCtrl, CB_ADDSTRING, (WPARAM) 0, (LPARAM) TEXT("License Group"));
               SendMessage(hCtrl, CB_SETITEMDATA, (WPARAM) dwIndex, (LPARAM) MAPPING_TABLE_NUM);

               dwIndex = SendMessage(hCtrl, CB_ADDSTRING, (WPARAM) 0, (LPARAM) TEXT("Server"));
               SendMessage(hCtrl, CB_SETITEMDATA, (WPARAM) dwIndex, (LPARAM) SERVER_TABLE_NUM);

               dwIndex = SendMessage(hCtrl, CB_ADDSTRING, (WPARAM) 0, (LPARAM) TEXT("Secure Products"));
               SendMessage(hCtrl, CB_SETITEMDATA, (WPARAM) dwIndex, (LPARAM) SECURE_PRODUCT_TABLE_NUM);

               dwIndex = SendMessage(hCtrl, CB_ADDSTRING, (WPARAM) 0, (LPARAM) TEXT("Certificate Database"));
               SendMessage(hCtrl, CB_SETITEMDATA, (WPARAM) dwIndex, (LPARAM) CERTIFICATE_TABLE_NUM);

               SendMessage(hCtrl, CB_SELECTSTRING, (WPARAM) -1, (LPARAM) TEXT("Add Cache"));
               break;

            case IDC_DUMPALL:
               hCtrl = GetDlgItem(hDlg, IDC_COMBO1);
               dwIndex = SendMessage(hCtrl, CB_GETCURSEL, 0, 0L);

               if (dwIndex != CB_ERR) {
                  dwData = SendMessage(hCtrl, CB_GETITEMDATA, dwIndex, 0L);
                  LlsDbgTableDump( dwData );
               }

               break;

            case IDC_DUMPITEM:
               hCtrl = GetDlgItem(hDlg, IDC_COMBO1);
               dwIndex = SendMessage(hCtrl, CB_GETCURSEL, 0, 0L);

               if (dwIndex != CB_ERR) {
                  dwData = SendMessage(hCtrl, CB_GETITEMDATA, dwIndex, 0L);

                  hCtrl = GetDlgItem(hDlg, IDC_EDIT1);
                  * (WORD *)ItemData = sizeof(ItemData);
                  SendMessage(hCtrl, EM_GETLINE, 0, (LPARAM) ItemData);

                  LlsDbgTableInfoDump( dwData, ItemData );
               }

               break;

            case IDC_TRACE:
               DlgTrace_Do(hDlg);
               break;

            case IDC_CONFIG:
               LlsDbgConfigDump();
               break;

            case IDC_FORCEREPLICATE:
               LlsDbgReplicationForce();
               break;

            case IDCANCEL:
               PostMessage(hDlg, WM_DESTROY, 0, 0);
               LlsClose();
               break;

         }

         break;

      default:
         break;
   }


   return (FALSE); // Didn't process the message

} // DlgMain