/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- * * The contents of this file are subject to the Netscape Public License * Version 1.0 (the "NPL"); you may not use this file except in * compliance with the NPL. You may obtain a copy of the NPL at * http://www.mozilla.org/NPL/ * * Software distributed under the NPL is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL * for the specific language governing rights and limitations under the * NPL. * * The Initial Developer of this code under the NPL is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1998 Netscape Communications Corporation. All Rights * Reserved. */ #include "stdafx.h" #include "mainfrm.h" #include "libi18n.h" #include "xplocale.h" #include "cxprint.h" #include "cxsave.h" #include "np.h" #include "prlog.h" #include "prlink.h" #include "xpstrsw.h" #if defined(OJI) #include "jvmmgr.h" #elif defined(JAVA) #include "java.h" #endif #include "cuvfs.h" #include "intl_csi.h" #include "edt.h" #include "prefapi.h" #include "edt.h" #define SIMULATE_WIN95_ON_NT true #ifdef SIMULATE_WIN95_ON_NT #define IsRunningOnNT FALSE #else #define IsRunningOnNT sysInfo.m_bWinNT #endif #ifdef XP_WIN32 static BOOL intlUnicodeFlag(int16 wincsid); #define INIT_FLAG_FOR_CSID(c) { CIntlWin::flagTable[(c) & MASK_FLAG_TABLE] = intlUnicodeFlag(c);} BOOL CIntlWin::flagTable[MAX_FLAG_TABLE_NUM]; #endif // XP_WIN32 extern int INTL_DocCharSetID(MWContext *context); enum { // just to ignore unnecessary strcomp javaFontHelvetica = 0, javaFontTimesRoman, javaFontCourier, javaFontDialog, javaFontDialogInput, javaFontZapfDingbats }; extern "C" { const char* IntlGetJavaFaceName(int csid, int javaFontID); BYTE IntlGetJavaCharset(int csid, int javaFontID); jref *intl_makeJavaString(int16 encoding, char *str, int len); }; extern "C" { PR_PUBLIC_API(BOOL ) CINTLWIN_TEXTOUT_E(int16 wincsid, HDC hdc, int nXStart, int nYStart, LPCSTR lpString,int iLength); PR_PUBLIC_API(BOOL ) CINTLWIN_GETTEXTEXTENTPOINT_E(int wincsid, HDC hDC, LPCSTR lpString, int cbString, LPSIZE lpSize); PR_PUBLIC_API(const char*) INTLGETJAVAFACENAME_E(int csid, int javaFontID); PR_PUBLIC_API(BYTE ) INTLGETJAVACHARSET_E(int csid, int javaFontID); #ifdef JAVA PR_PUBLIC_API(jref* ) INTL_MAKEJAVASTRING_E(int16 encoding, char *str, int len); #endif // JAVA PR_PUBLIC_API(int16* ) INTL_GETUNICODECSIDLIST_E(int16 * outnum); PR_PUBLIC_API(int32 ) INTL_UNICODELEN_E(uint16* ustr); PR_PUBLIC_API(INTL_CompoundStr* ) INTL_COMPOUNDSTRFROMUNICODE_E(uint16* inunicode, uint32 inlen); PR_PUBLIC_API(void ) INTL_COMPOUNDSTRDESTROY_E(INTL_CompoundStr* This); PR_PUBLIC_API(INTL_CompoundStrIterator ) INTL_COMPOUNDSTRFIRSTSTR_E(INTL_CompoundStr* This, INTL_Encoding_ID *outencoding, unsigned char** outtext); PR_PUBLIC_API(INTL_CompoundStrIterator ) INTL_COMPOUNDSTRNEXTSTR_E(INTL_CompoundStrIterator iterator, INTL_Encoding_ID *outencoding, unsigned char** outtext); PR_PUBLIC_API(INTL_CompoundStr* ) INTL_COMPOUNDSTRCLONE_E(INTL_CompoundStr* s1); PR_PUBLIC_API(int16 ) INTL_DEFAULTWINCHARSETID_E(MWContext *context); PR_PUBLIC_API(int32 ) INTL_TEXTBYTECOUNTTOCHARLEN_E(int16 csid, unsigned char* text, uint32 byteCount); PR_PUBLIC_API(int32 ) INTL_TEXTCHARLENTOBYTECOUNT_E(int16 csid, unsigned char* text, uint32 charLen); PR_PUBLIC_API(uint32 ) INTL_UNICODETOSTRLEN_E(INTL_Encoding_ID encoding,INTL_Unicode* ustr, uint32 ustrlen); PR_PUBLIC_API(void ) INTL_UNICODETOSTR_E(INTL_Encoding_ID encoding,INTL_Unicode* ustr,uint32 ustrlen,unsigned char* dest, uint32 destbuflen); }; // // Data type use for Unicode table loader // #define MAXUTABLENAME 16 typedef struct tblrsrcinfo { char name[MAXUTABLENAME]; uint16 refcount; HGLOBAL hTbl; } tblrsrcinfo; typedef struct utablename { uint16 csid; tblrsrcinfo frominfo; tblrsrcinfo toinfo; } utablename; // // The following are private // static void intl_WriteUnicodeConvList(int num_of_csid, int16* csidlist); static void intl_ReadUnicodeConvList(); static void intl_UnloadUCS2Table(uint16 csid, void *utblPtr, int from); static tblrsrcinfo* intl_FindUTableName(uint16 csid, int from); static void *intl_LoadUCS2Table(uint16 csid, int from); static void intl_UnloadUCS2Table(uint16 csid, void *utblPtr, int from); // This structure is used for following table for default font value, // It'll be removed after default value goes to resource file. struct FontCharTable { int16 csid; char szPropFont[LF_FACESIZE] ; int iPropSize ; char szFixFont[LF_FACESIZE] ; int iFixSize ; int iPropCharset; int iFixCharset; }; // Note: always add new comer to last line. struct FontCharTable fontchar_tbl[] = { CS_LATIN1, DEF_PROPORTIONAL_FONT, 12, DEF_FIXED_FONT, 10, ANSI_CHARSET, ANSI_CHARSET, CS_SJIS, "‚l‚r –¾’©", 10, "‚l‚r –¾’©", 10, SHIFTJIS_CHARSET, SHIFTJIS_CHARSET, CS_BIG5, "Times New Roman", 12, "Courier New", 10, CHINESEBIG5_CHARSET, CHINESEBIG5_CHARSET, CS_KSC_8BIT,"Times New Roman", 12, "Courier New", 10, HANGEUL_CHARSET, HANGEUL_CHARSET, CS_GB_8BIT, "Times New Roman", 12, "Courier New", 10, 134, 134, CS_CP_1250, "Times New Roman", 12, "Courier New", 10, 238,238, CS_CP_1251, "Times New Roman", 12, "Courier New", 10, 204,204, CS_ARMSCII8, "ArmNet Helvetica", 12, "ArmNet Courier", 10, 160, 160, CS_CP_1253, "Times New Roman", 12, "Courier New", 10, 161,161, CS_8859_9, "Times New Roman", 12, "Courier New", 10, 162,162, CS_VIET_VIQR, "Times New Roman", 12, "Courier New", 10, 163,163, CS_VIET_VISCII, "ÁnhMinh 1.1", 12, "MinhQuân 1.1", 10, 163,163, CS_VIET_VPS, "VPS Times", 12, "VPS Courier", 10, 163,163, CS_VIET_TCVN, ".VNTime", 12, ".VNTime", 10, 163,163, CS_VIET_VNI, "VNI-Times", 12, "VNI-Times", 10, 163,163, CS_TIS620, "AngsanaUPC", 16, "CordiaUPC", 14, THAI_CHARSET, THAI_CHARSET, CS_UTF8, DEF_PROPORTIONAL_FONT, 12, DEF_FIXED_FONT, 10, DEFAULT_CHARSET, DEFAULT_CHARSET, CS_USER_DEFINED_ENCODING, DEF_PROPORTIONAL_FONT, 12, DEF_FIXED_FONT, 10, ANSI_CHARSET, ANSI_CHARSET, 0, "", 0, "", 0, 0, 0 } ; // This table defined how many encoding we supports in our Navigator and // what kind of conversion we support for each encoding. // Note: always add new comer to last line. // Encoding, Encoding used for Display, supported CSID list, 0 unsigned int lang_table[] = { IDS_LANGUAGE_LATIN1, CS_LATIN1, CS_LATIN1, 0, IDS_LANGUAGE_LATIN2, CS_CP_1250, CS_CP_1250, CS_LATIN2, 0, IDS_LANGUAGE_JAPANESE, CS_SJIS, CS_AUTO | CS_SJIS, CS_SJIS, CS_JIS, CS_EUCJP, 0, IDS_LANGUAGE_TAIWANESE, CS_BIG5, CS_BIG5, CS_CNS_8BIT, CS_X_BIG5, 0, IDS_LANGUAGE_CHINESE, CS_GB_8BIT, CS_GB_8BIT, CS_GB2312, CS_GB2312_11, CS_HZ, 0, IDS_LANGUAGE_KOREAN, CS_KSC_8BIT, CS_KSC_8BIT | CS_AUTO, CS_KSC_8BIT, CS_2022_KR, CS_KSC5601, 0, IDS_LANGUAGE_WIN1251, CS_CP_1251, CS_CP_1251, CS_8859_5, CS_KOI8_R, 0, IDS_LANGUAGE_ARMENIAN, CS_ARMSCII8, CS_ARMSCII8, 0, IDS_LANGUAGE_GREEK, CS_CP_1253, CS_CP_1253, CS_8859_7, 0, IDS_LANGUAGE_TURKISH, CS_8859_9, CS_8859_9, 0, IDS_LANGUAGE_VIETNAMESE_VIQR, CS_VIET_VIQR, CS_VIET_VIQR, CS_VIET_VISCII, CS_VIET_VPS, CS_VIET_TCVN, CS_VIET_VNI, 0, IDS_LANGUAGE_VIETNAMESE_VISCII, CS_VIET_VISCII, CS_VIET_VISCII, CS_VIET_VPS, CS_VIET_TCVN, CS_VIET_VIQR, CS_VIET_VNI, 0, IDS_LANGUAGE_VIETNAMESE_VPS, CS_VIET_VPS, CS_VIET_VPS, CS_VIET_VISCII, CS_VIET_TCVN, CS_VIET_VIQR, CS_VIET_VNI, 0, IDS_LANGUAGE_VIETNAMESE_TCVN, CS_VIET_TCVN, CS_VIET_TCVN, CS_VIET_VISCII, CS_VIET_VPS, CS_VIET_VIQR, CS_VIET_VNI, 0, IDS_LANGUAGE_VIETNAMESE_VNI, CS_VIET_VNI, CS_VIET_TCVN, CS_VIET_VISCII, CS_VIET_VPS, CS_VIET_VIQR, CS_VIET_VNI, 0, IDS_LANGUAGE_THAI, CS_TIS620, CS_TIS620, 0, IDS_LANGUAGE_UTF8, CS_UTF8, CS_UTF8, CS_UTF7, CS_UCS2, CS_UCS2_SWAP, CS_T61, 0, IDS_LANGUAGE_USERDEFINED, CS_USER_DEFINED_ENCODING, CS_USER_DEFINED_ENCODING, 0, UINT_MAX }; CIntlFont::CIntlFont() { CString fontList; LPSTR lpszPropName = NULL; LPSTR lpszFixName = NULL; int32 iPropSize, iFixSize ; int iPropCharset, iFixCharset; BOOL ret = FALSE; int i ; int nLang ; EncodingInfo *pEncoding; iPropCharset = iFixCharset = 0; #ifdef XP_WIN32 for(int j = 0; j < MAX_FLAG_TABLE_NUM; j++) INIT_FLAG_FOR_CSID(j); #endif pEncodingInfoTbl = (struct EncodingInfo *) malloc( (MAXLANGNUM + 1) * sizeof (struct EncodingInfo) ) ; if (pEncodingInfoTbl == NULL) { TRACE("No memory for MultiLingual support.\n"); return ; } memset(pEncodingInfoTbl, 0, (MAXLANGNUM + 1) * sizeof(struct EncodingInfo)); nLang = 0; pEncoding = pEncodingInfoTbl; for (i = 0; (lang_table[i] != UINT_MAX) && (nLang < MAXLANGNUM); i++) { pEncoding->iLangResId = lang_table[i++]; pEncoding->iCSID = lang_table[i++]; // Setup default font information. for (int j = 0; j < MAXLANGNUM; j++) { if (fontchar_tbl[j].csid == pEncoding->iCSID) { // First, lets try to copy from the hard coded table strcpy(pEncoding->szPropName, fontchar_tbl[j].szPropFont); pEncoding->iPropSize = fontchar_tbl[j].iPropSize; strcpy(pEncoding->szFixName, fontchar_tbl[j].szFixFont); pEncoding->iFixSize = fontchar_tbl[j].iFixSize; pEncoding->iPropCharset = fontchar_tbl[j].iPropCharset; pEncoding->iFixCharset = fontchar_tbl[j].iFixCharset; } } char key[80]; // Now, let's try to get it from the PREF sprintf(key, "intl.font%d.win.prop_font", pEncoding->iCSID); lpszPropName = NULL; if( PREF_NOERROR == PREF_CopyCharPref(key, &lpszPropName)) { strcpy(pEncoding->szPropName, lpszPropName); XP_FREE(lpszPropName); } sprintf(key, "intl.font%d.win.fixed_font", pEncoding->iCSID); lpszFixName = NULL; if( PREF_NOERROR == PREF_CopyCharPref(key, &lpszFixName)) { strcpy(pEncoding->szFixName, lpszFixName); XP_FREE(lpszFixName); } sprintf(key, "intl.font%d.win.prop_size", pEncoding->iCSID); if( PREF_NOERROR == PREF_GetIntPref(key, &iPropSize)) pEncoding->iPropSize = (int)iPropSize; sprintf(key, "intl.font%d.win.fixed_size", pEncoding->iCSID); if( PREF_NOERROR == PREF_GetIntPref(key, &iFixSize)) pEncoding->iFixSize = (int)iFixSize; // Setup supported CSID list for (j =0; lang_table[i]; j++) { pEncoding->csid[j] = lang_table[i++] ; #ifdef XP_WIN32 INIT_FLAG_FOR_CSID(pEncoding->csid[j]); #endif } pEncoding->nCodeset = j; nLang ++ ; pEncoding ++ ; } nEncoding = MAXLANGNUM; intl_ReadUnicodeConvList(); } EncodingInfo * CIntlFont::GetEncodingInfo(int id) { if (id < nEncoding) return &pEncodingInfoTbl[id]; else return NULL; } EncodingInfo * CIntlFont::GetEncodingInfo(MWContext *pContext) { int doc_csid, id; doc_csid = INTL_DocCharSetID(pContext) & ~CS_AUTO ; id = DocCSIDtoID(doc_csid); return GetEncodingInfo(id); } int16 IntlCharsetToCsid(BYTE charset) { int i; for (i = 0; i < MAXLANGNUM; i++) { EncodingInfo *pEncoding = theApp.m_pIntlFont->GetEncodingInfo(i); if (charset == pEncoding->iPropCharset) return (pEncoding->iCSID & ~CS_AUTO); } return CS_LATIN1; } int CIntlFont::DocCSIDtoID(int doc_csid) { int i, j; EncodingInfo *pEncoding ; /**************************************************************/ /*** This section should work for everybody, but for now we ***/ /*** make it work for vietnamese only (our area). Basically ***/ /*** instead of returning the first csid found in doc_csid, ***/ /*** we check the default view encoding first, and return ***/ /*** that default view csid if found, otherwise it will ***/ /*** return the value as the usual way ***/ int k; int16 def_doccsid; def_doccsid = INTL_DefaultDocCharSetID(0); if (! ((def_doccsid == CS_VIET_VISCII) || (def_doccsid == CS_VIET_VPS) || (def_doccsid == CS_VIET_TCVN) || (def_doccsid == CS_VIET_VNI) || (def_doccsid == CS_VIET_VIQR) )) { def_doccsid = 0; } k = 0; pEncoding = &pEncodingInfoTbl[0]; for (i = 0; i < nEncoding; i++) { for (j = 0; j < pEncoding->nCodeset; j++) { if (doc_csid == pEncoding->csid[j]) { if ((def_doccsid == 0) || (def_doccsid == pEncoding->iCSID)) return i ; if (k == 0) k = i; } } pEncoding ++ ; } // Note!!!: return 0 here is not good idea, but it can avoid crash. // need to revisit this code later. return k; } char * CIntlFont::GetEncodingName(int id) { if (id < nEncoding) return szLoadString(pEncodingInfoTbl[id].iLangResId); else // Never should come here return "Unknown"; } void CIntlFont::WriteToIniFile() { EncodingInfo *pEncoding; pEncoding = &pEncodingInfoTbl[0]; for (int i = 0; i < MAXLANGNUM; i++) { char key[80]; sprintf(key, "intl.font%d.win.prop_font", pEncoding->iCSID); PREF_SetCharPref(key, pEncoding->szPropName); sprintf(key, "intl.font%d.win.fixed_font", pEncoding->iCSID); PREF_SetCharPref(key, pEncoding->szFixName); sprintf(key, "intl.font%d.win.prop_size", pEncoding->iCSID); PREF_SetIntPref(key, (int32)pEncoding->iPropSize); sprintf(key, "intl.font%d.win.fixed_size", pEncoding->iCSID); PREF_SetIntPref(key, (int32)pEncoding->iFixSize); pEncoding ++ ; } } BYTE IntlGetLfCharset(int csid) { int id; if (csid == 0) csid = INTL_DefaultWinCharSetID(0); csid = csid & ~CS_AUTO; // mask off AUTO bit if (csid == 0 || csid == CS_LATIN1 || csid == CS_UNKNOWN) return ANSI_CHARSET; id = theApp.m_pIntlFont->DocCSIDtoID(csid); EncodingInfo *pEncoding = theApp.m_pIntlFont->GetEncodingInfo(id); return pEncoding->iPropCharset; } const char *IntlGetUIFixFaceName(int csid) { int id ; if (csid == 0) csid = INTL_DefaultWinCharSetID(0); csid = csid & ~CS_AUTO; // mask off AUTO bit id = theApp.m_pIntlFont->DocCSIDtoID(csid); EncodingInfo *pEncoding = theApp.m_pIntlFont->GetEncodingInfo(id); return pEncoding->szFixName; } const char *IntlGetUIPropFaceName(int csid) { int id ; if (csid == 0) csid = INTL_DefaultWinCharSetID(0); csid = csid & ~CS_AUTO; // mask off AUTO bit id = theApp.m_pIntlFont->DocCSIDtoID(csid); EncodingInfo *pEncoding = theApp.m_pIntlFont->GetEncodingInfo(id); return pEncoding->szPropName; } //------------------------------------------------------------ // Function called from cross-platform code //------------------------------------------------------------ extern "C" int FE_StrColl(const char* s1, const char* s2) { return lstrcmp(s1, s2); } extern "C" size_t FE_StrfTime(MWContext *context, char *result, size_t maxsize, int format, const struct tm *timeptr) { #ifdef XP_WIN16 switch(format) { case XP_TIME_FORMAT: return strftime (result, maxsize, "%H:%M", timeptr); case XP_WEEKDAY_TIME_FORMAT: return strftime (result, maxsize, "%a %H:%M", timeptr); case XP_DATE_TIME_FORMAT: return strftime (result, maxsize, "%x %H:%M", timeptr); case XP_LONG_DATE_TIME_FORMAT: return strftime (result, maxsize, "%c", timeptr); default: result[0] = '\0'; return 0; } #else int wincsid = INTL_DefaultWinCharSetID(context); LANGID langid; langid = GetSystemDefaultLangID(); if ((wincsid & MULTIBYTE) && sysInfo.m_bDBCS && !((GetSystemDefaultLangID() == 0x0411 && wincsid == CS_SJIS) || (GetSystemDefaultLangID() == 0x0412 && wincsid == CS_KSC_8BIT) || (GetSystemDefaultLangID() == 0x0812 && wincsid == CS_KSC_8BIT) || (GetSystemDefaultLangID() == 0x0804 && wincsid == CS_GB_8BIT) || (GetSystemDefaultLangID() == 0x1004 && wincsid == CS_GB_8BIT) || (GetSystemDefaultLangID() == 0x0C04 && wincsid == CS_BIG5) || (GetSystemDefaultLangID() == 0x0404 && wincsid == CS_BIG5))) { // In multibyte, if system doesn't match with current win_csid switch(format) { case XP_TIME_FORMAT: return strftime (result, maxsize, "%H:%M", timeptr); case XP_WEEKDAY_TIME_FORMAT: return strftime (result, maxsize, "%a %H:%M", timeptr); case XP_DATE_TIME_FORMAT: return strftime (result, maxsize, "%x %H:%M", timeptr); case XP_LONG_DATE_TIME_FORMAT: return strftime (result, maxsize, "%c", timeptr); default: result[0] = '\0'; return 0; } } else { SYSTEMTIME daytime; int n, m; daytime.wYear = 1900 + timeptr->tm_year; daytime.wMonth = timeptr->tm_mon + 1; daytime.wDayOfWeek = timeptr->tm_wday; daytime.wDay = timeptr->tm_mday; daytime.wHour = timeptr->tm_hour; daytime.wMinute = timeptr->tm_min; daytime.wSecond = timeptr->tm_sec; daytime.wMilliseconds = 0; *result = '\0'; switch(format) { case XP_TIME_FORMAT: // return strftime (result, maxsize, "%X", timeptr); if (n = GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &daytime, NULL, result, maxsize)) return n; else return strftime (result, maxsize, "%H:%M", timeptr); case XP_WEEKDAY_TIME_FORMAT: // return strftime (result, maxsize, "%a %X", timeptr); if (GetDateFormat(LOCALE_USER_DEFAULT,0,&daytime,"ddd ", result, maxsize)) { n = strlen(result); if (m = GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &daytime, NULL, result+n, maxsize-n)) return n + m; else return strftime (result, maxsize, "%a %H:%M", timeptr); } else return strftime (result, maxsize, "%a %H:%M", timeptr); case XP_DATE_TIME_FORMAT: // return strftime (result, maxsize, "%x %X", timeptr); if (GetDateFormat(LOCALE_USER_DEFAULT,DATE_SHORTDATE, &daytime,NULL, result, maxsize)) { n = strlen(result); result[n++] = ' '; if (m = GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &daytime, NULL, result+n, maxsize-n)) return m + n; else return strftime (result, maxsize, "%x %H:%M", timeptr); } else return strftime (result, maxsize, "%x %H:%M", timeptr); case XP_LONG_DATE_TIME_FORMAT: // return strftime (result, maxsize, "%x %X", timeptr); if (GetDateFormat(LOCALE_USER_DEFAULT,DATE_LONGDATE, &daytime,NULL, result, maxsize)) { n = strlen(result); result[n++] = ' '; if (m = GetTimeFormat(LOCALE_USER_DEFAULT, 0, &daytime, NULL, result+n, maxsize-n)) return m + n; else return strftime (result, maxsize, "%x %H:%M", timeptr); } else return strftime (result, maxsize, "%x %H:%M", timeptr); default: result[0] = '\0'; return 0; } } #endif } CXPResSwitcher g_xpResSwitcher; /* XP_GetString * * This one takes XP string ID (which is used mainly by libnet, libsec) * and loads String from resource file (netscape.rc3). */ extern "C" char *XP_GetString(int id) { int16 resid; resid = id + 7000; char *buf = szLoadString(resid, &g_xpResSwitcher); return buf; } /* INTL_DocCharSetID and INTL_DefaultDocCharSetID getting closer and closer For 2.1, we need to remove one of them. */ int INTL_DocCharSetID(MWContext *context) { int doccsid; if (context == NULL) return theApp.m_iCSID; else if (doccsid = INTL_GetCSIDocCSID(LO_GetDocumentCharacterSetInfo(context))) return doccsid; #ifndef MOZ_NGLAYOUT else if (context->type == MWContextPrint && ((CPrintCX *)((context)->fe.cx))->m_iCSID) return ((CPrintCX *)((context)->fe.cx))->m_iCSID; #endif else if (GetFrame(context) && GetFrame(context)->m_iCSID) return GetFrame(context)->m_iCSID; else return theApp.m_iCSID; } /* This routine will retrieve default URL charset Id from conversion engine. */ extern int16 INTL_DefaultDocCharSetID(MWContext * context) { int doccsid; if (context == NULL) return theApp.m_iCSID; else if (doccsid = INTL_GetCSIDocCSID(LO_GetDocumentCharacterSetInfo(context))) return doccsid; #ifndef MOZ_NGLAYOUT else if (context->type == MWContextPrint && ((CPrintCX *)((context)->fe.cx))->m_iCSID) return ((CPrintCX *)((context)->fe.cx))->m_iCSID; #endif else if (context->type == MWContextSaveToDisk && ((CSaveCX*)((context)->fe.cx))->m_iCSID) return ((CSaveCX *)((context)->fe.cx))->m_iCSID; else if (GetFrame(context) && ((CMainFrame *)GetFrame(context))->m_iCSID) return ((CMainFrame *)GetFrame(context))->m_iCSID; else return theApp.m_iCSID; } extern "C" uint16 FE_DefaultDocCharSetID(MWContext * context) { if (context == NULL) return theApp.m_iCSID; #ifndef MOZ_NGLAYOUT else if (context->type == MWContextPrint && ((CPrintCX *)((context)->fe.cx))->m_iCSID) return ((CPrintCX *)((context)->fe.cx))->m_iCSID; #endif else if (context->type == MWContextSaveToDisk && ((CSaveCX*)((context)->fe.cx))->m_iCSID) return ((CSaveCX *)((context)->fe.cx))->m_iCSID; else if (GetFrame(context) && ((CMainFrame *)GetFrame(context))->m_iCSID) return ((CMainFrame *)GetFrame(context))->m_iCSID; else return theApp.m_iCSID; } /* This routine will relayout current document. It's called from xp rountine to do CharSet conversion based on new doc_csid found from */ extern void INTL_Relayout(MWContext * pContext) { if(pContext == NULL || ABSTRACTCX(pContext) == NULL || ABSTRACTCX(pContext)->IsDestroyed()) { // Don't allow this to happen if the context has been destroyed... return; } // Let the page load, so that it is in the cache (bug fix 51701) // or will get a page that is partially "transfer interrupted" // if just doing a Reload() as that part of the page is // possibly already cached before the entire page is downloaded // leading to lossy display. // Another way to do this is to ignore the cache altogether for a // more immediate effect: Reload(NET_SUPER_RELOAD) // but that is not nice to the cache, or the user if working // offline, etc. #if 0 //#ifdef EDITOR if(EDT_IS_EDITOR(pContext)){ EDT_RefreshLayout(pContext); } else #endif ABSTRACTCX(pContext)->NiceReload(); } /* See information in Unicode Functions Supported by Windows 95 PSS ID Number: Q125671 */ int CIntlWin::m_iConvBufSize = 0; #ifdef XP_WIN32 LPWSTR CIntlWin::m_wConvBuf = NULL; #endif BOOL CIntlWin::FontSelectIgnorePitch(int16 wincsid) { return ( (wincsid & MULTIBYTE) || (CS_TIS620 == wincsid ) || (CS_ARMSCII8 == wincsid ) ); } BOOL CIntlWin::FontSelectIgnoreCharset(int16 wincsid) { return ( UseUnicodeFontAPI(wincsid) || ( CS_USER_DEFINED_ENCODING == wincsid) ); } BOOL CIntlWin::AllocConvBuffer(int iLength) { #ifdef WIN32 if (m_iConvBufSize == 0) { if (iLength < 1024) iLength = 1024; m_wConvBuf = (WCHAR *)malloc(iLength); m_iConvBufSize = iLength; } else { m_wConvBuf = (WCHAR *) realloc(m_wConvBuf, iLength); m_iConvBufSize = iLength; } #endif return TRUE; } int16 CIntlWin::m_system_locale_csid = 0; int16 CIntlWin::GetSystemLocaleCsid() { if( 0 == m_system_locale_csid ) { #ifdef XP_WIN32 m_system_locale_csid = CodePageToCsid(GetACP()); #else m_system_locale_csid = CodePageToCsid(GetKBCodePage()); // In Win3.1 We cannot call GetACP(), we can just call GetKBCodePage() #endif } if( 0 == m_system_locale_csid ) // if still cannot find the csid, Fall back to Latin 1 { m_system_locale_csid = CS_LATIN1; } return m_system_locale_csid; } int16 CIntlWin::CodePageToCsid(UINT cp) { switch(cp) { case 1250: case 852: // MS-DOS Slavic OEM in the case of Win16 GetKBCodePage return CS_CP_1250; case 1251: case 855: // IBM Cyrillic OEM in the case of Win16 GetKBCodePage case 866: // MS-DOS Russian OEM in the case of Win16 GetKBCodePage return CS_CP_1251; case 1252: case 437: // US OEM in the case of Win16 GetKBCodePage case 850: // MS-DOS Multilingual OEM in the case of Win16 GetKBCodePage case 860: // MS-DOS Portutuese OEM in the case of Win16 GetKBCodePage case 861: // MS-DOS Icelandic OEM in the case of Win16 GetKBCodePage case 863: // MS-DOS Canadian-French OEM in the case of Win16 GetKBCodePage case 865: // MS-DOS Nordic OEM in the case of Win16 GetKBCodePage return CS_LATIN1; case 1253: case 737: // Greek OEM in the case of Win16 GetKBCodePage case 869: // IBM Modern Greek OEM in the case of Win16 GetKBCodePage return CS_CP_1253; case 1254: case 857: // IBM Turkish OEM in the case of Win16 GetKBCodePage return CS_CP_1254; // CS_CP_1254; case 1255: return CS_UNKNOWN; // CS_CP_1255; case 1256: return CS_UNKNOWN; // CS_CP_1256; case 775: // Baltic OEM in the case of Win16 GetKBCodePage case 1257: return CS_UNKNOWN; // CS_CP_1257; case 932: return CS_SJIS; case 936: return CS_GB_8BIT; case 949: case 1361: // Korean (Johab) OEM in the case of Win16 GetKBCodePage return CS_KSC_8BIT; case 950: return CS_BIG5; case 874: return CS_TIS620; default: return CS_UNKNOWN; } } int CIntlWin::MultiByteToWideChar(int16 wincsid, LPCSTR lpMultiByte, int iLength) { if((lpMultiByte == NULL) || (lpMultiByte[0] == '\0') || (iLength == 0)) return 0; #ifdef WIN32 if (iLength == -1) iLength = strlen(lpMultiByte); if (((iLength+1) * 2) > m_iConvBufSize) AllocConvBuffer((iLength+1) * 2); iLength = INTL_TextToUnicode(wincsid, (unsigned char*)lpMultiByte, iLength, m_wConvBuf, m_iConvBufSize) ; #endif return iLength; } // // UseUnicodeFontAPI return // // csid Latin1/Symbol/ UTF8 MultiByte Other Single Byte // UserDefined/Digbats J/K/SC/TC CE/Greek/Cyr/Turk // Platform // Win 95 NonDB FALSE TRUE TRUE FALSE (Need test) // Win NT NonDB FALSE TRUE TRUE TRUE (Need test) // Win 95 DB FALSE TRUE (1) FALSE // Win NT DB FALSE TRUE (1) TRUE(2) // // (1) FALSE if it is equal to the system locale's csid. // (2) Could be true or false. But need more work for Edit control if use TRUE // #ifdef XP_WIN32 static BOOL intlUnicodeFlag(int16 wincsid) { if(! theApp.m_bUseUnicodeFont) return FALSE; if(0 == wincsid) // Unknown csid return FALSE; if(CS_UTF8 == wincsid) return TRUE; if( (CS_LATIN1 == wincsid) || (CS_SYMBOL == wincsid) || (CS_DINGBATS == wincsid) || (CS_USER_DEFINED_ENCODING == wincsid)) { return FALSE; } if( wincsid & MULTIBYTE) { if(CIntlWin::GetSystemLocaleCsid() == wincsid) return FALSE; else return TRUE; } else // Other SingleByte csid { if((CS_VIET_VISCII == wincsid) || (CS_VIET_VPS == wincsid) || (CS_VIET_TCVN == wincsid) || (CS_VIET_VIQR == wincsid) || (CS_TIS620 == wincsid) ) return FALSE; if(IsRunningOnNT) return TRUE; else return FALSE; } } #endif BOOL CIntlWin::UseVirtualFont() { return theApp.m_bUseVirtualFont; } BOOL CIntlWin::GetTextExtentPoint(int wincsid, HDC hDC, LPCSTR pString, int iLength, LPSIZE lpSize) { #ifdef MOZ_NGLAYOUT XP_ASSERT(0); return FALSE; #else if(0 == iLength) { lpSize->cx = 0; lpSize->cy = 0; return TRUE; } wincsid = INTL_DocToWinCharSetID(wincsid) & ~ CS_AUTO; int wlen; if ( CIntlWin::UseUnicodeFontAPI(wincsid)) { if(wlen = MultiByteToWideChar(wincsid, pString, iLength)) { return ::GetTextExtentPoint32W(hDC, m_wConvBuf, wlen, lpSize); } } return::GetTextExtentPoint32(hDC, pString, iLength, lpSize); #endif /* MOZ_NGLAYOUT */ } BOOL CIntlWin::GetTextExtentPointWithCyaFont(CyaFont *theNSFont,int wincsid, HDC hDC, LPCSTR pString, int iLength, LPSIZE lpSize) { #ifdef MOZ_NGLAYOUT XP_ASSERT(0); return FALSE; #else if(0 == iLength) { lpSize->cx = 0; lpSize->cy = 0; return TRUE; } // wincsid = INTL_DocToWinCharSetID(wincsid) & ~ CS_AUTO; XP_ASSERT(((wincsid & CS_AUTO) == 0) && (wincsid != CS_JIS) && (wincsid!=CS_EUCJP)); int wlen; if ( CIntlWin::UseUnicodeFontAPI(wincsid)) { if(wlen = MultiByteToWideChar(wincsid, pString, iLength)) { return theNSFont->MeasureTextSize(hDC, (char *)m_wConvBuf, wlen*sizeof(*m_wConvBuf), NULL, 0, lpSize); } } return( theNSFont->MeasureTextSize( hDC, (char *)pString, iLength, NULL, 0, lpSize) ); #endif /* MOZ_NGLAYOUT */ } CSize CIntlWin::GetTextExtent(int16 wincsid, HDC pDC, LPCTSTR pString, int iLength) { CSize csSize; BOOL bRetval; bRetval = CIntlWin::GetTextExtentPoint(wincsid, pDC, pString, iLength, &csSize); return(csSize); } BOOL CIntlWin::TextOut(int16 wincsid, HDC hDC, int nXStart, int nYStart, LPCSTR lpString,int iLength) { #ifdef MOZ_NGLAYOUT XP_ASSERT(0); return FALSE; #else if(0 == iLength) return TRUE; wincsid = INTL_DocToWinCharSetID(wincsid) & ~ CS_AUTO; int wlen; if ( CIntlWin::UseUnicodeFontAPI(wincsid)) { if(wlen = MultiByteToWideChar(wincsid, lpString, iLength)) { return ::TextOutW(hDC, nXStart, nYStart, m_wConvBuf, wlen); } } return ::TextOut(hDC, nXStart, nYStart, lpString, iLength); // The final fallback #endif /* MOZ_NGLAYOUT */ } //based on BOOL CIntlWin::TextOut(int16 wincsid, HDC hDC, int nXStart, int nYStart, LPCSTR lpString,int iLength) BOOL CIntlWin::TextOutWithCyaFont(CyaFont *theNSFont, int16 wincsid, HDC hDC, int nXStart, int nYStart, LPCSTR lpString,int iLength) { #ifdef MOZ_NGLAYOUT XP_ASSERT(0); return FALSE; #else if(0 == iLength) return TRUE; int wlen; if ( CIntlWin::UseUnicodeFontAPI(wincsid)) { if(wlen = MultiByteToWideChar(wincsid, lpString, iLength)) { // the encording flag in theNSFont makes it call ::TextOutW() return ( theNSFont->drawText(hDC, nXStart, nYStart, (char *)m_wConvBuf, wlen * 2) == FONTERR_OK); } } return( theNSFont->drawText(hDC, nXStart, nYStart, (char *)lpString, iLength) == FONTERR_OK ) ; #endif /* MOZ_NGLAYOUT */ } BOOL CIntlWin::ExtTextOut(int16 wincsid, HDC pDC, int x, int y, UINT nOptions, LPCRECT lpRect, LPCSTR lpszString, UINT nCount, LPINT lpDxWidths) { #ifdef MOZ_NGLAYOUT XP_ASSERT(0); return FALSE; #else if(0 == nCount) return TRUE; wincsid = INTL_DocToWinCharSetID(wincsid) & ~ CS_AUTO; int wlen; if ( CIntlWin::UseUnicodeFontAPI(wincsid)) { if(wlen = MultiByteToWideChar(wincsid, lpszString, nCount)) { return ::ExtTextOutW(pDC, x, y, nOptions, lpRect, m_wConvBuf, wlen, lpDxWidths); } } return ::ExtTextOut(pDC, x, y, nOptions, lpRect, lpszString, nCount, lpDxWidths); #endif /* MOZ_NGLAYOUT */ } #ifdef XP_WIN32 int CIntlWin::DrawTextEx(int16 wincsid, HDC hdc, LPSTR lpchText, int cchText,LPRECT lprc,UINT dwDTFormat,LPDRAWTEXTPARAMS lpDTParams) { #ifdef MOZ_NGLAYOUT XP_ASSERT(0); return 0; #else wincsid = INTL_DocToWinCharSetID(wincsid) & ~ CS_AUTO; int iRetval; int wlen; if (cchText == -1) cchText = strlen(lpchText); if ( CIntlWin::UseUnicodeFontAPI(wincsid)) { // DrawTextExW and DrawTextW is not working on Win95 right now. See Note above if( (IsRunningOnNT) && (wlen = MultiByteToWideChar(wincsid, lpchText, cchText))) { return ::DrawTextW(hdc, m_wConvBuf, wlen, lprc, dwDTFormat); } int x, y; SIZE sz; CIntlWin::GetTextExtentPoint(wincsid, hdc, lpchText, cchText, &sz); if(dwDTFormat & DT_CALCRECT) { lprc->top = 0; lprc->left = 0; lprc->right = sz.cx; lprc->bottom = sz.cy; return sz.cy; } // Caculate X x = lprc->left; if(dwDTFormat & DT_CENTER) x = (lprc->left + lprc->right - sz.cx) / 2; else if(dwDTFormat & DT_RIGHT) x = lprc->right - sz.cx; // Caculate Y y = lprc->top ; if(dwDTFormat & DT_VCENTER) y = ( lprc->top + lprc->bottom - sz.cy ) / 2; else if(dwDTFormat & DT_BOTTOM) y = lprc->bottom - sz.cy; return CIntlWin::TextOut(wincsid, hdc, x, y, lpchText, cchText); } else { if (IsRunningOnNT) iRetval = ::DrawText(hdc, lpchText, cchText, lprc, dwDTFormat); else iRetval = ::DrawTextEx(hdc, lpchText, cchText, lprc, dwDTFormat, lpDTParams); } return iRetval; #endif /* MOZ_NGLAYOUT */ } #endif int CIntlWin::DrawText(int16 wincsid, HDC hdc, LPSTR lpchText, int cchText,LPRECT lprc,UINT dwDTFormat) { #ifdef MOZ_NGLAYOUT XP_ASSERT(0); return 0; #else return CIntlWin::DrawTextEx( wincsid, hdc, lpchText, cchText, lprc, dwDTFormat, NULL); #endif /* MOZ_NGLAYOUT */ } extern "C" void *FE_GetSingleByteTable(int16 from_csid, int16 to_csid, int resourceid) { HRSRC hrsrc; HGLOBAL hRes; char szName[256]; strcpy(szName, (const char *)INTL_CsidToCharsetNamePt(from_csid)); strcpy(szName + strlen(szName), "_TO_"); strcpy(szName + strlen(szName), (const char *)INTL_CsidToCharsetNamePt(to_csid)); for (char *p = szName; *p; p++) { if (*p == '-') *p = '_'; } hrsrc = ::FindResource(AfxGetResourceHandle(), szName, RT_RCDATA); XP_ASSERT(hrsrc); if (!hrsrc) { TRACE1("FE_GetSingleByteTable cannot find resource: %s\n", szName); return NULL; } hRes = ::LoadResource(AfxGetResourceHandle(), hrsrc); XP_ASSERT(hRes); if (!hRes) { TRACE1("FE_GetSingleByteTable cannot load resource: %s\n", szName); return NULL; } return (void *) hRes; } extern "C" char *FE_LockTable(void **hres) { return (LPSTR)::LockResource((HGLOBAL) hres); } extern "C" void FE_FreeSingleByteTable(void **hres) { #ifndef XP_WIN32 ::UnlockResource((HGLOBAL) hres); #endif ::FreeResource((HGLOBAL) hres); } extern "C" INTLCharSetID FE_GetCharSetID(INTL_CharSetID_Selector selector) { INTLCharSetID charsetID = CS_DEFAULT; switch (selector) { case INTL_FileNameCsidSel: case INTL_DefaultTextWidgetCsidSel: case INTL_OldBookmarkCsidSel: charsetID = (INTLCharSetID) CIntlWin::GetSystemLocaleCsid(); break; default: break; } #ifdef DEBUG_ricardob XP_ASSERT(CS_DEFAULT != charsetID); #endif return charsetID; } /*--------------------------------------------------------------------------*/ #define MAXNUMOFCSIDLIST 64 #define UNICODECONVERSIONCHARTLIST "UnicodeConversionCharsetList" #ifdef XP_WIN32 #define UNICODEDLL "UNI3200.DLL" #define LIBRARYLOADOK(l) (l != NULL) #define UNICODE_VERIFYCSIDLIST_SYM "UNICODE_VERIFYCSIDLIST" #else #define UNICODEDLL "UNI1600.DLL" #define LIBRARYLOADOK(l) (l > HINSTANCE_ERROR) #define UNICODE_VERIFYCSIDLIST_SYM "_UNICODE_VERIFYCSIDLIST" #endif static int intl_VerifyCsidList(int inNumOfItem, int16 *csidlist) { int iRetval = 0; HINSTANCE hUniLib = LoadLibrary(UNICODEDLL); if(LIBRARYLOADOK(hUniLib)) { typedef int (*func)(int, int16 *); func VerifyProc = (func)GetProcAddress(hUniLib, UNICODE_VERIFYCSIDLIST_SYM); ASSERT(VerifyProc); if(VerifyProc) { iRetval = VerifyProc(inNumOfItem, csidlist); VerifyProc = NULL; } FreeLibrary(hUniLib); hUniLib = NULL; } return(iRetval); } // // Read and Write charset List for Unicode conversion // static void intl_ReadUnicodeConvList() { CString charsetlist; int16 csidlist[MAXNUMOFCSIDLIST]; int num_of_csid; // Find the charsetlist from preference charsetlist = theApp.GetProfileString("INTL", UNICODECONVERSIONCHARTLIST, ""); // If we cannot find it from preference , find it from resource if(strlen((const char*)charsetlist) == 0) charsetlist = szLoadString(IDS_CHARSET_LIST_FOR_UNICODE); // Otherwise, it is very wrong, however, we still give it // CS_LATIN1 , CS_SYMBOL, and CS_DINGBATS if(strlen((const char*)charsetlist) == 0) charsetlist = "iso-8859-1,x-cp1250,x-cp1251,x-cp1253,iso-8859-9,Shift_JIS,euc-kr,gb2312,big5,adobe-symbol-encoding,x-dingbats"; for(num_of_csid=0; num_of_csid < MAXNUMOFCSIDLIST; ) { int duplicate; int csid; int i; int lastone = 0; int len = charsetlist.GetLength(); int thislen = charsetlist.Find(','); if(thislen == -1) { lastone = 1; thislen = len; } csid=INTL_CharSetNameToID((char *)(const char *)charsetlist.Left(thislen)); // Check to see is that duplicate ? for(i=0, duplicate=0;i < num_of_csid; i ++) { if(csid == csidlist[i]) duplicate = 1; } // If not duplicate, add it to the list if(duplicate == 0 ) csidlist[num_of_csid++] = csid; if(lastone == 0 ) charsetlist = charsetlist.Right(len - thislen - 1); else break; } // Write it to the Prefs intl_WriteUnicodeConvList(num_of_csid, csidlist); // Filter through our csid checking code - intl_VerifyCsidList() num_of_csid = intl_VerifyCsidList(num_of_csid, csidlist); // OK, now we have the list. Call the xp function to initialize // Unicode Converter INTL_SetUnicodeCSIDList(num_of_csid, csidlist); } static void intl_WriteUnicodeConvList(int num_of_csid, int16* csidlist) { char str[512]; int first, i; char * cur; // Now, convert those csid to string for(first=1,i=0,cur=str;i < num_of_csid;i++) { if(first) first = 0; else *cur++ = ','; INTL_CharSetIDToName(csidlist[i], cur); cur += strlen(cur); } // And write to the Profile theApp.WriteProfileString("INTL", UNICODECONVERSIONCHARTLIST, str); } extern "C" { BYTE IntlGetJavaCharset(int csid, int javaFontID) { // currently, we ignore javaFontID. We may need to use it later switch(csid) { case CS_DINGBATS: case CS_SYMBOL: return SYMBOL_CHARSET; default: return IntlGetLfCharset(csid); } } const char* IntlGetJavaFaceName(int csid, int javaFontID) { switch(csid) { case CS_DINGBATS: return "Wingdings"; case CS_SYMBOL: return "Symbol"; default: switch(javaFontID) { case javaFontTimesRoman: case javaFontDialog: case javaFontHelvetica: return IntlGetUIPropFaceName(csid); case javaFontDialogInput: case javaFontCourier: return IntlGetUIFixFaceName(csid); default: return IntlGetUIPropFaceName(csid); } } } }; extern "C" { PR_PUBLIC_API(const char* ) INTLGETJAVAFACENAME_E(int csid, int javaFontID) { return IntlGetJavaFaceName(csid, javaFontID); } PR_PUBLIC_API(BYTE ) INTLGETJAVACHARSET_E(int csid, int javaFontID) { return IntlGetJavaCharset(csid, javaFontID); } PR_PUBLIC_API(int16* ) INTL_GETUNICODECSIDLIST_E(int16 * outnum) { return INTL_GetUnicodeCSIDList(outnum); } PR_PUBLIC_API(int32 ) INTL_UNICODELEN_E(uint16* ustr) { return INTL_UnicodeLen(ustr); } PR_PUBLIC_API(INTL_CompoundStr* ) INTL_COMPOUNDSTRFROMUNICODE_E(uint16* inunicode, uint32 inlen) { return INTL_CompoundStrFromUnicode(inunicode, inlen); } PR_PUBLIC_API(void ) INTL_COMPOUNDSTRDESTROY_E(INTL_CompoundStr* This) { INTL_CompoundStrDestroy(This); } PR_PUBLIC_API(INTL_CompoundStrIterator ) INTL_COMPOUNDSTRFIRSTSTR_E(INTL_CompoundStr* This, INTL_Encoding_ID *outencoding, unsigned char** outtext) { return INTL_CompoundStrFirstStr(This, outencoding,outtext); } PR_PUBLIC_API(INTL_CompoundStrIterator ) INTL_COMPOUNDSTRNEXTSTR_E(INTL_CompoundStrIterator iterator, INTL_Encoding_ID *outencoding, unsigned char** outtext) { return INTL_CompoundStrNextStr(iterator, outencoding, outtext); } PR_PUBLIC_API(INTL_CompoundStr* ) INTL_COMPOUNDSTRCLONE_E(INTL_CompoundStr* s1) { return INTL_CompoundStrClone(s1); } PR_PUBLIC_API(int16 ) INTL_DEFAULTWINCHARSETID_E(MWContext *context) { return INTL_DefaultWinCharSetID(context); } PR_PUBLIC_API(int32 ) INTL_TEXTBYTECOUNTTOCHARLEN_E(int16 csid, unsigned char* text, uint32 byteCount) { return INTL_TextByteCountToCharLen(csid, text, byteCount); } PR_PUBLIC_API(int32 ) INTL_TEXTCHARLENTOBYTECOUNT_E(int16 csid, unsigned char* text, uint32 charLen) { return INTL_TextCharLenToByteCount(csid, text, charLen); } PR_PUBLIC_API(uint32 ) INTL_UNICODETOSTRLEN_E(INTL_Encoding_ID encoding,INTL_Unicode* ustr, uint32 ustrlen) { return INTL_UnicodeToStrLen(encoding,ustr,ustrlen); } PR_PUBLIC_API(void ) INTL_UNICODETOSTR_E(INTL_Encoding_ID encoding,INTL_Unicode* ustr,uint32 ustrlen,unsigned char* dest, uint32 destbuflen) { INTL_UnicodeToStr(encoding,ustr,ustrlen,dest,destbuflen); } #ifdef JAVA PR_PUBLIC_API(jref * ) INTL_MAKEJAVASTRING_E(int16 encoding, char *str, int len) { return intl_makeJavaString(encoding, str, len); } #endif // JAVA PR_PUBLIC_API(BOOL ) CINTLWIN_TEXTOUT_E(int16 wincsid, HDC hdc, int nXStart, int nYStart, LPCSTR lpString,int iLength) { return CIntlWin::TextOut( wincsid, hdc, nXStart, nYStart, lpString, iLength); } PR_PUBLIC_API(BOOL ) CINTLWIN_GETTEXTEXTENTPOINT_E(int wincsid, HDC hDC, LPCSTR lpString, int cbString, LPSIZE lpSize) { return CIntlWin::GetTextExtentPoint( wincsid, hDC, lpString, cbString, lpSize); } }; // extern "C"