作者lihgong (Q.Q)
看板PttCurrent
标题Re: [请益] 锁文的功能
时间Sun Dec 19 11:14:39 2004
我大概把实作的方法写在这边
有人需要可以参考看看
首先看pttstruct.h
找fileheader_t里filemode一个空的栏位来用
在看板里面, lock的文章要和其他文章区别
下面列出现行的pttCurrent的filemode
#define FILE_LOCAL 0x1 /* local saved */
#define FILE_READ 0x1 /* already read : mail only */
#define FILE_MARKED 0x2 /* opus: 0x8 */
#define FILE_DIGEST 0x4 /* digest */
#define FILE_HOLD 0x8 /* unused */
#define FILE_BOTTOM 0x8 /* push_bottom */
#define FILE_SOLVED 0x10 /* problem solved, sysop/BM only */
#define FILE_HIDE 0x20 /* hild */
#define FILE_BID 0x20 /* for bid */
#define FILE_BM 0x40 /* BM only */
#define FILE_MULTI 0x100 /* multi send for mail */
#define FILE_VOTE 0x40 /* for vote */
#define FILE_ANONYMOUS 0x80 /* anonymous file */
说实话... 要在上面的filemode再塞一个锁定文章有点困难
还是可以做, 比如舍弃FILE_BID的功能, 拿这个flag来做锁定文章
或是... (想办法桥出来就是了 @@)
或是考虑下面比较难搞的办法
----------
根本的解法是扩充filemode, 从char->short
我站上在扩展filemode之後, 重新分配的filemode变...
// 看板文章区
#define FILE_LOCAL 0x0001 /* local saved */
#define FILE_MARKED 0x0002 /* mark post */
#define FILE_DIGEST 0x0004 /* digest */
#define FILE_SOLVED 0x0008 /* problem solved, sysop/BM only */
#define FILE_VOTE 0x0010 /* for vote */
#define FILE_ANONYMOUS 0x0020 /* 匿名文章, 文章 money 栏位拿来存 uid */
#define FILE_BOTTOM 0x0040 /* push_bottom */
// 信件区
#define FILE_READ 0x0100 /* already read : mail only */
#define FILE_REPLYED 0x0200 /* replyed mail : mail only */
#define FILE_MULTI 0x0400 /* multi send for mail */
//阅读权限区
#define FILE_HIDE 0x1000 /* hide & 文章加密 */
#define FILE_BM 0x2000 /* BM only */
[email protected] no.982有转换程式的范例 (当然... 要稍微改一下)
拼一点把旧的filemode完全对应的新的filemode (看起来比较整齐乾净)
懒一点就直接filemode (新的) = filemode (旧的)
多出来的8-bit就可以乱用
当然罗... 建议你另外跑一个PttCurrent来测试
完全ok了再对原站做转换 (话说我当时爆了十几次 @@)
-----------
最後列出我站上的fileheader_t给你参考
typedef struct fileheader_t {
char filename[FNLEN]; /* M.9876543210.A */
char recommend; /* important level */
char owner[IDLEN + 2]; /* uid[.] */
char date[6]; /* [02/02] or space(5) */
char title[TTLEN + 1];
/* lihgong: 下面这些flag和ptt不同, 主要原因是我把money栏位改成 short */
union {
short money;
short anon_uid;
/* lihgong: 因为我站上人数 < 65535人 */
/* different order to match alignment */
#ifdef _BIG_ENDIAN
struct {
unsigned char logins; /* money & 0xff00 */
unsigned char posts; /* money & 0xff */
} vote_limits;
struct {
unsigned short flag:1;
unsigned short ref:15;
} refer;
#else
struct {
unsigned char posts; /* money & 0xff */
unsigned char logins; /* money & 0xff00 */
} vote_limits;
struct {
unsigned short ref:15;
unsigned short flag:1;
} refer;
#endif
} multi; /* rocker: if bit16 on ==> reference */
/* XXX dirty, split into flag and money if money of each file is less than 16bit? */
unsigned short filemode; /* must be last field @ boards.c */
} fileheader_t;
note. 上面那段恐怖的union, 如果你没用到里头的posts和logins
放心的把那串union注解掉, 换成short money吧
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.113.140.120
1F:推 frankiori:再度大感谢 163.21.254.249 12/20