00001 /*
00002 * The Apache Software License, Version 1.1
00003 *
00004 * Copyright (c) 1999-2000 The Apache Software Foundation. All rights
00005 * reserved.
00006 *
00007 * Redistribution and use in source and binary forms, with or without
00008 * modification, are permitted provided that the following conditions
00009 * are met:
00010 *
00011 * 1. Redistributions of source code must retain the above copyright
00012 * notice, this list of conditions and the following disclaimer.
00013 *
00014 * 2. Redistributions in binary form must reproduce the above copyright
00015 * notice, this list of conditions and the following disclaimer in
00016 * the documentation and/or other materials provided with the
00017 * distribution.
00018 *
00019 * 3. The end-user documentation included with the redistribution,
00020 * if any, must include the following acknowledgment:
00021 * "This product includes software developed by the
00022 * Apache Software Foundation (http://www.apache.org/)."
00023 * Alternately, this acknowledgment may appear in the software itself,
00024 * if and wherever such third-party acknowledgments normally appear.
00025 *
00026 * 4. The names "Xerces" and "Apache Software Foundation" must
00027 * not be used to endorse or promote products derived from this
00028 * software without prior written permission. For written
00029 * permission, please contact apache\@apache.org.
00030 *
00031 * 5. Products derived from this software may not be called "Apache",
00032 * nor may "Apache" appear in their name, without prior written
00033 * permission of the Apache Software Foundation.
00034 *
00035 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
00036 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
00037 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
00038 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
00039 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
00040 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
00041 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
00042 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
00043 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
00044 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
00045 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00046 * SUCH DAMAGE.
00047 * ====================================================================
00048 *
00049 * This software consists of voluntary contributions made by many
00050 * individuals on behalf of the Apache Software Foundation, and was
00051 * originally based on software copyright (c) 1999, International
00052 * Business Machines, Inc., http://www.ibm.com . For more information
00053 * on the Apache Software Foundation, please see
00054 * <http://www.apache.org/>.
00055 */
00056
00057 /*
00058 * $Id: PlatformUtils.hpp,v 1.9 2000/05/04 02:43:45 aruna1 Exp $
00059 */
00060
00061
00062 #if !defined(PLATFORMUTILS_HPP)
00063 #define PLATFORMUTILS_HPP
00064
00065 #include <util/XercesDefs.hpp>
00066 #include <util/XMLException.hpp>
00067
00068 class XMLMsgLoader;
00069 class XMLNetAccessor;
00070 class XMLTransService;
00071
00072
00073 //
00074 // For internal use only
00075 //
00076 // This class provides a simple abstract API via which lazily evaluated
00077 // data can be cleaned up.
00078 //
00079 class XMLDeleter
00080 {
00081 public :
00082 virtual ~XMLDeleter();
00083
00084 protected :
00085 XMLDeleter();
00086
00087 private :
00088 XMLDeleter(const XMLDeleter&);
00089 void operator=(const XMLDeleter&);
00090 };
00091
00092
00101 class XMLPlatformUtils
00102 {
00103 public :
00105 //@{
00106 enum PanicReasons
00107 {
00108 Panic_NoTransService
00109 , Panic_NoDefTranscoder
00110 , Panic_CantFindLib
00111 , Panic_UnknownMsgDomain
00112 , Panic_CantLoadMsgDomain
00113 , Panic_SynchronizationErr
00114 , Panic_SystemInit
00115
00116 , PanicReasons_Count
00117 };
00118 //@}
00119
00121 //@{
00122
00135 static XMLNetAccessor* fgNetAccessor;
00136
00147 static XMLTransService* fgTransService;
00148
00149 //@}
00150
00151
00153 //@{
00154
00159 static void Initialize();
00160
00167 static void Terminate();
00168
00182 static void panic
00183 (
00184 const PanicReasons reason
00185 );
00186 //@}
00187
00189 //@{
00190
00203 static unsigned int curFilePos(FileHandle theFile);
00204
00214 static void closeFile(FileHandle theFile);
00215
00226 static unsigned int fileSize(FileHandle theFile);
00227
00238 static FileHandle openFile(const char* const fileName);
00239
00250 static FileHandle openFile(const XMLCh* const fileName);
00251
00261 static FileHandle openStdInHandle();
00262
00278 static unsigned int readFileBuffer
00279 (
00280 FileHandle theFile
00281 , const unsigned int toRead
00282 , XMLByte* const toFill
00283 );
00284
00293 static void resetFile(FileHandle theFile);
00294
00295 //@}
00296
00297
00299 //@{
00314 static XMLCh* getFullPath(const XMLCh* const srcPath);
00315
00329 static bool isRelative(const XMLCh* const toCheck);
00330
00350 static XMLCh* weavePaths
00351 (
00352 const XMLCh* const basePath
00353 , const XMLCh* const relativePath
00354 );
00355 //@}
00356
00358 //@{
00359
00369 static unsigned long getCurrentMillis();
00370 //@}
00371
00373 //@{
00374
00382 static void closeMutex(void* const mtxHandle);
00383
00391 static void lockMutex(void* const mtxHandle);
00392
00400 static void* makeMutex();
00401
00414 static void unlockMutex(void* const mtxHandle);
00415
00416 //@}
00417
00418
00420 //@{
00421
00429 static XMLMsgLoader* loadMsgSet(const XMLCh* const msgDomain);
00430
00431 //@}
00432
00434 //@{
00435
00461 static void* compareAndSwap
00462 (
00463 void** toFill
00464 , const void* const newValue
00465 , const void* const toCompare
00466 );
00467
00468 //@}
00469
00470
00472 //@{
00473
00493 static int atomicIncrement(int& location);
00494
00514 static int atomicDecrement(int& location);
00515
00516 //@}
00517
00518
00519 //
00520 // For internal use only.
00521 //
00522 // The parser creates a good bit of static/global data lazily, to
00523 // avoid order of creation issues. Those objects can be registered
00524 // here to be cleaned up during the Terminate() call.
00526 static void registerLazyData(XMLDeleter* const deleter);
00527 static void cleanupLazyData();
00528
00529
00530 private :
00532 //@{
00533
00539 static XMLMsgLoader* loadAMsgSet(const XMLCh* const msgDomain);
00540
00550 static XMLNetAccessor* makeNetAccessor();
00551
00562 static XMLTransService* makeTransService();
00563
00570 static void platformInit();
00571
00578 static void platformTerm();
00579 };
00580
00581
00582 MakeXMLException(XMLPlatformUtilsException, )
00583
00584
00585
00586 // ---------------------------------------------------------------------------
00587 // XMLDeleter: Public Destructor
00588 // ---------------------------------------------------------------------------
00589 inline XMLDeleter::~XMLDeleter()
00590 {
00591 }
00592
00593 // ---------------------------------------------------------------------------
00594 // XMLDeleter: Hidden constructors and operators
00595 // ---------------------------------------------------------------------------
00596 inline XMLDeleter::XMLDeleter()
00597 {
00598 }
00599
00600 #endif