Source code for pysiriproxy.packetPlayer

# Copyright (C) (c) 2012 Brett Ponsler, Pete Lamonica, Pete Lamonica
# This file is part of pysiriproxy.
#
# pysiriproxy 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 3 of the License, or
# (at your option) any later version.
#
# pysiriproxy is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with pysiriproxy.  If not, see <http://www.gnu.org/licenses/>.
'''Contains the Player class.'''
from pysiriproxy.utils import toHex
from pysiriproxy.constants import Modes

from pyamp.processes.threading import Thread


[docs]class Player(Thread): '''The Player class loads a file containing data which it proceeds to send to the given protocol class using the same interface used to handle connections to the server. This allows us to save incoming data to the server and replay it for testing purposes. ''' def __init__(self, protocol, filename, logger): ''' * protocol -- The server protocol class * filename -- The filename containing to data to replay * logger -- The logger ''' Thread.__init__(self) self.__log = logger.get("PacketPlayer") self.__protocol = protocol(logger=logger) self.__content = file(filename).read() self.__lines = self.__content.split("-END_OF_DATA-") self.__index = 0 # Start in Line mode self.__setMode(Modes.Line) # Map the fuction to call based on the current mode self.__modeMap = {Modes.Line: self.__sendLineData, Modes.Raw: self.__sendRawData}
[docs] def onCycle(self, i): '''Called during each cycle of the thread.''' if self.__index >= len(self.__lines): self.shutdown() return # The first cycle corresponds to a created connection if i == 1: self.__protocol.connectionMade() # Only send data once per second if i % 10 == 0: # Call the data sending function for the current mode modeFn = self.__modeMap.get(self.__protocol.getMode()) if modeFn is not None: modeFn()
[docs] def onShutdown(self): '''Called in the event that the thread is shutdown.''' self.__protocol.connectionLost("Player thread shutdown")
[docs] def onException(self, e, traceback): '''An exception occurred. * e -- The exception * traceback -- The traceback ''' self.__log.error("Traceback:", traceback) self.shutdown() ##### Private functions #####
def __sendLineData(self): '''Send a line of data to the server.''' data = self.__lines[self.__index] self.__protocol.lineReceived(data) self.__index += 1 def __sendRawData(self): '''Send raw data to the server.''' # True to send all remaining data, else to send parts _SEND_ALL = False # The two ways of choosing data to send if _SEND_ALL: # Send all remaining data at once lines = self.__lines[self.__index:] self.__index = len(self.__lines) data = '\n'.join(lines) else: # Send parts of the remaining data lines = self.__lines[self.__index] self.__index += 1 data = lines self.__protocol.rawDataReceived(data) def __setMode(self, mode): '''Set the data sending mode. * mode -- The mode ''' self.__mode = mode