diff options
author | piaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2014-08-05 18:34:43 +0800 |
---|---|---|
committer | piaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2014-08-05 18:34:43 +0800 |
commit | c6e492d11c24db678b4c3c8ccdbc8473dccf35b8 (patch) | |
tree | e985e9fa2e1ca7b84a09400f9860fcf8b46ad4e6 | |
parent | c1ebcc7e2d0c5ef9a0c51d7ea2ed117639e646aa (diff) | |
download | pttbbs-c6e492d11c24db678b4c3c8ccdbc8473dccf35b8.tar pttbbs-c6e492d11c24db678b4c3c8ccdbc8473dccf35b8.tar.gz pttbbs-c6e492d11c24db678b4c3c8ccdbc8473dccf35b8.tar.bz2 pttbbs-c6e492d11c24db678b4c3c8ccdbc8473dccf35b8.tar.lz pttbbs-c6e492d11c24db678b4c3c8ccdbc8473dccf35b8.tar.xz pttbbs-c6e492d11c24db678b4c3c8ccdbc8473dccf35b8.tar.zst pttbbs-c6e492d11c24db678b4c3c8ccdbc8473dccf35b8.zip |
py: Allow re-packing BBS structures, and decode Big5 strings internally.
git-svn-id: http://opensvn.csie.org/pttbbs/trunk@6026 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
-rw-r--r-- | pttbbs/util/pyutil/pttstruct.py | 71 |
1 files changed, 40 insertions, 31 deletions
diff --git a/pttbbs/util/pyutil/pttstruct.py b/pttbbs/util/pyutil/pttstruct.py index 0a0ddeb1..03001ab8 100644 --- a/pttbbs/util/pyutil/pttstruct.py +++ b/pttbbs/util/pyutil/pttstruct.py @@ -3,6 +3,7 @@ import collections import struct +import big5 IDLEN = 12 IPV4LEN = 15 @@ -123,33 +124,33 @@ BOARDHEADER_FMT = ( ("pad4", "40s"), ) -BRD_NOCOUNT = 0x00000002 # 不列入統計 -BRD_NOTRAN = 0x00000004 # 不轉信 -BRD_GROUPBOARD = 0x00000008 # 群組板 -BRD_HIDE = 0x00000010 # 隱藏板 (看板好友才可看) -BRD_POSTMASK = 0x00000020 # 限制發表或閱讀 -BRD_ANONYMOUS = 0x00000040 # 匿名板 -BRD_DEFAULTANONYMOUS = 0x00000080 # 預設匿名板 -BRD_NOCREDIT = 0x00000100 # 發文無獎勵看板 -BRD_VOTEBOARD = 0x00000200 # 連署機看板 -BRD_WARNEL = 0x00000400 # 連署機看板 -BRD_TOP = 0x00000800 # 熱門看板群組 -BRD_NORECOMMEND = 0x00001000 # 不可推薦 -BRD_BLOG = 0x00002000 # (已停用) 部落格 -BRD_BMCOUNT = 0x00004000 # 板主設定列入記錄 -BRD_SYMBOLIC = 0x00008000 # symbolic link to board -BRD_NOBOO = 0x00010000 # 不可噓 -BRD_LOCALSAVE = 0x00020000 # 預設 Local Save -BRD_RESTRICTEDPOST = 0x00040000 # 板友才能發文 -BRD_GUESTPOST = 0x00080000 # guest能 post -BRD_COOLDOWN = 0x00100000 # 冷靜 -BRD_CPLOG = 0x00200000 # 自動留轉錄記錄 -BRD_NOFASTRECMD = 0x00400000 # 禁止快速推文 -BRD_IPLOGRECMD = 0x00800000 # 推文記錄 IP -BRD_OVER18 = 0x01000000 # 十八禁 -BRD_NOREPLY = 0x02000000 # 不可回文 -BRD_ALIGNEDCMT = 0x04000000 # 對齊式的推文 -BRD_NOSELFDELPOST = 0x08000000 # 不可自刪 +BRD_NOCOUNT = 0x00000002 # 不列入統計 +BRD_NOTRAN = 0x00000004 # 不轉信 +BRD_GROUPBOARD = 0x00000008 # 群組板 +BRD_HIDE = 0x00000010 # 隱藏板 (看板好友才可看) +BRD_POSTMASK = 0x00000020 # 限制發表或閱讀 +BRD_ANONYMOUS = 0x00000040 # 匿名板 +BRD_DEFAULTANONYMOUS = 0x00000080 # 預設匿名板 +BRD_NOCREDIT = 0x00000100 # 發文無獎勵看板 +BRD_VOTEBOARD = 0x00000200 # 連署機看板 +BRD_WARNEL = 0x00000400 # 連署機看板 +BRD_TOP = 0x00000800 # 熱門看板群組 +BRD_NORECOMMEND = 0x00001000 # 不可推薦 +BRD_BLOG = 0x00002000 # (已停用) 部落格 +BRD_BMCOUNT = 0x00004000 # 板主設定列入記錄 +BRD_SYMBOLIC = 0x00008000 # symbolic link to board +BRD_NOBOO = 0x00010000 # 不可噓 +BRD_LOCALSAVE = 0x00020000 # 預設 Local Save +BRD_RESTRICTEDPOST = 0x00040000 # 板友才能發文 +BRD_GUESTPOST = 0x00080000 # guest能 post +BRD_COOLDOWN = 0x00100000 # 冷靜 +BRD_CPLOG = 0x00200000 # 自動留轉錄記錄 +BRD_NOFASTRECMD = 0x00400000 # 禁止快速推文 +BRD_IPLOGRECMD = 0x00800000 # 推文記錄 IP +BRD_OVER18 = 0x01000000 # 十八禁 +BRD_NOREPLY = 0x02000000 # 不可回文 +BRD_ALIGNEDCMT = 0x04000000 # 對齊式的推文 +BRD_NOSELFDELPOST = 0x08000000 # 不可自刪 FNLEN = 28 # Length of filename @@ -181,9 +182,15 @@ def unpack_data(blob, format_pattern): # Convert C-style strings. for name, pat in format_pattern: if 's' in pat: - data[name] = data[name].partition(chr(0))[0] + data[name] = big5.decode(data[name].partition(chr(0))[0]) return data +def pack_data(data, format_pattern): + fmt = get_format(format_pattern) + values = (big5.encode(data[name]) if 's' in f else data[name] + for name, f in format_pattern) + return struct.pack(fmt, *values) + FILE_LOCAL = 0x01 # local saved, non-mail FILE_READ = 0x01 # already read, mail only FILE_MARKED = 0x02 # non-mail + mail @@ -210,6 +217,8 @@ if __name__ == '__main__': entry = f.read(FILEHEADER_SIZE) header = unpack_data(entry, FILEHEADER_FMT) print header + xblob = pack_data(header, FILEHEADER_FMT) + assert xblob == entry with open('/home/bbs/.PASSWDS', 'rb') as f: entry = f.read(USEREC_SIZE) @@ -221,6 +230,6 @@ if __name__ == '__main__': board = unpack_data(entry, BOARDHEADER_FMT) print board - print 'file title: ', header['title'].decode('big5').encode('big5') - print 'user name: ', user['realname'].decode('big5').encode('big5') - print 'board title: ', board['title'].decode('big5').encode('big5') + print 'user name: ', big5.encode(user['realname']) + print 'file title: ', big5.encode(header['title']) + print 'board title: ', big5.encode(board['title']) |