⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 .#aftersync.c.1.3

📁 个人日程管理系统
💻 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 + -