/*++

Copyright (c) 1997  Microsoft Corporation

Module Name:

    class.c

Abstract:

    This file implements the modem co-class
    installer for fax.

Environment:

    WIN32 User Mode

Author:

    Wesley Witt (wesw) 31-Jul-1997

--*/

#include "wizard.h"
#pragma hdrstop


#if DBG

typedef struct _DIF_DEBUG {
    DWORD DifValue;
    LPTSTR DifString;
} DIF_DEBUG, *PDIF_DEBUG;

DIF_DEBUG DifDebug[] =
{
    { 0,                           TEXT("")                           },  //  0x00000000
    { DIF_SELECTDEVICE,            TEXT("DIF_SELECTDEVICE")           },  //  0x00000001
    { DIF_INSTALLDEVICE,           TEXT("DIF_INSTALLDEVICE")          },  //  0x00000002
    { DIF_ASSIGNRESOURCES,         TEXT("DIF_ASSIGNRESOURCES")        },  //  0x00000003
    { DIF_PROPERTIES,              TEXT("DIF_PROPERTIES")             },  //  0x00000004
    { DIF_REMOVE,                  TEXT("DIF_REMOVE")                 },  //  0x00000005
    { DIF_FIRSTTIMESETUP,          TEXT("DIF_FIRSTTIMESETUP")         },  //  0x00000006
    { DIF_FOUNDDEVICE,             TEXT("DIF_FOUNDDEVICE")            },  //  0x00000007
    { DIF_SELECTCLASSDRIVERS,      TEXT("DIF_SELECTCLASSDRIVERS")     },  //  0x00000008
    { DIF_VALIDATECLASSDRIVERS,    TEXT("DIF_VALIDATECLASSDRIVERS")   },  //  0x00000009
    { DIF_INSTALLCLASSDRIVERS,     TEXT("DIF_INSTALLCLASSDRIVERS")    },  //  0x0000000A
    { DIF_CALCDISKSPACE,           TEXT("DIF_CALCDISKSPACE")          },  //  0x0000000B
    { DIF_DESTROYPRIVATEDATA,      TEXT("DIF_DESTROYPRIVATEDATA")     },  //  0x0000000C
    { DIF_VALIDATEDRIVER,          TEXT("DIF_VALIDATEDRIVER")         },  //  0x0000000D
    { DIF_MOVEDEVICE,              TEXT("DIF_MOVEDEVICE")             },  //  0x0000000E
    { DIF_DETECT,                  TEXT("DIF_DETECT")                 },  //  0x0000000F
    { DIF_INSTALLWIZARD,           TEXT("DIF_INSTALLWIZARD")          },  //  0x00000010
    { DIF_DESTROYWIZARDDATA,       TEXT("DIF_DESTROYWIZARDDATA")      },  //  0x00000011
    { DIF_PROPERTYCHANGE,          TEXT("DIF_PROPERTYCHANGE")         },  //  0x00000012
    { DIF_ENABLECLASS,             TEXT("DIF_ENABLECLASS")            },  //  0x00000013
    { DIF_DETECTVERIFY,            TEXT("DIF_DETECTVERIFY")           },  //  0x00000014
    { DIF_INSTALLDEVICEFILES,      TEXT("DIF_INSTALLDEVICEFILES")     },  //  0x00000015
    { DIF_UNREMOVE,                TEXT("DIF_UNREMOVE")               },  //  0x00000016
    { DIF_SELECTBESTCOMPATDRV,     TEXT("DIF_SELECTBESTCOMPATDRV")    },  //  0x00000017
    { DIF_ALLOW_INSTALL,           TEXT("DIF_ALLOW_INSTALL")          },  //  0x00000018
    { DIF_REGISTERDEVICE,          TEXT("DIF_REGISTERDEVICE")         },  //  0x00000019
    { 0,                           TEXT("")                           },  //  0x0000001A
    { 0,                           TEXT("")                           },  //  0x0000001B
    { 0,                           TEXT("")                           },  //  0x0000001C
    { 0,                           TEXT("")                           },  //  0x0000001D
    { 0,                           TEXT("")                           },  //  0x0000001E
    { 0,                           TEXT("")                           },  //  0x0000001F
    { DIF_INSTALLINTERFACES,       TEXT("DIF_INSTALLINTERFACES")      },  //  0x00000020
    { DIF_DETECTCANCEL,            TEXT("DIF_DETECTCANCEL")           },  //  0x00000021
    { DIF_REGISTER_COINSTALLERS,   TEXT("DIF_REGISTER_COINSTALLERS")  },  //  0x00000022
    { 0,                           TEXT("")                           }   //  0x00000023
};

#endif






LRESULT
FaxModemDlgProc(
    HWND hwnd,
    UINT message,
    WPARAM wParam,
    LPARAM lParam
    )
{
    switch( message ) {
        case WM_INITDIALOG:
            break;

        case WM_COMMAND:
            switch( wParam ) {
                case IDCANCEL:
                    EndDialog( hwnd, IDCANCEL );
                    return TRUE;

                case IDOK:
                    EndDialog( hwnd, IDOK );
                    return TRUE;
            }
            break;
    }

    return FALSE;
}


DWORD
CALLBACK
FaxModemCoClassInstaller(
    IN DI_FUNCTION InstallFunction,
    IN HDEVINFO DeviceInfoSet,
    IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
    IN OUT PCOINSTALLER_CONTEXT_DATA Context
    )
{
    DWORD rVal = NO_ERROR;
    HKEY hKey = INVALID_HANDLE_VALUE;
    LPTSTR FriendlyName = NULL;
    LPTSTR ModemAttachedTo = NULL;
    HANDLE hFile = NULL;
    TCHAR ComPortName[32];
#if 0
    int DlgErr;
#endif



    DebugPrint(( TEXT("FaxModemCoClassInstaller:  processing %s request"), DifDebug[InstallFunction].DifString ));

    if (InstallFunction == DIF_FIRSTTIMESETUP) {
        NtGuiMode = TRUE;
        return 0;
    }

    if (InstallFunction == DIF_INSTALLDEVICE) {

        if (!Context->PostProcessing) {
            DebugPrint(( TEXT("FaxModemCoClassInstaller:  pre-installation, waiting for post-installation call") ));
            return ERROR_DI_POSTPROCESSING_REQUIRED;
        }

        if (Context->InstallResult != NO_ERROR) {
            DebugPrint(( TEXT("FaxModemCoClassInstaller:  previous error causing installation failure, 0x%08x"), Context->InstallResult ));
            return Context->InstallResult;
        }

        //
        // get the modem information
        //

        hKey = SetupDiOpenDevRegKey(
            DeviceInfoSet,
            DeviceInfoData,
            DICS_FLAG_GLOBAL,
            0,
            DIREG_DRV,
            KEY_READ
            );
        if (hKey == INVALID_HANDLE_VALUE) {
            DebugPrint(( TEXT("FaxModemCoClassInstaller:  SetupDiOpenDevRegKey failed") ));
            rVal = ERROR_GEN_FAILURE;
            goto fax_install_exit;
        }

        FriendlyName = GetRegistryString( hKey, TEXT("FriendlyName"), EMPTY_STRING );
        ModemAttachedTo = GetRegistryString( hKey, TEXT("AttachedTo"), EMPTY_STRING );

        RegCloseKey( hKey );

        //
        // open the com port that the modem is attached to
        //

        _stprintf( ComPortName, TEXT("\\\\.\\%s"), ModemAttachedTo );

        hFile = CreateFile(
            ComPortName,
            GENERIC_READ | GENERIC_WRITE,
            0,
            NULL,
            OPEN_EXISTING,
            0,
            NULL
            );
        if (hFile == INVALID_HANDLE_VALUE) {
            DebugPrint((
                TEXT("FaxModemCoClassInstaller:  could not open the com port for modem [%s][%s], ec=%d"),
                FriendlyName,
                ModemAttachedTo,
                GetLastError()
                ));
            rVal = ERROR_GEN_FAILURE;
            goto fax_install_exit;
        }

        //
        // get the fax class for the modem, zero is data only
        //

        if (GetModemClass( hFile ) == 0) {
            DebugPrint((
                TEXT("FaxModemCoClassInstaller:  modem is NOT a fax modem [%s][%s]"),
                FriendlyName,
                ModemAttachedTo
                ));
            CloseHandle( hFile );
            rVal = ERROR_GEN_FAILURE;
            goto fax_install_exit;
        }

        CloseHandle( hFile );

        //
        // the modem is a valid fax modem
        // ask the user if they want fax services
        //
 #if 0
        if (!NtGuiMode) {
            DlgErr = DialogBoxParam(
                FaxWizModuleHandle,
                MAKEINTRESOURCE(IDD_FAX_MODEM_INSTALL),
                NULL,
                FaxModemDlgProc,
                (LPARAM) 0
                );
            if (DlgErr == -1 || DlgErr == 0) {
                //
                // the user does not want fax services
                //
                DebugPrint((
                    TEXT("FaxModemCoClassInstaller:  user does not want fax service for modem [%s][%s]"),
                    FriendlyName,
                    ModemAttachedTo
                    ));
                goto fax_install_exit;
            }
        }
#endif
        if (!NtGuiMode) {
            //
            // create a fax printer
            //

            if (!CreateServerFaxPrinter( NULL, FAX_PRINTER_NAME )) {
                DebugPrint(( TEXT("CreateServerFaxPrinter() failed") ));
            }

            //
            // start the fax service
            //

            StartFaxService();

            //
            // create the program groups
            //

            CreateGroupItems( FALSE, NULL );
        }

fax_install_exit:

        MemFree( FriendlyName );
        MemFree( ModemAttachedTo );

        return rVal;
    }

    return NO_ERROR;
}