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

📄 addresstransfer.c

📁 我的Palm OS 5 SDK zhCN_PIMApps代码。 使用codewarrior 开发环境
💻 C
📖 第 1 页 / 共 4 页
字号:
	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 + -