///////////////////////////////////////////////////////////////////////////////////////////////////////// // TEST BOOST - MEMORY MAPPING FILE #include #include #define ROOT_LIB_PATH( __RELATIVE_PATH ) "/TFS_OSGeo/SIT/SIG_SDK/Open Source/boost-1.54.0"#__RELATIVE_PATH #if _DEBUG #pragma comment(lib, ROOT_LIB_PATH( "/lib32-msvc-10.0/libboost_iostreams-vc100-mt-sgd-1_54.lib" )) #pragma comment(lib, ROOT_LIB_PATH( "/lib32-msvc-10.0/libboost_filesystem-vc100-mt-sgd-1_54.lib" )) #else #pragma comment(lib, ROOT_LIB_PATH( "/lib32-msvc-10.0/libboost_iostreams-vc100-mt-s-1_54.lib" )) #pragma comment(lib, ROOT_LIB_PATH( "/lib32-msvc-10.0/libboost_filesystem-vc100-mt-s-1_54.lib" )) #endif //------------------------------------------------------------------------------------------------------- // Helper wrapper class for boost::mapped_file. class mapped_file_manager { public: mapped_file_manager() : file(NULL), length(0), tell(0) { } ~mapped_file_manager() { close(); } public: boost::iostreams::mapped_file* file; uintmax_t length; uintmax_t tell; public: bool open(const char *pszFilename, bool readOnly) { if (boost::filesystem::exists(pszFilename)) { boost::iostreams::mapped_file* fileP = new boost::iostreams::mapped_file(); fileP->open(pszFilename, readOnly ? boost::iostreams::mapped_file_source::readwrite : boost::iostreams::mapped_file_source::readwrite); if (fileP->is_open()) { length = boost::filesystem::file_size(pszFilename); file = fileP; return true; } } return false; } bool close() { if (file) { length = 0; tell = 0; file->close(); delete file; file = NULL; return true; } return false; } }; SAFile MMF_SHP_Open( const char *pszFilename, const char *pszAccess ) { if (boost::filesystem::exists(pszFilename)) { mapped_file_manager* manager = new mapped_file_manager(); if (manager->open(pszFilename, strstr(pszAccess, "r")!=NULL)) { #if _DEBUG size_t size = manager->file->size(); #endif return (SAFile)manager; } delete manager; } return NULL; } SAOffset MMF_SHP_Read( void *p, SAOffset size, SAOffset nmemb, SAFile file ) { mapped_file_manager* manager = (mapped_file_manager*)file; char* data = manager->file->data(); int memoyrSize = size*nmemb; memcpy(p, data+manager->tell, memoyrSize); manager->tell += memoyrSize; return nmemb; } SAOffset MMF_SHP_Write( void *p, SAOffset size, SAOffset nmemb, SAFile file ) { mapped_file_manager* manager = (mapped_file_manager*)file; char* data = manager->file->data(); int memoyrSize = size*nmemb; memcpy(data+manager->tell, p, memoyrSize); manager->tell += memoyrSize; return nmemb; } SAOffset MMF_SHP_Seek( SAFile file, SAOffset offset, int whence ) { mapped_file_manager* manager = (mapped_file_manager*)file; if (whence==SEEK_SET) { manager->tell = offset; return 0; } else if (whence==SEEK_END) { manager->tell = manager->length+offset; return offset<0 ? 0 : 1; } else if (whence==SEEK_CUR) { manager->tell = manager->tell+offset; return 0; } return 2; } SAOffset MMF_SHP_Tell( SAFile file ) { mapped_file_manager* manager = (mapped_file_manager*)file; return (SAOffset)manager->tell; } int MMF_SHP_Flush( SAFile file ) { mapped_file_manager* manager = (mapped_file_manager*)file; // TODO: return 0; } int MMF_SHP_Close( SAFile file ) { if (file) { mapped_file_manager* manager = (mapped_file_manager*)file; manager->close(); delete manager; return 1; } return 0; } void MMF_SHP_Error( const char *message ) { CPLError( CE_Failure, CPLE_AppDefined, "%s", message ); } int MMF_SHP_Remove( const char *pszFilename ) { return VSIUnlink( pszFilename ); } //------------------------------------------------------------------------------------------------------- void SASetupBoostlibHooks( SAHooks *psHooks ) { psHooks->FOpen = MMF_SHP_Open; psHooks->FRead = MMF_SHP_Read; psHooks->FWrite = MMF_SHP_Write; psHooks->FSeek = MMF_SHP_Seek; psHooks->FTell = MMF_SHP_Tell; psHooks->FFlush = MMF_SHP_Flush; psHooks->FClose = MMF_SHP_Close; psHooks->Remove = MMF_SHP_Remove; psHooks->Atof = DBFFastAtof; psHooks->Error = MMF_SHP_Error; } //-------------------------------------------------------------------------------------------------------