8
8
from PyQt5 .QtCore import QDir
9
9
from PyQt5 .QtWidgets import QFileDialog , QMessageBox
10
10
11
- from urh .models .FileIconProvider import FileIconProvider
12
11
from urh .signalprocessing .IQArray import IQArray
13
12
14
- VIEW_TYPES = ["Bits" , "Hex" , "ASCII" ]
15
-
16
13
archives = {}
17
14
""":type: dict of [str, str]
18
15
:param: archives[extracted_filename] = filename"""
19
16
20
17
RECENT_PATH = QDir .homePath ()
21
18
22
- EXT = {np .int8 : ".complex16s" , np .uint8 : ".complex16u" , np .int16 : ".complex32s" , np .uint16 : ".complex32u" ,
23
- np .float32 : ".complex" , np .complex64 : ".complex" }
24
- FILTER = {np .int8 : "Complex16 signed (*.complex16s *.cs8)" , np .uint8 : "Complex16 unsigned (*.complex16u *.cu8)" ,
25
- np .uint16 : "Complex32 unsigned (*.complex32u *.cu16)" , np .int16 : "Complex32 signed (*.complex32s *.cs16)" ,
26
- np .float32 : "Complex (*.complex)" , np .complex64 : "Complex (*.complex)" }
19
+ SIGNAL_FILE_EXTENSIONS_BY_TYPE = {
20
+ np .int8 : ".complex16s" ,
21
+ np .uint8 : ".complex16u" ,
22
+ np .int16 : ".complex32s" ,
23
+ np .uint16 : ".complex32u" ,
24
+ np .float32 : ".complex" ,
25
+ np .complex64 : ".complex"
26
+ }
27
+
28
+ SIGNAL_NAME_FILTERS_BY_TYPE = {
29
+ np .int8 : "Complex16 signed (*.complex16s *.cs8)" ,
30
+ np .uint8 : "Complex16 unsigned (*.complex16u *.cu8)" ,
31
+ np .uint16 : "Complex32 unsigned (*.complex32u *.cu16)" ,
32
+ np .int16 : "Complex32 signed (*.complex32s *.cs16)" ,
33
+ np .float32 : "Complex (*.complex)" ,
34
+ np .complex64 : "Complex (*.complex)"
35
+ }
36
+
37
+ EVERYTHING_FILE_FILTER = "All Files (*)"
38
+
39
+ SIGNAL_NAME_FILTERS = list (sorted (set (SIGNAL_NAME_FILTERS_BY_TYPE .values ())))
40
+
41
+ COMPRESSED_COMPLEX_FILE_FILTER = "Compressed Complex File (*.coco)"
42
+ WAV_FILE_FILTER = "Waveform Audio File Format (*.wav *.wave)"
43
+ PROTOCOL_FILE_FILTER = "Protocol (*.proto.xml *.proto)"
44
+ BINARY_PROTOCOL_FILE_FILTER = "Binary Protocol (*.bin)"
45
+ PLAIN_BITS_FILE_FILTER = "Plain Bits (*.txt)"
46
+ FUZZING_FILE_FILTER = "Fuzzing Profile (*.fuzz.xml *.fuzz)"
47
+ SIMULATOR_FILE_FILTER = "Simulator Profile (*.sim.xml *.sim)"
48
+ TAR_FILE_FILTER = "Tar Archive (*.tar *.tar.gz *.tar.bz2)"
49
+ ZIP_FILE_FILTER = "Zip Archive (*.zip)"
50
+
51
+
52
+ def __get__name_filter_for_signals () -> str :
53
+ return ";;" .join ([EVERYTHING_FILE_FILTER ] + SIGNAL_NAME_FILTERS + [COMPRESSED_COMPLEX_FILE_FILTER , WAV_FILE_FILTER ])
27
54
28
55
29
56
def get_open_dialog (directory_mode = False , parent = None , name_filter = "full" ) -> QFileDialog :
30
- fip = FileIconProvider ()
31
57
dialog = QFileDialog (parent = parent , directory = RECENT_PATH )
32
- dialog .setIconProvider (fip )
33
58
34
59
if directory_mode :
35
60
dialog .setFileMode (QFileDialog .Directory )
@@ -38,98 +63,43 @@ def get_open_dialog(directory_mode=False, parent=None, name_filter="full") -> QF
38
63
dialog .setFileMode (QFileDialog .ExistingFiles )
39
64
dialog .setWindowTitle ("Open Files" )
40
65
if name_filter == "full" :
41
- name_filter = "All Files (*);;" \
42
- "Complex (*.complex);;" \
43
- "Complex16 unsigned (*.complex16u *.cu8);;" \
44
- "Complex16 signed (*.complex16s *.cs8);;" \
45
- "Complex32 unsigned (*.complex32u *.cu16);;" \
46
- "Complex32 signed (*.complex32s *.cs16);;" \
47
- "WAV (*.wav);;" \
48
- "Protocols (*.proto.xml *.proto);;" \
49
- "Binary Protocols (*.bin);;" \
50
- "Fuzzing Profiles (*.fuzz.xml *.fuzz);;" \
51
- "Simulator (*.sim.xml *.sim)" \
52
- "Plain Bits (*.txt);;" \
53
- "Tar Archives (*.tar *.tar.gz *.tar.bz2);;" \
54
- "Zip Archives (*.zip)"
66
+ name_filter = __get__name_filter_for_signals () + ";;" \
67
+ + ";;" .join ([PROTOCOL_FILE_FILTER , BINARY_PROTOCOL_FILE_FILTER , PLAIN_BITS_FILE_FILTER ,
68
+ FUZZING_FILE_FILTER , SIMULATOR_FILE_FILTER , TAR_FILE_FILTER , ZIP_FILE_FILTER ])
69
+ elif name_filter == "signals_only" :
70
+ name_filter = __get__name_filter_for_signals ()
55
71
elif name_filter == "proto" :
56
- name_filter = "Protocols (*.proto.xml *.proto);; Binary Protocols (*.bin)"
72
+ name_filter = ";;" . join ([ PROTOCOL_FILE_FILTER , BINARY_PROTOCOL_FILE_FILTER ])
57
73
elif name_filter == "fuzz" :
58
- name_filter = "Fuzzprofiles (*.fuzz.xml *.fuzz)"
74
+ name_filter = FUZZING_FILE_FILTER
59
75
elif name_filter == "simulator" :
60
- name_filter = "Simulator (*.sim.xml *.sim)"
76
+ name_filter = SIMULATOR_FILE_FILTER
61
77
62
78
dialog .setNameFilter (name_filter )
63
79
64
- dialog .setOptions (QFileDialog .DontResolveSymlinks )
65
- dialog .setViewMode (QFileDialog .Detail )
66
-
67
80
return dialog
68
81
69
82
70
- def uncompress_archives (file_names , temp_dir ):
71
- """
72
- Extract each archive from the list of filenames.
73
- Normal files stay untouched.
74
- Add all files to the Recent Files.
75
- :type file_names: list of str
76
- :type temp_dir: str
77
- :rtype: list of str
78
- """
79
- result = []
80
- for filename in file_names :
81
- if filename .endswith (".tar" ) or filename .endswith (".tar.gz" ) or filename .endswith (".tar.bz2" ):
82
- obj = tarfile .open (filename , "r" )
83
- extracted_file_names = []
84
- for j , member in enumerate (obj .getmembers ()):
85
- obj .extract (member , temp_dir )
86
- extracted_filename = os .path .join (temp_dir , obj .getnames ()[j ])
87
- extracted_file_names .append (extracted_filename )
88
- archives [extracted_filename ] = filename
89
- result .extend (extracted_file_names [:])
90
- elif filename .endswith (".zip" ):
91
- obj = zipfile .ZipFile (filename )
92
- extracted_file_names = []
93
- for j , info in enumerate (obj .infolist ()):
94
- obj .extract (info , path = temp_dir )
95
- extracted_filename = os .path .join (temp_dir , obj .namelist ()[j ])
96
- extracted_file_names .append (extracted_filename )
97
- archives [extracted_filename ] = filename
98
- result .extend (extracted_file_names [:])
99
- else :
100
- result .append (filename )
101
-
102
- return result
103
-
104
-
105
- def get_save_file_name (initial_name : str , wav_only = False , caption = "Save signal" , selected_name_filter = None ):
83
+ def ask_save_file_name (initial_name : str , caption = "Save signal" , selected_name_filter = None ):
106
84
global RECENT_PATH
107
85
if caption == "Save signal" :
108
- name_filter = "Complex (*.complex);;" \
109
- "Complex16 unsigned (*.complex16u *.cu8);;" \
110
- "Complex16 signed (*.complex16s *.cs8);;" \
111
- "Complex32 unsigned (*.complex32u *.cu16);;" \
112
- "Complex32 signed (*.complex32s *.cs16);;" \
113
- "Complex compressed (*.coco);;" \
114
- "WAV (*.wav);;" \
115
- "All Files (*)"
116
- if wav_only :
117
- name_filter = "WAV (*.wav);;All Files (*)"
118
- elif caption == "Save fuzz profile" :
119
- name_filter = "Fuzzing Profile (*.fuzz.xml *.fuzz);;All Files (*)"
86
+ name_filter = __get__name_filter_for_signals ()
87
+ elif caption == "Save fuzzing profile" :
88
+ name_filter = FUZZING_FILE_FILTER
120
89
elif caption == "Save encoding" :
121
90
name_filter = ""
122
91
elif caption == "Save simulator profile" :
123
- name_filter = "Simulator (*.sim.xml *.sim);;All Files (*)"
92
+ name_filter = SIMULATOR_FILE_FILTER
124
93
elif caption == "Export spectrogram" :
125
94
name_filter = "Frequency Time (*.ft);;Frequency Time Amplitude (*.fta)"
95
+ elif caption == "Save protocol" :
96
+ name_filter = ";;" .join ([PROTOCOL_FILE_FILTER , BINARY_PROTOCOL_FILE_FILTER ])
126
97
else :
127
- name_filter = "Protocols (*.proto.xml *.proto);;Binary Protocol (*.bin);;All Files (*)"
98
+ name_filter = EVERYTHING_FILE_FILTER
128
99
129
100
filename = None
130
101
dialog = QFileDialog (directory = RECENT_PATH , caption = caption , filter = name_filter )
131
102
dialog .setFileMode (QFileDialog .AnyFile )
132
- dialog .setViewMode (QFileDialog .Detail )
133
103
dialog .setLabelText (QFileDialog .Accept , "Save" )
134
104
dialog .setAcceptMode (QFileDialog .AcceptSave )
135
105
@@ -147,23 +117,23 @@ def get_save_file_name(initial_name: str, wav_only=False, caption="Save signal",
147
117
return filename
148
118
149
119
150
- def save_data_dialog (signal_name : str , data , sample_rate = 1e6 , wav_only = False , parent = None ) -> str :
120
+ def ask_signal_file_name_and_save (signal_name : str , data , sample_rate = 1e6 , wav_only = False , parent = None ) -> str :
151
121
if wav_only :
152
- if not signal_name .endswith (".wav" ):
122
+ if not signal_name .endswith (".wav" ) and not signal_name . endswith ( ".wave" ) :
153
123
signal_name += ".wav"
154
- name_filter = "WAV (*.wav)"
124
+ selected_name_filter = WAV_FILE_FILTER
155
125
else :
156
- if not any (signal_name .endswith (e ) for e in FILTER .values ()):
126
+ if not any (signal_name .endswith (e ) for e in SIGNAL_NAME_FILTERS_BY_TYPE .values ()):
157
127
try :
158
- dtype = next (d for d in EXT .keys () if d == data .dtype )
159
- signal_name += EXT [dtype ]
160
- name_filter = FILTER [dtype ]
128
+ dtype = next (d for d in SIGNAL_FILE_EXTENSIONS_BY_TYPE .keys () if d == data .dtype )
129
+ signal_name += SIGNAL_FILE_EXTENSIONS_BY_TYPE [dtype ]
130
+ selected_name_filter = SIGNAL_NAME_FILTERS_BY_TYPE [dtype ]
161
131
except StopIteration :
162
- name_filter = None
132
+ selected_name_filter = None
163
133
else :
164
- name_filter = None
134
+ selected_name_filter = None
165
135
166
- filename = get_save_file_name (signal_name , wav_only , selected_name_filter = name_filter )
136
+ filename = ask_save_file_name (signal_name , selected_name_filter = selected_name_filter )
167
137
168
138
if filename :
169
139
try :
@@ -232,6 +202,41 @@ def rewrite_tar(tar_name: str):
232
202
shutil .rmtree (tempdir )
233
203
234
204
205
+ def uncompress_archives (file_names , temp_dir ):
206
+ """
207
+ Extract each archive from the list of filenames.
208
+ Normal files stay untouched.
209
+ Add all files to the Recent Files.
210
+ :type file_names: list of str
211
+ :type temp_dir: str
212
+ :rtype: list of str
213
+ """
214
+ result = []
215
+ for filename in file_names :
216
+ if filename .endswith (".tar" ) or filename .endswith (".tar.gz" ) or filename .endswith (".tar.bz2" ):
217
+ obj = tarfile .open (filename , "r" )
218
+ extracted_file_names = []
219
+ for j , member in enumerate (obj .getmembers ()):
220
+ obj .extract (member , temp_dir )
221
+ extracted_filename = os .path .join (temp_dir , obj .getnames ()[j ])
222
+ extracted_file_names .append (extracted_filename )
223
+ archives [extracted_filename ] = filename
224
+ result .extend (extracted_file_names [:])
225
+ elif filename .endswith (".zip" ):
226
+ obj = zipfile .ZipFile (filename )
227
+ extracted_file_names = []
228
+ for j , info in enumerate (obj .infolist ()):
229
+ obj .extract (info , path = temp_dir )
230
+ extracted_filename = os .path .join (temp_dir , obj .namelist ()[j ])
231
+ extracted_file_names .append (extracted_filename )
232
+ archives [extracted_filename ] = filename
233
+ result .extend (extracted_file_names [:])
234
+ else :
235
+ result .append (filename )
236
+
237
+ return result
238
+
239
+
235
240
def get_directory ():
236
241
directory = QFileDialog .getExistingDirectory (None , "Choose Directory" , QDir .homePath (),
237
242
QFileDialog .ShowDirsOnly | QFileDialog .DontResolveSymlinks )
0 commit comments