UserFile::UserFile(Class *cls, const req::ptr<StreamContext>& context /*= null */) : UserFSNode(cls, context) { m_StreamOpen = lookupMethod(s_stream_open.get()); m_StreamClose = lookupMethod(s_stream_close.get()); m_StreamRead = lookupMethod(s_stream_read.get()); m_StreamWrite = lookupMethod(s_stream_write.get()); m_StreamSeek = lookupMethod(s_stream_seek.get()); m_StreamTell = lookupMethod(s_stream_tell.get()); m_StreamEof = lookupMethod(s_stream_eof.get()); m_StreamFlush = lookupMethod(s_stream_flush.get()); m_StreamTruncate = lookupMethod(s_stream_truncate.get()); m_StreamLock = lookupMethod(s_stream_lock.get()); m_StreamStat = lookupMethod(s_stream_stat.get()); m_UrlStat = lookupMethod(s_url_stat.get()); m_Unlink = lookupMethod(s_unlink.get()); m_Rename = lookupMethod(s_rename.get()); m_Mkdir = lookupMethod(s_mkdir.get()); m_Rmdir = lookupMethod(s_rmdir.get()); m_StreamMetadata = lookupMethod(s_stream_metadata.get()); m_StreamCast = lookupMethod(s_stream_cast.get()); setIsLocal(true); // UserFile, to match Zend, should not call stream_close() unless it was ever // opened. This is a bit of a misuse of this field but the API doesn't allow // one direct access to an not-yet-opened stream resource so it should be // safe. setIsClosed(true); }
MemFile::MemFile(const char *data, int64_t len, const String& wrapper, const String& stream) : File(false, wrapper, stream), m_data(nullptr), m_len(len), m_cursor(0), m_malloced(true) { m_data = (char*)malloc(len + 1); if (m_data && len) { memcpy(m_data, data, len); } m_data[len] = '\0'; setIsLocal(true); }
PlainFile::PlainFile(FILE *stream, bool nonblocking, const String& wrapper_type, const String& stream_type) : File(nonblocking, wrapper_type.isNull() ? s_plainfile : wrapper_type, stream_type.isNull() ? s_stdio : stream_type), m_stream(stream), m_buffer(nullptr) { if (stream) { setFd(fileno(stream)); m_buffer = (char *)malloc(BUFSIZ); if (m_buffer) setbuffer(stream, m_buffer, BUFSIZ); } setIsLocal(true); }
MemFile::MemFile(const String& wrapper, const String& stream) : File(false, wrapper, stream), m_data(nullptr), m_len(-1), m_cursor(0), m_malloced(false) { setIsLocal(true); }
ZipFile::ZipFile() : m_gzFile(nullptr) { setIsLocal(true); setEof(false); }
BZ2File::BZ2File(SmartPtr<PlainFile>&& innerFile) : m_bzFile(nullptr), m_innerFile(std::move(innerFile)) { setIsLocal(m_innerFile->isLocal()); }
BZ2File::BZ2File(): m_bzFile(nullptr), m_innerFile(makeSmartPtr<PlainFile>()) { m_innerFile->unregister(); setIsLocal(m_innerFile->isLocal()); }