📄 handle_pbap.c
字号:
/****************************************************************************
Copyright (C) Cambridge Silicon Radio Limited 2006-2009
Part of BlueLab 4.1-Release
DESCRIPTION
Implementation for handling PBAP library messages and functionality
FILE
handle_pbap.c
*/
/****************************************************************************
Header files
*/
#include <connection.h>
#include <pbapc.h>
#include <print.h>
#include <panic.h>
#include <pbap_common.h>
#include <stdlib.h>
#include <bdaddr.h>
#include <stream.h>
#include <string.h>
#include <md5.h>
#include "main.h"
#include "handle_pbap.h"
#include "handle_connection.h"
#include "generate_at_resp.h"
/* Message Handler Prototypes */
static void handlePbapInitCfm(applicationTaskData *pTask, PBAPC_INIT_CFM_T *pMsg);
static void handlePbapConnectCfm(applicationTaskData *pTask, PBAPC_CONNECT_CFM_T *pMsg);
static void handlePbapDisconnectInd(applicationTaskData *pTask, PBAPC_DISCONNECT_IND_T *pMsg);
static void handlePbapSetPhonebookCfm(applicationTaskData *pTask, PBAPC_SET_PHONEBOOK_CFM_T *pMsg);
static void handlePullVCardListStartInd(applicationTaskData *pTask, PBAPC_PULL_VCARD_LIST_START_IND_T *pMsg);
static void handlePullVCardListDataInd(applicationTaskData *pTask, PBAPC_PULL_VCARD_LIST_DATA_IND_T *pMsg);
static void handlePullVCardListCompleteInd(applicationTaskData *pTask, PBAPC_PULL_VCARD_LIST_COMPLETE_IND_T *pMsg);
static void handlePullVCardEntryStartInd(applicationTaskData *pTask, PBAPC_PULL_VCARD_ENTRY_START_IND_T *pMsg);
static void handlePullVCardEntryDataInd(applicationTaskData *pTask, PBAPC_PULL_VCARD_ENTRY_DATA_IND_T *pMsg);
static void handlePullVCardEntryCompleteInd(applicationTaskData *pTask, PBAPC_PULL_VCARD_ENTRY_COMPLETE_IND_T *pMsg);
static void handlePullPhonebookStartInd(applicationTaskData *pTask, PBAPC_PULL_PHONEBOOK_START_IND_T *pMsg);
static void handlePullPhonebookDataInd(applicationTaskData *pTask, PBAPC_PULL_PHONEBOOK_DATA_IND_T *pMsg);
static void handlePullPhonebookCompleteInd(applicationTaskData *pTask, PBAPC_PULL_PHONEBOOK_COMPLETE_IND_T *pMsg);
static void handleAuthRequestInd(applicationTaskData *pTask, PBAPC_AUTH_REQUEST_IND_T *pMsg);
/* Interface Functions */
void pbapConnect(applicationTaskData *pTask, const bdaddr pAddr)
{
setState(&pTask->appState, AppStateAppConnecting);
PbapcConnect(pTask->pbapData.pbapc, &pAddr, PBAP_DEF_PACKET);
}
/*
Disconnect from PBAP Server
*/
void pbapDisconnect(applicationTaskData *pTask)
{
setState(&pTask->appState, AppStateAppDisconnecting);
PbapcDisconnect(pTask->pbapData.pbapc);
}
/*
Set the current phonebook
*/
void pbapSetPhonebook(applicationTaskData *pTask, uint16 pRepository, uint16 pPhonebook)
{
if (pTask->appState == AppStateAppConnected)
{
PbapcSetPhonebook(pTask->pbapData.pbapc, (pbap_phone_repository)pRepository, (pbap_phone_book)pPhonebook);
setState(&pTask->appState, AppStateSetPhonebook);
}
else
{ /* Not in an idle connected state */
PRINT((" Application in incorrect state\n"));
atRespSendSetPbCfm(1); /* Generic Fail */
}
}
/*
Start Getting the vCard Listing
*/
void pbapGetVCardList(applicationTaskData *pTask, const uint8 *pSrchVal,
uint16 pSizeSrchVal, uint16 pSrchAttr, uint16 pMaxList, uint16 pListStart)
{
if (pTask->appState == AppStateAppConnected)
{
setState(&pTask->appState, AppStateGetVCardList);
if (pSrchVal)
{
pTask->pbapData.srchVal = (uint8*)PanicUnlessMalloc(sizeof(uint8) * (pSizeSrchVal+1));
memcpy(pTask->pbapData.srchVal, pSrchVal, pSizeSrchVal);
pTask->pbapData.srchVal[pSizeSrchVal] = '\0';
}
else
pTask->pbapData.srchVal = NULL;
PbapcPullvCardListingStart(pTask->pbapData.pbapc, pbap_order_default, pbap_b_unknown, pTask->pbapData.srchVal,
pSizeSrchVal+1, (pbap_search_values)pSrchAttr, pMaxList, pListStart);
}
else
{ /* Not in an idle connected state */
PRINT((" Application in incorrect state\n"));
}
}
/*
Start getting a vCard Entry
*/
void pbapGetVCardEntry(applicationTaskData *pTask, uint16 pEntry, uint16 pFormat, uint32 pFilter)
{
if (pTask->appState == AppStateAppConnected)
{
setState(&pTask->appState, AppStateGetVCardEntry);
PbapcPullvCardEntryStart(pTask->pbapData.pbapc, pEntry, pFilter, (uint32)0, (pbap_format_values)pFormat);
}
else
{ /* Not in an idle connected state */
PRINT((" Application in incorrect state\n"));
}
}
/*
Start downloading the phonebook
*/
void pbapDownloadPhonebook(applicationTaskData *pTask, uint16 pRepository, uint16 pPhonebook, uint16 pStart,
uint16 pMaxList, uint32 pFilter, uint16 pFormat)
{
if (pTask->appState == AppStateAppConnected)
{
setState(&pTask->appState, AppStateDownloadPhonebook);
PbapcPullPhonebookStart(pTask->pbapData.pbapc, (pbap_phone_repository)pRepository, (pbap_phone_book)pPhonebook,
pFilter, 0, (pbap_format_values)pFormat, pMaxList, pStart);
/* PbapcPullvCardEntryStart(pTask->pbapData.pbapc, pEntry, pFilter, (uint32)0, (pbap_format_values)pFormat);*/
}
else
{ /* Not in an idle connected state */
PRINT((" Application in incorrect state\n"));
}
}
/*
Initialise the PBAP System
*/
void initPbap(applicationTaskData *pTask)
{
PRINT(("initPbap\n"));
/* Initialise the PBAP library */
PbapcInit(&pTask->task, 1);
}
void handlePbapMessages(applicationTaskData *pTask, MessageId pId, Message pMessage)
{
switch (pId)
{
case PBAPC_INIT_CFM:
handlePbapInitCfm(pTask, (PBAPC_INIT_CFM_T *)pMessage);
break;
case PBAPC_CONNECT_CFM:
handlePbapConnectCfm(pTask, (PBAPC_CONNECT_CFM_T *)pMessage);
break;
case PBAPC_DISCONNECT_IND:
handlePbapDisconnectInd(pTask, (PBAPC_DISCONNECT_IND_T *)pMessage);
break;
case PBAPC_SET_PHONEBOOK_CFM:
handlePbapSetPhonebookCfm(pTask, (PBAPC_SET_PHONEBOOK_CFM_T *)pMessage);
break;
case PBAPC_PULL_VCARD_LIST_START_IND:
handlePullVCardListStartInd(pTask, (PBAPC_PULL_VCARD_LIST_START_IND_T *)pMessage);
break;
case PBAPC_PULL_VCARD_LIST_DATA_IND:
handlePullVCardListDataInd(pTask, (PBAPC_PULL_VCARD_LIST_DATA_IND_T *)pMessage);
break;
case PBAPC_PULL_VCARD_LIST_COMPLETE_IND:
handlePullVCardListCompleteInd(pTask, (PBAPC_PULL_VCARD_LIST_COMPLETE_IND_T *)pMessage);
break;
case PBAPC_PULL_VCARD_ENTRY_START_IND:
handlePullVCardEntryStartInd(pTask, (PBAPC_PULL_VCARD_ENTRY_START_IND_T *)pMessage);
break;
case PBAPC_PULL_VCARD_ENTRY_DATA_IND:
handlePullVCardEntryDataInd(pTask, (PBAPC_PULL_VCARD_ENTRY_DATA_IND_T *)pMessage);
break;
case PBAPC_PULL_VCARD_ENTRY_COMPLETE_IND:
handlePullVCardEntryCompleteInd(pTask, (PBAPC_PULL_VCARD_ENTRY_COMPLETE_IND_T *)pMessage);
break;
case PBAPC_PULL_PHONEBOOK_START_IND:
handlePullPhonebookStartInd(pTask, (PBAPC_PULL_PHONEBOOK_START_IND_T *)pMessage);
break;
case PBAPC_PULL_PHONEBOOK_DATA_IND:
handlePullPhonebookDataInd(pTask, (PBAPC_PULL_PHONEBOOK_DATA_IND_T *)pMessage);
break;
case PBAPC_PULL_PHONEBOOK_COMPLETE_IND:
handlePullPhonebookCompleteInd(pTask, (PBAPC_PULL_PHONEBOOK_COMPLETE_IND_T *)pMessage);
break;
case PBAPC_AUTH_REQUEST_IND :
handleAuthRequestInd(pTask,(PBAPC_AUTH_REQUEST_IND_T *)pMessage);
break;
default:
PRINT(("PBAPC Unhandled message : 0x%X\n",pId));
break;
}
}
/* Message Handlers */
static void handlePbapInitCfm(applicationTaskData *pTask, PBAPC_INIT_CFM_T *pMsg)
{
PRINT(("PBAPC_INIT_CFM : "));
if (pMsg->status == pbapc_success)
{
PRINT(("success\n"));
pTask->pbapData.pbapc = pMsg->pbapc;
setState(&pTask->appState, AppStateAppIdle);
}
else
{ /* Failed to initialise PBAPC */
PRINT(("failure\n"));
PRINT((" Status : %d\n", pMsg->status));
Panic();
}
}
static void handlePbapConnectCfm(applicationTaskData *pTask, PBAPC_CONNECT_CFM_T *pMsg)
{
PRINT(("PBAPC_CONNECT_CFM\n"));
PRINT((" Status : %d\n", pMsg->status));
if (pMsg->status == pbapc_success)
{
setState(&pTask->appState, AppStateAppConnected);
}
else
{
setState(&pTask->appState, AppStateAppIdle);
}
atRespSendConCfm(pMsg->status);
}
static void handlePbapDisconnectInd(applicationTaskData *pTask, PBAPC_DISCONNECT_IND_T *pMsg)
{
PRINT(("PBAPC_DISCONNECT_IND\n"));
setState(&pTask->appState, AppStateAppIdle);
atRespSendDiscoCfm();
}
static void handlePbapSetPhonebookCfm(applicationTaskData *pTask, PBAPC_SET_PHONEBOOK_CFM_T *pMsg)
{
PRINT(("PBAPC_SET_PHONEBOOK_CFM\n"));
PRINT((" Status : %d\n", pMsg->status));
setState(&pTask->appState, AppStateAppConnected);
atRespSendSetPbCfm(pMsg->status);
}
static void handlePullVCardListStartInd(applicationTaskData *pTask, PBAPC_PULL_VCARD_LIST_START_IND_T *pMsg)
{
PRINT(("PBAPC_PULL_VCARD_LIST_START_IND\n"));
/* Send Data to Host */
atRespSendGetVCListData(pMsg->src, pMsg->dataOffset, pMsg->dataLen);
PbapcPacketComplete(pTask->pbapData.pbapc);
if (pMsg->moreData)
{
PRINT((" Requesting next Packet\n"));
PbapcPullvCardListingNext(pTask->pbapData.pbapc);
}
}
static void handlePullVCardListDataInd(applicationTaskData *pTask, PBAPC_PULL_VCARD_LIST_DATA_IND_T *pMsg)
{
PRINT(("PBAPC_PULL_VCARD_LIST_DATA_IND\n"));
/* Send Data to Host */
atRespSendGetVCListData(pMsg->src, pMsg->dataOffset, pMsg->dataLen);
PbapcPacketComplete(pTask->pbapData.pbapc);
if (pMsg->moreData)
{
PRINT((" Requesting next Packet\n"));
PbapcPullvCardListingNext(pTask->pbapData.pbapc);
}
}
static void handlePullVCardListCompleteInd(applicationTaskData *pTask, PBAPC_PULL_VCARD_LIST_COMPLETE_IND_T *pMsg)
{
PRINT(("PBAPC_PULL_VCARD_LIST_COMPLETE_IND\n"));
/* Send Complete to Host */
atRespSendGetVCListComplete(pMsg->status);
setState(&pTask->appState, AppStateAppConnected);
}
static void handlePullVCardEntryStartInd(applicationTaskData *pTask, PBAPC_PULL_VCARD_ENTRY_START_IND_T *pMsg)
{
PRINT(("PBAPC_PULL_VCARD_ENTRY_START_IND\n"));
/* Send Data to Host */
atRespSendGetVCEntryData(pMsg->src, pMsg->dataOffset, pMsg->dataLen);
PbapcPacketComplete(pTask->pbapData.pbapc);
if (pMsg->moreData)
{
PRINT((" Requesting next Packet\n"));
PbapcPullvCardEntryNext(pTask->pbapData.pbapc);
}
}
static void handlePullVCardEntryDataInd(applicationTaskData *pTask, PBAPC_PULL_VCARD_ENTRY_DATA_IND_T *pMsg)
{
PRINT(("PBAPC_PULL_VCARD_ENTRY_DATA_IND\n"));
/* Send Data to Host */
atRespSendGetVCEntryData(pMsg->src, pMsg->dataOffset, pMsg->dataLen);
PbapcPacketComplete(pTask->pbapData.pbapc);
if (pMsg->moreData)
{
PRINT((" Requesting next Packet\n"));
PbapcPullvCardEntryNext(pTask->pbapData.pbapc);
}
}
static void handlePullVCardEntryCompleteInd(applicationTaskData *pTask, PBAPC_PULL_VCARD_ENTRY_COMPLETE_IND_T *pMsg)
{
PRINT(("PBAPC_PULL_VCARD_ENTRY_COMPLETE_IND\n"));
/* Send Complete to Host */
atRespSendGetVCEntryComplete(pMsg->status);
setState(&pTask->appState, AppStateAppConnected);
}
static void handlePullPhonebookStartInd(applicationTaskData *pTask, PBAPC_PULL_PHONEBOOK_START_IND_T *pMsg)
{
PRINT(("PBAPC_PULL_VCARD_ENTRY_START_IND\n"));
/* Send Data to Host */
atRespSendPullPhonebookData(pMsg->src, pMsg->dataOffset, pMsg->dataLen);
PbapcPacketComplete(pTask->pbapData.pbapc);
if (pMsg->moreData)
{
PRINT((" Requesting next Packet\n"));
PbapcPullPhonebookNext(pTask->pbapData.pbapc);
}
}
static void handlePullPhonebookDataInd(applicationTaskData *pTask, PBAPC_PULL_PHONEBOOK_DATA_IND_T *pMsg)
{
PRINT(("PBAPC_PULL_PHONEBOOK_DATA_IND\n"));
/* Send Data to Host */
atRespSendPullPhonebookData(pMsg->src, pMsg->dataOffset, pMsg->dataLen);
PbapcPacketComplete(pTask->pbapData.pbapc);
if (pMsg->moreData)
{
PRINT((" Requesting next Packet\n"));
PbapcPullPhonebookNext(pTask->pbapData.pbapc);
}
}
static void handlePullPhonebookCompleteInd(applicationTaskData *pTask, PBAPC_PULL_PHONEBOOK_COMPLETE_IND_T *pMsg)
{
PRINT(("PBAPC_PULL_PHONEBOOK_COMPLETE_IND\n"));
/* Send Complete to Host */
atRespSendPullPhonebookComplete(pMsg->status);
setState(&pTask->appState, AppStateAppConnected);
}
static void handleAuthRequestInd(applicationTaskData *pTask, PBAPC_AUTH_REQUEST_IND_T *pMsg)
{
uint8 digest[GOEP_SIZE_DIGEST];
PRINT(("PBAPC_AUTH_REQUEST_IND\n"));
/* Send Complete to Host */
atRespSendPullPhonebookComplete(pbapc_success);
{
MD5_CTX context;
/* Digest blocks */
MD5Init(&context);
MD5Update(&context, pMsg->nonce, strlen((char *)pMsg->nonce));
MD5Update(&context, (uint8 *)":",1);
MD5Update(&context, (uint8 *)"8888",4);
MD5Final(digest,&context);
}
PbapcConnectAuthResponse(pTask->pbapData.pbapc, &digest[0], 0, NULL, NULL);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -