From 019a40e0c0a37d29d1f4c70cf9eeadf1590a15b0 Mon Sep 17 00:00:00 2001 From: Florian Zeitz Date: Thu, 28 Jul 2011 21:46:09 +0200 Subject: [PATCH] Move MPD connection in a separate class --- src/MPDConnection.h | 34 ++++++++++++++++ src/MPDConnection.m | 97 +++++++++++++++++++++++++++++++++++++++++++++ src/PEPThread.h | 9 ++--- src/PEPThread.m | 62 ++++++----------------------- 4 files changed, 146 insertions(+), 56 deletions(-) create mode 100644 src/MPDConnection.h create mode 100644 src/MPDConnection.m diff --git a/src/MPDConnection.h b/src/MPDConnection.h new file mode 100644 index 0000000..e776e6e --- /dev/null +++ b/src/MPDConnection.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2011, Florian Zeitz + * + * 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 diff --git a/src/MPDConnection.m b/src/MPDConnection.m new file mode 100644 index 0000000..8c610aa --- /dev/null +++ b/src/MPDConnection.m @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2011, Florian Zeitz + * + * 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 + +#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 diff --git a/src/PEPThread.h b/src/PEPThread.h index b483fc2..049c4d9 100644 --- a/src/PEPThread.h +++ b/src/PEPThread.h @@ -20,11 +20,8 @@ * 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 diff --git a/src/PEPThread.m b/src/PEPThread.m index cd13eb3..80577e1 100644 --- a/src/PEPThread.m +++ b/src/PEPThread.m @@ -31,52 +31,15 @@ @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"]; @@ -87,8 +50,9 @@ 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 { @@ -113,12 +77,12 @@ 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 @@ -150,11 +114,9 @@ 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]; -- 2.39.2