@implementation PEPThread: OFThread
- (void)dealloc
{
- [sock release];
+ [conn release];
[super dealloc];
}
-- (void)MPD_connect
-{
- int64_t pause = 1;
- while(1) {
- @try {
- [sock release];
- sock = [[OFTCPSocket alloc] init];
- [sock connectToHost: @"localhost"
- port: 6600];
- return;
- } @catch (id e) {
- of_log(@"Connection failed, retrying in %" PRIi64
- " seconds", pause);
- [OFThread sleepForTimeInterval: pause];
- if (pause < 120)
- pause *= 2;
- [e release];
- }
- }
-}
-
-- (OFMutableDictionary*)MPD_responseFromSocket: (OFTCPSocket*)sock
-{
- OFString *answer;
- OFMutableDictionary *response = [OFMutableDictionary dictionary];
- while ((answer = [sock readLine]) && ![answer hasPrefix: @"OK"]) {
- size_t index;
- index = [answer indexOfFirstOccurrenceOfString: @":"];
- if (index == OF_INVALID_INDEX)
- continue;
- [response setObject: [answer substringFromIndex: index + 2
- toIndex: answer.length]
- forKey: [answer substringFromIndex: 0
- toIndex: index]];
- }
-
- return response;
-}
-
- (id)main
{
- [self MPD_connect];
- [self MPD_responseFromSocket: sock];
+ OFString *mpd_host;
+ uint16_t mpd_port;
+ OFDictionary *environment = [OFApplication environment];
+ OFString *mpd_port_string;
+ mpd_host = [environment objectForKey: @"MPD_HOST"];
+ if (mpd_host == nil)
+ mpd_host = @"localhost";
+ mpd_port_string = [environment objectForKey: @"MPD_PORT"];
+ if (mpd_port_string && [mpd_port_string decimalValue] <= UINT16_MAX)
+ mpd_port = (uint16_t) [mpd_port_string decimalValue];
+ else
+ mpd_port = 6600;
+ conn = [[MPDConnection alloc] initWithHost: mpd_host
+ port: mpd_port];
+ [conn connect];
while (1) {
OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init];
@try {
tune = [OFXMLElement elementWithName: @"tune"
namespace: NS_TUNE];
[item addChild: tune];
- [sock writeLine: @"status"];
- response = [self MPD_responseFromSocket: sock];
+
+ [conn send: @"command_list_begin"];
+ [conn send: @"status"];
+ [conn send: @"currentsong"];
+ [conn send: @"command_list_end"];
+ response = [conn response];
+
if ([[response objectForKey: @"state"]
isEqual: @"play"]) {
- [sock writeLine: @"currentsong"];
- response = [self MPD_responseFromSocket: sock];
if ((answer =
[response objectForKey: @"Artist"]))
[tune addChild: [OFXMLElement
elementWithName: @"title"
namespace: NS_TUNE
stringValue: answer]];
+ else if ((answer =
+ [response objectForKey: @"file"]))
+ [tune addChild: [OFXMLElement
+ elementWithName: @"title"
+ namespace: NS_TUNE
+ stringValue: answer]];
if ((answer =
[response objectForKey: @"Track"]))
[tune addChild: [OFXMLElement
stringValue: answer]];
}
[object sendStanza: tuneIQ];
- [sock writeLine: @"idle player"];
- [self MPD_responseFromSocket: sock];
+ [conn idle];
} @catch (id e) {
- [self MPD_connect];
- [self MPD_responseFromSocket: sock];
+ [conn connect];
[e release];
}
[pool release];