1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
/***************************************************************************
* Copyright (C) 2006-2016 by Ilya Kotov *
* forkotov02@ya.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., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef HTTPSTREAMREADER_H
#define HTTPSTREAMREADER_H
#include <QObject>
#include <QIODevice>
#include <QUrl>
#include <QMutex>
#include <QString>
#include <QHash>
#include <QThread>
#include <curl/curl.h>
#ifdef WITH_ENCA
#include <enca.h>
#endif
class QTextCodec;
class QFileInfo;
class DownloadThread;
class HTTPInputSource;
/*! @internal
* @author Ilya Kotov <forkotov02@ya.ru>
*/
struct HttpStreamData
{
char *buf;
size_t buf_fill;
size_t buf_size;
QString content_type;
bool aborted;
QHash <QString, QByteArray> header;
bool icy_meta_data;
size_t icy_metaint;
};
/*! @internal
* @author Ilya Kotov <forkotov02@ya.ru>
*/
class HttpStreamReader : public QIODevice
{
Q_OBJECT
public:
HttpStreamReader(const QString &url, HTTPInputSource *parent);
virtual ~HttpStreamReader();
/**
* QIODevice API
*/
bool atEnd () const override;
qint64 bytesAvailable () const override;
qint64 bytesToWrite () const override;
void close () override;
bool isSequential () const override;
bool open (OpenMode mode) override;
bool seek (qint64 pos) override;
/**
* helper functions
*/
QString contentType();
void downloadFile();
QMutex *mutex();
HttpStreamData *stream();
void checkBuffer();
void run();
signals:
void ready();
void error();
protected:
qint64 readData(char*, qint64) override;
qint64 writeData(const char*, qint64) override;
private:
void abort();
qint64 readBuffer(char* data, qint64 maxlen);
void readICYMetaData();
void parseICYMetaData(char *data, qint64 size);
void sendStreamInfo(QTextCodec *codec);
CURL *m_handle;
QMutex m_mutex;
HttpStreamData m_stream;
QString m_url;
QString m_userAgent;
size_t m_metacount;
QString m_title;
bool m_ready;
bool m_meta_sent;
size_t m_prebuffer_size;
QTextCodec *m_codec;
DownloadThread *m_thread;
HTTPInputSource *m_parent;
#ifdef WITH_ENCA
EncaAnalyser m_analyser;
QTextCodec *m_prevCodec;
#endif
};
class DownloadThread : public QThread
{
Q_OBJECT
public:
DownloadThread(HttpStreamReader *parent);
virtual ~DownloadThread ();
private:
virtual void run() override;
HttpStreamReader *m_parent;
};
#endif
|