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

📄 handle_pbap.c

📁 藍芽電話簿範本
💻 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 + -