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
  • branches/branch-1-0/src/helpers/nls.c

    r317 r349  
    2222
    2323/*
    24  *      Copyright (C) 1997-2002 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/*
     
    376418 *@@changed V1.0.4 (2005-10-29) [pr]: Rewritten to prevent memory leaks and errors
    377419 *@@changed V1.0.5 (2006-05-29) [pr]: Read Country rather than Locale settings on Warp 4 FP13+ @@fixes 614
     420 *@@changed WarpIN V1.0.15 (2007-03-26) [pr]: Rewritten to load UCONV/LIBUNI functions dynamically @@fixes 936
    378421 */
    379422
     
    382425    if (pcs)
    383426    {
    384         if (doshIsWarp4()==3)   // V1.0.5 (2006-05-29) [pr]
     427        if (   (doshIsWarp4()==3)
     428            && (!fUniResolved)
     429           )
     430        {
     431            HMODULE hmodUCONV = NULLHANDLE,
     432                    hmodLIBUNI = NULLHANDLE;
     433
     434            fUniResolved = TRUE;
     435            if (   (doshResolveImports("UCONV.DLL",
     436                                       &hmodUCONV,
     437                                       G_aResolveFromUCONV,
     438                                       sizeof(G_aResolveFromUCONV) / sizeof(G_aResolveFromUCONV[0]))
     439                    == NO_ERROR)
     440                && (doshResolveImports("LIBUNI.DLL",
     441                                       &hmodLIBUNI,
     442                                       G_aResolveFromLIBUNI,
     443                                       sizeof(G_aResolveFromLIBUNI) / sizeof(G_aResolveFromLIBUNI[0]))
     444                    == NO_ERROR)
     445               )
     446                fUniOK = TRUE;
     447        }
     448
     449        if (   (doshIsWarp4()==3)       // V1.0.5 (2006-05-29) [pr]
     450            && fUniOK
     451           )
    385452        {
    386453            UconvObject         uconv_object;
    387454
    388             if (UniCreateUconvObject((UniChar *)L"",
    389                                      &uconv_object) == ULS_SUCCESS)
     455            if (G_UniCreateUconvObject((UniChar *)L"",
     456                                       &uconv_object) == ULS_SUCCESS)
    390457            {
    391458                LocaleObject locale_object;
    392459
    393                 if (UniCreateLocaleObject(UNI_UCS_STRING_POINTER,
    394                                           (UniChar *)L"",
    395                                           &locale_object) == ULS_SUCCESS)
     460                if (G_UniCreateLocaleObject(UNI_UCS_STRING_POINTER,
     461                                            (UniChar *)L"",
     462                                            &locale_object) == ULS_SUCCESS)
    396463                {
    397464                    int i;
     
    416483                        UniChar *pItem;
    417484
    418                         if (UniQueryLocaleItem(locale_object,
    419                                                itemList[i].lclItem,
    420                                                &pItem) == ULS_SUCCESS)
     485                        if (G_UniQueryLocaleItem(locale_object,
     486                                                 itemList[i].lclItem,
     487                                                 &pItem) == ULS_SUCCESS)
    421488                        {
    422                             int iLen = UniStrlen(pItem) + 1;
     489                            int iLen = G_UniStrlen(pItem) + 1;
    423490                            PSZ pszResult = malloc(iLen);
    424491
    425                             if (UniStrFromUcs(uconv_object,
    426                                               pszResult,
    427                                               pItem,
    428                                               iLen) == ULS_SUCCESS)
     492                            if (G_UniStrFromUcs(uconv_object,
     493                                                pszResult,
     494                                                pItem,
     495                                                iLen) == ULS_SUCCESS)
    429496                            {
    430497                                switch(itemList[i].iType)
     
    441508
    442509                            free(pszResult);
    443                             UniFreeMem(pItem);
     510                            G_UniFreeMem(pItem);
    444511                        }
    445512                    }
    446513
    447                     UniFreeLocaleObject(locale_object);
     514                    G_UniFreeLocaleObject(locale_object);
    448515                }
    449516
    450                 UniFreeUconvObject(uconv_object);
     517                G_UniFreeUconvObject(uconv_object);
    451518            }
    452519        }
Note: See TracChangeset for help on using the changeset viewer.