Ignore:
Timestamp:
Mar 27, 2007, 9:32:24 PM (18 years ago)
Author:
pr
Message:

Load UCONV and LIBUNI functions dynamically. Bug 936.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/helpers/nls.c

    r319 r349  
    2222
    2323/*
    24  *      Copyright (C) 1997-2006 Ulrich M”ller.
     24 *      Copyright (C) 1997-2007 Ulrich M”ller.
    2525 *      This file is part of the "XWorkplace helpers" source package.
    2626 *      This is free software; you can redistribute it and/or modify
     
    6464#pragma hdrstop
    6565
    66 #pragma library("LIBULS")
    67 #pragma library("LIBCONV")
     66// WarpIN V1.0.15 (2007-03-26) [pr]: @@fixes 936
     67// UCONV functions
     68int (* CALLCONV G_UniCreateUconvObject)(UniChar *code_set, UconvObject *uobj) = NULL;
     69int (* CALLCONV G_UniStrFromUcs)(UconvObject co, char *target, UniChar *source,
     70    int len) = NULL;
     71int (* CALLCONV G_UniFreeUconvObject)(UconvObject uobj) = NULL;
     72// LIBUNI functions
     73int (* CALLCONV G_UniCreateLocaleObject)(int locale_spec_type,
     74    const void *locale_spec, LocaleObject *locale_object_ptr) = NULL;
     75int (* CALLCONV G_UniQueryLocaleItem)(const LocaleObject locale_object,
     76    LocaleItem item, UniChar **info_item_addr_ptr) = NULL;
     77size_t (* CALLCONV G_UniStrlen)(const UniChar *ucs1) = NULL;
     78int (* CALLCONV G_UniFreeMem)(void *memory_ptr) = NULL;
     79int (* CALLCONV G_UniFreeLocaleObject)(LocaleObject locale_object) = NULL;
     80
     81/*
     82 * G_aResolveFromUCONV:
     83 *      functions resolved from UCONV.DLL.
     84 *      Used with doshResolveImports.
     85 */
     86
     87static const RESOLVEFUNCTION G_aResolveFromUCONV[] =
     88{
     89    "UniCreateUconvObject", (PFN*)&G_UniCreateUconvObject,
     90    "UniStrFromUcs", (PFN*)&G_UniStrFromUcs,
     91    "UniFreeUconvObject", (PFN*)&G_UniFreeUconvObject
     92};
     93
     94/*
     95 * G_aResolveFromLIBUNI:
     96 *      functions resolved from LIBUNI.DLL.
     97 *      Used with doshResolveImports.
     98 */
     99
     100static const RESOLVEFUNCTION G_aResolveFromLIBUNI[] =
     101{
     102    "UniCreateLocaleObject", (PFN*)&G_UniCreateLocaleObject,
     103    "UniQueryLocaleItem", (PFN*)&G_UniQueryLocaleItem,
     104    "UniStrlen", (PFN*)&G_UniStrlen,
     105    "UniFreeMem", (PFN*)&G_UniFreeMem,
     106    "UniFreeLocaleObject", (PFN*)&G_UniFreeLocaleObject
     107};
     108
     109static BOOL fUniResolved = FALSE, fUniOK = FALSE;
    68110
    69111/*
     
    380422 *@@changed V1.0.4 (2005-10-15) [pr]: Added support for Locale object settings on MCP systems @@fixes 614
    381423 *@@changed V1.0.5 (2006-05-29) [pr]: Read Country rather than Locale settings on Warp 4 FP13+ @@fixes 614
     424 *@@changed WarpIN V1.0.15 (2007-03-26) [pr]: Rewritten to load UCONV/LIBUNI functions dynamically @@fixes 936
    382425 */
    383426
    384427VOID nlsGetAMPM(PCOUNTRYAMPM pampm)
    385428{
    386     if (doshIsWarp4()==3)       // V1.0.5 (2006-05-29) [pr]
     429    if (   (doshIsWarp4()==3)
     430        && (!fUniResolved)
     431       )
     432    {
     433        HMODULE hmodUCONV = NULLHANDLE,
     434                hmodLIBUNI = NULLHANDLE;
     435
     436        fUniResolved = TRUE;
     437        if (   (doshResolveImports("UCONV.DLL",
     438                                   &hmodUCONV,
     439                                   G_aResolveFromUCONV,
     440                                   sizeof(G_aResolveFromUCONV) / sizeof(G_aResolveFromUCONV[0]))
     441                == NO_ERROR)
     442            && (doshResolveImports("LIBUNI.DLL",
     443                                   &hmodLIBUNI,
     444                                   G_aResolveFromLIBUNI,
     445                                   sizeof(G_aResolveFromLIBUNI) / sizeof(G_aResolveFromLIBUNI[0]))
     446                == NO_ERROR)
     447           )
     448            fUniOK = TRUE;
     449    }
     450
     451    if (   (doshIsWarp4()==3)   // V1.0.5 (2006-05-29) [pr]
     452        && fUniOK
     453       )
    387454    {
    388455        UconvObject         uconv_object;
    389456
    390         if (UniCreateUconvObject((UniChar *)L"",
    391                                  &uconv_object) == ULS_SUCCESS)
     457        if (G_UniCreateUconvObject((UniChar *)L"",
     458                                   &uconv_object) == ULS_SUCCESS)
    392459        {
    393460            LocaleObject locale_object;
    394461
    395             if (UniCreateLocaleObject(UNI_UCS_STRING_POINTER,
    396                                       (UniChar *)L"",
    397                                       &locale_object) == ULS_SUCCESS)
     462            if (G_UniCreateLocaleObject(UNI_UCS_STRING_POINTER,
     463                                        (UniChar *)L"",
     464                                        &locale_object) == ULS_SUCCESS)
    398465            {
    399466                int i;
     
    414481                    UniChar *pItem;
    415482
    416                     if (UniQueryLocaleItem(locale_object,
    417                                            itemList[i].lclItem,
    418                                            &pItem) == ULS_SUCCESS)
     483                    if (G_UniQueryLocaleItem(locale_object,
     484                                             itemList[i].lclItem,
     485                                             &pItem) == ULS_SUCCESS)
    419486                    {
    420                         int iLen = UniStrlen(pItem) + 1;
     487                        int iLen = G_UniStrlen(pItem) + 1;
    421488                        PSZ pszResult = malloc(iLen);
    422489
    423                         if (UniStrFromUcs(uconv_object,
    424                                           pszResult,
    425                                           pItem,
    426                                           iLen) == ULS_SUCCESS)
     490                        if (G_UniStrFromUcs(uconv_object,
     491                                            pszResult,
     492                                            pItem,
     493                                            iLen) == ULS_SUCCESS)
    427494                        {
    428495                            switch(itemList[i].iType)
     
    443510
    444511                        free(pszResult);
    445                         UniFreeMem(pItem);
     512                        G_UniFreeMem(pItem);
    446513                    }
    447514                }
    448515
    449                 UniFreeLocaleObject(locale_object);
     516                G_UniFreeLocaleObject(locale_object);
    450517            }
    451518
    452             UniFreeUconvObject(uconv_object);
     519            G_UniFreeUconvObject(uconv_object);
    453520        }
    454521    }
     
    493560 *@@changed V1.0.4 (2005-10-29) [pr]: Rewritten to prevent memory leaks and errors
    494561 *@@changed V1.0.5 (2006-05-29) [pr]: Read Country rather than Locale settings on Warp 4 FP13+ @@fixes 614
     562 *@@changed WarpIN V1.0.15 (2007-03-26) [pr]: Rewritten to load UCONV/LIBUNI functions dynamically @@fixes 936
    495563 */
    496564
     
    501569        PCOUNTRYSETTINGS pcs = &pcs2->cs;
    502570
    503         if (doshIsWarp4()==3)   // V1.0.5 (2006-05-29) [pr]
     571        if (   (doshIsWarp4()==3)
     572            && (!fUniResolved)
     573           )
     574        {
     575            HMODULE hmodUCONV = NULLHANDLE,
     576                    hmodLIBUNI = NULLHANDLE;
     577
     578            fUniResolved = TRUE;
     579            if (   (doshResolveImports("UCONV.DLL",
     580                                       &hmodUCONV,
     581                                       G_aResolveFromUCONV,
     582                                       sizeof(G_aResolveFromUCONV) / sizeof(G_aResolveFromUCONV[0]))
     583                    == NO_ERROR)
     584                && (doshResolveImports("LIBUNI.DLL",
     585                                       &hmodLIBUNI,
     586                                       G_aResolveFromLIBUNI,
     587                                       sizeof(G_aResolveFromLIBUNI) / sizeof(G_aResolveFromLIBUNI[0]))
     588                    == NO_ERROR)
     589               )
     590                fUniOK = TRUE;
     591        }
     592
     593        if (   (doshIsWarp4()==3)       // V1.0.5 (2006-05-29) [pr]
     594            && fUniOK
     595           )
    504596        {
    505597            UconvObject         uconv_object;
    506598
    507             if (UniCreateUconvObject((UniChar *)L"",
    508                                      &uconv_object) == ULS_SUCCESS)
     599            if (G_UniCreateUconvObject((UniChar *)L"",
     600                                       &uconv_object) == ULS_SUCCESS)
    509601            {
    510602                LocaleObject locale_object;
    511603
    512                 if (UniCreateLocaleObject(UNI_UCS_STRING_POINTER,
    513                                           (UniChar *)L"",
    514                                           &locale_object) == ULS_SUCCESS)
     604                if (G_UniCreateLocaleObject(UNI_UCS_STRING_POINTER,
     605                                            (UniChar *)L"",
     606                                            &locale_object) == ULS_SUCCESS)
    515607                {
    516608                    int i;
     
    535627                        UniChar *pItem;
    536628
    537                         if (UniQueryLocaleItem(locale_object,
    538                                                itemList[i].lclItem,
    539                                                &pItem) == ULS_SUCCESS)
     629                        if (G_UniQueryLocaleItem(locale_object,
     630                                                 itemList[i].lclItem,
     631                                                 &pItem) == ULS_SUCCESS)
    540632                        {
    541                             int iLen = UniStrlen(pItem) + 1;
     633                            int iLen = G_UniStrlen(pItem) + 1;
    542634                            PSZ pszResult = malloc(iLen);
    543635
    544                             if (UniStrFromUcs(uconv_object,
    545                                               pszResult,
    546                                               pItem,
    547                                               iLen) == ULS_SUCCESS)
     636                            if (G_UniStrFromUcs(uconv_object,
     637                                                pszResult,
     638                                                pItem,
     639                                                iLen) == ULS_SUCCESS)
    548640                            {
    549641                                switch(itemList[i].iType)
     
    564656
    565657                            free(pszResult);
    566                             UniFreeMem(pItem);
     658                            G_UniFreeMem(pItem);
    567659                        }
    568660                    }
    569661
    570                     UniFreeLocaleObject(locale_object);
     662                    G_UniFreeLocaleObject(locale_object);
    571663                }
    572664
    573                 UniFreeUconvObject(uconv_object);
     665                G_UniFreeUconvObject(uconv_object);
    574666            }
    575667        }
Note: See TracChangeset for help on using the changeset viewer.