def start(self):
     self.started = False
     self.pf = PacketForwarder(self.handle_device_reset)
     self.pf.start()
     self.q = self.pf.sending_queue
     while not self.started:
         pass
class TAMProxy:

    DEVICELIST_CODE = c.devices.devicelist.code
    ADD_CODE = c.devices.devicelist.add_code
    REMOVE_CODE = c.devices.devicelist.remove_code
    CLEAR_CODE = c.devices.devicelist.clear_code

    def __init__(self):
        self.recovery_data = dict()
        self.start()

    def start(self):
        self.started = False
        self.pf = PacketForwarder(self.handle_device_reset)
        self.pf.start()
        self.q = self.pf.sending_queue
        while not self.started:
            pass

    def stop(self):
        self.pf.stop()
        self.pf.join()
        self.started = False

    def handle_device_reset(self):
        self.clear_devices()
        for device_id, add_vals in self.recovery_data.iteritems():
            self.add_device(*add_vals)
        if not self.started: self.started = True

    def add_device(self, add_payload, callback):
        payload = self.ADD_CODE + add_payload
        self.send_request(self.DEVICELIST_CODE, payload, callback)

    def remove_device(self, device_id, callback):
        payload = self.REMOVE_CODE + device_id
        self.send_request(self.DEVICELIST_CODE, payload, callback)

    def clear_devices(self):
        self.send_request(self.DEVICELIST_CODE, self.CLEAR_CODE,
                          self.empty_callback)

    def send_request(self,
                     device_id,
                     payload,
                     callback=None,
                     continuous=False,
                     weight=1,
                     remove=False):
        if not callback: callback = self.empty_callback
        if device_id is not None:
            self.q.put(
                ((device_id, payload, continuous, weight, remove), callback))
            return True
        else:
            return False

    def empty_callback(self, request, response):
        pass
class TAMProxy:

    DEVICELIST_CODE =   c.devices.devicelist.code
    ADD_CODE =          c.devices.devicelist.add_code
    REMOVE_CODE =       c.devices.devicelist.remove_code
    CLEAR_CODE =        c.devices.devicelist.clear_code

    def __init__(self):
        self.recovery_data = dict()
        self.start()

    def start(self):
        self.started = False
        self.pf = PacketForwarder(self.handle_device_reset)
        self.pf.start()
        self.q = self.pf.sending_queue
        while not self.started: pass

    def stop(self):
        self.pf.stop()
        self.pf.join()
        self.started = False

    def handle_device_reset(self):
        self.clear_devices()
        for device_id, add_vals in self.recovery_data.iteritems():
            self.add_device(*add_vals)
        if not self.started: self.started = True

    def add_device(self, add_payload, callback):
        payload = self.ADD_CODE + add_payload
        self.send_request(self.DEVICELIST_CODE,
                         payload,
                         callback)

    def remove_device(self, device_id, callback):
        payload = self.REMOVE_CODE + device_id
        self.send_request(self.DEVICELIST_CODE,
                         payload,
                         callback)

    def clear_devices(self):
        self.send_request(self.DEVICELIST_CODE,
                         self.CLEAR_CODE,
                         self.empty_callback)

    def send_request(self, device_id, payload, callback=None, 
                     continuous=False, weight=1, remove=False):
        if not callback: callback = self.empty_callback
        if device_id is not None: 
            self.q.put(((device_id, payload, continuous, weight, remove),
                        callback))
            return True
        else: return False

    def empty_callback(self, request, response):
        pass
 def start(self):
     self.started = False
     self.pf = PacketForwarder(self.handle_device_reset)
     self.pf.start()
     self.q = self.pf.sending_queue
     while not self.started: pass