PlatformUtils.hpp

Go to the documentation of this file.
00001 /*
00002  * Copyright 1999-2004 The Apache Software Foundation.
00003  * 
00004  * Licensed under the Apache License, Version 2.0 (the "License");
00005  * you may not use this file except in compliance with the License.
00006  * You may obtain a copy of the License at
00007  * 
00008  *      http://www.apache.org/licenses/LICENSE-2.0
00009  * 
00010  * Unless required by applicable law or agreed to in writing, software
00011  * distributed under the License is distributed on an "AS IS" BASIS,
00012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00013  * See the License for the specific language governing permissions and
00014  * limitations under the License.
00015  */
00016 
00017 /*
00018  * $Id: PlatformUtils.hpp 180016 2005-06-04 19:49:30Z jberry $
00019  */
00020 
00021 
00022 #if !defined(PLATFORMUTILS_HPP)
00023 #define PLATFORMUTILS_HPP
00024 
00025 #include <xercesc/util/XMLException.hpp>
00026 #include <xercesc/util/PanicHandler.hpp>
00027 
00028 XERCES_CPP_NAMESPACE_BEGIN
00029 
00030 class XMLMsgLoader;
00031 class XMLNetAccessor;
00032 class XMLTransService;
00033 class MemoryManager;
00034 class XMLMutex;
00035 
00036 //
00037 //  For internal use only
00038 //
00039 //  This class provides a simple abstract API via which lazily evaluated
00040 //  data can be cleaned up.
00041 //
00042 class XMLUTIL_EXPORT XMLDeleter
00043 {
00044 public :
00045     virtual ~XMLDeleter();
00046 
00047 protected :
00048     XMLDeleter();
00049 
00050 private :
00051     XMLDeleter(const XMLDeleter&);
00052     XMLDeleter& operator=(const XMLDeleter&);
00053 };
00054 
00055 
00064 class XMLUTIL_EXPORT XMLPlatformUtils
00065 {
00066 public :
00067 
00070 
00083     static XMLNetAccessor*      fgNetAccessor;
00084 
00095     static XMLTransService*     fgTransService;
00096 
00101     static PanicHandler*        fgUserPanicHandler;
00102     
00107     static PanicHandler*        fgDefaultPanicHandler;
00108 
00114     static MemoryManager*       fgMemoryManager;
00115     
00124     static MemoryManager*       fgArrayMemoryManager;
00125 
00126     static XMLMutex*            fgAtomicMutex;
00127     
00129 
00130 
00133 
00164     static void Initialize(const char*          const locale = XMLUni::fgXercescDefaultLocale
00165                          , const char*          const nlsHome = 0
00166                          ,       PanicHandler*  const panicHandler = 0
00167                          ,       MemoryManager* const memoryManager = 0
00168                          ,       bool                 toInitStatics = false);
00169 
00176     static void Terminate();
00177 
00194     static void panic
00195     (
00196         const   PanicHandler::PanicReasons    reason
00197     );
00198     
00200 
00203 
00217     static unsigned int curFilePos(FileHandle theFile
00218         , MemoryManager* const manager  = XMLPlatformUtils::fgMemoryManager);
00219 
00230     static void closeFile(FileHandle theFile
00231         , MemoryManager* const manager  = XMLPlatformUtils::fgMemoryManager);
00232 
00243     static unsigned int fileSize(FileHandle theFile
00244         , MemoryManager* const manager  = XMLPlatformUtils::fgMemoryManager);
00245 
00256     static FileHandle openFile(const char* const fileName
00257         , MemoryManager* const manager  = XMLPlatformUtils::fgMemoryManager);
00258 
00269     static FileHandle openFile(const XMLCh* const fileName
00270         , MemoryManager* const manager  = XMLPlatformUtils::fgMemoryManager);
00271 
00282     static FileHandle openFileToWrite(const char* const fileName
00283         , MemoryManager* const manager  = XMLPlatformUtils::fgMemoryManager);
00284 
00295     static FileHandle openFileToWrite(const XMLCh* const fileName
00296         , MemoryManager* const manager  = XMLPlatformUtils::fgMemoryManager);
00297 
00308     static FileHandle openStdInHandle(MemoryManager* const manager  = XMLPlatformUtils::fgMemoryManager);
00309 
00326     static unsigned int readFileBuffer
00327     (
00328                 FileHandle      theFile
00329         , const unsigned int    toRead
00330         ,       XMLByte* const  toFill
00331         , MemoryManager* const manager  = XMLPlatformUtils::fgMemoryManager
00332     );
00333 
00348     static void writeBufferToFile
00349     (
00350           FileHandle     const  theFile
00351         , long                  toWrite
00352         , const XMLByte* const  toFlush
00353         , MemoryManager* const manager  = XMLPlatformUtils::fgMemoryManager
00354     );
00355 
00365     static void resetFile(FileHandle theFile
00366         , MemoryManager* const manager  = XMLPlatformUtils::fgMemoryManager);
00367 
00369 
00370 
00394     static XMLCh* getFullPath
00395     (
00396         const XMLCh* const srcPath
00397         , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
00398     );
00399 
00413     static XMLCh* getCurrentDirectory
00414     (
00415         MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
00416     );
00417 
00427     static inline bool isAnySlash(XMLCh c);
00428     
00438     static void   removeDotSlash(XMLCh* const srcPath
00439         , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
00440 
00451     static void   removeDotDotSlash(XMLCh* const srcPath
00452         , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
00453 
00467     static bool isRelative(const XMLCh* const toCheck
00468         , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
00469         );
00470 
00490     static XMLCh* weavePaths
00491     (
00492         const   XMLCh* const    basePath
00493         , const XMLCh* const    relativePath
00494         , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
00495     );
00497 
00500 
00510     static unsigned long getCurrentMillis();
00512 
00515 
00523     static void closeMutex(void* const mtxHandle);
00524 
00532     static void lockMutex(void* const mtxHandle);
00533 
00543     static void* makeMutex(MemoryManager* manager = XMLPlatformUtils::fgMemoryManager);
00544 
00557     static void unlockMutex(void* const mtxHandle);
00558 
00560 
00561 
00564 
00572     static XMLMsgLoader* loadMsgSet(const XMLCh* const msgDomain);
00573 
00575 
00578 
00604     static void* compareAndSwap
00605     (
00606                 void**      toFill
00607         , const void* const newValue
00608         , const void* const toCompare
00609     );
00610 
00612 
00613 
00616 
00636     static int atomicIncrement(int& location);
00637 
00657     static int atomicDecrement(int& location);
00658 
00660 
00674     static void recognizeNEL(bool state
00675         , MemoryManager* const manager  = XMLPlatformUtils::fgMemoryManager);
00676 
00680     static bool isNELRecognized();
00682 
00694     static void strictIANAEncoding(const bool state);
00695 
00700     static bool isStrictIANAEncoding();
00702                 
00710         static inline size_t alignPointerForNewBlockAllocation(size_t ptrSize);
00711 
00712 private :
00713     // -----------------------------------------------------------------------
00714     //  Unimplemented constructors and operators
00715     // -----------------------------------------------------------------------
00716     XMLPlatformUtils();
00717 
00720 
00726     static XMLMsgLoader* loadAMsgSet(const XMLCh* const msgDomain);
00727 
00737     static XMLNetAccessor* makeNetAccessor();
00738 
00749     static XMLTransService* makeTransService();
00750 
00757     static void platformInit();
00758 
00765     static void platformTerm();
00766 
00774     static int  searchSlashDotDotSlash(XMLCh* const srcPath);
00775 
00777 
00780 
00787     static bool fgMemMgrAdopted;
00788 
00790 };
00791 
00792 
00793 MakeXMLException(XMLPlatformUtilsException, XMLUTIL_EXPORT)
00794 
00795 
00796 // ---------------------------------------------------------------------------
00797 //  XMLPlatformUtils: alignPointerForNewBlockAllocation
00798 // ---------------------------------------------------------------------------
00799 //  Calculate alignment required by platform for a new
00800 //      block allocation. We use this in our custom allocators
00801 //      to ensure that returned blocks are properly aligned.
00802 //  Note that, although this will take a pointer and return the position
00803 //  at which it should be placed for correct alignment, in our code
00804 //  we normally use size_t parameters to discover what the alignment
00805 //  of header blocks should be.  Thus, if this is to be
00806 //  used for the former purpose, to make compilers happy
00807 //  some casting will be necessary - neilg.
00808 //
00809 //  Note: XML_PLATFORM_NEW_BLOCK_ALIGNMENT may be specified on a
00810 //        per-architecture basis to dictate the alignment requirements
00811 //        of the architecture. In the absense of this specification,
00812 //        this routine guesses at the correct alignment value.
00813 //
00814 //        A XML_PLATFORM_NEW_BLOCK_ALIGNMENT value of zero is illegal.
00815 //        If a platform requires absolutely no alignment, a value
00816 //        of 1 should be specified ("align pointers on 1 byte boundaries").
00817 //
00818 inline size_t
00819 XMLPlatformUtils::alignPointerForNewBlockAllocation(size_t ptrSize)
00820 {
00821         //      Macro XML_PLATFORM_NEW_BLOCK_ALIGNMENT may be defined
00822         //      as needed to dictate alignment requirements on a
00823         //      per-architecture basis. In the absense of that we
00824         //      take an educated guess.
00825         #ifdef XML_PLATFORM_NEW_BLOCK_ALIGNMENT
00826                 size_t alignment = XML_PLATFORM_NEW_BLOCK_ALIGNMENT;
00827         #else
00828                 size_t alignment = (sizeof(void*) >= sizeof(double)) ? sizeof(void*) : sizeof(double);
00829         #endif
00830         
00831         //      Calculate current alignment of pointer
00832         size_t current = ptrSize % alignment;
00833         
00834         //      Adjust pointer alignment as needed
00835         return (current == 0)
00836                  ? ptrSize
00837                  : (ptrSize + alignment - current);
00838 }
00839 
00840 
00841 
00842 // ---------------------------------------------------------------------------
00843 //  XMLDeleter: Public Destructor
00844 // ---------------------------------------------------------------------------
00845 inline XMLDeleter::~XMLDeleter()
00846 {
00847 }
00848 
00849 // ---------------------------------------------------------------------------
00850 //  XMLDeleter: Hidden constructors and operators
00851 // ---------------------------------------------------------------------------
00852 inline XMLDeleter::XMLDeleter()
00853 {
00854 }
00855 
00856 XERCES_CPP_NAMESPACE_END
00857 
00858 #endif

Generated on Tue Dec 12 00:18:56 2006 for XQilla Simple API by  doxygen 1.4.6