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

📄 vcard_gen.c

📁 pbap_server:bluetooth 可供带有PBAP功能bluetooth手机使用
💻 C
字号:
/****************************************************************************

DESCRIPTION
	Implementation for handling vCard generation functionality
	
FILE
	vcard_gen.c
	
*/

/****************************************************************************
    Header files
*/

#include <print.h>
#include <pbap_common.h>
#include <panic.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

#include "main.h"
#include "vcard_gen.h"
#include "pb_access.h"
#include "buffer.h"
#include "folder.h"

/* Listing Format constants */

static const uint8 gVCardEntryHeader[] = {'B','E','G','I','N',':','V','C','A','R','D','\n','V','E','R','S','I','O','N',':'};
static const uint8 gVCardEntryVersion21[] = {'2','.','1','\n'};
static const uint8 gVCardEntryVersion30[] = {'3','.','0','\n'};
static const uint8 gVCardEntryName21[] = {'N',':'};
static const uint8 gVCardEntryName30[] = {'F','N',':'};
static const uint8 gVCardEntryTel[] = {'T','E','L',':'};
static const uint8 gVCardEntryTelMobile[] = {'T','E','L',';','M','O','B','I','L','E',':'};
static const uint8 gVCardEntryTelBusiness[] = {'T','E','L',';','W','O','R','K',':'};
static const uint8 gVCardEntryFooter[] = {'E','N','D',':','V','C','A','R','D','\n'};
static const uint8 gVCardEntryNewline[] = {'\n'};


/* Local Functions */

static void vcgResetState(applicationTaskData *pTask);
static bool vcgFillBuffer(applicationTaskData *pTask, pbaSearchResult *pEntry);
static bool vcgAddElement(applicationTaskData *pTask, const uint8 *pElement, uint16 pSizeElement, const uint8 *pHeader, uint16 pSizeHeader);

/* Interface Functions */

/*
	Start downloading a vCard entry
*/
bool vcgGetFirstEntryBuffer(applicationTaskData *pTask, uint16 pEntry, pbap_format_values pFormat)
{
	bool lComplete = TRUE;
	pbap_phone_book lCurrent = folderCurrentFolder(pTask);
	
	if (!allocBuffer(pTask, PBAPS_MIN_BUFFER_SIZE))
	{
		PRINT(("    Cannot Allocate Buffer\n"));
		Panic();
	}

	if (pbaOpenPhonebook(pTask, lCurrent))
	{
		if (pbaGotoEntry(pTask, pEntry))
		{
			pbaSearchResult lEntry;
			pbaGetCurrentEntry(pTask, &lEntry);
			vcgResetState(pTask);
			pTask->vCardData.format = pFormat;
			lComplete = vcgFillBuffer(pTask, &lEntry);
		}
	}
	
	if (lComplete)
		pbaClosePhonebook(pTask);
		
	return lComplete;
}

/*
	Download the next buffer of the vCard Entry
*/
bool vcgGetNextEntryBuffer(applicationTaskData *pTask)
{
	bool lComplete = TRUE;
	pbaSearchResult lEntry;

	resetBuffer(pTask);	
	pbaGetCurrentEntry(pTask, &lEntry);
	lComplete = vcgFillBuffer(pTask, &lEntry);
	
	if (lComplete)
		pbaClosePhonebook(pTask);
		
	return lComplete;
}

/*
	Clean up from downloading the vCard entry
*/
void vcgCleanupListBuffer(applicationTaskData *pTask)
{
	freeBuffer(pTask);
	pbaClosePhonebook(pTask);
}

/*
	Start downloading a complete phonebook
*/
bool vcgGetFirstPhonebookBuffer(applicationTaskData *pTask, pbap_phone_book pBook, uint16 pListStart, pbap_format_values pFormat, uint16 pMaxList)
{
	bool lComplete = TRUE;
	
	PRINT(("vcgGetFirstPhonebookBuffer\n"));
	
	if (!allocBuffer(pTask, PBAPS_MIN_BUFFER_SIZE))
	{
		PRINT(("    Cannot Allocate Buffer\n"));
		Panic();
	}

	if (pbaOpenPhonebook(pTask, pBook))
	{
		if (pbaGotoEntry(pTask, pListStart))
		{
			bool lFoundEntry = TRUE;
			bool lFilled = TRUE;
			pbaSearchResult lEntry;
			pTask->vCardData.format = pFormat;
			pTask->vCardData.maxList = pMaxList;
			
			pbaGetCurrentEntry(pTask, &lEntry);
			
			while (lFoundEntry && lFilled && pTask->vCardData.maxList > 0)
			{
				vcgResetState(pTask);
				lFilled = vcgFillBuffer(pTask, &lEntry);
				if (lFilled)
				{
					lFoundEntry = pbaGotoNextEntry(pTask, &lEntry);
					pTask->vCardData.maxList--;
				}
			}
			
			lComplete = (!lFoundEntry || (pTask->vCardData.maxList == 0));
		}
	}
		
	return lComplete;
}

/*
	Download the next buffer of a complete phonebook
*/
bool vcgGetNextPhonebookBuffer(applicationTaskData *pTask)
{
	bool lFoundEntry = TRUE;
	bool lFilled = TRUE;
	pbaSearchResult lEntry;
	
	PRINT(("vcgGetNextPhonebookBuffer\n"));

	resetBuffer(pTask);
	pbaGetCurrentEntry(pTask, &lEntry);
	
	while (lFoundEntry && lFilled && pTask->vCardData.maxList > 0)
	{
		lFilled = vcgFillBuffer(pTask, &lEntry);
		if (lFilled)
		{
			lFoundEntry = pbaGotoNextEntry(pTask, &lEntry);
			vcgResetState(pTask);
			pTask->vCardData.maxList--;
		}
	}

	return (!lFoundEntry || (pTask->vCardData.maxList == 0));
}


