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
00163 static MemoryManager* fgArrayMemoryManager;
00164
00166
00167
00170
00201 static void Initialize(const char* const locale = XMLUni::fgXercescDefaultLocale
00202 , const char* const nlsHome = 0
00203 , PanicHandler* const panicHandler = 0
00204 , MemoryManager* const memoryManager = 0);
00205
00212 static void Terminate();
00213
00230 static void panic
00231 (
00232 const PanicHandler::PanicReasons reason
00233 );
00234
00236
00239
00252 static unsigned int curFilePos(FileHandle theFile);
00253
00263 static void closeFile(FileHandle theFile);
00264
00275 static unsigned int fileSize(FileHandle theFile);
00276
00287 static FileHandle openFile(const char* const fileName);
00288
00299 static FileHandle openFile(const XMLCh* const fileName);
00300
00311 static FileHandle openFileToWrite(const char* const fileName);
00312
00323 static FileHandle openFileToWrite(const XMLCh* const fileName);
00324
00334 static FileHandle openStdInHandle();
00335
00351 static unsigned int readFileBuffer
00352 (
00353 FileHandle theFile
00354 , const unsigned int toRead
00355 , XMLByte* const toFill
00356 );
00357
00372 static void writeBufferToFile
00373 (
00374 FileHandle const theFile
00375 , long toWrite
00376 , const XMLByte* const toFlush
00377 );
00378
00387 static void resetFile(FileHandle theFile);
00388
00390
00391
00415 static XMLCh* getFullPath
00416 (
00417 const XMLCh* const srcPath
00418 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
00419 );
00420
00434 static XMLCh* getCurrentDirectory
00435 (
00436 MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
00437 );
00438
00448 static inline bool isAnySlash(XMLCh c);
00449
00459 static void removeDotSlash(XMLCh* const srcPath);
00460
00471 static void removeDotDotSlash(XMLCh* const srcPath);
00472
00486 static bool isRelative(const XMLCh* const toCheck);
00487
00507 static XMLCh* weavePaths
00508 (
00509 const XMLCh* const basePath
00510 , const XMLCh* const relativePath
00511 );
00513
00516
00526 static unsigned long getCurrentMillis();
00528
00531
00539 static void closeMutex(void* const mtxHandle);
00540
00548 static void lockMutex(void* const mtxHandle);
00549
00557 static void* makeMutex();
00558
00571 static void unlockMutex(void* const mtxHandle);
00572
00574
00575
00578
00586 static XMLMsgLoader* loadMsgSet(const XMLCh* const msgDomain);
00587
00589
00592
00618 static void* compareAndSwap
00619 (
00620 void** toFill
00621 , const void* const newValue
00622 , const void* const toCompare
00623 );
00624
00626
00627
00630
00650 static int atomicIncrement(int& location);
00651
00671 static int atomicDecrement(int& location);
00672
00674
00688 static void recognizeNEL(bool state);
00689
00693 static bool isNELRecognized();
00695
00707 static void strictIANAEncoding(const bool state);
00708
00713 static bool isStrictIANAEncoding();
00715
00723 static inline size_t alignPointerForNewBlockAllocation(size_t ptrSize);
00724
00725 private :
00728
00734 static XMLMsgLoader* loadAMsgSet(const XMLCh* const msgDomain);
00735
00745 static XMLNetAccessor* makeNetAccessor();
00746
00757 static XMLTransService* makeTransService();
00758
00765 static void platformInit();
00766
00773 static void platformTerm();
00774
00782 static int searchSlashDotDotSlash(XMLCh* const srcPath);
00783
00785
00788
00795 static bool fgMemMgrAdopted;
00796
00798 };
00799
00800
00801 MakeXMLException(XMLPlatformUtilsException, )
00802
00803
00804
00805
00806
00807
00808
00809
00810
00811
00812
00813
00814
00815
00816
00817
00818
00819
00820
00821
00822
00823
00824
00825
00826 inline size_t
00827 XMLPlatformUtils::alignPointerForNewBlockAllocation(size_t ptrSize)
00828 {
00829
00830
00831
00832
00833 #ifdef XML_PLATFORM_NEW_BLOCK_ALIGNMENT
00834 size_t alignment = XML_PLATFORM_NEW_BLOCK_ALIGNMENT;
00835 #else
00836 size_t alignment = (sizeof(void*) >= sizeof(double)) ? sizeof(void*) : sizeof(double);
00837 #endif
00838
00839
00840 size_t current = ptrSize % alignment;
00841
00842
00843 return (current == 0)
00844 ? ptrSize
00845 : (ptrSize + alignment - current);
00846 }
00847
00848
00849
00850
00851
00852
00853 inline XMLDeleter::~XMLDeleter()
00854 {
00855 }
00856
00857
00858
00859
00860 inline XMLDeleter::XMLDeleter()
00861 {
00862 }
00863
00864 XERCES_CPP_NAMESPACE_END
00865
00866 #endif