VSILFILE *VSIFileFromMemBuffer( const char *pszFilename, GByte *pabyData, vsi_l_offset nDataLength, int bTakeOwnership ) { if( VSIFileManager::GetHandler("") == VSIFileManager::GetHandler("/vsimem/") ) VSIInstallMemFileHandler(); VSIMemFilesystemHandler *poHandler = static_cast<VSIMemFilesystemHandler *>( VSIFileManager::GetHandler("/vsimem/")); if( pszFilename == nullptr ) return nullptr; CPLString osFilename = pszFilename; VSIMemFilesystemHandler::NormalizePath( osFilename ); if( osFilename.empty() ) return nullptr; VSIMemFile *poFile = new VSIMemFile; poFile->osFilename = osFilename; poFile->bOwnData = CPL_TO_BOOL(bTakeOwnership); poFile->pabyData = pabyData; poFile->nLength = nDataLength; poFile->nAllocLength = nDataLength; { CPLMutexHolder oHolder( &poHandler->hMutex ); poHandler->Unlink_unlocked(osFilename); poHandler->oFileList[poFile->osFilename] = poFile; CPLAtomicInc(&(poFile->nRefCount)); } // TODO(schwehr): Fix this so that the using statement is not needed. // Will just adding the bool for bSetError be okay? return reinterpret_cast<VSILFILE *>( poHandler->Open( osFilename, "r+" ) ); }
VSILFILE *VSIFileFromMemBuffer( const char *pszFilename, GByte *pabyData, vsi_l_offset nDataLength, int bTakeOwnership ) { if( VSIFileManager::GetHandler("") == VSIFileManager::GetHandler("/vsimem/") ) VSIInstallMemFileHandler(); VSIMemFilesystemHandler *poHandler = (VSIMemFilesystemHandler *) VSIFileManager::GetHandler("/vsimem/"); if (pszFilename == NULL) return NULL; CPLString osFilename = pszFilename; VSIMemFilesystemHandler::NormalizePath( osFilename ); VSIMemFile *poFile = new VSIMemFile; poFile->osFilename = osFilename; poFile->bOwnData = bTakeOwnership; poFile->pabyData = pabyData; poFile->nLength = nDataLength; poFile->nAllocLength = nDataLength; { CPLMutexHolder oHolder( &poHandler->hMutex ); poHandler->Unlink_unlocked(osFilename); poHandler->oFileList[poFile->osFilename] = poFile; poFile->nRefCount++; } return (VSILFILE *) poHandler->Open( osFilename, "r+" ); }