1
|
1 import pprint
|
|
2 import json
|
|
3 import base64
|
|
4 import traceback
|
|
5
|
|
6
|
|
7 class Elem(object):
|
|
8 expires = -1
|
|
9 name = "Elem"
|
|
10 remote_size = -1
|
|
11 remote_last_modified = -1
|
|
12
|
|
13 def __init__(self, eDict=None):
|
|
14 if eDict:
|
|
15 self.expires = eDict['expiryDateTime']
|
|
16 self.name = eDict['name']
|
|
17 self.remote_size = eDict['remoteSize']
|
|
18 if 'remoteLastmodified' in eDict:
|
|
19 self.remote_last_modified = eDict['remoteLastmodified']
|
|
20 # if self.remote_last_modified >= 0:
|
|
21 # self.remote_last_modified = datetime.utcfromtimestamp(self.remote_last_modified / 1000) # JAVA RAGE
|
|
22
|
|
23 def dict(self):
|
|
24 return {'expiryDateTime': self.expires,
|
|
25 'name': self.name,
|
|
26 'remoteSize': self.remote_size}
|
|
27
|
|
28 def __repr__(self):
|
|
29 # return json.dumps(self.dict(), sort_keys=True, indent=4)
|
|
30 return "Elem: " + pprint.pformat(self.dict())
|
|
31
|
|
32
|
|
33 class Directory(Elem):
|
|
34 name = "Virtual Directory"
|
|
35 children = []
|
|
36
|
|
37 def __init__(self, eDict=None, jsonText=None):
|
|
38 self.children = []
|
|
39 if jsonText:
|
|
40 eDict = json.loads(jsonText)
|
|
41 if eDict:
|
|
42 Elem.__init__(self, eDict=eDict)
|
|
43
|
|
44 for child in eDict['children']:
|
|
45 if child['isDir']:
|
|
46 self.children.append(Directory(child))
|
|
47 else:
|
|
48 self.children.append(File(child))
|
|
49
|
|
50 def dict(self):
|
|
51 me = Elem.dict(self)
|
|
52 me['isDir'] = True
|
|
53 me['children'] = [kid.dict() for kid in self.children]
|
|
54 return me
|
|
55
|
|
56 def __repr__(self):
|
|
57 this = self.dict()
|
|
58 return "Directory: " + pprint.pformat(this)
|
|
59 # return json.dumps(this, sort_keys=True, indent=4)
|
|
60
|
|
61
|
|
62 class File(Elem):
|
|
63 name = "file"
|
|
64 remote_size = 0
|
|
65 local_path = ""
|
|
66 fragments = []
|
|
67
|
|
68 def __init__(self, extras=None):
|
|
69 self.fragments = []
|
|
70 if extras:
|
|
71 Elem.__init__(self, eDict=extras)
|
|
72
|
|
73 for fragment in extras['fragments']:
|
|
74 self.fragments.append(Fragment(fragment))
|
|
75
|
|
76 def dict(self):
|
|
77 me = Elem.dict(self)
|
|
78 me['isDir'] = False
|
|
79 me['fragments'] = [fragment.dict() for fragment in self.fragments]
|
|
80 return me
|
|
81
|
|
82 def __repr__(self):
|
|
83 # return json.dumps(self.dict(), sort_keys=True, indent=4)
|
|
84 return "File: " + pprint.pformat(self.dict())
|
|
85
|
|
86
|
|
87 class Fragment(object):
|
|
88 name = ""
|
|
89 order = 0
|
|
90 providers = []
|
|
91 # Newer root files have these
|
|
92 length = None
|
|
93 iv = None
|
|
94 offset = None
|
|
95
|
|
96 def __init__(self, eDict=None):
|
|
97 if eDict:
|
|
98 self.name = eDict['codename']
|
|
99 self.order = eDict['orderNo']
|
|
100 self.providers = eDict['sasProviders']
|
|
101 if "length" in eDict:
|
|
102 self.length = eDict["length"]
|
|
103 if "iv" in eDict:
|
|
104 self.iv = base64.b64decode(eDict["iv"])
|
|
105 if "offset" in eDict:
|
|
106 self.offset = eDict["offset"]
|
|
107 else:
|
|
108 self.providers = []
|
|
109
|
|
110 def dict(self):
|
|
111 form = {'codename': self.name, 'orderNo': self.order, 'sasProviders': self.providers}
|
|
112 if self.length:
|
|
113 form["length"] = self.length
|
|
114 if self.iv:
|
|
115 form["iv"] = base64.b64encode(self.iv)
|
|
116 if self.offset != None:
|
|
117 form["offset"] = self.offset
|
|
118 return form
|
|
119
|
|
120 def __repr__(self):
|
|
121 return json.dumps(self.dict())
|