/* Local Functions */

static void vcgResetState(applicationTaskData *pTask)
{
	pTask->vCardData.sentHeader = FALSE;
	pTask->vCardData.sentFooter = FALSE;
	pTask->vCardData.sentName = FALSE;
	pTask->vCardData.sentPhone = FALSE;
	pTask->vCardData.sentMobile = FALSE;
	pTask->vCardData.sentBusiness = FALSE;
}

static bool vcgFillBuffer(applicationTaskData *pTask, pbaSearchResult *pEntry)
{
	bool lComplete = FALSE;
	bool lSpace = TRUE;
	uint16 lSize;

	if (!pTask->vCardData.sentHeader)
	{
		lSize = sizeof(gVCardEntryHeader) + sizeof(gVCardEntryVersion21);
		if (lSize <= pTask->buffer.freeSpace)
		{
			memcpy(&pTask->buffer.buffer[pTask->buffer.nextPos], gVCardEntryHeader, sizeof(gVCardEntryHeader));
			pTask->buffer.nextPos += sizeof(gVCardEntryHeader);
			if (pTask->vCardData.format == pbap_format_30)
				memcpy(&pTask->buffer.buffer[pTask->buffer.nextPos], gVCardEntryVersion30, sizeof(gVCardEntryVersion30));
			else
				memcpy(&pTask->buffer.buffer[pTask->buffer.nextPos], gVCardEntryVersion21, sizeof(gVCardEntryVersion21));
			pTask->buffer.nextPos += sizeof(gVCardEntryVersion21);
			pTask->buffer.used += lSize;
			pTask->buffer.freeSpace -= lSize;
			pTask->vCardData.sentHeader = TRUE;
		}
		else
			lSpace = FALSE;
	}
	
	if (lSpace && !pTask->vCardData.sentName)
	{
		if (pTask->vCardData.format == pbap_format_30)
			lSpace = vcgAddElement(pTask, pEntry->namePtr, pEntry->nameSize, gVCardEntryName30, sizeof(gVCardEntryName30));
		else
			lSpace = vcgAddElement(pTask, pEntry->namePtr, pEntry->nameSize, gVCardEntryName21, sizeof(gVCardEntryName21));
		if (lSpace)
			pTask->vCardData.sentName = TRUE;
	}
	
	if (lSpace && !pTask->vCardData.sentPhone)
	{
		lSpace = vcgAddElement(pTask, pEntry->phonePtr, pEntry->phoneSize, gVCardEntryTel, sizeof(gVCardEntryTel));
		if (lSpace)
			pTask->vCardData.sentPhone = TRUE;
	}
		
	if (lSpace && !pTask->vCardData.sentMobile)
	{
		lSpace = vcgAddElement(pTask, pEntry->mobilePtr, pEntry->mobileSize, gVCardEntryTelMobile, sizeof(gVCardEntryTelMobile));
		if (lSpace)
			pTask->vCardData.sentMobile = TRUE;
	}
		
	if (lSpace && !pTask->vCardData.sentBusiness)
	{
		lSpace = vcgAddElement(pTask, pEntry->businessPtr, pEntry->businessSize, gVCardEntryTelBusiness, sizeof(gVCardEntryTelBusiness));
		if (lSpace)
			pTask->vCardData.sentBusiness = TRUE;
	}
		
	if (lSpace && !pTask->vCardData.sentFooter)
	{
		lSize = sizeof(gVCardEntryFooter);
		if (lSize <= pTask->buffer.freeSpace)
		{
			memcpy(&pTask->buffer.buffer[pTask->buffer.nextPos], gVCardEntryFooter, lSize);
			pTask->buffer.nextPos += lSize;
			pTask->buffer.used += lSize;
			pTask->buffer.freeSpace -= lSize;
			pTask->vCardData.sentFooter = TRUE;
		}
	}
	
	lComplete = (pTask->vCardData.sentName && pTask->vCardData.sentPhone && pTask->vCardData.sentMobile && pTask->vCardData.sentBusiness
					&& pTask->vCardData.sentHeader && pTask->vCardData.sentFooter);
	
	return lComplete;
}

static bool vcgAddElement(applicationTaskData *pTask, const uint8 *pElement, uint16 pSizeElement, const uint8 *pHeader, uint16 pSizeHeader)
{
	bool lSpace = TRUE;
	uint16 lSize;
	
	if (pElement)
	{
		lSize = pSizeElement + pSizeHeader + sizeof(gVCardEntryNewline);
		if (lSize <= pTask->buffer.freeSpace)
		{
			memcpy(&pTask->buffer.buffer[pTask->buffer.nextPos], pHeader, pSizeHeader);
			pTask->buffer.nextPos += pSizeHeader;
			memcpy(&pTask->buffer.buffer[pTask->buffer.nextPos], pElement, pSizeElement);
			pTask->buffer.nextPos += pSizeElement;
			memcpy(&pTask->buffer.buffer[pTask->buffer.nextPos], gVCardEntryNewline, sizeof(gVCardEntryNewline));
			pTask->buffer.nextPos += sizeof(gVCardEntryNewline);
			pTask->buffer.used += lSize;
			pTask->buffer.freeSpace -= lSize;
		}
		else
			lSpace = FALSE;
	}

	return lSpace;
}

⌨️ 快捷键说明

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