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

📄 chinesemate.c

📁 palm os 上的中文伴侣源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
/*
 * ChineseMate.c
 *
 * main file for ChineseMate
 *
 * This wizard-generated code is based on code adapted from the
 * stationery files distributed as part of the Palm OS SDK 4.0.
 *
 * Copyright (c) 1999-2000 Palm, Inc. or its subsidiaries.
 * All rights reserved.
 */
 
#include <PalmOS.h>
#include <68K\Hs.h>
#include <common\system\palmOneNavigator.h>
#include <common\system\HsKeyCodes.h>

#include "ChineseMate.h"
#include "ChineseMate_Rsc.h"
#include "AddrDefines.h"
#include "AddressDB.h"
#include "OLD_AddrDefines.h"
#include "OLD_AddressDB.h"

#define ByteSwap16(n) ( ((((unsigned int) n) << 8) & 0xFF00) | \
						((((unsigned int) n) >> 8) & 0x00FF) )

/*********************************************************************
 * Internal Functions
 *********************************************************************/

static void GetCallerID(Char * callNumber, Char * caller, UInt16 addrType)
{
	AddrCallerIDParamsType * param;
	SysNotifyParamType * np;
	Boolean unnamed = false;
	const Char * formatStr = "^name^first|^company|(^label)^|";

	param = MemPtrNew(sizeof(AddrCallerIDParamsType));
	param->lookupString = callNumber;
	param->formatString = MemPtrNew(32);
	StrCopy(param->formatString, formatStr);
	param->formatString[31] = 0x00;
	param->resultString = NULL;
	param->callback = NULL;
	param->ref = NULL;
	param->uniqueID = 0;
	param->flags = 0;
	MemPtrSetOwner(param, 0);
	
	np = MemPtrNew(sizeof(SysNotifyParamType));
	np->notifyType = addrAppNotificationCmdCallerID;
	np->broadcaster = appFileCreator;
	np->notifyDetailsP = param;
	np->userDataP = NULL;
	MemPtrSetOwner(np, 0);
	
	if (addrType == 0)
	{
		CallWithCommand('appl', 'addr', sysAppLaunchCmdNotify, np);
	}
	else
	{
		CallWithCommand('appl', 'PAdd', sysAppLaunchCmdNotify, np);
	}
	
	if (param->resultString)
	{
		UInt16 i = 0;
		UInt16 j = 0;
		if (param->resultString[0] != '|') //此通讯记录有姓名
		{
			while (param->resultString[i] != '|') //把姓名填入缓存
			{
				caller[i] = param->resultString[i];
				i ++;
			}
			caller[i] = 0x20; //加一个空格
			i ++;
			//往后搜索,跳过company
			j = i;
			while (param->resultString[j] != '|')
			{
				j ++;
			}
			//把电话类型填入缓存
			j ++;
			while (param->resultString[j] != '|')
			{
				caller[i] = param->resultString[j];
				i ++; j ++;
			}
			caller[i] = 0x20; caller[i + 1] = 0x00; //字符串结尾标记
		}
		else //此通讯录没有姓名
		{
			if (param->resultString[1] != '|') //有company
			{
				j ++;
				while (param->resultString[j] != '|') //把company填入缓存
				{
					caller[i] = param->resultString[j];
					i ++; j ++;
				}
				caller[i] = 0x20; //加一个空格
				i ++;
				j ++; //指向电话类型
			}
			else //连company都没有
			{
				//填入“未命名”[0xCEB4 0xC3FC 0xC3FB]
				j += 2; //指向电话类型
				caller[0] = 0xCE; caller[1] = 0xB4;
				caller[2] = 0xC3; caller[3] = 0xFC;
				caller[4] = 0xC3; caller[5] = 0xFB;
				caller[6] = 0x20;
				i = 7;
				unnamed = true;
			}
			//填入电话类型
			while (param->resultString[j] != '|')
			{
				caller[i] = param->resultString[j];
				i ++;
				j ++;
			}
			caller[i] = 0x20;
			 //字符串结束标记
			if (unnamed)
			{
				j = i + 5;
				while (i <= j)
				{
					caller[i] = 0x20;
					i ++;
				}
				caller[i] = 0x00;
			}
			else
			{
				caller[i + 1] = 0x00;
			}
		}
	}
	
	MemPtrFree(np);
	if (param->resultString)
	{
		MemPtrFree(param->resultString);
	}
	MemPtrFree(param->formatString);
	MemPtrFree(param);
}

