📄 chinesemate.c
字号:
/*
* 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 + -