9 |
9 |
10 import os |
10 import os |
11 |
11 |
12 from PyQt6.QtCore import QObject, QDate, QDateTime, QTime |
12 from PyQt6.QtCore import QObject, QDate, QDateTime, QTime |
13 |
13 |
14 from E5Network.E5UrlInfo import E5UrlInfo, E5UrlPermission |
14 from EricNetwork.EricUrlInfo import EricUrlInfo, EricUrlPermission |
15 |
15 |
16 |
16 |
17 class FtpDirLineParserError(Exception): |
17 class FtpDirLineParserError(Exception): |
18 """ |
18 """ |
19 Exception class raised, if a parser issue was detected. |
19 Exception class raised, if a parser issue was detected. |
67 """ |
67 """ |
68 Private method to parse a Unix mode string modifying the |
68 Private method to parse a Unix mode string modifying the |
69 given URL info object. |
69 given URL info object. |
70 |
70 |
71 @param modeString mode string to be parsed (string) |
71 @param modeString mode string to be parsed (string) |
72 @param urlInfo reference to the URL info object (E5UrlInfo) |
72 @param urlInfo reference to the URL info object (EricUrlInfo) |
73 @exception FtpDirLineParserError Raised if the mode cannot be parsed. |
73 @exception FtpDirLineParserError Raised if the mode cannot be parsed. |
74 """ |
74 """ |
75 if len(modeString) != 10: |
75 if len(modeString) != 10: |
76 raise FtpDirLineParserError( |
76 raise FtpDirLineParserError( |
77 "invalid mode string '{0}'".format(modeString)) |
77 "invalid mode string '{0}'".format(modeString)) |
78 |
78 |
79 modeString = modeString.lower() |
79 modeString = modeString.lower() |
80 |
80 |
81 permission = 0 |
81 permission = 0 |
82 if modeString[1] != '-': |
82 if modeString[1] != '-': |
83 permission |= E5UrlPermission.READ_OWNER |
83 permission |= EricUrlPermission.READ_OWNER |
84 if modeString[2] != '-': |
84 if modeString[2] != '-': |
85 permission |= E5UrlPermission.WRITE_OWNER |
85 permission |= EricUrlPermission.WRITE_OWNER |
86 if modeString[3] != '-': |
86 if modeString[3] != '-': |
87 permission |= E5UrlPermission.EXE_OWNER |
87 permission |= EricUrlPermission.EXE_OWNER |
88 if modeString[4] != '-': |
88 if modeString[4] != '-': |
89 permission |= E5UrlPermission.READ_GROUP |
89 permission |= EricUrlPermission.READ_GROUP |
90 if modeString[5] != '-': |
90 if modeString[5] != '-': |
91 permission |= E5UrlPermission.WRITE_GROUP |
91 permission |= EricUrlPermission.WRITE_GROUP |
92 if modeString[6] != '-': |
92 if modeString[6] != '-': |
93 permission |= E5UrlPermission.EXE_GROUP |
93 permission |= EricUrlPermission.EXE_GROUP |
94 if modeString[7] != '-': |
94 if modeString[7] != '-': |
95 permission |= E5UrlPermission.READ_OTHER |
95 permission |= EricUrlPermission.READ_OTHER |
96 if modeString[8] != '-': |
96 if modeString[8] != '-': |
97 permission |= E5UrlPermission.WRITE_OTHER |
97 permission |= EricUrlPermission.WRITE_OTHER |
98 if modeString[9] != '-': |
98 if modeString[9] != '-': |
99 permission |= E5UrlPermission.EXE_OTHER |
99 permission |= EricUrlPermission.EXE_OTHER |
100 urlInfo.setPermissions(permission) |
100 urlInfo.setPermissions(permission) |
101 |
101 |
102 if modeString[0] == "d": |
102 if modeString[0] == "d": |
103 urlInfo.setDir(True) |
103 urlInfo.setDir(True) |
104 urlInfo.setFile(False) |
104 urlInfo.setFile(False) |
126 </ul> |
126 </ul> |
127 |
127 |
128 @param monthAbbreviation abbreviation of the month name (string) |
128 @param monthAbbreviation abbreviation of the month name (string) |
129 @param day day of the month (string) |
129 @param day day of the month (string) |
130 @param yearOrTime string giving the year or a time (string) |
130 @param yearOrTime string giving the year or a time (string) |
131 @param urlInfo reference to the URL info object (E5UrlInfo) |
131 @param urlInfo reference to the URL info object (EricUrlInfo) |
132 @exception FtpDirLineParserError Raised if the month abbreviation is |
132 @exception FtpDirLineParserError Raised if the month abbreviation is |
133 not recognized. |
133 not recognized. |
134 """ |
134 """ |
135 try: |
135 try: |
136 month = FtpDirLineParser.MonthnamesNumbers[ |
136 month = FtpDirLineParser.MonthnamesNumbers[ |
194 def __parseUnixLine(self, line): |
194 def __parseUnixLine(self, line): |
195 """ |
195 """ |
196 Private method to parse a Unix style directory listing line. |
196 Private method to parse a Unix style directory listing line. |
197 |
197 |
198 @param line directory line to be parsed (string) |
198 @param line directory line to be parsed (string) |
199 @return URL info object containing the valid data (E5UrlInfo) |
199 @return URL info object containing the valid data (EricUrlInfo) |
200 """ |
200 """ |
201 modeString, nlink, user, group, size, month, day, yearOrTime, name = ( |
201 modeString, nlink, user, group, size, month, day, yearOrTime, name = ( |
202 self.__splitUnixLine(line) |
202 self.__splitUnixLine(line) |
203 ) |
203 ) |
204 |
204 |
205 if name in [".", ".."]: |
205 if name in [".", ".."]: |
206 return None |
206 return None |
207 |
207 |
208 urlInfo = E5UrlInfo() |
208 urlInfo = EricUrlInfo() |
209 self.__parseUnixMode(modeString, urlInfo) |
209 self.__parseUnixMode(modeString, urlInfo) |
210 self.__parseUnixTime(month, day, yearOrTime, urlInfo) |
210 self.__parseUnixTime(month, day, yearOrTime, urlInfo) |
211 urlInfo.setOwner(user) |
211 urlInfo.setOwner(user) |
212 urlInfo.setGroup(group) |
212 urlInfo.setGroup(group) |
213 urlInfo.setSize(int(size)) |
213 urlInfo.setSize(int(size)) |
228 have the format "10-23-12 03:25PM" (month-day_of_month-two_digit_year, |
228 have the format "10-23-12 03:25PM" (month-day_of_month-two_digit_year, |
229 hour:minute, am/pm). |
229 hour:minute, am/pm). |
230 |
230 |
231 @param date date string (string) |
231 @param date date string (string) |
232 @param time time string (string) |
232 @param time time string (string) |
233 @param urlInfo reference to the URL info object (E5UrlInfo) |
233 @param urlInfo reference to the URL info object (EricUrlInfo) |
234 @exception FtpDirLineParserError Raised if either of the strings is not |
234 @exception FtpDirLineParserError Raised if either of the strings is not |
235 recognized. |
235 recognized. |
236 """ |
236 """ |
237 try: |
237 try: |
238 month, day, year = [int(part) for part in date.split('-')] |
238 month, day, year = [int(part) for part in date.split('-')] |
258 def __parseWindowsLine(self, line): |
258 def __parseWindowsLine(self, line): |
259 """ |
259 """ |
260 Private method to parse a Windows style directory listing line. |
260 Private method to parse a Windows style directory listing line. |
261 |
261 |
262 @param line directory line to be parsed (string) |
262 @param line directory line to be parsed (string) |
263 @return URL info object containing the valid data (E5UrlInfo) |
263 @return URL info object containing the valid data (EricUrlInfo) |
264 @exception FtpDirLineParserError Raised if the line is not of a |
264 @exception FtpDirLineParserError Raised if the line is not of a |
265 recognized Windows format. |
265 recognized Windows format. |
266 """ |
266 """ |
267 try: |
267 try: |
268 date, time, dirOrSize, name = line.split(None, 3) |
268 date, time, dirOrSize, name = line.split(None, 3) |
272 "line '{0}' cannot be parsed".format(line)) |
272 "line '{0}' cannot be parsed".format(line)) |
273 |
273 |
274 if name in [".", ".."]: |
274 if name in [".", ".."]: |
275 return None |
275 return None |
276 |
276 |
277 urlInfo = E5UrlInfo() |
277 urlInfo = EricUrlInfo() |
278 self.__parseWindowsTime(date, time, urlInfo) |
278 self.__parseWindowsTime(date, time, urlInfo) |
279 if dirOrSize.lower() == "<dir>": |
279 if dirOrSize.lower() == "<dir>": |
280 urlInfo.setDir(True) |
280 urlInfo.setDir(True) |
281 urlInfo.setFile(False) |
281 urlInfo.setFile(False) |
282 else: |
282 else: |
291 |
291 |
292 ext = os.path.splitext(name.lower())[1] |
292 ext = os.path.splitext(name.lower())[1] |
293 urlInfo.setSymLink(ext == ".lnk") |
293 urlInfo.setSymLink(ext == ".lnk") |
294 |
294 |
295 permissions = ( |
295 permissions = ( |
296 E5UrlPermission.READ_OWNER | E5UrlPermission.WRITE_OWNER | |
296 EricUrlPermission.READ_OWNER | EricUrlPermission.WRITE_OWNER | |
297 E5UrlPermission.READ_GROUP | E5UrlPermission.WRITE_GROUP | |
297 EricUrlPermission.READ_GROUP | EricUrlPermission.WRITE_GROUP | |
298 E5UrlPermission.READ_OTHER | E5UrlPermission.WRITE_OTHER |
298 EricUrlPermission.READ_OTHER | EricUrlPermission.WRITE_OTHER |
299 ) |
299 ) |
300 if ext in [".exe", ".com", ".bat", ".cmd"]: |
300 if ext in [".exe", ".com", ".bat", ".cmd"]: |
301 permissions |= ( |
301 permissions |= ( |
302 E5UrlPermission.EXE_OWNER | |
302 EricUrlPermission.EXE_OWNER | |
303 E5UrlPermission.EXE_GROUP | |
303 EricUrlPermission.EXE_GROUP | |
304 E5UrlPermission.EXE_OTHER |
304 EricUrlPermission.EXE_OTHER |
305 ) |
305 ) |
306 urlInfo.setPermissions(permissions) |
306 urlInfo.setPermissions(permissions) |
307 |
307 |
308 return urlInfo |
308 return urlInfo |
309 |
309 |
314 This implementation support Unix and Windows style directory |
314 This implementation support Unix and Windows style directory |
315 listings. It tries Unix style first and if that fails switches |
315 listings. It tries Unix style first and if that fails switches |
316 to Windows style. If that fails as well, an exception is raised. |
316 to Windows style. If that fails as well, an exception is raised. |
317 |
317 |
318 @param line directory line to be parsed (string) |
318 @param line directory line to be parsed (string) |
319 @return URL info object containing the valid data (E5UrlInfo) |
319 @return URL info object containing the valid data (EricUrlInfo) |
320 """ |
320 """ |
321 if self.__ignoreLine(line): |
321 if self.__ignoreLine(line): |
322 return None |
322 return None |
323 |
323 |
324 try: |
324 try: |