static WChar OLD_GetFirstChar(DmOpenRef * dbRef, UInt16 recI)
{
	MemHandle				recH = 0;
	OLD_AddrDBRecordType	addrRec;
	WChar					firstChar = 0;
	
	OLD_AddrDBGetRecord(dbRef, recI, &addrRec, &recH);
	if (recH)
	{
		if (addrRec.fields[OLD_name])
		{
			if ((UInt8)addrRec.fields[OLD_name][0] > 128)
			{
				firstChar = ((((UInt16) addrRec.fields[OLD_name][0]) << 8) & 0xFF00) | (((UInt16) addrRec.fields[OLD_name][1]) & 0x00FF);
			}
			else
			{
				firstChar = ((UInt16) addrRec.fields[OLD_name][0]) & 0x00FF;
			}
		}
		else if (addrRec.fields[OLD_firstName])
		{
			if ((UInt8)addrRec.fields[OLD_firstName][0] > 128)
			{
				firstChar = ((((UInt16) addrRec.fields[OLD_firstName][0]) << 8) & 0xFF00) | (((UInt16) addrRec.fields[OLD_firstName][1]) & 0x00FF);
			}
			else
			{
				firstChar = ((UInt16) addrRec.fields[OLD_firstName][0]) & 0x00FF;
			}
		}
		else if (addrRec.fields[company])
		{
			if ((UInt8)addrRec.fields[company][0] > 128)
			{
				firstChar = ((((UInt16) addrRec.fields[company][0]) << 8) & 0xFF00) | (((UInt16) addrRec.fields[company][1]) & 0x00FF);
			}
			else
			{
				firstChar = ((UInt16) addrRec.fields[company][0]) & 0x00FF;
			}
		}
		else
		{
			firstChar = 0x0055; //'U'
		}
		MemHandleUnlock(recH);
	}
	
	return firstChar;
}

static WChar GetFirstChar(DmOpenRef * dbRef, UInt16 recI)
{
	MemHandle			recH = 0;
	AddrDBRecordType	addrRec;
	WChar				firstChar = 0;
	
	AddrDBGetRecord(dbRef, recI, &addrRec, &recH);
	if (recH)
	{
		if (addrRec.fields[name])
		{
			if ((UInt8)addrRec.fields[name][0] > 128)
			{
				firstChar = ((((UInt16) addrRec.fields[name][0]) << 8) & 0xFF00) | (((UInt16) addrRec.fields[name][1]) & 0x00FF);
			}
			else
			{
				firstChar = ((UInt16) addrRec.fields[name][0]) & 0x00FF;
			}
		}
		else if (addrRec.fields[firstName])
		{
			if ((UInt8)addrRec.fields[firstName][0] > 128)
			{
				firstChar = ((((UInt16) addrRec.fields[firstName][0]) << 8) & 0xFF00) | (((UInt16) addrRec.fields[firstName][1]) & 0x00FF);
			}
			else
			{
				firstChar = ((UInt16) addrRec.fields[firstName][0]) & 0x00FF;
			}
		}
		else if (addrRec.fields[company])
		{
			if ((UInt8)addrRec.fields[company][0] > 128)
			{
				firstChar = ((((UInt16) addrRec.fields[company][0]) << 8) & 0xFF00) | (((UInt16) addrRec.fields[company][1]) & 0x00FF);
			}
			else
			{
				firstChar = ((UInt16) addrRec.fields[company][0]) & 0x00FF;
			}
		}
		else
		{
			firstChar = 0x0055; //'U'
		}
		MemHandleUnlock(recH);
	}
	
	return firstChar;
}

static UInt16 GetCurLine(totalLen, lineLen, curPos)
{
	UInt16	i;
	if (curPos > totalLen)
	{
		return 0;
	}
	i = 0;
	while(true)
	{
		if (curPos >= lineLen)
		{
			i ++;
			lineLen += lineLen;
		}
		else
		{
			break;
		}
	}
	return i;
}

static UInt16 GetMaxLine(totalLen, lineLen)
{
	UInt16	i;
	i = 0;
	while(true)
	{
		if (lineLen <= totalLen)
		{
			i ++;
			lineLen += lineLen;
		}
		else
		{
			break;
		}
	}
	return i;
}

static Char GetFirstPY(UInt16 CHChar, DmOpenRef * pydbRef)
{
	MemHandle	recordHandle;
	Char		* recordPtr;
	Char		firstPY;

	recordHandle = DmQueryRecord(pydbRef, 0);
	recordPtr = (Char *)MemHandleLock(recordHandle);
	firstPY = recordPtr[CHChar - 33088];
	MemHandleUnlock(recordHandle);
	
	return firstPY;
}

