PlatformUtils.cpp
上传用户:zhuqijet
上传日期:2013-06-25
资源大小:10074k
文件大小:16k
源码类别:

词法分析

开发平台:

Visual C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 1999-2003 The Apache Software Foundation.  All rights
  5.  * reserved.
  6.  *
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  *
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  *
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in
  16.  *    the documentation and/or other materials provided with the
  17.  *    distribution.
  18.  *
  19.  * 3. The end-user documentation included with the redistribution,
  20.  *    if any, must include the following acknowledgment:
  21.  *       "This product includes software developed by the
  22.  *        Apache Software Foundation (http://www.apache.org/)."
  23.  *    Alternately, this acknowledgment may appear in the software itself,
  24.  *    if and wherever such third-party acknowledgments normally appear.
  25.  *
  26.  * 4. The names "Xerces" and "Apache Software Foundation" must
  27.  *    not be used to endorse or promote products derived from this
  28.  *    software without prior written permission. For written
  29.  *    permission, please contact apache@apache.org.
  30.  *
  31.  * 5. Products derived from this software may not be called "Apache",
  32.  *    nor may "Apache" appear in their name, without prior written
  33.  *    permission of the Apache Software Foundation.
  34.  *
  35.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38.  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46.  * SUCH DAMAGE.
  47.  * ====================================================================
  48.  *
  49.  * This software consists of voluntary contributions made by many
  50.  * individuals on behalf of the Apache Software Foundation, and was
  51.  * originally based on software copyright (c) 1999, International
  52.  * Business Machines, Inc., http://www.ibm.com .  For more information
  53.  * on the Apache Software Foundation, please see
  54.  * <http://www.apache.org/>.
  55.  */
  56. /*
  57.  * $Log: PlatformUtils.cpp,v $
  58.  * Revision 1.10  2003/05/18 14:02:05  knoaman
  59.  * Memory manager implementation: pass per instance manager.
  60.  *
  61.  * Revision 1.9  2003/04/30 16:54:38  knoaman
  62.  * Initialize xerces with a default memory manager if none is provided.
  63.  *
  64.  * Revision 1.8  2003/03/09 16:40:47  peiyongz
  65.  * PanicHandler
  66.  *
  67.  * Revision 1.7  2003/02/17 19:54:47  peiyongz
  68.  * Allow set user specified error message file location in PlatformUtils::Initialize().
  69.  *
  70.  * Revision 1.6  2002/12/20 22:10:20  tng
  71.  * XML 1.1
  72.  *
  73.  * Revision 1.5  2002/11/08 21:06:16  peiyongz
  74.  * move comment to *hpp for API doc generation
  75.  *
  76.  * Revision 1.4  2002/11/04 22:24:21  peiyongz
  77.  * Locale setting for message loader
  78.  *
  79.  * Revision 1.3  2002/11/04 15:22:04  tng
  80.  * C++ Namespace Support.
  81.  *
  82.  * Revision 1.2  2002/07/18 20:05:31  knoaman
  83.  * Add a new feature to control strict IANA encoding name.
  84.  *
  85.  * Revision 1.1.1.1  2002/02/01 22:22:11  peiyongz
  86.  * sane_include
  87.  *
  88.  * Revision 1.16  2001/10/25 21:52:28  peiyongz
  89.  * XMLDeleterFor related functions and data are removed.
  90.  *
  91.  * Revision 1.15  2001/10/24 19:59:49  peiyongz
  92.  * [Bug 3975] gInitFlag problem
  93.  *
  94.  * Revision 1.14  2001/10/23 23:09:32  peiyongz
  95.  * [Bug#880] patch to PlatformUtils:init()/term() and related. from Mark Weaver
  96.  *
  97.  * Revision 1.13  2001/05/11 13:26:27  tng
  98.  * Copyright update.
  99.  *
  100.  * Revision 1.12  2001/05/03 18:43:01  knoaman
  101.  * Added new option to the parsers so that the NEL (0x85) char can be treated as a newline character.
  102.  *
  103.  * Revision 1.11  2001/02/07 17:46:34  billsch
  104.  * Rearranged statements in Initialize() so that platformInit() is called
  105.  * before an XMLMutex is created.
  106.  *
  107.  * Revision 1.10  2000/07/25 20:55:23  jpolast
  108.  * use gInitFlag as a reference to the number of times
  109.  * Initialized was called.  this way, the terminate routines are
  110.  * not invoked until all processes call Terminate() on the parser.
  111.  *
  112.  * Revision 1.9  2000/06/26 20:30:04  jpolast
  113.  * check if initialized in Terminate() to stop access violations
  114.  * submitted by John_Roper@iOra.com
  115.  *
  116.  * Revision 1.8  2000/05/09 00:22:40  andyh
  117.  * Memory Cleanup.  XMLPlatformUtils::Terminate() deletes all lazily
  118.  * allocated memory; memory leak checking tools will no longer report
  119.  * that leaks exist.  (DOM GetElementsByTagID temporarily removed
  120.  * as part of this.)
  121.  *
  122.  * Revision 1.7  2000/03/24 19:50:29  roddey
  123.  * Clear the 'initialized' flag when the termination call is made. Probably
  124.  * not required technically, but...
  125.  *
  126.  * Revision 1.6  2000/03/02 19:54:44  roddey
  127.  * This checkin includes many changes done while waiting for the
  128.  * 1.1.0 code to be finished. I can't list them all here, but a list is
  129.  * available elsewhere.
  130.  *
  131.  * Revision 1.5  2000/02/06 07:48:03  rahulj
  132.  * Year 2K copyright swat.
  133.  *
  134.  * Revision 1.4  2000/01/19 00:56:59  roddey
  135.  * Changes to get rid of dependence on old utils standard streams and to
  136.  * get rid of the fgLibLocation stuff.
  137.  *
  138.  * Revision 1.3  1999/12/18 00:18:10  roddey
  139.  * More changes to support the new, completely orthagonal support for
  140.  * intrinsic encodings.
  141.  *
  142.  * Revision 1.2  1999/12/15 19:41:28  roddey
  143.  * Support for the new transcoder system, where even intrinsic encodings are
  144.  * done via the same transcoder abstraction as external ones.
  145.  *
  146.  * Revision 1.1.1.1  1999/11/09 01:04:53  twl
  147.  * Initial checkin
  148.  *
  149.  * Revision 1.2  1999/11/08 20:45:11  rahul
  150.  * Swat for adding in Product name and CVS comment log variable.
  151.  *
  152.  */
  153. // ---------------------------------------------------------------------------
  154. //  Includes
  155. // ---------------------------------------------------------------------------
  156. #include <xercesc/util/XMLMsgLoader.hpp>
  157. #include <xercesc/util/Mutexes.hpp>
  158. #include <xercesc/util/PlatformUtils.hpp>
  159. #include <xercesc/util/RefVectorOf.hpp>
  160. #include <xercesc/util/TransService.hpp>
  161. #include <xercesc/util/XMLString.hpp>
  162. #include <xercesc/util/XMLNetAccessor.hpp>
  163. #include <xercesc/util/XMLUni.hpp>
  164. #include <xercesc/internal/XMLReader.hpp>
  165. #include <xercesc/util/RuntimeException.hpp>
  166. #include <xercesc/util/XMLRegisterCleanup.hpp>
  167. #include <xercesc/util/DefaultPanicHandler.hpp>
  168. #include <xercesc/internal/MemoryManagerImpl.hpp>
  169. #include <limits.h>
  170. XERCES_CPP_NAMESPACE_BEGIN
  171. // ---------------------------------------------------------------------------
  172. //  Local data members
  173. //
  174. //  gSyncMutex
  175. //      This is a mutex that will be used to synchronize access to some of
  176. //      the static data of the platform utilities class and here locally.
  177. // ---------------------------------------------------------------------------
  178. static XMLMutex*                gSyncMutex = 0;
  179. static long                     gInitFlag = 0;
  180. // ---------------------------------------------------------------------------
  181. //  Global data
  182. //
  183. // gXMLCleanupList
  184. // This is a list of cleanup functions to be called on
  185. // XMLPlatformUtils::Terminate.  Their function is to reset static
  186. // data in classes that use it.
  187. //
  188. // gXMLCleanupListMutex
  189. // This is a mutex that will be used to synchronise access to the global
  190. // static data cleanup list
  191. // ---------------------------------------------------------------------------
  192. XMLRegisterCleanup* gXMLCleanupList = 0;
  193. XMLMutex*           gXMLCleanupListMutex = 0;
  194. // ---------------------------------------------------------------------------
  195. //  XMLPlatformUtils: Static Data Members
  196. // ---------------------------------------------------------------------------
  197. XMLNetAccessor*     XMLPlatformUtils::fgNetAccessor = 0;
  198. XMLTransService*    XMLPlatformUtils::fgTransService = 0;
  199. PanicHandler*       XMLPlatformUtils::fgUserPanicHandler = 0;
  200. PanicHandler*       XMLPlatformUtils::fgDefaultPanicHandler = 0;
  201. MemoryManager*      XMLPlatformUtils::fgMemoryManager = 0;
  202. bool                XMLPlatformUtils::fgMemMgrAdopted = true;
  203. // ---------------------------------------------------------------------------
  204. //  XMLPlatformUtils: Init/term methods
  205. // ---------------------------------------------------------------------------
  206. void XMLPlatformUtils::Initialize(const char*          const locale 
  207.                                 , const char*          const nlsHome
  208.                                 ,       PanicHandler*  const panicHandler
  209.                                 ,       MemoryManager* const memoryManager)
  210. {
  211.     //
  212.     //  Effects of overflow:
  213.     //  . resouce re-allocations
  214.     //  . consequently resource leaks
  215.     //  . potentially terminate() may never get executed
  216.     //
  217.     //  We got to prevent overflow from happening.
  218.     //  no error or exception
  219.     //
  220.     if (gInitFlag == LONG_MAX)
  221.         return;
  222.     // Set pluggable memory manager
  223.     if (!fgMemoryManager)
  224.     {
  225.         if (memoryManager)
  226.         {
  227.             fgMemoryManager = memoryManager;
  228.             fgMemMgrAdopted = false;
  229.         }
  230.         else
  231.         {
  232.             fgMemoryManager = new MemoryManagerImpl();
  233.         }
  234.     }
  235.     //
  236.     //  Make sure we haven't already been initialized. Note that this is not
  237.     //  thread safe and is not intended for that. Its more for those COM
  238.     //  like processes that cannot keep up with whether they have initialized
  239.     //  us yet or not.
  240.     //
  241.     gInitFlag++;
  242.     if (gInitFlag > 1)
  243.       return;
  244.     /***
  245.      * Panic Handler:
  246.      *
  247.      ***/
  248.     if (!panicHandler)
  249.     {
  250.         fgDefaultPanicHandler = new DefaultPanicHandler();
  251.     }
  252.     else
  253.     {
  254.         fgUserPanicHandler = panicHandler;
  255.     }
  256.     
  257.     //
  258.     //  Call the platform init method, which is implemented in each of the
  259.     //  per-platform implementation cpp files. This one does the very low
  260.     //  level per-platform setup. It cannot use any XML util services at all,
  261.     //  i.e. only native services.
  262.     //
  263.     platformInit();
  264.     // Create the local sync mutex
  265.     gSyncMutex = new XMLMutex;
  266. // Create the mutex for the static data cleanup list
  267.     gXMLCleanupListMutex = new XMLMutex;
  268.     //
  269.     //  Ask the per-platform code to make the desired transcoding service for
  270.     //  us to use. This call cannot throw any exceptions or do anything that
  271.     //  cause any transcoding to happen. It should create the service and
  272.     //  return it or zero if it cannot.
  273.     //
  274.     //  This one also cannot use any utility services. It can only create a
  275.     //  transcoding service object and return it.
  276.     //
  277.     //  If we cannot make one, then we call panic to end the process.
  278.     //
  279.     fgTransService = makeTransService();
  280.     if (!fgTransService)
  281.         panic(PanicHandler::Panic_NoTransService);
  282.     // Initialize the transcoder service
  283.     fgTransService->initTransService();
  284.     //
  285.     //  Try to create a default local code page transcoder. This is the one
  286.     //  that will be used internally by the XMLString class. If we cannot
  287.     //  create one, then call the panic method.
  288.     //
  289.     XMLLCPTranscoder* defXCode = XMLPlatformUtils::fgTransService->makeNewLCPTranscoder();
  290.     if (!defXCode)
  291.         panic(PanicHandler::Panic_NoDefTranscoder);
  292.     XMLString::initString(defXCode, fgMemoryManager);
  293.     //
  294.     //  Now lets ask the per-platform code to give us an instance of the type
  295.     //  of network access implementation he wants to use. This can return
  296.     //  a zero pointer if this platform doesn't want to support this.
  297.     //
  298.     fgNetAccessor = makeNetAccessor();
  299.     /***
  300.      * Message Loader:
  301.      *
  302.      *     Locale setting 
  303.      *     nlsHome setting 
  304.      ***/
  305.     XMLMsgLoader::setLocale(locale);
  306.     XMLMsgLoader::setNLSHome(nlsHome);
  307. }
  308. void XMLPlatformUtils::Terminate()
  309. {
  310.     //
  311.     // To prevent it from running underflow.
  312.     // otherwise we come to delete non-existing resources.
  313.     //
  314.     //  no error or exception
  315.     //
  316.     if (gInitFlag == 0)
  317.         return;
  318. gInitFlag--;
  319. if (gInitFlag > 0)
  320. return;
  321.     // Delete any net accessor that got installed
  322.     delete fgNetAccessor;
  323.     fgNetAccessor = 0;
  324.     //
  325.     //  Call some other internal modules to give them a chance to clean up.
  326.     //  Do the string class last in case something tries to use it during
  327.     //  cleanup.
  328.     //
  329.     XMLString::termString();
  330.     // Clean up the the transcoding service
  331.     delete fgTransService;
  332.     fgTransService = 0;
  333.     // Clean up the sync mutex
  334.     delete gSyncMutex;
  335.     gSyncMutex = 0;
  336. // Clean up statically allocated, lazily cleaned data in each class
  337. // that has registered for it.
  338. // Note that calling doCleanup() also unregisters the cleanup
  339. // function, so that we are chewing the list down to nothing here
  340. while (gXMLCleanupList)
  341. gXMLCleanupList->doCleanup();
  342. // Clean up the mutex for accessing gXMLCleanupList
  343. delete gXMLCleanupListMutex;
  344. gXMLCleanupListMutex = 0;
  345.     //
  346.     //  And do platform termination. This cannot do use any XML services
  347.     //  at all, it can only clean up local stuff. It it reports an error,
  348.     //  it cannot use any XML exception or error reporting services.
  349.     //
  350.     platformTerm();
  351.     /***
  352.      *  de-allocate resource
  353.      *
  354.      *  refer to discussion in the Initialize()
  355.      ***/
  356.     XMLMsgLoader::setLocale(0);
  357.     XMLMsgLoader::setNLSHome(0);
  358.     if (fgDefaultPanicHandler)
  359.     {
  360.         delete fgDefaultPanicHandler;
  361.     }
  362.     // de-allocate default memory manager
  363.     if (fgMemMgrAdopted)
  364.     {
  365.         delete fgMemoryManager;
  366.         fgMemoryManager = 0;
  367.     }
  368.     else
  369.     {
  370.         fgMemMgrAdopted = true;
  371.     }
  372.     // And say we are no longer initialized
  373.     gInitFlag = 0;
  374. }
  375. // ---------------------------------------------------------------------------
  376. //  XMLPlatformUtils: Msg support methods
  377. // ---------------------------------------------------------------------------
  378. XMLMsgLoader* XMLPlatformUtils::loadMsgSet(const XMLCh* const msgDomain)
  379. {
  380.     //
  381.     //  Ask the platform support to load up the correct type of message
  382.     //  loader for the indicated message set. We don't check here whether it
  383.     //  works or not. That's their decision.
  384.     //
  385.     return loadAMsgSet(msgDomain);
  386. }
  387. // ---------------------------------------------------------------------------
  388. //  XMLPlatformUtils: NEL Character Handling
  389. // ---------------------------------------------------------------------------
  390. void XMLPlatformUtils::recognizeNEL(bool state) {
  391.     //Make sure initialize has been called
  392.     if (gInitFlag == 0) {
  393.         return;
  394.     }
  395.     if (state) {
  396.         if (!XMLChar1_0::isNELRecognized()) {
  397.             XMLChar1_0::enableNELWS();
  398.         }
  399.     }
  400.     else {
  401.         if (XMLChar1_0::isNELRecognized()) {
  402.             ThrowXML(RuntimeException, XMLExcepts::NEL_RepeatedCalls);
  403.         }
  404.     }
  405. }
  406. bool XMLPlatformUtils::isNELRecognized() {
  407.     return XMLChar1_0::isNELRecognized();
  408. }
  409. // ---------------------------------------------------------------------------
  410. //  XMLPlatformUtils: IANA Encoding checking setting
  411. // ---------------------------------------------------------------------------
  412. void XMLPlatformUtils::strictIANAEncoding(const bool state) {
  413.     //Make sure initialize has been called
  414.     if (gInitFlag == 0) {
  415.         return;
  416.     }
  417.     fgTransService->strictIANAEncoding(state);
  418. }
  419. bool XMLPlatformUtils::isStrictIANAEncoding() {
  420.     if (gInitFlag)
  421.         return fgTransService->isStrictIANAEncoding();
  422.     return false;
  423. }
  424. XERCES_CPP_NAMESPACE_END