/* File: D:\WACKER\tdll\translat.c (Created: 24-Aug-1994) * * Copyright 1994 by Hilgraeve Inc. -- Monroe, MI * All rights reserved * * $Revision: 8 $ * $Date: 7/08/02 6:50p $ */ #include #pragma hdrstop #include #include "features.h" #include "stdtyp.h" #if defined(CHARACTER_TRANSLATION) #include "mc.h" #include "translat.h" #include "session.h" #include "tdll.h" #include "htchar.h" #include "misc.h" // mscStripName() #include "translat.hh" /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * FUNCTION: * CreateTranslateHandle * * DESCRIPTION: * * ARGUMENTS: * * RETURNS: * */ HTRANSLATE CreateTranslateHandle(HSESSION hSession) { HHTRANSLATE hT = NULL; PST_TRANS_INT hI; size_t size; size = sizeof(ST_TRANSLATE); size += sizeof(ST_TRANS_INT); size += sizeof(LONG); hT = malloc(size); if (hT) { memset(hT, 0, size); hI = (PST_TRANS_INT)(hT + 1); hI->hSession = hSession; InitTranslateHandle((HTRANSLATE)hT, TRUE); } return (HTRANSLATE)hT; } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * FUNCTION: * * DESCRIPTION: * * ARGUEMENTS: * * RETURNS: * */ STATIC_FUNC int LoadTranslateDll(HTRANSLATE pH) { HHTRANSLATE pstH = (HHTRANSLATE)pH; PST_TRANS_INT hI; HANDLE sH = INVALID_HANDLE_VALUE; WIN32_FIND_DATA stF; TCHAR szFileName[MAX_PATH]; TCHAR szPath[MAX_PATH]; TCHAR *pDllName = TEXT("HTRN_*.DLL"); if (pstH == NULL) { assert(0); return -1; } hI = (PST_TRANS_INT)(pstH + 1); // // The translation DLL is not in the path, so check in the // module's directory. // GetModuleFileName((HINSTANCE)0, szFileName, MAX_PATH); GetFullPathName(szFileName, MAX_PATH, szPath, NULL); mscStripName(szPath); if (StrCharGetStrLength(szPath) + StrCharGetStrLength(pDllName) <= MAX_PATH) { StrCharCat(szPath, pDllName); sH = FindFirstFile(szPath, &stF); } // // The translation DLL is not in the module's directory, so see if // it is in the same location as the HyperTerminal executable (which // we extract from the registry). // if (sH == INVALID_HANDLE_VALUE) { DWORD dwSize = MAX_PATH; HKEY hKey; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\HyperTrm.exe"), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) { if (RegQueryValueEx(hKey, NULL, 0, 0, szFileName, &dwSize) == ERROR_SUCCESS) { if (szFileName[0] == TEXT('\"')) { StrCharCopyN(szPath, &szFileName[1], MAX_PATH); } else { StrCharCopyN(szPath, szFileName, MAX_PATH); } mscStripName(szPath); if (StrCharGetStrLength(szPath) + StrCharGetStrLength(pDllName) <= MAX_PATH) { StrCharCat(szPath, pDllName); sH = FindFirstFile(szPath, &stF); } } RegCloseKey(hKey); } } if (sH != INVALID_HANDLE_VALUE) { mscStripName(szPath); if (StrCharGetStrLength(szPath) + StrCharGetStrLength(stF.cFileName) <= MAX_PATH) { StrCharCat(szPath, stF.cFileName); hI->hInstance = LoadLibrary(szPath); if (hI->hInstance) { /* Load library succeeded */ (FARPROC)pstH->pfnCreate = GetProcAddress(hI->hInstance, TEXT("transCreateHandle")); /* Do we need to error check these things ? */ (FARPROC)pstH->pfnInit = GetProcAddress(hI->hInstance, TEXT("transInitHandle")); (FARPROC)pstH->pfnLoad = GetProcAddress(hI->hInstance, TEXT("transLoadHandle")); (FARPROC)pstH->pfnSave = GetProcAddress(hI->hInstance, TEXT("transSaveHandle")); (FARPROC)pstH->pfnDestroy = GetProcAddress(hI->hInstance, TEXT("transDestroyHandle")); (FARPROC)pstH->pfnDoDialog = GetProcAddress(hI->hInstance, TEXT("transDoDialog")); (FARPROC)pstH->pfnIn = GetProcAddress(hI->hInstance, TEXT("transCharIn")); (FARPROC)pstH->pfnOut = GetProcAddress(hI->hInstance, TEXT("transCharOut")); pstH->pfnIsDeviceLoaded = translateInternalTrue; } else { pstH->pfnCreate = translateInternalVoid; pstH->pfnInit = translateInternalFalse; pstH->pfnLoad = translateInternalFalse; pstH->pfnSave = translateInternalFalse; pstH->pfnDestroy = translateInternalFalse; pstH->pfnDoDialog = translateInternalDoDlg; pstH->pfnIn = translateInternalCio; pstH->pfnOut = translateInternalCio; pstH->pfnIsDeviceLoaded = translateInternalFalse; } } FindClose(sH); } if ((*pstH->pfnIsDeviceLoaded)(pstH->pDllHandle)) { /* TODO: create the new translation handle */ pstH->pDllHandle = (*pstH->pfnCreate)(hI->hSession); if (pstH->pDllHandle) { (*pstH->pfnInit)(pstH->pDllHandle); } } return 0; } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * FUNCTION: * InitTranslateHandle * * DESCRIPTION: * Returns the handle to a known state * * ARGUMENTS: * A translate handle * * RETURNS: * ZERO if everything is OK, otherwise a negative error code. * */ int InitTranslateHandle(HTRANSLATE pH, BOOL LoadDLL) { HHTRANSLATE pstH = (HHTRANSLATE)pH; PST_TRANS_INT hI; if (pstH == NULL) { assert(0); return -1; } hI = (PST_TRANS_INT)(pstH + 1); /* * Clean up the old function if necessary */ if (pstH->pfnIsDeviceLoaded) { /* Try not to call a NULL pointer */ if ((*pstH->pfnIsDeviceLoaded)(pstH->pDllHandle)) { /* Internally, we always return a FALSE */ if (pstH->pfnDestroy) { (*pstH->pfnDestroy)(pstH->pDllHandle); } hI = (PST_TRANS_INT)(pstH + 1); if (hI->hInstance) { FreeLibrary(hI->hInstance); } hI->hInstance = (HINSTANCE)0; } } /* * Initialize the function pointers */ pstH->pDllHandle = (VOID *)0; pstH->pfnCreate = translateInternalVoid; pstH->pfnInit = translateInternalFalse; pstH->pfnLoad = translateInternalFalse; pstH->pfnSave = translateInternalFalse; pstH->pfnDestroy = translateInternalFalse; pstH->pfnIsDeviceLoaded = translateInternalFalse; pstH->pfnDoDialog = translateInternalDoDlg; pstH->pfnIn = translateInternalCio; pstH->pfnOut = translateInternalCio; if (LoadDLL == TRUE) { LoadTranslateDll((HTRANSLATE)pstH); } return 0; } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * FUNCTION: * LoadTranslateHandle * * DESCRIPTION: * Chacks to see if an acceptable DLL is available and loads it if it is. * * ARGUMENTS: * * RETURNS: * */ int LoadTranslateHandle(HTRANSLATE pH) { HHTRANSLATE pstH = (HHTRANSLATE)pH; PST_TRANS_INT hI; if (pstH == NULL) { assert(0); return -1; } hI = (PST_TRANS_INT)(pstH + 1); if ((*pstH->pfnIsDeviceLoaded)(pstH->pDllHandle)) { /* TODO: create the new translation handle */ // pstH->pDllHandle = (*pstH->pfnCreate)(hI->hSession); if (pstH->pDllHandle) { // (*pstH->pfnInit)(pstH->pDllHandle); (*pstH->pfnLoad)(pstH->pDllHandle); } } return 0; } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * FUNCTION: * * DESCRIPTION: * * ARGUMENTS: * * RETURNS: * */ int SaveTranslateHandle(HTRANSLATE pH) { HHTRANSLATE pstH = (HHTRANSLATE)pH; if (pstH == NULL) { assert(0); return -1; } if ((*pstH->pfnIsDeviceLoaded)(pstH->pDllHandle)) { if (pstH->pDllHandle) { (*pstH->pfnSave)(pstH->pDllHandle); } } return 0; } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * FUNCTION: * * DESCRIPTION: * * ARGUMENTS: * * RETURNS: * */ int DestroyTranslateHandle(HTRANSLATE pH) { HHTRANSLATE pstH = (HHTRANSLATE)pH; if (pstH == NULL) { assert(0); return -1; } /* Set everything back to a known state */ InitTranslateHandle(pH, FALSE); // // Don't forget to destroy the translate handle so we don't // have a memory leak. REV: 03/20/2001. // if (pstH->pfnDestroy) { (*pstH->pfnDestroy)(pstH->pDllHandle); } free(pstH); pstH = NULL; pH = NULL; return 0; } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * FUNCTION: * * DESCRIPTION: * * ARGUMENTS: * * RETURNS: * */ static int translateInternalDoDlg(HWND hWnd, VOID *pV) { return FALSE; } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * FUNCTION: * translateInternalFalse * translateInternalTrue * * DESCRIPTION: * Dummy fill in routines that return a constant * * ARGUMENTS: * pV -- an unused DLL translation handle (probably a NULL) * * RETURNS: * Either TRUE or FALSE, depending. * */ static int translateInternalFalse(VOID *pV) { return FALSE; } static int translateInternalTrue(VOID *pV) { return TRUE; } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * FUNCTION: * translateInternalVoid * * DESCRIPTION: * A dummy stub to fill in for a handle creation routine * * ARGUMENTS: * hSession -- the ever popular session handle * * RETURNS: * Always returns a NULL pointer * */ static VOID *translateInternalVoid(HSESSION hSession) { return (VOID *)0; } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * FUNCTION: * translateInternalCio * * DESCRIPTION: * Internal character in and character out function. This is simply a * loopback function that is used as a dummy function if the translation * DLL is not available. It is used as the default in the initialized * but not loaded structure. * * ARGUMENTS: * pV -- handle to the translation DLL (nothing in this case) * cC -- the character to be translated * nR -- the number of characters returned (returned to caller) * nS -- maximum number of characters that can be returned * pC -- where to return the returned characters * * RETURNS: * ZERO if everything is OK, otherwise a negative error code * */ static int translateInternalCio(VOID *pV, TCHAR cC, int *nR, int nS, TCHAR *pC) { if (nS > 0) { *nR = 1; *pC = cC; return 0; } return (-1); } #endif