static void GetFirstName(DmOpenRef * dbRef, UInt16 rcIndex, Char * addrFullName)
{
	MemHandle			rcHandle;
	AddrDBRecordType	addrRecord;
	const Char			* unName = "unamed\0";
	
	AddrDBGetRecord(dbRef, rcIndex, &addrRecord, &rcHandle);
	addrFullName[0] = '\0';
	addrFullName[99] = '\0';
	if (addrRecord.fields[firstName])
	{
		StrCat(addrFullName, addrRecord.fields[firstName]);
	}
	if (StrLen(addrFullName) == 0)
	{
		if (addrRecord.fields[company])
		{
			StrCat(addrFullName, addrRecord.fields[company]);
		}
		else
		{
			StrCat(addrFullName, unName);
		}
	}
	if (rcHandle)
	{
		MemHandleUnlock(rcHandle);
	}
}

static void OLD_GetFirstName(DmOpenRef * dbRef, UInt16 rcIndex, Char * addrFullName)
{
	MemHandle				rcHandle;
	OLD_AddrDBRecordType	addrRecord;
	const Char				* unName = "unamed\0";
	
	OLD_AddrDBGetRecord(dbRef, rcIndex, &addrRecord, &rcHandle);
	addrFullName[0] = '\0';
	addrFullName[99] = '\0';
	if (addrRecord.fields[OLD_firstName])
	{
		StrCat(addrFullName, addrRecord.fields[OLD_firstName]);
	}
	if (StrLen(addrFullName) == 0)
	{
		if (addrRecord.fields[company])
		{
			StrCat(addrFullName, addrRecord.fields[company]);
		}
		else
		{
			StrCat(addrFullName, unName);
		}
	}
	if (rcHandle)
	{
		MemHandleUnlock(rcHandle);
	}
}

static void GBK2PY(Char * gbkStr, Char * pyStr, DmOpenRef * dbR)
{
	UInt16		gbkSize;
	UInt16		gbkOffset;
	UInt16		pyOffset;
	WChar		curChar;
	
	gbkSize = StrLen(gbkStr);
	gbkOffset = 0;
	pyOffset = 0;
	while (gbkOffset < gbkSize)
	{
		gbkOffset += TxtGetNextChar(gbkStr, gbkOffset, &curChar);
		if (curChar > 128)
		{
			pyStr[pyOffset] = GetFirstPY(curChar, dbR);
		}
		else
		{
			if (curChar > 96 && curChar < 123)
			{
				pyStr[pyOffset] = curChar - 32;
			}
			else
			{
				pyStr[pyOffset] = curChar;
			}
		}
		pyOffset ++;
	}
	pyStr[pyOffset] = '\0';
}

static UInt16 TxtLen(Char * str)
{
	UInt16	strSize;
	UInt16	sLen;
	UInt16	i;
	
	i = 0;
	sLen = 0;
	strSize = StrLen(str);
	while (i < strSize)
	{
		i += TxtNextCharSize(str, i);
		sLen ++;
	}
	return sLen;
}

static void FastAccessHandler(WChar * Buf, FormType * frmP)
{
	EventType	event;
	FieldType	* fldKeyPtr;
	ListType	* lstP;
	MemHandle	fldKeyTextHandle;
	Char		* fldKeyTextPtr;
	Boolean		ExitEventLoop;
	UInt16		i;
	UInt16		fldTextSp;
	DmOpenRef	* dbRef;
	DmOpenRef	* dbR;
	UInt16		dbCount;
	Char		* addrFullName;
	UInt16		seachOffset;
	UInt16		keyLength;
	Boolean		inSel;
	Char		* lstBuf;
	Char		* bLstBuf;
	UInt16		lstBufLen;
	Char		* pyStr;
	MemHandle	lstArrayHandle;
	Char		** lstItemStr;
	Boolean		keyHandled;
	
	//Init List
	lstP = (ListType *)FrmGetObjectPtr(frmP, FrmGetObjectIndex(frmP, lstResult));
	LstSetSelection(lstP, noListSelection);
	inSel = false;
	//Init Field
	fldKeyPtr = (FieldType *)FrmGetObjectPtr(frmP, FrmGetObjectIndex(frmP, fldKeyN));
	fldKeyTextHandle = MemHandleNew(6);
	fldKeyTextPtr = MemHandleLock(fldKeyTextHandle);
	for (i = 0; i < 6; i ++)
	{
		fldKeyTextPtr[i] = '\0';
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -