def test_submit_sm_multipart_sar(self): transport, protocol = yield self.setup_bind(config={ 'send_multipart_sar': True, }) long_message = 'This is a long message.' * 20 seq_nums = yield protocol.submit_csm_sar( 'abc123', 'dest_addr', short_message=long_message) pdus = yield wait_for_pdus(transport, 4) # seq no 1 == bind_transceiver, 2 == enquire_link, 3 == sar_msg_ref_num self.assertEqual([4, 5, 6, 7], seq_nums) msg_parts = [] msg_refs = [] for i, sm in enumerate(pdus): pdu_opts = unpacked_pdu_opts(sm) mandatory_parameters = sm['body']['mandatory_parameters'] self.assertEqual('submit_sm', sm['header']['command_id']) msg_parts.append(mandatory_parameters['short_message']) self.assertTrue(len(mandatory_parameters['short_message']) <= 130) msg_refs.append(pdu_opts['sar_msg_ref_num']) self.assertEqual(i + 1, pdu_opts['sar_segment_seqnum']) self.assertEqual(4, pdu_opts['sar_total_segments']) self.assertEqual(long_message, ''.join(msg_parts)) self.assertEqual([3, 3, 3, 3], msg_refs) stored_ids = yield self.lookup_message_ids(protocol, seq_nums) self.assertEqual(['abc123'] * len(seq_nums), stored_ids)
def handle_ussd_pdu(self, pdu): pdu_params = pdu['body']['mandatory_parameters'] pdu_opts = unpacked_pdu_opts(pdu) if not detect_ussd(pdu_opts): return succeed(False) # We have a USSD message. d = self.handle_deliver_sm_ussd(pdu, pdu_params, pdu_opts) d.addCallback(lambda _: True) return d
def decode_pdus(self, pdus): content = [] for pdu in pdus: pdu_params = pdu["body"]["mandatory_parameters"] pdu_opts = unpacked_pdu_opts(pdu) # We might have a `message_payload` optional field to worry about. message_payload = pdu_opts.get("message_payload", None) if message_payload is not None: short_message = message_payload.decode("hex") else: short_message = pdu_params["short_message"] content.append(self.dcs_decode(short_message, pdu_params["data_coding"])) return content
def test_submit_sm_long(self): transport, protocol = yield self.setup_bind() long_message = 'This is a long message.' * 20 seq_nums = yield protocol.submit_sm_long( 'abc123', 'dest_addr', long_message) [submit_sm] = yield wait_for_pdus(transport, 1) pdu_opts = unpacked_pdu_opts(submit_sm) self.assertEqual('submit_sm', submit_sm['header']['command_id']) self.assertEqual( None, submit_sm['body']['mandatory_parameters']['short_message']) self.assertEqual(''.join('%02x' % ord(c) for c in long_message), pdu_opts['message_payload']) stored_ids = yield self.lookup_message_ids(protocol, seq_nums) self.assertEqual(['abc123'], stored_ids)
def decode_pdus(self, pdus): content = [] for pdu in pdus: pdu_params = pdu['body']['mandatory_parameters'] pdu_opts = unpacked_pdu_opts(pdu) # We might have a `message_payload` optional field to worry about. message_payload = pdu_opts.get('message_payload', None) if message_payload is not None: short_message = message_payload.decode('hex') else: short_message = pdu_params['short_message'] content.append( self.dcs_decode(short_message, pdu_params['data_coding'])) return content
def _handle_delivery_report_optional_params(self, pdu): """ Check if this might be a delivery report with optional PDU parameters. If so, handle it and return a deferred ``True``, otherwise return a deferred ``False``. """ pdu_opts = unpacked_pdu_opts(pdu) receipted_message_id = pdu_opts.get("receipted_message_id", None) message_state = pdu_opts.get("message_state", None) if receipted_message_id is None or message_state is None: return succeed(False) status = self.STATUS_MAP.get(message_state, "UNKNOWN") d = self.transport.handle_delivery_report( receipted_message_id=receipted_message_id, delivery_status=self.delivery_status(status) ) d.addCallback(lambda _: True) return d
def _handle_delivery_report_optional_params(self, pdu): """ Check if this might be a delivery report with optional PDU parameters. If so, handle it and return a deferred ``True``, otherwise return a deferred ``False``. """ pdu_opts = unpacked_pdu_opts(pdu) receipted_message_id = pdu_opts.get('receipted_message_id', None) message_state = pdu_opts.get('message_state', None) if receipted_message_id is None or message_state is None: return succeed(False) status = self.STATUS_MAP.get(message_state, 'UNKNOWN') d = self.transport.handle_delivery_report( receipted_message_id=receipted_message_id, delivery_status=self.delivery_status(status)) d.addCallback(lambda _: True) return d
def handle_delivery_report_pdu(self, pdu): """ Check if this might be a delivery receipt with PDU parameters. There's a chance we'll get a delivery receipt without these parameters, if that happens we'll try a regex match in ``inspect_delivery_report_content`` once the message has (potentially) been reassembled and decoded. """ pdu_opts = unpacked_pdu_opts(pdu) receipted_message_id = pdu_opts.get('receipted_message_id', None) message_state = pdu_opts.get('message_state', None) if receipted_message_id is None or message_state is None: return succeed(False) status = self.STATUS_MAP.get(message_state, 'UNKNOWN') d = self.transport.handle_delivery_report( receipted_message_id=receipted_message_id, delivery_status=self.delivery_status(status)) d.addCallback(lambda _: True) return d
def pdu_tlv(pdu, tag): return unpacked_pdu_opts(pdu)[tag]