00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062 #if !defined(PLATFORMUTILS_HPP)
00063 #define PLATFORMUTILS_HPP
00064
00065 #include <xercesc/util/XMLException.hpp>
00066 #include <xercesc/util/PanicHandler.hpp>
00067
00068 XERCES_CPP_NAMESPACE_BEGIN
00069
00070 class XMLMsgLoader;
00071 class XMLNetAccessor;
00072 class XMLTransService;
00073 class MemoryManager;
00074
00075
00076
00077
00078
00079
00080
00081 class XMLDeleter
00082 {
00083 public :
00084 virtual ~XMLDeleter();
00085
00086 protected :
00087 XMLDeleter();
00088
00089 private :
00090 XMLDeleter(const XMLDeleter&);
00091 XMLDeleter& operator=(const XMLDeleter&);
00092 };
00093
00094
00103 class XMLPlatformUtils
00104 {
00105 public :
00106
00109
00122 static XMLNetAccessor* fgNetAccessor;
00123
00134 static XMLTransService* fgTransService;
00135
00140 static PanicHandler* fgUserPanicHandler;
00141
00146 static PanicHandler* fgDefaultPanicHandler;
00147
00153 static MemoryManager* fgMemoryManager;
00154
00156
00157
00160
00191 static void Initialize(const char* const locale = XMLUni::fgXercescDefaultLocale
00192 , const char* const nlsHome = 0
00193 , PanicHandler* const panicHandler = 0
00194 , MemoryManager* const memoryManager = 0);
00195
00202 static void Terminate();
00203
00220 static void panic
00221 (
00222 const PanicHandler::PanicReasons reason
00223 );
00224
00226
00229
00242 static unsigned int curFilePos(FileHandle theFile);
00243
00253 static void closeFile(FileHandle theFile);
00254
00265 static unsigned int fileSize(FileHandle theFile);
00266
00277 static FileHandle openFile(const char* const fileName);
00278
00289 static FileHandle openFile(const XMLCh* const fileName);
00290
00301 static FileHandle openFileToWrite(const char* const fileName);
00302
00313 static FileHandle openFileToWrite(const XMLCh* const fileName);
00314
00324 static FileHandle openStdInHandle();
00325
00341 static unsigned int readFileBuffer
00342 (
00343 FileHandle theFile
00344 , const unsigned int toRead
00345 , XMLByte* const toFill
00346 );
00347
00362 static void writeBufferToFile
00363 (
00364 FileHandle const theFile
00365 , long toWrite
00366 , const XMLByte* const toFlush
00367 );
00368
00377 static void resetFile(FileHandle theFile);
00378
00380
00381
00402 static XMLCh* getFullPath
00403 (
00404 const XMLCh* const srcPath
00405 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
00406 );
00407
00421 static XMLCh* getCurrentDirectory
00422 (
00423 MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
00424 );
00425
00435 static inline bool isAnySlash(XMLCh c);
00436
00446 static void removeDotSlash(XMLCh* const srcPath);
00447
00458 static void removeDotDotSlash(XMLCh* const srcPath);
00459
00473 static bool isRelative(const XMLCh* const toCheck);
00474
00494 static XMLCh* weavePaths
00495 (
00496 const XMLCh* const basePath
00497 , const XMLCh* const relativePath
00498 );
00500
00503
00513 static unsigned long getCurrentMillis();
00515
00518
00526 static void closeMutex(void* const mtxHandle);
00527
00535 static void lockMutex(void* const mtxHandle);
00536
00544 static void* makeMutex();
00545
00558 static void unlockMutex(void* const mtxHandle);
00559
00561
00562
00565
00573 static XMLMsgLoader* loadMsgSet(const XMLCh* const msgDomain);
00574
00576
00579
00605 static void* compareAndSwap
00606 (
00607 void** toFill
00608 , const void* const newValue
00609 , const void* const toCompare
00610 );
00611
00613
00614
00617
00637 static int atomicIncrement(int& location);
00638
00658 static int atomicDecrement(int& location);
00659
00661
00675 static void recognizeNEL(bool state);
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 :
00715
00721 static XMLMsgLoader* loadAMsgSet(const XMLCh* const msgDomain);
00722
00732 static XMLNetAccessor* makeNetAccessor();
00733
00744 static XMLTransService* makeTransService();
00745
00752 static void platformInit();
00753
00760 static void platformTerm();
00761
00769 static int searchSlashDotDotSlash(XMLCh* const srcPath);
00770
00772
00775
00782 static bool fgMemMgrAdopted;
00783
00785 };
00786
00787
00788 MakeXMLException(XMLPlatformUtilsException, )
00789
00790
00791
00792
00793
00794
00795
00796
00797
00798
00799
00800
00801
00802
00803 inline size_t
00804 XMLPlatformUtils::alignPointerForNewBlockAllocation(size_t ptrSize)
00805 {
00806
00807
00808
00809
00810 #ifdef XML_PLATFORM_NEW_BLOCK_ALIGNMENT
00811 size_t alignment = XML_PLATFORM_NEW_BLOCK_ALIGNMENT;
00812 #else
00813 size_t alignment = (sizeof(void*) >= sizeof(double)) ? sizeof(void*) : sizeof(double);
00814 #endif
00815
00816
00817 size_t current = ptrSize % alignment;
00818
00819
00820 return (current == 0)
00821 ? ptrSize
00822 : (ptrSize + alignment - current);
00823 }
00824
00825
00826
00827
00828
00829
00830 inline XMLDeleter::~XMLDeleter()
00831 {
00832 }
00833
00834
00835
00836
00837 inline XMLDeleter::XMLDeleter()
00838 {
00839 }
00840
00841 XERCES_CPP_NAMESPACE_END
00842
00843 #endif