laforge has submitted this change. ( https://gerrit.osmocom.org/c/pysim/+/37621?usp=email )
Change subject: pySim.runtime: Be more verbose if incompatible method is called
......................................................................
pySim.runtime: Be more verbose if incompatible method is called
Change-Id: I57190d50a63e0c22a8c5921e1348fae31b23e3d4
---
M pySim/runtime.py
1 file changed, 21 insertions(+), 6 deletions(-)
Approvals:
fixeria: Looks good to me, approved
Jenkins Builder: Verified
diff --git a/pySim/runtime.py b/pySim/runtime.py
index 2d1f12b..a90128d 100644
--- a/pySim/runtime.py
+++ b/pySim/runtime.py
@@ -451,7 +451,8 @@
binary data read from the file
"""
if not isinstance(self.selected_file, TransparentEF):
- raise TypeError("Only works with TransparentEF")
+ raise TypeError("Only works with TransparentEF, but %s is %s" % (self.selected_file,
+ self.selected_file.__class__.__mro__))
return self.scc.read_binary(self.selected_file.fid, length, offset)
def read_binary_dec(self) -> Tuple[dict, str]:
@@ -475,7 +476,8 @@
offset : Offset into the file from which to write 'data_hex'
"""
if not isinstance(self.selected_file, TransparentEF):
- raise TypeError("Only works with TransparentEF")
+ raise TypeError("Only works with TransparentEF, but %s is %s" % (self.selected_file,
+ self.selected_file.__class__.__mro__))
return self.scc.update_binary(self.selected_file.fid, data_hex, offset, conserve=self.rs.conserve_write)
def update_binary_dec(self, data: dict):
@@ -497,7 +499,8 @@
hex string of binary data contained in record
"""
if not isinstance(self.selected_file, LinFixedEF):
- raise TypeError("Only works with Linear Fixed EF")
+ raise TypeError("Only works with Linear Fixed EF, but %s is %s" % (self.selected_file,
+ self.selected_file.__class__.__mro__))
# returns a string of hex nibbles
return self.scc.read_record(self.selected_file.fid, rec_nr)
@@ -520,7 +523,8 @@
data_hex : Hex string binary data to be written
"""
if not isinstance(self.selected_file, LinFixedEF):
- raise TypeError("Only works with Linear Fixed EF")
+ raise TypeError("Only works with Linear Fixed EF, but %s is %s" % (self.selected_file,
+ self.selected_file.__class__.__mro__))
return self.scc.update_record(self.selected_file.fid, rec_nr, data_hex,
conserve=self.rs.conserve_write,
leftpad=self.selected_file.leftpad)
@@ -556,7 +560,8 @@
list of integer tags contained in EF
"""
if not isinstance(self.selected_file, BerTlvEF):
- raise TypeError("Only works with BER-TLV EF")
+ raise TypeError("Only works with BER-TLV EF, but %s is %s" % (self.selected_file,
+ self.selected_file.__class__.__mro__))
data, _sw = self.scc.retrieve_data(self.selected_file.fid, 0x5c)
_tag, _length, value, _remainder = bertlv_parse_one(h2b(data))
return list(value)
@@ -569,7 +574,8 @@
data_hex : Hex string binary data to be written (value portion)
"""
if not isinstance(self.selected_file, BerTlvEF):
- raise TypeError("Only works with BER-TLV EF")
+ raise TypeError("Only works with BER-TLV EF, but %s is %s" % (self.selected_file,
+ self.selected_file.__class__.__mro__))
return self.scc.set_data(self.selected_file.fid, tag, data_hex, conserve=self.rs.conserve_write)
def register_cmds(self, cmd_app=None):
--
To view, visit https://gerrit.osmocom.org/c/pysim/+/37621?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: pysim
Gerrit-Branch: master
Gerrit-Change-Id: I57190d50a63e0c22a8c5921e1348fae31b23e3d4
Gerrit-Change-Number: 37621
Gerrit-PatchSet: 3
Gerrit-Owner: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: dexter <pmaier(a)sysmocom.de>
Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-MessageType: merged
laforge has submitted this change. ( https://gerrit.osmocom.org/c/pysim/+/37622?usp=email )
Change subject: pySim.commands: Don't convert SwMatchError to ValueError
......................................................................
pySim.commands: Don't convert SwMatchError to ValueError
In the read and write command implementations, we used to catch
lower-layer exceptions (usually SwMatchError) and "translate" that into
a value error, only to add more information to the exception. This
meant that higher-layer code could no longer detect this was actually
a SwMatchError exception type.
Let's instead use the add_note() method to amend the existing exception,
rather than raising a new one of different type.
Change-Id: Ic94d0fe60a8a5e15aade56ec418192ecf31ac5e7
---
M pySim/commands.py
1 file changed, 22 insertions(+), 4 deletions(-)
Approvals:
fixeria: Looks good to me, but someone else must approve
laforge: Looks good to me, approved
Jenkins Builder: Verified
diff --git a/pySim/commands.py b/pySim/commands.py
index 40b0980..3f659eb 100644
--- a/pySim/commands.py
+++ b/pySim/commands.py
@@ -334,8 +334,8 @@
try:
data, sw = self.send_apdu_checksw(pdu)
except Exception as e:
- raise ValueError('%s, failed to read (offset %d)' %
- (str_sanitize(str(e)), offset)) from e
+ e.add_note('failed to read (offset %d)' % offset)
+ raise e
total_data += data
chunk_offset += chunk_len
return total_data, sw
@@ -394,8 +394,8 @@
try:
chunk_data, chunk_sw = self.send_apdu_checksw(pdu)
except Exception as e:
- raise ValueError('%s, failed to write chunk (chunk_offset %d, chunk_len %d)' %
- (str_sanitize(str(e)), chunk_offset, chunk_len)) from e
+ e.add_note('failed to write chunk (chunk_offset %d, chunk_len %d)' % (chunk_offset, chunk_len))
+ raise e
total_data += data
chunk_offset += chunk_len
if verify:
--
To view, visit https://gerrit.osmocom.org/c/pysim/+/37622?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: pysim
Gerrit-Branch: master
Gerrit-Change-Id: Ic94d0fe60a8a5e15aade56ec418192ecf31ac5e7
Gerrit-Change-Number: 37622
Gerrit-PatchSet: 3
Gerrit-Owner: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: dexter <pmaier(a)sysmocom.de>
Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-MessageType: merged
laforge has submitted this change. ( https://gerrit.osmocom.org/c/pysim/+/37623?usp=email )
Change subject: pySim.tlv: Separate {to,from}_val_dict() from {to,from}_dict()
......................................................................
pySim.tlv: Separate {to,from}_val_dict() from {to,from}_dict()
There are some situations where we want to work with a type-name-wrapped
dict that includes the type information, and others where we don't want
that. The main reason is that nested IEs can only be reconstructed if
we can determine the type/class of the nested IE from the dict data.
Let's explicitly offer {to,from}_val_dict() methods that work with
the value-part only
Related: OS#6453
Change-Id: I81654ea54aed9e598943f41a26a57dcc3a7f10c2
---
M pySim/tlv.py
1 file changed, 47 insertions(+), 11 deletions(-)
Approvals:
fixeria: Looks good to me, but someone else must approve
laforge: Looks good to me, approved
Jenkins Builder: Verified
diff --git a/pySim/tlv.py b/pySim/tlv.py
index ed3be5d..8180fd1 100644
--- a/pySim/tlv.py
+++ b/pySim/tlv.py
@@ -142,25 +142,43 @@
else:
return '%s(%s)' % (type(self).__name__, self.decoded)
- def to_dict(self):
- """Return a JSON-serializable dict representing the [nested] IE data."""
+ def to_val_dict(self):
+ """Return a JSON-serializable dict representing just the [nested] value portion of the IE
+ data. This does not include any indication of the type of 'self', so the resulting dict alone
+ will be insufficient ot recreate an object from it without additional type information."""
if len(self.children):
- v = [x.to_dict() for x in self.children]
+ return [x.to_dict() for x in self.children]
else:
- v = self.decoded
- return {camel_to_snake(type(self).__name__): v}
+ return self.decoded
+
+ def from_val_dict(self, decoded):
+ """Set the IE internal decoded representation to data from the argument.
+ If this is a nested IE, the child IE instance list is re-created.
+
+ This method is symmetrical to to_val_dict() aboe, i.e. there is no outer dict
+ containig the snake-reformatted type name of 'self'."""
+ if self.nested_collection:
+ self.children = self.nested_collection.from_dict(decoded)
+ else:
+ self.children = []
+ self.decoded = decoded
+
+ def to_dict(self):
+ """Return a JSON-serializable dict representing the [nested] IE data. The returned
+ data contains an outer dict with the snake-reformatted type of 'self' and is hence
+ sufficient to re-create an object from it."""
+ return {camel_to_snake(type(self).__name__): self.to_val_dict()}
def from_dict(self, decoded: dict):
"""Set the IE internal decoded representation to data from the argument.
- If this is a nested IE, the child IE instance list is re-created."""
+ If this is a nested IE, the child IE instance list is re-created.
+
+ This method is symmetrical to to_dict() above, i.e. the outer dict must contain just a single
+ key-value pair, where the key is the snake-reformatted type name of 'self'"""
expected_key_name = camel_to_snake(type(self).__name__)
if not expected_key_name in decoded:
raise ValueError("Dict %s doesn't contain expected key %s" % (decoded, expected_key_name))
- if self.nested_collection:
- self.children = self.nested_collection.from_dict(decoded[expected_key_name])
- else:
- self.children = []
- self.decoded = decoded[expected_key_name]
+ self.from_val_dict(decoded[expected_key_name])
def is_constructed(self):
"""Is this IE constructed by further nested IEs?"""
--
To view, visit https://gerrit.osmocom.org/c/pysim/+/37623?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: pysim
Gerrit-Branch: master
Gerrit-Change-Id: I81654ea54aed9e598943f41a26a57dcc3a7f10c2
Gerrit-Change-Number: 37623
Gerrit-PatchSet: 3
Gerrit-Owner: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: dexter <pmaier(a)sysmocom.de>
Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: lynxis lazus <lynxis(a)fe80.eu>
Gerrit-MessageType: merged
laforge has submitted this change. ( https://gerrit.osmocom.org/c/pysim/+/37620?usp=email )
Change subject: pySim.tlv: Add convenience methods to IE class
......................................................................
pySim.tlv: Add convenience methods to IE class
The new methods allow programmatic resolution of nested IEs from
a parent, assuming there's only one child of a given type (which is
often but not always the case).
Change-Id: Ic95b74437647ae8d4bf3cdc481832afb622e3cf0
---
M pySim/tlv.py
1 file changed, 32 insertions(+), 1 deletion(-)
Approvals:
fixeria: Looks good to me, but someone else must approve
laforge: Looks good to me, approved
Jenkins Builder: Verified
diff --git a/pySim/tlv.py b/pySim/tlv.py
index 6dc5301..ed3be5d 100644
--- a/pySim/tlv.py
+++ b/pySim/tlv.py
@@ -19,7 +19,7 @@
import inspect
import abc
import re
-from typing import List, Tuple
+from typing import List, Tuple, Optional
from pySim.utils import bertlv_encode_len, bertlv_parse_len, bertlv_encode_tag, bertlv_parse_tag
from pySim.utils import comprehensiontlv_encode_tag, comprehensiontlv_parse_tag
@@ -189,6 +189,24 @@
self.children = []
return super().from_bytes(do, context=context)
+ def child_by_name(self, name: str) -> Optional['IE']:
+ """Return a child IE instance of given snake-case/json type name. This only works in case
+ there is no more than one child IE of the given type."""
+ children = list(filter(lambda c: camel_to_snake(type(c).__name__) == name, self.children))
+ if len(children) > 1:
+ raise KeyError('There are multiple children of class %s' % name)
+ elif len(children) == 1:
+ return children[0]
+
+ def child_by_type(self, cls) -> Optional['IE']:
+ """Return a child IE instance of given type (class). This only works in case
+ there is no more than one child IE of the given type."""
+ children = list(filter(lambda c: isinstance(c, cls), self.children))
+ if len(children) > 1:
+ raise KeyError('There are multiple children of class %s' % cls)
+ elif len(children) == 1:
+ return children[0]
+
class TLV_IE(IE):
"""Abstract base class for various TLV type Information Elements."""
--
To view, visit https://gerrit.osmocom.org/c/pysim/+/37620?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: pysim
Gerrit-Branch: master
Gerrit-Change-Id: Ic95b74437647ae8d4bf3cdc481832afb622e3cf0
Gerrit-Change-Number: 37620
Gerrit-PatchSet: 3
Gerrit-Owner: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: dexter <pmaier(a)sysmocom.de>
Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-MessageType: merged