📄 addresstransfer.c
字号:
Boolean personOnlyAtWork = false;
AddressPhoneLabels phoneLabel;
MemHandle unnamedRecordStrH;
Char * unnamedRecordStr;
Char* fields[7];
PdiWriteBeginObject(pdiRefNum, writer, kPdiPRN_BEGIN_VCARD);
PdiWriteProperty(pdiRefNum, writer, kPdiPRN_VERSION);
PdiWritePropertyValue(pdiRefNum, writer, (Char*)"2.1", kPdiWriteData);
PdiWritePropertyStr(pdiRefNum, writer, "X-PALM", kPdiNoFields, 1);
PdiWritePropertyValue(pdiRefNum, writer, (Char*) kVObjectVersion, kPdiWriteData);
if (recordP->fields[name] || recordP->fields[firstName] || recordP->fields[company])
PdiWriteProperty(pdiRefNum, writer, kPdiPRN_N);
if (recordP->fields[name] != NULL ||
recordP->fields[firstName] != NULL)
{
fields[0] = recordP->fields[name];
fields[1] = recordP->fields[firstName];
PdiWritePropertyFields(pdiRefNum, writer, fields, 2, kPdiWriteText);
TraceOutput(TL(appErrorClass | 5, "name = %s", recordP->fields[name]));
}
else if (recordP->fields[company] != NULL)
// no name field, so try emitting company in N: field
{
PdiWritePropertyValue(pdiRefNum, writer, recordP->fields[company], kPdiWriteText);
TraceOutput(TL(appErrorClass | 5, "name = %s", recordP->fields[company]));
}
else
// no company name either, so emit unnamed identifier
{
// But before doing that check if there is an alternate field (e.g the "EnglishName" in Chinese).
if (!PrvTransferAlternateFieldExists(recordP))
{
PdiWriteProperty(pdiRefNum, writer, kPdiPRN_N);
unnamedRecordStrH = DmGetResource(strRsc, UnnamedRecordStr);
unnamedRecordStr = MemHandleLock(unnamedRecordStrH);
PdiWritePropertyValue(pdiRefNum, writer, unnamedRecordStr, kPdiWriteText);
TraceOutput(TL(appErrorClass | 5, "name = %s", unnamedRecordStr));
MemHandleUnlock(unnamedRecordStrH);
DmReleaseResource(unnamedRecordStrH);
}
}
if (recordP->fields[address] != NULL ||
recordP->fields[city] != NULL ||
recordP->fields[state] != NULL ||
recordP->fields[zipCode] != NULL ||
recordP->fields[country] != NULL)
{
PdiWriteProperty(pdiRefNum, writer, kPdiPRN_ADR);
if (!recordP->fields[country])
{
PdiWriteParameter(pdiRefNum, writer, kPdiPAV_TYPE_DOM, false);
}
// ABa: Add a tag HOME or WORK
if (recordP->fields[company])
{
// if there's a company name, assume work address
PdiWriteParameter(pdiRefNum, writer, kPdiPAV_TYPE_WORK, false);
}
else
{
// If no company name, assume home address
PdiWriteParameter(pdiRefNum, writer, kPdiPAV_TYPE_HOME, false);
}
fields[0] = fields[1] = NULL;
fields[2] = recordP->fields[address];
fields[3] = recordP->fields[city];
fields[4] = recordP->fields[state];
fields[5] = recordP->fields[zipCode];
fields[6] = recordP->fields[country];
PdiWritePropertyFields(pdiRefNum, writer, fields, 7, kPdiWriteText);
}
if (recordP->fields[company] != NULL)
{
PdiWriteProperty(pdiRefNum, writer, kPdiPRN_ORG);
PdiWritePropertyValue(pdiRefNum, writer, recordP->fields[company], kPdiWriteText);
}
/* LFe: THE CODE CAS
// Emit a title
if (recordP->fields[title] != NULL)
{
// We want to encode ';' with quoted-printable because we convert
// non encoded ';' into '\n'. This change fixes the bug on ';' in TITLE
PdiWritePropertyStr(pdiRefNum, writer, "TITLE", kPdiSemicolonFields, 1);
PdiWritePropertyValue(pdiRefNum, writer, recordP->fields[title], kPdiWriteText);
}
*/
/* LFe: CHANGE TO: - NEED TO BE VALIDATED
*/
// Emit a title
if (recordP->fields[title] != NULL)
{
PdiWriteProperty(pdiRefNum, writer, kPdiPRN_TITLE);
PdiWritePropertyValue(pdiRefNum, writer, recordP->fields[title], kPdiWriteText);
}
// Emit a note
if (recordP->fields[note] != NULL)
{
PdiWriteProperty(pdiRefNum, writer, kPdiPRN_NOTE);
PdiWritePropertyValue(pdiRefNum, writer, recordP->fields[note], kPdiWriteMultiline);
}
for (i = firstPhoneField; i <= lastPhoneField; i++)
{
if (recordP->fields[i] != NULL)
{
phoneLabel = (AddressPhoneLabels) GetPhoneLabel(recordP, i);
if (phoneLabel == homeLabel)
{
if (personOnlyAtWork)
{
personOnlyAtWork = false;
break;
}
else
{
personOnlyAtHome = true;
}
}
else if (phoneLabel == workLabel)
{
if (personOnlyAtHome)
{
personOnlyAtHome = false;
break;
}
else
{
personOnlyAtWork = true;
}
}
}
}
// Now emit the phone fields
for (i = firstPhoneField; i <= lastPhoneField; i++)
{
if (recordP->fields[i] != NULL)
{
phoneLabel = (AddressPhoneLabels) GetPhoneLabel(recordP, i);
if (phoneLabel != emailLabel)
{
// The item
PdiWriteProperty(pdiRefNum, writer, kPdiPRN_TEL);
// Is this prefered? Assume so if listed in the list view.
if (recordP->options.phones.displayPhoneForList == i - firstPhoneField)
{
PdiWriteParameter(pdiRefNum, writer, kPdiPAV_TYPE_PREF, false);
}
// Add a home or work tag, unless this field is labeled "other".
// We don't want "other" phone numbers to be tagged as ";WORK" or
// ";HOME", because then they are interpreted as "work" or "home" numbers
// on the receiving end.
if (phoneLabel != otherLabel)
{
if (personOnlyAtHome || phoneLabel == homeLabel)
PdiWriteParameter(pdiRefNum, writer, kPdiPAV_TYPE_HOME, false);
else if (personOnlyAtWork || phoneLabel == workLabel)
PdiWriteParameter(pdiRefNum, writer, kPdiPAV_TYPE_WORK, false);
}
switch (phoneLabel)
{
case faxLabel:
PdiWriteParameter(pdiRefNum, writer, kPdiPAV_TYPE_FAX, false);
break;
case pagerLabel:
PdiWriteParameter(pdiRefNum, writer, kPdiPAV_TYPE_PAGER, false);
break;
case mobileLabel:
PdiWriteParameter(pdiRefNum, writer, kPdiPAV_TYPE_CELL, false);
break;
case mainLabel:
PdiWriteParameter(pdiRefNum, writer, kPdiPAV_X_X_PALM_MAIN, false);
case workLabel:
case homeLabel:
PdiWriteParameter(pdiRefNum, writer, kPdiPAV_TYPE_VOICE, false);
break;
case otherLabel:
break;
}
PdiWritePropertyValue(pdiRefNum, writer, recordP->fields[i], kPdiWriteText);
}
else
{
// The item
PdiWriteProperty(pdiRefNum, writer, kPdiPRN_EMAIL);
// Is this prefered? Assume so if listed in the list view.
if (recordP->options.phones.displayPhoneForList == i - firstPhoneField)
{
PdiWriteParameter(pdiRefNum, writer, kPdiPAV_TYPE_PREF, false);
}
if (personOnlyAtHome || phoneLabel == homeLabel)
PdiWriteParameter(pdiRefNum, writer, kPdiPAV_TYPE_HOME, false);
else if (personOnlyAtWork || phoneLabel == workLabel)
PdiWriteParameter(pdiRefNum, writer, kPdiPAV_TYPE_WORK, false);
// Now try to identify the email type by it's syntax.
// A '@' indicates a probable internet address.
if (StrChr(recordP->fields[i], '@') == NULL)
{
if (TxtCharIsDigit(TxtGetChar(recordP->fields[i], 0)))
{
if (StrChr(recordP->fields[i], ',') != NULL)
PdiWriteParameterStr(pdiRefNum, writer, "", "CIS");
// We know that a hyphen is never part of a multi-byte char.
else if (recordP->fields[i][3] == '-')
{
PdiWriteParameterStr(pdiRefNum, writer, "", "MCIMail");
}
}
}
else
{
PdiWriteParameter(pdiRefNum, writer, kPdiPAV_TYPE_INTERNET, false);
}
PdiWritePropertyValue(pdiRefNum, writer, recordP->fields[i], kPdiWriteText);
}
}
}
for (i = firstRenameableLabel; i <= lastRenameableLabel; i++)
{
if (recordP->fields[i] != NULL)
{
PdiWriteProperty(pdiRefNum, writer, kPdiPRN_X_PALM_CUSTOM);
// Emit the custom field number
StrIToA(uidString, i - firstRenameableLabel + 1);
PdiWriteParameterStr(pdiRefNum, writer, "", uidString);
if (appInfoP == NULL)
appInfoP = (AddrAppInfoPtr) AddrDBAppInfoGetPtr(dbP);
// Emit the custom label name if used. This will enable smart matching.
if (appInfoP->fieldLabels[i][0] != nullChr)
{
//DOLATER ABa the Pdi library must escape or omit ":" and ";" chars
// when beaming to an old palm
PdiWriteParameterStr(pdiRefNum, writer, "", appInfoP->fieldLabels[i]);
}
PdiWritePropertyValue(pdiRefNum, writer, recordP->fields[i], kPdiWriteText);
}
}
if (appInfoP != NULL)
MemPtrUnlock(appInfoP);
// Emit an unique id
if (writeUniqueIDs)
{
// Get the record's unique id and append to the string.
DmRecordInfo(dbP, index, NULL, &uid, NULL);
StrIToA(uidString, uid);
PdiWriteProperty(pdiRefNum, writer, kPdiPRN_UID);
PdiWritePropertyValue(pdiRefNum, writer, uidString, kPdiWriteData);
}
#ifdef VCARD_CATEGORIES
// Emit category
{
Char description[dmCategoryLength];
UInt16 attr;
UInt16 category;
// Get category name
DmRecordInfo (dbP, index, &attr, NULL, NULL);
category = attr & dmRecAttrCategoryMask;
CategoryGetName(dbP, category, description);
PdiWriteProperty(pdiRefNum, writer, kPdiPRN_X_PALM_CATEGORY);
// DOLATER Pdi library will take care of this special value
// and must omit ";" and ":" when beaming to an old Palm
PdiWritePropertyValue(pdiRefNum, writer, description, kPdiWriteText);
}
#endif
PdiWriteEndObject(pdiRefNum, writer, kPdiPRN_END_VCARD);
if (writer->error)
ErrThrow(writer->error);
}
/***********************************************************************
*
* FUNCTION: TransferPreview
*
* DESCRIPTION: Create a short string preview of the data coming in.
*
* PARAMETERS: infoP - the preview info from the command parameter block
* of the sysAppLaunchCmdExgPreview launch
*
* RETURNED: nothing
*
* REVISION HISTORY:
* Name Date Description
* ---- ---- -----------
* dje 8/31/00 Created
*
***********************************************************************/
void TransferPreview(ExgPreviewInfoType *infoP)
{
Err err;
UInt16 pdiRefNum;
PdiReaderType* reader;
UDAReaderType* stream;
Boolean loaded;
Char *lastNameP = NULL, *firstNameP = NULL, *companyP = NULL;
Boolean multiple = false;
NameLayoutFieldMapType nameLayoutFMap;
Char separatorStr[kMaxSeparatorStrLen];
if (infoP->op == exgPreviewQuery)
{
infoP->types = exgPreviewShortString;
return;
}
if (infoP->op != exgPreviewShortString)
{
infoP->error = exgErrNotSupported;
return;
}
// if we have a description we don't have to parse the vObject
if (infoP->socketP->description && *infoP->socketP->description)
{
StrNCopy(infoP->string, infoP->socketP->description, infoP->size - 1);
infoP->string[infoP->size - 1] = 0;
infoP->error = errNone;
return;
}
err = ExgAccept(infoP->socketP);
if (!err)
{
err = PrvTransferPdiLibLoad(&pdiRefNum, &loaded);
}
if (!err)
{
stream = UDAExchangeReaderNew(infoP->socketP);
reader = PdiReaderNew(pdiRefNum, stream, kPdiOpenParser);
reader->appData = infoP->socketP;
if (reader)
{
PdiReadProperty(pdiRefNum, reader);
if (reader->property != kPdiPRN_BEGIN_VCARD)
goto ParseError;
PdiEnterObject(pdiRefNum, reader);
PdiDefineResizing(pdiRefNum, reader, 16, tableMaxTextItemSize);
while (PdiReadProperty(pdiRefNum, reader) == 0)
{
if (reader->property == kPdiPRN_BEGIN_VCARD)
{
multiple = true;
break;
}
switch (reader->property)
{
case kPdiPRN_N:
PdiReadPropertyField(pdiRefNum, reader, &lastNameP, kPdiResizableBuffer, kPdiDefaultFields);
PdiReadPropertyField(pdiRefNum, reader, &firstNameP, kPdiResizableBuffer, kPdiDefaultFields);
break;
case kPdiPRN_FN:
// Take care of FN iff no name nor first name.
if (lastNameP == NULL && firstNameP == NULL)
PdiReadPropertyField(pdiRefNum, reader, &lastNameP, kPdiResizableBuffer, kPdiDefaultFields);
break;
case kPdiPRN_NICKNAME:
// Take care of nickname iff no first name.
if (firstNameP == NULL)
PdiReadPropertyField(pdiRefNum, reader, &firstNameP, kPdiResizableBuffer, kPdiDefaultFields);
break;
case kPdiPRN_ORG:
PdiReadPropertyField(pdiRefNum, reader, &companyP, kPdiResizableBuffer, kPdiConvertSemicolon);
break;
// ignore other properties
}
}
if (multiple)
{
MemHandle resH = DmGetResource(strRsc, ExgMultipleDescriptionStr);
void *desc = MemHandleLock(resH);
StrNCopy(infoP->string, desc, infoP->size - 1);
infoP->string[infoP->size - 1] = chrNull;
MemHandleUnlock(resH);
DmReleaseResource(resH);
}
else
{
// if the company and last name fields are identical, assume company only
if (lastNameP != NULL
&& companyP != NULL
&& firstNameP == NULL
&& StrCompare(lastNameP, companyP) == 0)
{
MemPtrFree(lastNameP);
lastNameP = NULL;
}
// write the short string preview
// DOLATER dje - Use the SortByCompany preference (getting it out of the database because we
// might not have access to globals).
if (firstNameP || lastNameP)
{
infoP->string[0] = chrNull;
if (ToolsGetDisplayNameLayout(firstNameP, lastNameP, &nameLayoutFMap))
{
Char* str1;
Char* str2;
ToolsGetStringResource (nameLayoutFMap.separatorStrID, separatorStr);
if (nameLayoutFMap.firstFieldNum == firstName)
{
str1 = firstNameP;
str2 = lastNameP;
}
else
{
str1 = lastNameP;
str2 = firstNameP;
}
if (str1)
StrNCat(infoP->string, str1, infoP->size);
if (str1 && str2)
StrNCat(infoP->string, separatorStr, infoP->size);
if (str2)
StrNCat(infoP->string, str2, infoP->size);
}
else // default to the enUS way of doing things
{
if (firstNameP)
StrNCat(infoP->string, firstNameP, infoP->size);
if (firstNameP && lastNameP)
StrNCat(infoP->string, " ", infoP->size);
if (lastNameP)
StrNCat(infoP->string, lastNameP, infoP->size);
}
}
else if (companyP)
{
StrNCopy(infoP->string, companyP, infoP->size - 1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -