summaryrefslogtreecommitdiffstats
path: root/noatun/library/titleproxy.h
blob: 541f3190914882271d035c07d9de228a55b1d0c9 (plain)
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
/***************************************************************************
                     titleproxy.h  -  description
                        -------------------
begin                : Nov 20 14:35:18 CEST 2003
copyright            : (C) 2003 by Mark Kretschmann
email                :
***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   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.                                   *
 *                                                                         *
 ***************************************************************************/

#ifndef AMAROK_TITLEPROXY_H
#define AMAROK_TITLEPROXY_H

#include <kurl.h>             //stack allocated

#include <tqobject.h>
#include <tqserversocket.h>    //baseclass
#include <tqsocket.h>          //stack allocated

class QString;

namespace TitleProxy
{
    /**
     * Proxy Concept:
     * 1. Connect to streamserver
     * 2. Listen on localhost, let aRts connect to proxyserver
     * 3. Write GET request to streamserver, containing Icy-MetaData:1 token
     * 4. Read MetaInt token from streamserver (==metadata offset)
     *
     * 5. Read stream data (mp3 + metadata) from streamserver
     * 6. Filter out metadata, send to app
     * 7. Write mp3 data to proxyserver
     * 8. Goto 5
     *
     * Some info on the shoutcast metadata protocol can be found at:
     * @see http://www.smackfu.com/stuff/programming/shoutcast.html
     *
     * @short A proxy server for extracting metadata from Shoutcast streams.
     */

    class Proxy : public QObject
    {
            Q_OBJECT
        public:
            Proxy( KURL url );
            ~Proxy();

            bool initSuccess() { return m_initSuccess; }
            KURL proxyUrl();

        signals:
				void metaData(
					const TQString &streamName,
					const TQString &streamGenre,
					const TQString &streamUrl,
					const TQString &streamBitrate,
					const TQString &trackTitle,
					const TQString &trackUrl);
            void proxyError();

        private slots:
            void accept( int socket );
            void connectToHost();
            void sendRequest();
            void readRemote();
            void connectError();

        private:
            bool processHeader( Q_LONG &index, Q_LONG bytesRead );
            void transmitData( const TQString &data );
            void error();
            TQString extractStr( const TQString &str, const TQString &key );

        //ATTRIBUTES:
            KURL m_url;
            int m_streamingMode;
            bool m_initSuccess;
            bool m_connectSuccess;

            int m_metaInt;
            TQString m_bitRate;
            int m_byteCount;
            uint m_metaLen;

            TQString m_metaData;
            bool m_headerFinished;
            TQString m_headerStr;
            int m_usedPort;
            TQString m_lastMetadata;
            bool m_icyMode;

            TQString m_streamName;
            TQString m_streamGenre;
            TQString m_streamUrl;

            char *m_pBuf;

            TQSocket m_sockRemote;
            TQSocket m_sockProxy;
    };


    class Server : public QServerSocket
    {
            Q_OBJECT

        public:
            Server( Q_UINT16 port, TQObject* parent )
                    : TQServerSocket( port, 1, parent, "TitleProxyServer" ) {};

        signals:
            void connected( int socket );

        private:
            void newConnection( int socket ) { emit connected( socket ); }
    };

} //namespace TitleProxy

#endif /*AMAROK_TITLEPROXY_H*/