laforge has submitted this change. ( 
https://gerrit.osmocom.org/c/pysim/+/38017?usp=email )

Change subject: transport: define TERMINAL RESPONSE content within 
ProactiveHandler
......................................................................

transport: define TERMINAL RESPONSE content within ProactiveHandler

So far the core proactive handling code would always generate a positive
response, with no way for the ProactiveHandler call-back to influence
that or to include additional IEs/TLVs.

Let's change that.

Change-Id: Ic772b3383533f845689ac97ad03fcf67cf59c208
---
M pySim/transport/__init__.py
1 file changed, 18 insertions(+), 15 deletions(-)

Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved




diff --git a/pySim/transport/__init__.py b/pySim/transport/__init__.py
index 47f6547..97022ce 100644
--- a/pySim/transport/__init__.py
+++ b/pySim/transport/__init__.py
@@ -57,7 +57,18 @@
         """Default handler for not otherwise handled proactive commands."""
         raise NotImplementedError('No handler method for %s' % pcmd.decoded)

-
+    def prepare_response(self, pcmd: ProactiveCommand, general_result: str = 
'performed_successfully'):
+        # The Command Details are echoed from the command that has been 
processed.
+        (command_details,) = [c for c in pcmd.children if isinstance(c, 
CommandDetails)]
+        # invert the device identities
+        (command_dev_ids,) = [c for c in pcmd.children if isinstance(c, 
DeviceIdentities)]
+        rsp_dev_ids = DeviceIdentities()
+        rsp_dev_ids.from_dict({'device_identities': {
+                                    'dest_dev_id': 
command_dev_ids.decoded['source_dev_id'],
+                                    'source_dev_id': 
command_dev_ids.decoded['dest_dev_id']}})
+        result = Result()
+        result.from_dict({'result': {'general_result': general_result, 
'additional_information': ''}})
+        return [command_details, rsp_dev_ids, result]

 class LinkBase(abc.ABC):
     """Base class for link/transport to card."""
@@ -185,34 +196,26 @@
             pcmd = ProactiveCommand()
             parsed = pcmd.from_tlv(h2b(fetch_rv[0]))
             print("FETCH: %s (%s)" % (fetch_rv[0], type(parsed).__name__))
-            result = Result()
             if self.proactive_handler:
                 # Extension point: If this does return a list of TLV objects,
                 # they could be appended after the Result; if the first is a
                 # Result, that cuold replace the one built here.
-                self.proactive_handler.receive_fetch_raw(pcmd, parsed)
-                result.from_dict({'result': {'general_result': 
'performed_successfully',
-                                             'additional_information': ''}})
+                ti_list = self.proactive_handler.receive_fetch_raw(pcmd, 
parsed)
+                if not ti_list:
+                    ti_list = self.proactive_handler.prepare_response(pcmd, 
'FIXME')
             else:
-                result.from_dict({'result': {'general_result': 
'command_beyond_terminal_capability',
-                                             'additional_information': ''}})
+                ti_list = self.proactive_handler.prepare_response(pcmd, 
'command_beyond_terminal_capability')

             # Send response immediately, thus also flushing out any further
             # proactive commands that the card already wants to send
             #
             # Structure as per TS 102 223 V4.4.0 Section 6.8

-            # The Command Details are echoed from the command that has been 
processed.
-            (command_details,) = [c for c in pcmd.decoded.children if 
isinstance(c, CommandDetails)]
-            # The Device Identities are fixed. (TS 102 223 V4.0.0 Section 
6.8.2)
-            device_identities = DeviceIdentities()
-            device_identities.from_dict({'device_identities': 
{'source_dev_id': 'terminal', 'dest_dev_id':
-                                                               'uicc'}})
-
             # Testing hint: The value of tail does not influence the behavior
             # of an SJA2 that sent ans SMS, so this is implemented only
             # following TS 102 223, and not fully tested.
-            tail = command_details.to_tlv() + device_identities.to_tlv() + 
result.to_tlv()
+            ti_list_bin = [x.to_tlv() for x in ti_list]
+            tail = b''.join(ti_list_bin)
             # Testing hint: In contrast to the above, this part is positively
             # essential to get the SJA2 to provide the later parts of a
             # multipart SMS in response to an OTA RFM command.

--
To view, visit https://gerrit.osmocom.org/c/pysim/+/38017?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings?usp=email

Gerrit-MessageType: merged
Gerrit-Project: pysim
Gerrit-Branch: master
Gerrit-Change-Id: Ic772b3383533f845689ac97ad03fcf67cf59c208
Gerrit-Change-Number: 38017
Gerrit-PatchSet: 4
Gerrit-Owner: laforge <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <[email protected]>

Reply via email to