laforge has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/pysim/+/37655?usp=email )


Change subject: pySim.esim.saip: Initial support for parsing 
GenericFileManagement
......................................................................

pySim.esim.saip: Initial support for parsing GenericFileManagement

Change-Id: I4a92f5849158a59f6acca05121d38adc0a495906
---
M pySim/esim/saip/__init__.py
1 file changed, 65 insertions(+), 0 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/pysim refs/changes/55/37655/1

diff --git a/pySim/esim/saip/__init__.py b/pySim/esim/saip/__init__.py
index c76cb5c..6cddf3e 100644
--- a/pySim/esim/saip/__init__.py
+++ b/pySim/esim/saip/__init__.py
@@ -153,6 +153,10 @@
             self.fileDescriptor.update(dict(fd))
         self.stream = self.linearize_file_content(l)

+    def from_gfm(self, d: Dict):
+        print(d)
+        # FIXME
+
     def to_tuples(self) -> List[Tuple]:
         """Generate a list of fileDescriptor, fillFileContent, fillFileOffset 
tuples into this instance."""
         raise NotImplementedError
@@ -277,6 +281,7 @@
             'opt-isim': ProfileElementOptISIM,
             'akaParameter': ProfileElementAKA,
             'header': ProfileElementHeader,
+            'genericFileManagement': ProfileElementGFM,
             'end': ProfileElementEnd,
             }
         """Construct an instance from given raw, DER encoded bytes."""
@@ -342,6 +347,57 @@
         #self.files2pe()
         pass

+class ProfileElementGFM(ProfileElement):
+    type = 'genericFileManagement'
+
+    def __init__(self, decoded = None, mandated: bool = True):
+        super().__init__(decoded, mandated)
+        # indexed by PE-Name
+        self.files = {}
+        self.tdef = asn1.types['ProfileElement'].type.name_to_member[self.type]
+
+    def add_file(self, path, file: File):
+        # FIXME: proper FS hiearchy
+        #if path in self.files:
+        #    raise KeyError('Cannot add file: path %s already exists' % path)
+        self.files[path] = file
+
+    def pe2files(self):
+        """Update the "files" member with the contents of the "decoded" 
member."""
+        def perform(self, path, file_elements):
+            if len(file_elements):
+                file = File('', file_elements)
+                self.add_file(path, file)
+
+        path = "3f00" # current DF: MF
+        file_elements = []
+        # looks like TCA added one level too much in the ASN.1 hierarchy here
+        for fmc in self.decoded['fileManagementCMD']:
+            for fmc2 in fmc:
+                if fmc2[0] == 'filePath':
+                    # selecting a new path means we're done with the previous 
file
+                    perform(self, path, file_elements)
+                    if fmc2[1] == "":
+                        path = "3f00"
+                    else:
+                        # FIXME
+                        pass
+                elif fmc2[0] == 'createFCP':
+                    # new FCP means new file; perform the old one
+                    perform(self, path, file_elements)
+                    file_elements = [('fileDescriptor', fmc2[1])]
+                elif fmc2[0] == 'fillFileOffset' or fmc2[0] == 
'fillFileContent':
+                    file_elements.append(fmc2)
+                else:
+                    raise ValueError("Unknown GFM choice '%s'" % fmc2[0])
+        # add the last file, if we still have any pending data in file_elements
+        perform(self, path, file_elements)
+
+    def _post_decode(self):
+        # not entirely sure about this automatism
+        self.pe2files()
+
+
 class ProfileElementMF(FsProfileElement):
     type = 'mf'


--
To view, visit https://gerrit.osmocom.org/c/pysim/+/37655?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: I4a92f5849158a59f6acca05121d38adc0a495906
Gerrit-Change-Number: 37655
Gerrit-PatchSet: 1
Gerrit-Owner: laforge <[email protected]>
Gerrit-MessageType: newchange

Reply via email to