def test_codecs(self): command1 = PJLinkCommandLine(PJLinkProtocol.POWER, PJLinkProtocol.ON) self.failUnlessEqual(command1.version, 1) self.failUnlessEqual(command1.command, PJLinkProtocol.POWER) self.failUnlessEqual(command1.data, PJLinkProtocol.ON) command2 = PJLinkCommandLine.decode(command1.encode()) self.failUnlessEqual(command1.encode(), command2.encode()) self.failUnlessEqual(command1.command, command2.command) self.failUnless(command1.data, command2.data) self.failUnless(command1.version, command2.version) response1 = PJLinkResponse(PJLinkProtocol.POWER, "1") self.failUnlessEqual(response1.version, 1) self.failUnlessEqual(response1.command, PJLinkProtocol.POWER) self.failUnlessEqual(response1.data, "1") response2 = PJLinkResponse.decode(response1.encode()) self.failUnlessEqual(response1.encode(), response2.encode()) self.failUnlessEqual(response1.version, response2.version) self.failUnlessEqual(response1.command, response2.command) self.failUnlessEqual(response1.data, response2.data)
def run(self): if self.running: return self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.server.bind(('127.0.0.1',self.port)) self.server.listen(self.backlog) self.running = True while self.running: client, address = self.server.accept() auth_request = PJLinkAuthenticationRequest(self.password) client.send(auth_request.encode()) data = client.recv(self.buffer_size) if not data: client.close() continue response = None command_line = PJLinkCommandLine.decode(data) if not auth_request.authentication_hash_matches(command_line.authentication_hash): response = PJLinkResponse(PJLinkProtocol.AUTHENTICATE, PJLinkProtocol.INVALID_PASSWORD_ERROR, version=None) client.send(response.encode()) client.close() continue if command_line.command == PJLinkProtocol.POWER: if command_line.data == PJLinkProtocol.ON or command_line.data == PJLinkProtocol.OFF: self.power_state = command_line.data for lamp in self.lamps: lamp[1] = command_line.data == PJLinkProtocol.ON response = PJLinkResponse(PJLinkProtocol.POWER, PJLinkProtocol.OK) elif command_line.data == PJLinkProtocol.QUERY: response = PJLinkResponse(PJLinkProtocol.POWER, self.power_state) else: response = PJLinkResponse(command_line.command, PJLinkProtocol.ERROR_2) elif command_line.command == PJLinkProtocol.INPUT: if command_line.data == PJLinkProtocol.QUERY: response = PJLinkResponse(command_line.command, '%s%s' % (self.input[0], self.input[1])) elif len(command_line.data) == 2: self.input = [command_line.data[0], command_line.data[1]] response = PJLinkResponse(command_line.command, PJLinkProtocol.OK) else: response = PJLinkResponse(command_line.commands, PJLinkProtocol.ERROR_2) elif command_line.command == PJLinkProtocol.AVAILABLE_INPUTS: if command_line.data == PJLinkProtocol.QUERY: data = ' '.join(['%s%s' % (input[0], input[1]) for input in self.available_inputs]) response = PJLinkResponse(command_line.command, data) else: response = PJLinkResponse(command_line.commands, PJLinkProtocol.ERROR_2) elif command_line.command == PJLinkProtocol.MUTE: if command_line.data == PJLinkProtocol.QUERY: response = PJLinkResponse(command_line.command, self.mute_state) elif command_line.data == PJLinkProtocol.AUDIO_VIDEO_MUTE_ON or command_line.data == PJLinkProtocol.AUDIO_VIDEO_MUTE_OFF or command_line.data == PJLinkProtocol.VIDEO_MUTE_ON or command_line.data == PJLinkProtocol.VIDEO_MUTE_OFF or command_line.data == PJLinkProtocol.AUDIO_MUTE_ON or command_line.data == PJLinkProtocol.AUDIO_MUTE_OFF: self.mute_state = command_line.data response = PJLinkResponse(command_line.command, PJLinkProtocol.OK) else: response = PJLinkResponse(command_line.command, PJLinkProtocol.ERROR_2) elif command_line.command == PJLinkProtocol.NAME: if command_line.data == PJLinkProtocol.QUERY: response = PJLinkResponse(command_line.command, self.projector_name) else: response = PJLinkResponse(command_line.command, PJLinkProtocol.ERROR_2) elif command_line.command == PJLinkProtocol.MANUFACTURE_NAME: if command_line.data == PJLinkProtocol.QUERY: response = PJLinkResponse(command_line.command, self.manufacture_name) else: response = PJLinkResponse(command_line.command, PJLinkProtocol.ERROR_2) elif command_line.command == PJLinkProtocol.PRODUCT_NAME: if command_line.data == PJLinkProtocol.QUERY: response = PJLinkResponse(command_line.command, self.product_name) else: response = PJLinkResponse(command_line.command, PJLinkProtocol.ERROR_2) elif command_line.command == PJLinkProtocol.OTHER_INFO: if command_line.data == PJLinkProtocol.QUERY: response = PJLinkResponse(command_line.command, self.other_info) else: response = PJLinkResponse(command_line.command, PJLinkProtocol.ERROR_2) elif command_line.command == PJLinkProtocol.CLASS_INFO: if command_line.data == PJLinkProtocol.QUERY: response = PJLinkResponse(command_line.command, self.class_info) else: response = PJLinkResponse(command_line.command, PJLinkProtocol.ERROR_2) elif command_line.command == PJLinkProtocol.ERROR_STATUS: if command_line.data == PJLinkProtocol.QUERY: data = ''.join([error[1] for error in self.errors]) response = PJLinkResponse(command_line.command, data) else: response = PJLinkResponse(command_line.command, PJLinkProtocol.ERROR_2) elif command_line.command == PJLinkProtocol.LAMP: if command_line.data == PJLinkProtocol.QUERY: data = ' '.join(['%s %s' % (lamp[0], '1' if lamp[1] == True else '0') for lamp in self.lamps]) response = PJLinkResponse(command_line.command, data) else: response = PJLinkResponse(command_line.command, PJLinkProtocol.ERROR_2) else: response = PJLinkResponse(command_line.command, PJLinkProtocol.ERROR_1) client.send(response.encode()) client.close() self.server.close()
def run(self): if self.running: return self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.server.bind(('127.0.0.1', self.port)) self.server.listen(self.backlog) self.running = True while self.running: client, address = self.server.accept() auth_request = PJLinkAuthenticationRequest(self.password) client.send(auth_request.encode()) data = client.recv(self.buffer_size) if not data: client.close() continue response = None command_line = PJLinkCommandLine.decode(data) if not auth_request.authentication_hash_matches( command_line.authentication_hash): response = PJLinkResponse( PJLinkProtocol.AUTHENTICATE, PJLinkProtocol.INVALID_PASSWORD_ERROR, version=None) client.send(response.encode()) client.close() continue if command_line.command == PJLinkProtocol.POWER: if command_line.data == PJLinkProtocol.ON or command_line.data == PJLinkProtocol.OFF: self.power_state = command_line.data for lamp in self.lamps: lamp[1] = command_line.data == PJLinkProtocol.ON response = PJLinkResponse(PJLinkProtocol.POWER, PJLinkProtocol.OK) elif command_line.data == PJLinkProtocol.QUERY: response = PJLinkResponse(PJLinkProtocol.POWER, self.power_state) else: response = PJLinkResponse(command_line.command, PJLinkProtocol.ERROR_2) elif command_line.command == PJLinkProtocol.INPUT: if command_line.data == PJLinkProtocol.QUERY: response = PJLinkResponse( command_line.command, '%s%s' % (self.input[0], self.input[1])) elif len(command_line.data) == 2: self.input = [command_line.data[0], command_line.data[1]] response = PJLinkResponse(command_line.command, PJLinkProtocol.OK) else: response = PJLinkResponse(command_line.commands, PJLinkProtocol.ERROR_2) elif command_line.command == PJLinkProtocol.AVAILABLE_INPUTS: if command_line.data == PJLinkProtocol.QUERY: data = ' '.join([ '%s%s' % (input[0], input[1]) for input in self.available_inputs ]) response = PJLinkResponse(command_line.command, data) else: response = PJLinkResponse(command_line.commands, PJLinkProtocol.ERROR_2) elif command_line.command == PJLinkProtocol.MUTE: if command_line.data == PJLinkProtocol.QUERY: response = PJLinkResponse(command_line.command, self.mute_state) elif command_line.data == PJLinkProtocol.AUDIO_VIDEO_MUTE_ON or command_line.data == PJLinkProtocol.AUDIO_VIDEO_MUTE_OFF or command_line.data == PJLinkProtocol.VIDEO_MUTE_ON or command_line.data == PJLinkProtocol.VIDEO_MUTE_OFF or command_line.data == PJLinkProtocol.AUDIO_MUTE_ON or command_line.data == PJLinkProtocol.AUDIO_MUTE_OFF: self.mute_state = command_line.data response = PJLinkResponse(command_line.command, PJLinkProtocol.OK) else: response = PJLinkResponse(command_line.command, PJLinkProtocol.ERROR_2) elif command_line.command == PJLinkProtocol.NAME: if command_line.data == PJLinkProtocol.QUERY: response = PJLinkResponse(command_line.command, self.projector_name) else: response = PJLinkResponse(command_line.command, PJLinkProtocol.ERROR_2) elif command_line.command == PJLinkProtocol.MANUFACTURE_NAME: if command_line.data == PJLinkProtocol.QUERY: response = PJLinkResponse(command_line.command, self.manufacture_name) else: response = PJLinkResponse(command_line.command, PJLinkProtocol.ERROR_2) elif command_line.command == PJLinkProtocol.PRODUCT_NAME: if command_line.data == PJLinkProtocol.QUERY: response = PJLinkResponse(command_line.command, self.product_name) else: response = PJLinkResponse(command_line.command, PJLinkProtocol.ERROR_2) elif command_line.command == PJLinkProtocol.OTHER_INFO: if command_line.data == PJLinkProtocol.QUERY: response = PJLinkResponse(command_line.command, self.other_info) else: response = PJLinkResponse(command_line.command, PJLinkProtocol.ERROR_2) elif command_line.command == PJLinkProtocol.CLASS_INFO: if command_line.data == PJLinkProtocol.QUERY: response = PJLinkResponse(command_line.command, self.class_info) else: response = PJLinkResponse(command_line.command, PJLinkProtocol.ERROR_2) elif command_line.command == PJLinkProtocol.ERROR_STATUS: if command_line.data == PJLinkProtocol.QUERY: data = ''.join([error[1] for error in self.errors]) response = PJLinkResponse(command_line.command, data) else: response = PJLinkResponse(command_line.command, PJLinkProtocol.ERROR_2) elif command_line.command == PJLinkProtocol.LAMP: if command_line.data == PJLinkProtocol.QUERY: data = ' '.join([ '%s %s' % (lamp[0], '1' if lamp[1] == True else '0') for lamp in self.lamps ]) response = PJLinkResponse(command_line.command, data) else: response = PJLinkResponse(command_line.command, PJLinkProtocol.ERROR_2) else: response = PJLinkResponse(command_line.command, PJLinkProtocol.ERROR_1) client.send(response.encode()) client.close() self.server.close()