📄 .#aftersync.c.1.3
字号:
#include <PalmOS.h>#include "aftersync.h"#include "progect.h"void reorganize(DmOpenRef dbP, MemPtr sortP, DmOpenRef log);void fixPdeskCategoryBug(DmOpenRef dbP);#define SORT_BLOCK_TAG 0xFFFFFFFF#define LOGWRITE(A) { Char dbg[80]; StrPrintF A; logWrite(log, dbg); }void logWrite(DmOpenRef log, char* msg){ UInt16 index = dmMaxRecordIndex; MemHandle h; MemPtr p; h = DmNewRecord(log, &index, StrLen(msg) + 1); p = MemHandleLock(h); DmWrite(p, 0, msg, StrLen(msg) + 1); MemHandleUnlock(h); DmReleaseRecord(log, index, false);}void afterSync(void){ // authentify user (cp protection) DmSearchStateType state; UInt16 cardno; LocalID dbID, sortinfoID; MemPtr p; MemHandle h; DmOpenRef dbP, log; Err err; err = DmCreateDatabase(0, "lbPG-synclog", 'lbPG', 'LOGT', false); if (err == dmErrAlreadyExists) { DmDeleteDatabase(0, DmFindDatabase(0, "lbPG-synclog")); err = DmCreateDatabase(0, "lbPG-synclog", 'lbPG', 'LOGT', false); if (err) return; } else if (err) { return; } log = DmOpenDatabase(0, DmFindDatabase(0, "lbPG-synclog"), dmModeWrite); LOGWRITE((dbg, "afterSync start")); err = DmGetNextDatabaseByTypeCreator(true, &state, 'DATA', 'lbPG', false, &cardno, &dbID); // for each progect database while (!err) { LOGWRITE((dbg, "Got a database")); dbP = DmOpenDatabase(cardno, dbID, dmModeReadWrite); fixPdeskCategoryBug(dbP); LOGWRITE((dbg, "Fixed PDesk bug in database")); // get sib (== sortinfoblock) DmDatabaseInfo(cardno, dbID, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &sortinfoID, NULL, NULL); // if sib and sib[0..3] == 0xffff if (sortinfoID) { p = MemLocalIDToLockedPtr(sortinfoID, cardno); // block begins with 0xffff and end with 0xffff if (p && MemPtrSize(p) > 2*sizeof(UInt32)) { if (*(UInt32*)p == SORT_BLOCK_TAG) { LOGWRITE((dbg, "Got data to sort")); reorganize(dbP, p, log); LOGWRITE((dbg, "Data sorted")); // remove sib MemPtrUnlock(p); p = NULL; h = DmNewHandle(dbP, 0); if (h) { sortinfoID = MemHandleToLocalID(h); } else { sortinfoID = NULL; } DmSetDatabaseInfo(cardno, dbID, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &sortinfoID, NULL, NULL); } } if (p) { MemPtrUnlock(p); } } DmCloseDatabase(dbP); err = DmGetNextDatabaseByTypeCreator(false, &state, 'DATA', 'lbPG', false, &cardno, &dbID); } LOGWRITE((dbg, "Sync stop")); DmCloseDatabase(log);} // void afterSync(void)void reorganize(DmOpenRef dbP, MemPtr sortP, DmOpenRef log){ UInt32 *p = (UInt32*)sortP; UInt16 size = MemPtrSize(sortP) / sizeof(UInt32); UInt16 from, to; UInt16 nbRec = DmNumRecords(dbP); Err err; size -= 2; // remove flags LOGWRITE((dbg, "reorganize starting now")); LOGWRITE((dbg, "Size of block is %d", size)); LOGWRITE((dbg, "Number of recs in db is %d", nbRec)); if (size != nbRec) { LOGWRITE((dbg, "Error, size do not match, aborting")); return; } p++; // skip start flag for (to = 0; to < size; to++) { err = DmFindRecordByID(dbP, p[to], &from); if (err) { LOGWRITE((dbg, "Cannot find record, got error %d, aborting", err)); return; } if (from != to) { LOGWRITE((dbg, "Moving from %d to %d", from , to)); err = DmMoveRecord(dbP, from, to); if (err) { LOGWRITE((dbg, "Cannot move record, got error %d, aborting", err)); return; } } }} // void reorganize(DmOpenRef dbP, MemPtr sortP)/**************************************************************************** * Name : fixPdeskCategoryBug * Desc : Pdesk sets the category of unfiled items to 1 instead of 0. If the project * doesn't have any categories defined, this results in a bad category value. * After synchronization, check for this bug and fix tasks with bad categories. * Parm : * -> db to search * Auth : sd, 06.09.2003 ***************************************************************************/void fixPdeskCategoryBug(DmOpenRef dbP){ UInt16 i, attr; UInt16 numRec = DmNumRecords(dbP); // check if category 1 exists. Set tasks w/ cat 1 to Unfiled (cat 0) if not to work around PDesk bug) char name[dmCategoryLength]; CategoryGetName(dbP, 1, name); if(StrLen(name)==0) { for (i=1; i<numRec; i++) { DmRecordInfo(dbP, i, &attr, NULL, NULL); if((attr & dmRecAttrCategoryMask) == 1) { attr = (attr & ~dmRecAttrCategoryMask) | dmRecAttrDirty; // clear category field DmSetRecordInfo(dbP, i, &attr, NULL); } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -