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

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 *encoderUTF8 = nsnull;
  49. static nsIUnicodeDecoder *decoderUTF8 = nsnull;
  50. static nsIUnicodeEncoder *encoderASCII = nsnull;
  51. static nsIUnicodeDecoder *decoderASCII = nsnull;
  52. #define TEXT_BUNDLE     "resource:/ui/psm_text.properties"
  53. #define UI_BUNDLE "resource:/ui/psm_ui.properties"
  54. #define BIN_BUNDLE "resource:/ui/psm_bin.properties"
  55. #define DOC_BUNDLE "resource:/ui/psm_doc.properties"
  56. extern "C" {
  57. static nsIStringBundle* nlsCreateBundle(char* bundleURL);
  58. static char* nlsGetUTF8StringFromBundle(nsIStringBundle *bundle, const char *name);
  59. static nsIStringBundle * bundles[4] = {NULL, NULL, NULL, NULL};
  60. }
  61. extern "C" PRBool nlsInit()
  62. {
  63. nsICharsetConverterManager *ccm = nsnull;
  64. nsAutoString charsetUTF8("UTF-8");
  65. nsAutoString charsetASCII("ISO-8859-1");
  66. PRBool ret = PR_FALSE;
  67. nsresult res;
  68. res = NS_InitXPCOM(NULL, NULL);
  69. NS_ASSERTION( NS_SUCCEEDED(res), "NS_InitXPCOM failed" );
  70. // Register components
  71. res = nsComponentManager::AutoRegister(nsIComponentManager::NS_Startup,
  72.                                                  NULL /* default */);
  73. if(NS_FAILED(res)) {
  74. goto loser;
  75. }
  76. // Create the bundles
  77. bundles[0] = nlsCreateBundle(TEXT_BUNDLE);
  78. bundles[1] = nlsCreateBundle(UI_BUNDLE);
  79. bundles[2] = nlsCreateBundle(BIN_BUNDLE);
  80. bundles[3] = nlsCreateBundle(DOC_BUNDLE);
  81. // Create a unicode encoder and decoder
  82. res = nsServiceManager::GetService(kCharsetConverterManagerCID,
  83. NS_GET_IID(nsICharsetConverterManager),
  84. (nsISupports**)&ccm);
  85. if (NS_FAILED(res) || (nsnull == ccm)) {
  86. goto loser;
  87. }
  88. res = ccm->GetUnicodeEncoder(&charsetUTF8, &encoderUTF8);
  89. if (NS_FAILED(res) || (nsnull == encoderUTF8)) {
  90. goto loser;
  91. }
  92. res = ccm->GetUnicodeDecoder(&charsetUTF8, &decoderUTF8);
  93. if (NS_FAILED(res) || (nsnull == decoderUTF8)) {
  94. goto loser;
  95. }
  96. res = ccm->GetUnicodeEncoder(&charsetASCII, &encoderASCII);
  97. if (NS_FAILED(res) || (nsnull == encoderASCII)) {
  98. goto loser;
  99. }
  100. res = ccm->GetUnicodeDecoder(&charsetASCII, &decoderASCII);
  101. if (NS_FAILED(res) || (nsnull == decoderASCII)) {
  102. goto loser;
  103. }
  104. ret = PR_TRUE;
  105. goto done;
  106. loser:
  107. NS_IF_RELEASE(bundles[0]);
  108. NS_IF_RELEASE(bundles[1]);
  109. NS_IF_RELEASE(bundles[2]);
  110. NS_IF_RELEASE(bundles[3]);
  111. NS_IF_RELEASE(encoderUTF8);
  112. NS_IF_RELEASE(decoderUTF8);
  113. NS_IF_RELEASE(encoderASCII);
  114. NS_IF_RELEASE(decoderASCII);
  115. done:
  116. return ret;
  117. }
  118. extern "C" nsIStringBundle* nlsCreateBundle(char* bundleURL)
  119. {
  120. nsresult ret;
  121. nsIStringBundleService *service = nsnull;
  122. nsIStringBundle* bundle = nsnull;
  123. nsILocale *locale = nsnull;
  124. // Get the string bundle service
  125. ret = nsServiceManager::GetService(kStringBundleServiceCID,
  126. kIStringBundleServiceIID,
  127. (nsISupports**)&service);
  128. if (NS_FAILED(ret)) {
  129. return NULL;
  130. }
  131. // Create the bundle
  132. ret = service->CreateBundle(bundleURL, locale, &bundle);
  133. if (NS_FAILED(ret)) {
  134. return NULL;
  135. }
  136. NS_IF_RELEASE(service);
  137. return bundle;
  138. }
  139. extern "C" char* nlsGetUTF8StringFromBundle(nsIStringBundle *bundle, const char *name)
  140. {
  141. nsresult ret;
  142. nsString key(name);
  143. nsString value;
  144. PRUnichar * p = NULL;
  145. ret = bundle->GetStringFromName(key.GetUnicode(), &p);
  146. if (NS_FAILED(ret)) {
  147. return NULL;
  148. }
  149. value = p;
  150. // XXX This is a hack to get cr and lf chars in string. 
  151. // See bug# 21418
  152. value.ReplaceSubstring("<psm:cr>", "r");
  153. value.ReplaceSubstring("<psm:lf>", "n");
  154. return value.ToNewUTF8String();
  155. }
  156. extern "C" char* nlsGetUTF8String(const char *name)
  157. {
  158. int i;
  159. char *value = NULL;
  160. for (i=0;i<4;i++) {
  161. value = nlsGetUTF8StringFromBundle(bundles[i], name);
  162. if (value) {
  163. break;
  164. }
  165. }
  166. return value;
  167. }
  168. extern "C" void * nlsNewDateFormat()
  169. {
  170. nsIComponentManager *comMgr;
  171. nsIDateTimeFormat *dateTimeFormat = nsnull;
  172. nsresult rv;
  173. rv = NS_GetGlobalComponentManager(&comMgr);
  174. if (NS_FAILED(rv)) {
  175. return NULL;
  176. }
  177. rv = comMgr->CreateInstance(kDateTimeCID, nsnull, NS_GET_IID(nsIDateTimeFormat), (void**)&dateTimeFormat);
  178. if (NS_FAILED(rv)) {
  179. return NULL;
  180. }
  181. return dateTimeFormat;
  182. }
  183. extern "C" void nlsFreeDateFormat(void * p)
  184. {
  185. nsIDateTimeFormat *dateTimeFormat = (nsIDateTimeFormat*)p;
  186. NS_IF_RELEASE(dateTimeFormat);
  187. }
  188. extern "C" char * nslPRTimeToUTF8String(void* p, PRInt64 t)
  189. {
  190. nsIDateTimeFormat *dateTimeFormat = (nsIDateTimeFormat*)p;
  191. nsString dateTime;
  192. nsresult rv;
  193. rv = dateTimeFormat->FormatPRTime(nsnull, kDateFormatShort, kTimeFormatNoSeconds, PRTime(t), dateTime);
  194. if (NS_FAILED(rv)) {
  195. return nsnull;
  196. }
  197. return dateTime.ToNewUTF8String();
  198. }
  199. extern "C" PRBool nlsUnicodeToUTF8(unsigned char * inBuf, unsigned int inBufBytes,
  200. unsigned char * outBuf, unsigned int maxOutBufLen,
  201. unsigned int * outBufLen)
  202. {
  203. PRBool ret = PR_FALSE;
  204. nsIUnicodeEncoder *enc = encoderUTF8;
  205. PRInt32 dstLength;
  206. nsresult res;
  207. res = enc->GetMaxLength((const PRUnichar *)inBuf, inBufBytes, &dstLength);
  208. if (NS_FAILED(res) || (dstLength > maxOutBufLen)) {
  209. goto loser;
  210. }
  211. res = enc->Convert((const PRUnichar *)inBuf, (PRInt32*)&inBufBytes, (char*)outBuf, &dstLength);
  212. if (NS_FAILED(res)) {
  213. goto loser;
  214. }
  215. /* outBuf[dstLength] = '';*/
  216. *outBufLen = dstLength;
  217. ret = PR_TRUE;
  218. loser:
  219. return ret;
  220. }
  221. extern "C" PRBool nlsUTF8ToUnicode(unsigned char * inBuf, unsigned int inBufBytes,
  222. unsigned char * outBuf, unsigned int maxOutBufLen,
  223. unsigned int * outBufLen)
  224. {
  225. PRBool ret = PR_FALSE;
  226. PRInt32 dstLength;
  227. nsIUnicodeDecoder *dec = decoderUTF8;
  228. nsresult res;
  229. res = dec->GetMaxLength((const char*)inBuf, inBufBytes, &dstLength);
  230. if (NS_FAILED(res) || (dstLength > maxOutBufLen)) {
  231. goto loser;
  232. }
  233. res = dec->Convert((const char *)inBuf, (PRInt32*)&inBufBytes, (PRUnichar*)outBuf, &dstLength);
  234. if (NS_FAILED(res)) {
  235. goto loser;
  236. }
  237. ret = PR_TRUE;
  238. loser:
  239. return ret;
  240. }
  241. extern "C" PRBool nlsUnicodeToASCII(unsigned char * inBuf, unsigned int inBufBytes,
  242. unsigned char * outBuf, unsigned int maxOutBufLen,
  243. unsigned int * outBufLen)
  244. {
  245. PRBool ret = PR_FALSE;
  246. nsIUnicodeEncoder *enc = encoderASCII;
  247. PRInt32 dstLength;
  248. nsresult res;
  249. res = enc->GetMaxLength((const PRUnichar *)inBuf, inBufBytes, &dstLength);
  250. if (NS_FAILED(res) || (dstLength > maxOutBufLen)) {
  251. goto loser;
  252. }
  253. res = enc->Convert((const PRUnichar *)inBuf, (PRInt32*)&inBufBytes, (char*)outBuf, &dstLength);
  254. if (NS_FAILED(res)) {
  255. goto loser;
  256. }
  257. /* outBuf[dstLength] = '';*/
  258. *outBufLen = dstLength;
  259. ret = PR_TRUE;
  260. loser:
  261. return ret;
  262. }
  263. extern "C" PRBool nlsASCIIToUnicode(unsigned char * inBuf, unsigned int inBufBytes,
  264. unsigned char * outBuf, unsigned int maxOutBufLen,
  265. unsigned int * outBufLen)
  266. {
  267. PRBool ret = PR_FALSE;
  268. PRInt32 dstLength;
  269. nsIUnicodeDecoder *dec = decoderASCII;
  270. nsresult res;
  271. res = dec->GetMaxLength((const char*)inBuf, inBufBytes, &dstLength);
  272. if (NS_FAILED(res) || (dstLength > maxOutBufLen)) {
  273. goto loser;
  274. }
  275. res = dec->Convert((const char *)inBuf, (PRInt32*)&inBufBytes, (PRUnichar*)outBuf, &dstLength);
  276. if (NS_FAILED(res)) {
  277. goto loser;
  278. }
  279. *outBufLen = (unsigned int)dstLength*2;
  280. ret = PR_TRUE;
  281. loser:
  282. return ret;
  283. }