void WidgetSessions::showRelated(const qmf::Data& object, const QString &widget_type, ArrowDirection a) { if (!updateAll) if (this->hasData() && (arrow() != arrowNone)) { //qDebug("showRelated: %s needs an update", this->objectName().toStdString().c_str()); emit needUpdate(); return; } setArrow(a); if (widget_type == "widgetConnections") { qpid::types::Variant value = object.getProperty("address"); std::string name = value.asString(); related->setRelatedData("connectionRef", name); related->clearFilter(); emit needData(); return; } // the object is a subscription qpid::types::Variant value = object.getProperty("sessionRef"); QString name(value.asMap()["_object_name"].asString().c_str()); QString session = name.section(':', -1); related->setRelatedData("name", session.toStdString()); related->clearFilter(); //qDebug("showRelated: %s needs new data", this->objectName().toStdString().c_str()); emit needData(); }
bool StreamReader::read(quint64 pos, int *length, char *buffer) { QMutexLocker lock(&m_mutex); DEBUG_BLOCK; bool ret = true; if (m_unlocked) { return ret; } if (currentPos() != pos) { if (!streamSeekable()) { return false; } setCurrentPos(pos); } if (m_buffer.capacity() < *length) { m_buffer.reserve(*length); } while (currentBufferSize() < static_cast<unsigned int>(*length)) { quint64 oldSize = currentBufferSize(); needData(); m_waitingForData.wait(&m_mutex); if (oldSize == currentBufferSize()) { if (m_eos && m_buffer.isEmpty()) { return false; } // We didn't get any more data *length = static_cast<int>(oldSize); // If we have some data to return, why tell to reader that we failed? // Remember that length argument is more like maxSize not requiredSize ret = true; } } if (m_mediaObject->state() != Phonon::BufferingState && m_mediaObject->state() != Phonon::LoadingState) { enoughData(); } memcpy(buffer, m_buffer.data(), *length); m_pos += *length; // trim the buffer by the amount read m_buffer = m_buffer.mid(*length); return ret; }
HRESULT read(LONGLONG pos, LONG length, BYTE *buffer, LONG *actual) { QMutexLocker locker(&m_mutexRead); if (m_mediaGraph->isStopping()) { return VFW_E_WRONG_STATE; } if(streamSize() != 1 && pos + length > streamSize()) { //it tries to read outside of the boundaries return E_FAIL; } if (currentPos() - currentBufferSize() != pos) { if (!streamSeekable()) { return S_FALSE; } setCurrentPos(pos); } int oldSize = currentBufferSize(); while (currentBufferSize() < int(length)) { needData(); if (m_mediaGraph->isStopping()) { return VFW_E_WRONG_STATE; } if (oldSize == currentBufferSize()) { break; //we didn't get any data } oldSize = currentBufferSize(); } DWORD bytesRead = qMin(currentBufferSize(), int(length)); { QWriteLocker locker(&m_lock); qMemCopy(buffer, m_buffer.data(), bytesRead); //truncate the buffer m_buffer = m_buffer.mid(bytesRead); } if (actual) { *actual = bytesRead; //initialization } return bytesRead == length ? S_OK : S_FALSE; }