def openFileStream(cntlr, filepath, mode='r', encoding=None): if PackageManager.isMappedUrl(filepath): filepath = PackageManager.mappedUrl(filepath) elif isHttpUrl(filepath) and cntlr and hasattr( cntlr, "modelManager" ): # may be called early in initialization for PluginManager filepath = cntlr.modelManager.disclosureSystem.mappedUrl(filepath) if archiveFilenameParts(filepath): # file is in an archive return openFileSource(filepath, cntlr).file(filepath, binary='b' in mode, encoding=encoding)[0] if isHttpUrl(filepath) and cntlr: _cacheFilepath = cntlr.webCache.getfilename( filepath, normalize=True ) # normalize is separate step in ModelDocument retrieval, combined here if _cacheFilepath is None: raise IOError(_("Unable to open file: {0}.").format(filepath)) filepath = _cacheFilepath # file path may be server (or memcache) or local file system if filepath.startswith(SERVER_WEB_CACHE) and cntlr: filestream = None cacheKey = filepath[len(SERVER_WEB_CACHE) + 1:].replace("\\", "/") if cntlr.isGAE: # check if in memcache cachedBytes = gaeGet(cacheKey) if cachedBytes: filestream = io.BytesIO(cachedBytes) if filestream is None: filestream = io.BytesIO() cntlr.webCache.retrieve( cntlr.webCache.cacheFilepathToUrl(filepath), filestream=filestream) if cntlr.isGAE: gaeSet(cacheKey, filestream.getvalue()) if mode.endswith('t') or encoding: contents = filestream.getvalue() filestream.close() filestream = FileNamedStringIO( filepath, contents.decode(encoding or 'utf-8')) return filestream # local file system elif encoding is None and 'b' not in mode: openedFileStream = io.open(filepath, mode='rb') hdrBytes = openedFileStream.read(512) encoding = XmlUtil.encoding(hdrBytes, default=None) openedFileStream.close() return io.open(filepath, mode=mode, encoding=encoding) else: # local file system return io.open(filepath, mode=mode, encoding=encoding)
def openFileStream(cntlr, filepath, mode='r', encoding=None): if PackageManager.isMappedUrl(filepath): filepath = PackageManager.mappedUrl(filepath) else: filepath = cntlr.modelManager.disclosureSystem.mappedUrl(filepath) if archiveFilenameParts(filepath): # file is in an archive return openFileSource(filepath, cntlr).file(filepath, binary='b' in mode, encoding=encoding)[0] if isHttpUrl(filepath) and cntlr: _cacheFilepath = cntlr.webCache.getfilename(filepath) if _cacheFilepath is None: raise IOError(_("Unable to open file: {0}.").format(filepath)) filepath = _cacheFilepath # file path may be server (or memcache) or local file system if filepath.startswith(SERVER_WEB_CACHE) and cntlr: filestream = None cacheKey = filepath[len(SERVER_WEB_CACHE) + 1:].replace("\\","/") if cntlr.isGAE: # check if in memcache cachedBytes = gaeGet(cacheKey) if cachedBytes: filestream = io.BytesIO(cachedBytes) if filestream is None: filestream = io.BytesIO() cntlr.webCache.retrieve(cntlr.webCache.cacheFilepathToUrl(filepath), filestream=filestream) if cntlr.isGAE: gaeSet(cacheKey, filestream.getvalue()) if mode.endswith('t') or encoding: contents = filestream.getvalue() filestream.close() filestream = FileNamedStringIO(filepath, contents.decode(encoding or 'utf-8')) return filestream # local file system elif encoding is None and 'b' not in mode: openedFileStream = io.open(filepath, mode='rb') hdrBytes = openedFileStream.read(512) encoding = XmlUtil.encoding(hdrBytes, default=None) openedFileStream.close() return io.open(filepath, mode=mode, encoding=encoding) else: # local file system return io.open(filepath, mode=mode, encoding=encoding)