/***************************************************************************
* Copyright (C) 2006-2011 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include <QApplication>
#include <QStringList>
#include <QDir>
#include <QSettings>
#include <QTextCodec>
#include <stdint.h>
#include <stdlib.h>
#include <qmmp/qmmpsettings.h>
#include <qmmp/qmmp.h>
#include <qmmp/statehandler.h>
#include "httpstreamreader.h"
//curl callbacks
static size_t curl_write_data(void *data, size_t size, size_t nmemb,
void *pointer)
{
HttpStreamReader *dl = (HttpStreamReader *)pointer;
dl->mutex()->lock ();
size_t buf_start = dl->stream()->buf_fill;
size_t data_size = size * nmemb;
dl->stream()->buf_fill += data_size;
dl->stream()->buf = (char *)realloc (dl->stream()->buf, dl->stream()->buf_fill);
memcpy (dl->stream()->buf + buf_start, data, data_size);
dl->mutex()->unlock();
dl->checkBuffer();
return data_size;
}
static size_t curl_header(void *data, size_t size, size_t nmemb,
void *pointer)
{
HttpStreamReader *dl = (HttpStreamReader *)pointer;
dl->mutex()->lock ();
size_t data_size = size * nmemb;
if (data_size < 3)
{
dl->mutex()->unlock();
return data_size;
}
//qDebug("header received: %s", (char*) data);
QString str = QString::fromAscii((char *) data, data_size);
str = str.trimmed ();
if (str.left(4).contains("HTTP"))
{
qDebug("HttpStreamReader: header received");
//TODO open metadata socket
}
else if (str.left(4).contains("ICY"))
{
qDebug("HttpStreamReader: shoutcast header received");
//dl->stream()->icy_meta_data = true;
}
else
{
QString key = str.left(str.indexOf(":")).trimmed().toLower();
QString value = str.right(str.size() - str.indexOf(":") - 1).trimmed();
dl->stream()->header.insert(key, value);
qDebug("HttpStreamReader: key=%s, value=%s",qPrintable(key),qPrintable(value));
if (key == "icy-metaint")
{
dl->stream()->icy_metaint = value.toInt();
dl->stream()->icy_meta_data = true;
}
}
dl->mutex()->unlock();
return data_size;
}
int curl_progress(void *pointer, double dltotal, double dlnow, double ultotal, double ulnow)
{
Q_UNUSED(dltotal);
Q_UNUSED(dlnow);
Q_UNUSED(ultotal);
Q_UNUSED(ulnow);
HttpStreamReader *dl = (HttpStreamReader *)pointer;
dl->mutex()->lock ();
bool aborted = dl->stream()->aborted;
dl->mutex()->unlock();
if (aborted)
return -1;
return 0;
}
HttpStreamReader::HttpStreamReader(const QString &url, QObject *parent)
: QIODevice(parent)
{
m_url = url;
curl_global_init(CURL_GLOBAL_ALL);
m_stream.buf_fill = 0;
m_stream.buf = 0;
m_stream.icy_meta_data = false;
m_stream.aborted = true;
m_stream.icy_metaint = 0;
m_handle = 0;
m_metacount = 0;
m_meta_sent = false;
m_thread = new DownloadThread(this);
QSettings settings(Qmmp::configFile(), QSettings::IniFormat);
settings.beginGroup("HTTP");
m_codec = QTextCodec::codecForName(settings.value("icy_encoding","windows-1252").toByteArray ());
m_buffer_size = settings.value("buffer_size",128).toInt() * 1000;
if (!m_codec)
m_codec = QTextCodec::codecForName ("UTF-8");
#ifdef WITH_ENCA
m_analyser = 0;
if(settings.value("use_enca", false).toBool())