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
|
/***************************************************************************
* copyright : (C) 2006 Ian Monroe <ian@monroe.nu> *
**************************************************************************/
/***************************************************************************
* *
* 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. *
* *
***************************************************************************/
#include "amarok.h"
#include "amarokconfig.h"
#include "daapclient.h"
#include "daapreader/authentication/hasher.h"
#include "debug.h"
#include "proxy.h"
#include <tdeapplication.h>
using namespace Daap;
//input url: daap://host:port/databaseId/music.ext
/*
bundle->setUrl( Amarok::QStringx("http://%1:3689/databases/%2/items/%3.%4?%5").args(
TQStringList() << m_host
<< m_databaseId
<< TQString::number( (*it).asMap()["miid"].asList()[0].asInt() )
<< (*it).asMap()["asfm"].asList()[0].asString()
<< m_loginString ) );
*/
Proxy::Proxy(KURL stream, DaapClient* client, const char* name)
: TQObject(client, name)
, m_proxy( new Amarok::ProcIO() )
{
DEBUG_BLOCK
//find the request id and increment it
const TQString hostKey = stream.host() + ':' + TQString::number(stream.port());
const int revisionId = client->incRevision( hostKey );
const int sessionId = client->getSession( hostKey );
//compose URL
KURL realStream = realStreamUrl( stream, sessionId );
//get hash
char hash[33] = {0};
GenerateHash( 3
, reinterpret_cast<const unsigned char*>((realStream.path() + realStream.query()).ascii())
, 2
, reinterpret_cast<unsigned char*>(hash)
, revisionId );
// Find free port
MyServerSocket* socket = new MyServerSocket();
const int port = socket->port();
debug() << "Proxy server using port: " << port << endl;
delete socket;
m_proxyUrl = KURL( TQString("http://localhost:%1/daap.mp3").arg( port ) );
//start proxy
m_proxy->setComm( TDEProcess::Communication( TDEProcess::AllOutput ) );
*m_proxy << "amarok_proxy.rb";
*m_proxy << "--daap";
*m_proxy << TQString::number( port );
*m_proxy << realStream.url();
*m_proxy << AmarokConfig::soundSystem();
*m_proxy << hash;
*m_proxy << TQString::number( revisionId );
*m_proxy << Amarok::proxyForUrl( realStream.url() );
if( !m_proxy->start( KProcIO::NotifyOnExit, true ) ) {
error() << "Failed to start amarok_proxy.rb" << endl;
return;
}
TQString line;
while( true ) {
kapp->processEvents();
m_proxy->readln( line );
if( line == "AMAROK_PROXY: startup" ) break;
}
debug() << "started amarok_proxy.rb --daap " << TQString::number( port ) << ' ' << realStream.url() << ' ' << AmarokConfig::soundSystem() << ' ' << hash << ' ' << revisionId << endl;
connect( m_proxy, TQT_SIGNAL( processExited( TDEProcess* ) ), this, TQT_SLOT( playbackStopped() ) );
connect( m_proxy, TQT_SIGNAL( readReady( KProcIO* ) ), this, TQT_SLOT( readProxy() ) );
}
Proxy::~Proxy()
{
delete m_proxy;
}
void
Proxy::playbackStopped()
{
deleteLater();
}
void
Proxy::readProxy()
{
TQString line;
while( m_proxy->readln( line ) != -1 )
{
debug() << line << endl;
}
}
KURL Proxy::realStreamUrl( KURL fakeStream, int sessionId )
{
KURL realStream;
realStream.setProtocol( "http" );
realStream.setHost(fakeStream.host());
realStream.setPort(fakeStream.port());
realStream.setPath( "/databases" + fakeStream.directory() + "/items/" + fakeStream.fileName() );
realStream.setQuery( TQString("?session-id=") + TQString::number(sessionId) );
return realStream;
}
#include "proxy.moc"
|