int mythfile_open(const char *pathname, int flags) { LOG(VB_FILE, LOG_DEBUG, QString("mythfile_open('%1', %2)") .arg(pathname).arg(flags)); struct stat fileinfo; if (mythfile_stat(pathname, &fileinfo)) return -1; if (S_ISDIR( fileinfo.st_mode )) // libmythdvdnav tries to open() a dir return errno = EISDIR, -1; int fileID = -1; if (strncmp(pathname, "myth://", 7)) { int lfd = open(pathname, flags); if (lfd < 0) return -1; m_fileWrapperLock.lockForWrite(); fileID = getNextFileID(); m_localfiles[fileID] = lfd; m_filenames[fileID] = pathname; m_fileWrapperLock.unlock(); } else { RingBuffer *rb = NULL; RemoteFile *rf = NULL; if ((fileinfo.st_size < 512) && (fileinfo.st_mtime < (time(NULL) - 300))) { if (flags & O_WRONLY) rf = new RemoteFile(pathname, true, false); // Writeable else rf = new RemoteFile(pathname, false, true); // Read-Only if (!rf) return -1; } else { if (flags & O_WRONLY) rb = RingBuffer::Create( pathname, true, false, RingBuffer::kDefaultOpenTimeout, true); // Writeable else rb = RingBuffer::Create( pathname, false, true, RingBuffer::kDefaultOpenTimeout, true); // Read-Only if (!rb) return -1; rb->Start(); } m_fileWrapperLock.lockForWrite(); fileID = getNextFileID(); if (rf) m_remotefiles[fileID] = rf; else if (rb) m_ringbuffers[fileID] = rb; m_filenames[fileID] = pathname; m_fileWrapperLock.unlock(); } m_callbackLock.lock(); if (!m_fileOpenCallbacks.isEmpty()) { QString path(pathname); QHashIterator<QString,Callback> it(m_fileOpenCallbacks); while (it.hasNext()) { it.next(); if (path.startsWith(it.key())) it.value().m_callback(it.value().m_object); } } m_callbackLock.unlock(); return fileID; }
int mythfile_open(const char *pathname, int flags) { VERBOSE(VB_FILE+VB_EXTRA, QString("mythfile_open('%1', %2)").arg(pathname).arg(flags)); struct stat fileinfo; if (mythfile_stat(pathname, &fileinfo)) return -1; if (S_ISDIR( fileinfo.st_mode )) // libmythdvdnav tries to open() a dir return -1; int fileID = -1; if (strncmp(pathname, "myth://", 7)) { int lfd = open(pathname, flags); if (lfd < 0) return -1; m_fileWrapperLock.lockForWrite(); fileID = getNextFileID(); m_localfiles[fileID] = lfd; m_filenames[fileID] = pathname; m_fileWrapperLock.unlock(); } else { RingBuffer *rb = NULL; RemoteFile *rf = NULL; if ((fileinfo.st_size < 51200) && (fileinfo.st_mtime < (time(NULL) - 300))) { if (flags & O_WRONLY) rf = new RemoteFile(pathname, true, false); // Writeable else rf = new RemoteFile(pathname, false, true); // Read-Only if (!rf) return -1; } else { if (flags & O_WRONLY) rb = RingBuffer::Create( pathname, true, false, RingBuffer::kDefaultOpenTimeout, true); // Writeable else rb = RingBuffer::Create( pathname, false, true, RingBuffer::kDefaultOpenTimeout, true); // Read-Only if (!rb) return -1; rb->Start(); } m_fileWrapperLock.lockForWrite(); fileID = getNextFileID(); if (rf) m_remotefiles[fileID] = rf; else if (rb) m_ringbuffers[fileID] = rb; m_filenames[fileID] = pathname; m_fileWrapperLock.unlock(); } return fileID; }