--- /dev/null
+/*
+ * Copyright (c) 2011, Florian Zeitz <florob@babelmonkeys.de>
+ *
+ * http://cgit.babelmonkeys.de/cgit.cgi/mpdbot/
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice is present in all copies.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+@interface MPDConnection: OFObject
+OFTCPSocket *sock;
+OFString *mpd_host;
+uint16_t mpd_port;
+
+- (void)connect;
+- (OFMutableDictionary*)response;
+- (void)send: (OFString*)message;
+- (void)idle;
+- initWithHost: (OFString*)host
+ port: (uint16_t)port;
+@end
--- /dev/null
+/*
+ * Copyright (c) 2011, Florian Zeitz <florob@babelmonkeys.de>
+ *
+ * http://cgit.babelmonkeys.de/cgit.cgi/mpdbot/
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice is present in all copies.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import <ObjFW/ObjFW.h>
+
+#import "MPDConnection.h"
+
+@implementation MPDConnection: OFObject
+- initWithHost: (OFString*)host
+ port: (uint16_t)port
+{
+ self = [super init];
+
+ mpd_host = [host copy];
+ mpd_port = port;
+
+ return self;
+}
+
+- (void)dealloc
+{
+ [sock release];
+ [mpd_host release];
+
+ [super dealloc];
+}
+
+- (void)connect
+{
+ int64_t pause = 1;
+ while(1) {
+ @try {
+ [sock release];
+ sock = [[OFTCPSocket alloc] init];
+ [sock connectToHost: mpd_host
+ port: mpd_port];
+ [self response];
+ return;
+ } @catch (id e) {
+ [of_stderr writeFormat: @"Connection failed, retrying"
+ @" in %" PRIi64 @" seconds\n", pause];
+ [OFThread sleepForTimeInterval: pause];
+ if (pause < 120)
+ pause *= 2;
+ [e release];
+ }
+ }
+}
+
+- (void)send: (OFString*)message
+{
+ [sock writeLine: message];
+}
+
+- (void)idle
+{
+ [sock writeLine: @"idle player"];
+ [self response];
+}
+
+- (OFMutableDictionary*)response
+{
+ 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;
+}
+@end
* POSSIBILITY OF SUCH DAMAGE.
*/
-@interface PEPThread: OFThread
-- (void)MPD_connect;
-- (OFMutableDictionary*)MPD_responseFromSocket: (OFTCPSocket*)sock;
+#import "MPDConnection.h"
-OFTCPSocket *sock;
-OFString *mpd_host;
-uint16_t mpd_port;
+@interface PEPThread: OFThread
+MPDConnection *conn;
@end
@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: mpd_host
- port: mpd_port];
- return;
- } @catch (id e) {
- [of_stderr writeFormat: @"Connection failed, retrying"
- @" in %" PRIi64 @" seconds\n", 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
{
+ OFString *mpd_host;
+ uint16_t mpd_port;
OFDictionary *environment = [OFApplication environment];
OFString *mpd_port_string;
mpd_host = [environment objectForKey: @"MPD_HOST"];
mpd_port = (uint16_t) [mpd_port_string decimalValue];
else
mpd_port = 6600;
- [self MPD_connect];
- [self MPD_responseFromSocket: sock];
+ 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: @"status"];
+ response = [conn response];
if ([[response objectForKey: @"state"]
isEqual: @"play"]) {
- [sock writeLine: @"currentsong"];
- response = [self MPD_responseFromSocket: sock];
+ [conn send: @"currentsong"];
+ response = [conn response];
if ((answer =
[response objectForKey: @"Artist"]))
[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];