Move MpdSession to a session module

This commit is contained in:
Stein Magnus Jodal 2012-10-16 16:13:20 +02:00
parent d9d6a3d5b6
commit d4f5d02c72
3 changed files with 63 additions and 57 deletions

View File

@ -4,8 +4,8 @@ import sys
from pykka import registry, actor from pykka import registry, actor
from mopidy import core, settings from mopidy import core, settings
from mopidy.frontends.mpd import dispatcher, protocol from mopidy.frontends.mpd import session
from mopidy.utils import locale_decode, log, network, process from mopidy.utils import locale_decode, network, process
logger = logging.getLogger('mopidy.frontends.mpd') logger = logging.getLogger('mopidy.frontends.mpd')
@ -33,7 +33,7 @@ class MpdFrontend(actor.ThreadingActor, core.CoreListener):
try: try:
network.Server( network.Server(
hostname, port, hostname, port,
protocol=MpdSession, protocol_kwargs={'core': core}, protocol=session.MpdSession, protocol_kwargs={'core': core},
max_connections=settings.MPD_SERVER_MAX_CONNECTIONS) max_connections=settings.MPD_SERVER_MAX_CONNECTIONS)
except IOError as error: except IOError as error:
logger.error( logger.error(
@ -43,7 +43,7 @@ class MpdFrontend(actor.ThreadingActor, core.CoreListener):
logger.info(u'MPD server running at [%s]:%s', hostname, port) logger.info(u'MPD server running at [%s]:%s', hostname, port)
def on_stop(self): def on_stop(self):
process.stop_actors_by_class(MpdSession) process.stop_actors_by_class(session.MpdSession)
def send_idle(self, subsystem): def send_idle(self, subsystem):
# FIXME this should be updated once pykka supports non-blocking calls # FIXME this should be updated once pykka supports non-blocking calls
@ -53,7 +53,7 @@ class MpdFrontend(actor.ThreadingActor, core.CoreListener):
'attr_path': ('on_idle',), 'attr_path': ('on_idle',),
'args': [subsystem], 'args': [subsystem],
'kwargs': {}, 'kwargs': {},
}, target_class=MpdSession) }, target_class=session.MpdSession)
def playback_state_changed(self, old_state, new_state): def playback_state_changed(self, old_state, new_state):
self.send_idle('player') self.send_idle('player')
@ -66,53 +66,3 @@ class MpdFrontend(actor.ThreadingActor, core.CoreListener):
def volume_changed(self): def volume_changed(self):
self.send_idle('mixer') self.send_idle('mixer')
class MpdSession(network.LineProtocol):
"""
The MPD client session. Keeps track of a single client session. Any
requests from the client is passed on to the MPD request dispatcher.
"""
terminator = protocol.LINE_TERMINATOR
encoding = protocol.ENCODING
delimiter = r'\r?\n'
def __init__(self, connection, core=None):
super(MpdSession, self).__init__(connection)
self.dispatcher = dispatcher.MpdDispatcher(session=self, core=core)
def on_start(self):
logger.info(u'New MPD connection from [%s]:%s', self.host, self.port)
self.send_lines([u'OK MPD %s' % protocol.VERSION])
def on_line_received(self, line):
logger.debug(
u'Request from [%s]:%s to %s: %s',
self.host, self.port, self.actor_urn, line)
response = self.dispatcher.handle_request(line)
if not response:
return
logger.debug(
u'Response to [%s]:%s from %s: %s',
self.host, self.port, self.actor_urn,
log.indent(self.terminator.join(response)))
self.send_lines(response)
def on_idle(self, subsystem):
self.dispatcher.handle_idle(subsystem)
def decode(self, line):
try:
return super(MpdSession, self).decode(line.decode('string_escape'))
except ValueError:
logger.warning(
u'Stopping actor due to unescaping error, data '
u'supplied by client was not valid.')
self.stop()
def close(self):
self.stop()

View File

@ -0,0 +1,56 @@
import logging
from mopidy.frontends.mpd import dispatcher, protocol
from mopidy.utils import log, network
logger = logging.getLogger('mopidy.frontends.mpd')
class MpdSession(network.LineProtocol):
"""
The MPD client session. Keeps track of a single client session. Any
requests from the client is passed on to the MPD request dispatcher.
"""
terminator = protocol.LINE_TERMINATOR
encoding = protocol.ENCODING
delimiter = r'\r?\n'
def __init__(self, connection, core=None):
super(MpdSession, self).__init__(connection)
self.dispatcher = dispatcher.MpdDispatcher(session=self, core=core)
def on_start(self):
logger.info(u'New MPD connection from [%s]:%s', self.host, self.port)
self.send_lines([u'OK MPD %s' % protocol.VERSION])
def on_line_received(self, line):
logger.debug(
u'Request from [%s]:%s to %s: %s',
self.host, self.port, self.actor_urn, line)
response = self.dispatcher.handle_request(line)
if not response:
return
logger.debug(
u'Response to [%s]:%s from %s: %s',
self.host, self.port, self.actor_urn,
log.indent(self.terminator.join(response)))
self.send_lines(response)
def on_idle(self, subsystem):
self.dispatcher.handle_idle(subsystem)
def decode(self, line):
try:
return super(MpdSession, self).decode(line.decode('string_escape'))
except ValueError:
logger.warning(
u'Stopping actor due to unescaping error, data '
u'supplied by client was not valid.')
self.stop()
def close(self):
self.stop()

View File

@ -4,7 +4,7 @@ from pykka.registry import ActorRegistry
from mopidy import core, settings from mopidy import core, settings
from mopidy.backends import dummy from mopidy.backends import dummy
from mopidy.frontends import mpd from mopidy.frontends.mpd import session
from tests import unittest from tests import unittest
@ -27,7 +27,7 @@ class BaseTestCase(unittest.TestCase):
self.core = core.Core.start(backend=self.backend).proxy() self.core = core.Core.start(backend=self.backend).proxy()
self.connection = MockConnection() self.connection = MockConnection()
self.session = mpd.MpdSession(self.connection, core=self.core) self.session = session.MpdSession(self.connection, core=self.core)
self.dispatcher = self.session.dispatcher self.dispatcher = self.session.dispatcher
self.context = self.dispatcher.context self.context = self.dispatcher.context