PDA

View Full Version : Custom QNetworkReply for WebView



victor.yacovlev
1st April 2009, 13:32
Hi all,

I'm trying to create a processing tunnel for web-browser (based on demo's browser), which should translate XML data into HTML representation.

I have overriden QNetworkAccessManager::createRequest to create new replies.
Also I have subclassed QNetworkReply and implemented its virtual methods: bytesAvailable, readData, close and abort. But no one of them are called, even signals like readyRead() and finished() are emited. What is wrong?



ProcessedReply::ProcessedReply(QNetworkAccessManag er::Operation op, const QNetworkRequest &req, const QByteArray &data, QObject *parent)
: QNetworkReply(parent), m_data(data), m_pos(0)
{
setOperation(op);
setRequest(req);
emit readyRead();
emit downloadProgress(0, m_data.size());
emit downloadProgress(m_data.size(), m_data.size());
emit finished();
}

qint64 ProcessedReply::bytesAvailable() const
{
return m_data.size();
}

void ProcessedReply::close()
{

QIODevice::close();
m_pos = 0;
}

qint64 ProcessedReply::readData(char *data, qint64 maxlen)
{
qint64 result = 0;
QByteArray portion = m_data.mid(m_pos,maxlen);
result = portion.size();
strcpy(data, portion.data());
emit readyRead();
return result;
}

void ProcessedReply::abort()
{
m_pos = 0;
}

QNetworkReply *NetworkAccessManager::createRequest(Operation op,const QNetworkRequest &req,QIODevice *outgoingData)
{
QNetworkReply *reply = QNetworkAccessManager::createRequest(op,req,outgoi ngData);
QString contentType = reply->header(QNetworkRequest::ContentTypeHeader).toStrin g();
QUrl url = reply->url();
QString scheme = url.scheme();
QString fileName = url.toLocalFile();
bool localLpml = url.scheme()=="file" && fileName.endsWith(".lpml");
if (contentType.contains("lpml") || localLpml) {
QByteArray data = LPMLProcessor::instance()->handleXMLData(reply);
QNetworkReply *newReply = new ProcessedReply(op, req, data, this);
return newReply;
}
return reply;
}