📄 vcard_gen.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 + -