<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:

def transferReporter(self, xferId, message):
        ''' the callback method used by the Aspera sdk during transfer
            to notify progress, error or successful completion
        '''
        if self.is_stopped():
            return True

        _asp_message = AsperaMessage(message)

        if not _asp_message.is_msg_type(
            [enumAsperaMsgType.INIT,
             enumAsperaMsgType.DONE,
             enumAsperaMsgType.ERROR,
             enumAsperaMsgType.FILEERROR,
             enumAsperaMsgType.STATS]):
                return

        _session_id = _asp_message.get_session_id()

        _msg = self.debug_id(xferId, _session_id) + " : " + _asp_message._msg_type
        logger.info(_msg)

        with self._session_lock:
            if _asp_message.is_msg_type([enumAsperaMsgType.INIT]):
                assert(_session_id not in self._sessions)
                _session = AsperaSession(_session_id)
                self._sessions[_session_id] = _session
                self.notify_init()
            else:
                _session = self._sessions[_session_id]

        if _asp_message.is_msg_type([enumAsperaMsgType.DONE]):
            if _session.set_bytes_transferred(_asp_message.get_bytes_transferred()):
                self.notify_progress()
            _session.set_success()
            self.notify_done()
        elif _asp_message.is_msg_type([enumAsperaMsgType.ERROR, enumAsperaMsgType.FILEERROR]):
            _session.set_error(_asp_message.get_error_descr())
            self.notify_done(error=True)
        elif _asp_message.is_msg_type([enumAsperaMsgType.STATS]):
            if _session.set_bytes_transferred(_asp_message.get_bytes_transferred()):
                self.notify_progress()