nlslayer.cpp
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:8k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is the Netscape security libraries.
  13.  * 
  14.  * The Initial Developer of the Original Code is Netscape
  15.  * Communications Corporation.  Portions created by Netscape are 
  16.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  17.  * Rights Reserved.
  18.  * 
  19.  * Contributor(s):
  20.  * 
  21.  * Alternatively, the contents of this file may be used under the
  22.  * terms of the GNU General Public License Version 2 or later (the
  23.  * "GPL"), in which case the provisions of the GPL are applicable 
  24.  * instead of those above.  If you wish to allow use of your 
  25.  * version of this file only under the terms of the GPL and not to
  26.  * allow others to use your version of this file under the MPL,
  27.  * indicate your decision by deleting the provisions above and
  28.  * replace them with the notice and other provisions required by
  29.  * the GPL.  If you do not delete the provisions above, a recipient
  30.  * may use your version of this file under either the MPL or the
  31.  * GPL.
  32.  */
  33. #include "nspr.h"
  34. #include "nscore.h"
  35. #include "nsString.h"
  36. #include "nsIServiceManager.h"
  37. #include "nsIStringBundle.h"
  38. #include "nsIDateTimeFormat.h"
  39. #include "nsDateTimeFormatCID.h"
  40. #include "nsICharsetConverterManager.h"
  41. extern "C" {
  42. #include "nlslayer.h"
  43. }
  44. static NS_DEFINE_IID(kStringBundleServiceCID, NS_STRINGBUNDLESERVICE_CID);
  45. static NS_DEFINE_IID(kIStringBundleServiceIID, NS_ISTRINGBUNDLESERVICE_IID);
  46. static NS_DEFINE_CID(kDateTimeCID, NS_DATETIMEFORMAT_CID);
  47. static NS_DEFINE_CID(kCharsetConverterManagerCID, NS_ICHARSETCONVERTERMANAGER_CID);
  48. static nsIUnicodeEncoder *encoderASCII = nsnull;
  49. #define TEXT_BUNDLE     "resource:/psmdata/ui/psm_text.properties"
  50. #define UI_BUNDLE "resource:/psmdata/ui/psm_ui.properties"
  51. #define BIN_BUNDLE "resource:/psmdata/ui/psm_bin.properties"
  52. #define DOC_BUNDLE "resource:/psmdata/ui/psm_doc.properties"
  53. extern "C" {
  54. static nsIStringBundle* nlsCreateBundle(char* bundleURL);
  55. static char* nlsGetUTF8StringFromBundle(nsIStringBundle *bundle, const char *name);
  56. static nsIStringBundle * bundles[4] = {NULL, NULL, NULL, NULL};
  57. }
  58. extern "C" PRBool nlsInit()
  59. {
  60. nsICharsetConverterManager *ccm = nsnull;
  61. nsAutoString charsetUTF8 = NS_ConvertASCIItoUCS2("UTF-8");
  62. nsAutoString charsetASCII = NS_ConvertASCIItoUCS2("ISO-8859-1");
  63. PRBool ret = PR_FALSE;
  64. nsresult res;
  65. #if !defined(XP_MAC)
  66. res = NS_InitXPCOM(NULL, NULL);
  67. NS_ASSERTION( NS_SUCCEEDED(res), "NS_InitXPCOM failed" );
  68. // Register components
  69. res = nsComponentManager::AutoRegister(nsIComponentManager::NS_Startup,
  70.                                                  NULL /* default */);
  71. if(NS_FAILED(res)) {
  72. goto loser;
  73. }
  74. #endif
  75. // Create the bundles
  76. bundles[0] = nlsCreateBundle(TEXT_BUNDLE);
  77. bundles[1] = nlsCreateBundle(UI_BUNDLE);
  78. bundles[2] = nlsCreateBundle(BIN_BUNDLE);
  79. bundles[3] = nlsCreateBundle(DOC_BUNDLE);
  80. // Create a unicode encoder and decoder
  81. res = nsServiceManager::GetService(kCharsetConverterManagerCID,
  82. NS_GET_IID(nsICharsetConverterManager),
  83. (nsISupports**)&ccm);
  84. if (NS_FAILED(res) || (nsnull == ccm)) {
  85. goto loser;
  86. }
  87. res = ccm->GetUnicodeEncoder(&charsetASCII, &encoderASCII);
  88. if (NS_FAILED(res) || (nsnull == encoderASCII)) {
  89. goto loser;
  90. }
  91. ret = PR_TRUE;
  92. goto done;
  93. loser:
  94. NS_IF_RELEASE(bundles[0]);
  95. NS_IF_RELEASE(bundles[1]);
  96. NS_IF_RELEASE(bundles[2]);
  97. NS_IF_RELEASE(bundles[3]);
  98. NS_IF_RELEASE(encoderASCII);
  99. done:
  100. return ret;
  101. }
  102. extern "C" nsIStringBundle* nlsCreateBundle(char* bundleURL)
  103. {
  104. nsresult ret;
  105. nsIStringBundleService *service = nsnull;
  106. nsIStringBundle* bundle = nsnull;
  107. nsILocale *locale = nsnull;
  108. // Get the string bundle service
  109. ret = nsServiceManager::GetService(kStringBundleServiceCID,
  110. kIStringBundleServiceIID,
  111. (nsISupports**)&service);
  112. if (NS_FAILED(ret)) {
  113. return NULL;
  114. }
  115. // Create the bundle
  116. ret = service->CreateBundle(bundleURL, locale, &bundle);
  117. if (NS_FAILED(ret)) {
  118. return NULL;
  119. }
  120. NS_IF_RELEASE(service);
  121. return bundle;
  122. }
  123. extern "C" char* nlsGetUTF8StringFromBundle(nsIStringBundle *bundle, const char *name)
  124. {
  125. nsresult ret;
  126. nsString key = NS_ConvertASCIItoUCS2(name);
  127. nsString value;
  128. PRUnichar * p = NULL;
  129. ret = bundle->GetStringFromName(key.GetUnicode(), &p);
  130. if (NS_FAILED(ret)) {
  131. return NULL;
  132. }
  133. value = p;
  134. // XXX This is a hack to get cr and lf chars in string. 
  135. // See bug# 21418
  136. value.ReplaceSubstring(NS_ConvertASCIItoUCS2("<psm:cr>"), NS_ConvertASCIItoUCS2("r"));
  137. value.ReplaceSubstring(NS_ConvertASCIItoUCS2("<psm:lf>"), NS_ConvertASCIItoUCS2("n"));
  138. return value.ToNewUTF8String();
  139. }
  140. extern "C" char* nlsGetUTF8String(const char *name)
  141. {
  142. int i;
  143. char *value = NULL;
  144. for (i=0;i<4;i++) {
  145. value = nlsGetUTF8StringFromBundle(bundles[i], name);
  146. if (value) {
  147. break;
  148. }
  149. }
  150. return value;
  151. }
  152. extern "C" void * nlsNewDateFormat()
  153. {
  154. nsIComponentManager *comMgr;
  155. nsIDateTimeFormat *dateTimeFormat = nsnull;
  156. nsresult rv;
  157. rv = NS_GetGlobalComponentManager(&comMgr);
  158. if (NS_FAILED(rv)) {
  159. return NULL;
  160. }
  161. rv = comMgr->CreateInstance(kDateTimeCID, nsnull, NS_GET_IID(nsIDateTimeFormat), (void**)&dateTimeFormat);
  162. if (NS_FAILED(rv)) {
  163. return NULL;
  164. }
  165. return dateTimeFormat;
  166. }
  167. extern "C" void nlsFreeDateFormat(void * p)
  168. {
  169. nsIDateTimeFormat *dateTimeFormat = (nsIDateTimeFormat*)p;
  170. NS_IF_RELEASE(dateTimeFormat);
  171. }
  172. extern "C" char * nslPRTimeToUTF8String(void* p, PRInt64 t)
  173. {
  174. nsIDateTimeFormat *dateTimeFormat = (nsIDateTimeFormat*)p;
  175. nsString dateTime;
  176. nsresult rv;
  177. rv = dateTimeFormat->FormatPRTime(nsnull, kDateFormatShort, kTimeFormatNoSeconds, PRTime(t), dateTime);
  178. if (NS_FAILED(rv)) {
  179. return nsnull;
  180. }
  181. return dateTime.ToNewUTF8String();
  182. }
  183. extern "C" PRBool nlsUnicodeToUTF8(unsigned char * inBuf, unsigned int inBufBytes,
  184. unsigned char * outBuf, unsigned int maxOutBufLen,
  185. unsigned int * outBufLen)
  186. {
  187. char *utf8;
  188. PRBool ret = PR_TRUE;
  189. utf8 = NS_ConvertUCS2toUTF8((PRUnichar*)inBuf, inBufBytes/2);
  190. *outBufLen = PL_strlen(utf8);
  191. if (*outBufLen+1 > maxOutBufLen) {
  192. ret = PR_FALSE;
  193. goto loser;
  194. }
  195. memcpy(outBuf, utf8, *outBufLen+1);
  196. loser:
  197. return ret;
  198. }
  199. extern "C" PRBool nlsUTF8ToUnicode(unsigned char * inBuf, unsigned int inBufBytes,
  200. unsigned char * outBuf, unsigned int maxOutBufLen,
  201. unsigned int * outBufLen)
  202. {
  203. PRBool ret = PR_TRUE;
  204. nsAutoString autoString = NS_ConvertUTF8toUCS2((const char*)inBuf);
  205. const PRUnichar *buffer;
  206. PRUint32 bufLen;
  207. unsigned int newLen;
  208. buffer = autoString.GetUnicode();
  209. bufLen = autoString.Length();
  210. newLen = (bufLen+1)*2;
  211. if (newLen > maxOutBufLen) {
  212. ret = PR_FALSE;
  213. goto loser;
  214. }
  215. memcpy(outBuf, (char*)buffer, newLen);
  216. *outBufLen = newLen;
  217. loser:
  218. return ret;
  219. }
  220. extern "C" PRBool nlsUnicodeToASCII(unsigned char * inBuf, unsigned int inBufBytes,
  221. unsigned char * outBuf, unsigned int maxOutBufLen,
  222. unsigned int * outBufLen)
  223. {
  224. PRBool ret = PR_FALSE;
  225. nsIUnicodeEncoder *enc = encoderASCII;
  226. PRInt32 dstLength;
  227. nsresult res;
  228. res = enc->GetMaxLength((const PRUnichar *)inBuf, inBufBytes, &dstLength);
  229. if (NS_FAILED(res) || (dstLength > maxOutBufLen)) {
  230. goto loser;
  231. }
  232. res = enc->Convert((const PRUnichar *)inBuf, (PRInt32*)&inBufBytes, (char*)outBuf, &dstLength);
  233. if (NS_FAILED(res)) {
  234. goto loser;
  235. }
  236. outBuf[dstLength] = '';
  237. *outBufLen = dstLength;
  238. ret = PR_TRUE;
  239. loser:
  240. return ret;
  241. }
  242. extern "C" PRBool nlsASCIIToUnicode(unsigned char * inBuf, unsigned int inBufBytes,
  243. unsigned char * outBuf, unsigned int maxOutBufLen,
  244. unsigned int * outBufLen)
  245. {
  246. nsAutoString autoString = NS_ConvertASCIItoUCS2((const char*)inBuf);
  247. PRUint32 bufLen;
  248. const PRUnichar *buffer;
  249. PRBool ret = PR_TRUE;
  250. unsigned int newLen;
  251. bufLen = autoString.Length();
  252. buffer = autoString.GetUnicode();
  253. newLen = (bufLen+1)*2;
  254. if (newLen > maxOutBufLen) {
  255. ret = PR_FALSE;
  256. goto loser;
  257. }
  258. memcpy(outBuf, buffer, newLen);
  259. *outBufLen = newLen;
  260. loser:
  261. return ret;
  262. }