void PluginStream::deliverData() { ASSERT(m_deliveryData); if (m_streamState == StreamStopped) // FIXME: We should cancel our job in the SubresourceLoader on error so we don't reach this case return; ASSERT(m_streamState != StreamBeforeStarted); if (!m_stream.ndata || m_deliveryData->size() == 0) return; int32_t totalBytes = m_deliveryData->size(); int32_t totalBytesDelivered = 0; if (m_loader) m_loader->setDefersLoading(true); while (totalBytesDelivered < totalBytes) { int32_t deliveryBytes = m_pluginFuncs->writeready(m_instance, &m_stream); if (deliveryBytes <= 0) { m_delayDeliveryTimer.startOneShot(0); break; } else { deliveryBytes = min(deliveryBytes, totalBytes - totalBytesDelivered); int32_t dataLength = deliveryBytes; char* data = m_deliveryData->data() + totalBytesDelivered; // Write the data deliveryBytes = m_pluginFuncs->write(m_instance, &m_stream, m_offset, dataLength, (void*)data); if (deliveryBytes < 0) { LOG_PLUGIN_NET_ERROR(); if (m_loader) m_loader->setDefersLoading(false); cancelAndDestroyStream(NPRES_NETWORK_ERR); return; } deliveryBytes = min(deliveryBytes, dataLength); m_offset += deliveryBytes; totalBytesDelivered += deliveryBytes; } } if (m_loader) m_loader->setDefersLoading(false); if (totalBytesDelivered > 0) { if (totalBytesDelivered < totalBytes) { int remainingBytes = totalBytes - totalBytesDelivered; memmove(m_deliveryData->data(), m_deliveryData->data() + totalBytesDelivered, remainingBytes); m_deliveryData->resize(remainingBytes); } else { m_deliveryData->resize(0); if (m_reason != WebReasonNone) destroyStream(); } } }
void PluginStream::didFail(NetscapePlugInStreamLoader* loader, const ResourceError&) { ASSERT(loader == m_loader); LOG_PLUGIN_NET_ERROR(); // destroyStream can result in our being deleted RefPtr<PluginStream> protect(this); destroyStream(NPRES_NETWORK_ERR); m_loader = 0; }