亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? ag_connect.c

?? bluetooth audio gateway
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* connects to the remote device */

#include "ag_private.h"
#include "ag_types.h"
#include "ag.h"

#include <sched.h>
#include <stdlib.h>
#include <message.h>
#include <print.h>


/*
    connectStatus
    Translates between the CCM_status flag and its equivalent AG connection status 
    flag. This is so the Connection Manager is completely transparent to the client 
*/
static ag_connection_status_t connectStatus(connect_status_t cm_status)
{
    switch(cm_status)
    {
        case CmConnectComplete:
            return AgConnectComplete;
        case CmConnectTimeout:
            return AgConnectTimeout;
        case CmConnectCancelled:
            return AgConnectCancelled;
        case CmConnectDisconnect:
            return AgConnectDisconnect;
        case CmConnectDisconnectAbnormal:
            return AgConnectDisconnectAbnormal;
        case CmConnectFailed:
            return AgConnectFailed;
		case CmConnectRemoteRefusal:
			return AgConnectRemoteRefusal;	
		case CmConnectServiceNotSupported:
			return AgConnectServiceNotSupported;
        default:
            PRINT(("ag_connect: Unknown connection status %d\n", cm_status));
            break;
    }
    return (ag_connection_status_t) cm_status;
}


/*
    sendConnectionHandle

    Send the allocated handle to the client. 
*/
static void sendConnectionHandle(ag_handle_t hdl, bd_addr_t addr)
{    
    /* Pass these to the interface to do with as it pleases */
    handleConnectionHandleMap(hdl, addr);
}


/*
    allocHandleFromAddress

    Takes a dvice address and returns an ag_handle for it. Only one device connection at a time supported
	so only one handle returned.
*/
static ag_handle_t allocHandleFromAddress(bd_addr_t addr)
{
	addr = addr;
	return ONLY_ONE_HANDLE;
}


/* 
    removeAddressFromHandleMap

    Removes a handle from the address map once a connection has been
    disconnected.
*/
static void removeAddressFromHandleMap(ag_handle_t hdl)
{
	hdl = hdl;

	/* Reset the stored addr to zeros */
	createAddressHandleMap();
}


static void copy_auth(cm_auth_config_t *out, ag_auth_config_t in)
{
    out->authentication = in.authentication;
    out->encryption     = in.encryption;
}

static void copy_addr(BD_ADDR_T *out, bd_addr_t in)
{
    out->nap = in.nap;
    out->uap = in.uap;
    out->lap = in.lap;
}

static void copy_park(cm_park_config_t *out, ag_park_config_t in)
{
    out->max_intval = in.max_intval;
    out->min_intval = in.min_intval;
}

static void copy_sniff(cm_sniff_config_t *out, ag_sniff_config_t in)
{
    out->max_intval = in.max_intval;
    out->min_intval = in.min_intval;
    out->attempt    = in.attempt;
    out->timeout    = in.timeout;
}

static uint16 connect_setup(uint16 target, bd_addr_t address)
{
	uint16 return_target;

    /* Initialise some state */
	agSetCurrentState(AgConnecting);    

	/* indicator status updates are disabled to start with */
    AGState.hfIndicatorUpdateEnabled = 0;
        
    /* Set service indicator to true and ongoing call indicator to false */
    AGState.hfServiceIndicator = 1;
    AGState.hfCallIndicator = 0;

	/* Voice recognition is disabled */
	AGState.hfVoiceRecogEnable = 0;
		
	/* Check what profile we should be using to connect */
	if (target == HANDSFREE_TARGET)
    {
		/* Check the GUI registered the HF as supported and if so OK else send error and default to HS */
		if (agIsHandsFreeSupported())
		{
			return_target = HANDSFREE_TARGET;
			agSetCurrentProfile(agHandsFreeProfile);
		}
		else
		{
			return_target = HEADSET_TARGET;
			agSetCurrentProfile(agHeadsetProfile);
		}
		AGState.roles_tried = return_target;
    }       
    else if (target == HEADSET_TARGET)
    {
		/* Check the app supports the headset profile if not it must support the HF as there's nothing else */
		if (agIsHeadsetSupported())
		{
			return_target = HEADSET_TARGET;
			agSetCurrentProfile(agHeadsetProfile);
		}
		else
		{
			return_target = HANDSFREE_TARGET;
			agSetCurrentProfile(agHandsFreeProfile);
		}
		AGState.roles_tried = return_target;
    }
    else
    {
		/* 
			If target not set by the GUI to a valid value see supported profiles. 
			If possible try HF first then HS. This way the GUI can say just connect
			in the most suitable mode and let the AG decide which profiles the 
			other end supports.
		*/
		if (agIsHeadsetSupported() && agIsHandsFreeSupported())
		{
			/* The AG supports both so try connecting as hf first */
			return_target = HANDSFREE_TARGET;
			agSetCurrentProfile(agHandsFreeProfile);
		}
		else if (agIsHandsFreeSupported())		
		{
			/* Only HF supported so use that */
			return_target = HANDSFREE_TARGET;
			agSetCurrentProfile(agHandsFreeProfile);
		}
		else
		{
			/* Default to the headset profile */
			return_target = HEADSET_TARGET;
			agSetCurrentProfile(agHeadsetProfile);
		}
		AGState.roles_tried = UNSPECIFIED_TARGET;
    }
                
    /* Allocate a connection handle for that device address */    
    sendConnectionHandle(allocHandleFromAddress(address), address);

	return return_target;
}


/* Public functions */

/*
    agConnectAsMasterReqAction

    Request to create an RFCOMM connection as master.
*/
void agConnectAsMasterReqAction(bd_addr_t addr, const ag_auth_config_t *use, const ag_park_config_t *park, const ag_sniff_config_t *sniff, uint16 target, timeout_t timeout)
{
    if (agIdleQuery())
    {
        MAKE_MSG(CM_CONNECT_AS_MASTER_REQ);

        copy_auth(&msg->use, *use);
        copy_addr(&msg->bd_addr, addr);
        copy_park(&msg->park, *park);
        copy_sniff(&msg->sniff, *sniff);
		
		/* Init the connection related state - set the target to what is returned */
		msg->target = connect_setup(target, addr);
        
        /* user specifies the timeout in seconds ... zero means never expire */
        msg->timeout     = timeout ? D_SEC(timeout) : D_NEVER;
		
		/* Set the server channel depending on the profile role */
		if (msg->target == HANDSFREE_TARGET)
			msg->profile_server_chan = AGState.agHfServerChan;
		else
			msg->profile_server_chan = AGState.agHsServerChan;

        agPutCmMsg(msg);

		/* TODO Store the connect params in case the connect attempt fails */
    }
    else
    {
        /* AG is not in an idle state so cannot enter connact mode */
        agSendErrorToClient(AgErrorConnectRequestWhenNotIdle, (BD_ADDR_T *)&addr);
    }
}


/*
    AGconnectAsSlaveReq
    Request to create an RFCOMM connection as slave.
*/
void agConnectAsSlaveReqAction(bd_addr_t addr, const ag_auth_config_t *use, const ag_park_config_t *park, const ag_sniff_config_t *sniff, timeout_t timeout, uint16 ps_ival, uint16 ps_win)
{
    if (agIdleQuery())
    {
        MAKE_MSG(CM_CONNECT_AS_SLAVE_REQ);

        copy_auth(&msg->use, *use);
        copy_addr(&msg->bd_addr, addr);
        copy_park(&msg->park, *park);
        copy_sniff(&msg->sniff, *sniff);

        /* Enable page scan but disable inquiry scan for power efficiency */
        msg->ps_interval = ps_ival;
        msg->ps_window   = ps_win;
        msg->is_interval = 0x400;
        msg->is_window   = 0x200;

        /* user specifies the timeout in seconds ... zero means never expire */
        msg->timeout     = timeout ? D_SEC(timeout) : D_NEVER;

        agPutCmMsg(msg);

		/* Init the connection related state - ignore the target returned as we're slave */
        (void) connect_setup(agProfileNotSet, addr);
    }
    else
    {
        /* AG is not in an idle state so cannot enter connact mode */
        agSendErrorToClient(AgErrorConnectRequestWhenNotIdle, (BD_ADDR_T *)&addr);
    }
}


/*
	agUnsupportedServiceInd

	The service the AG tried to connect to is not suported by the remote device
*/
void agUnsupportedServiceInd(CM_UNSUPPORTED_SERVICE_IND_T *ind)
{
	MAKE_MSG(CM_UNSUPPORTED_SERVICE_RES);

	if (AGState.roles_tried == UNSPECIFIED_TARGET)
	{
		/* User did not specify so we're trying hf and now we can try hs */
		if (ind->target == HANDSFREE_TARGET)
		{
			/* Did not connect to HF so try HS */
			msg->srch_continue = 1;
			msg->new_target = HEADSET_TARGET;
			msg->new_conn_server_chan = AGState.agHsServerChan;

			AGState.roles_tried = HEADSET_TARGET;
		}
		else if (ind->target == HEADSET_TARGET)
		{
			/* Did not connect to HS so try HF */
			msg->srch_continue = 1;
			msg->new_target = HANDSFREE_TARGET;
			msg->new_conn_server_chan = AGState.agHfServerChan;

			AGState.roles_tried = HANDSFREE_TARGET;
		}
		else 
		{
			/* No idea what we tried to connect to so just stop */

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品高清亚洲| 欧美日韩在线不卡| 精品国产成人在线影院| 一区二区三区不卡视频| 国产精品99久久久久久宅男| 欧美喷潮久久久xxxxx| 亚洲欧美一区二区三区极速播放 | 天天做天天摸天天爽国产一区| 国内精品写真在线观看| 欧美裸体bbwbbwbbw| 亚洲精品国产精华液| 国产黄色91视频| 久久综合狠狠综合久久综合88| 亚洲成人资源在线| 91视频一区二区三区| 国产精品国产馆在线真实露脸| 国产激情视频一区二区三区欧美 | 丁香一区二区三区| 精品久久久网站| 美女免费视频一区二区| 欧美主播一区二区三区美女| 亚洲美女免费视频| 91麻豆123| 欧美国产欧美亚州国产日韩mv天天看完整| 毛片av一区二区三区| 日韩欧美美女一区二区三区| 免费观看一级欧美片| 欧美日韩免费观看一区三区| 一区二区三区在线免费观看| 91久久奴性调教| 亚洲国产精品久久不卡毛片| 欧美色大人视频| 国产精品久久久久久久久搜平片 | 亚洲福利电影网| 欧美日韩和欧美的一区二区| 午夜精品爽啪视频| 2024国产精品| 岛国av在线一区| 中文字幕中文在线不卡住| 99视频精品全部免费在线| 国产精品成人在线观看| 91老司机福利 在线| 亚洲三级电影网站| 欧美丰满少妇xxxbbb| 精品写真视频在线观看| 中文字幕欧美三区| 欧美羞羞免费网站| 美脚の诱脚舐め脚责91| 日韩美女主播在线视频一区二区三区| 国产中文字幕一区| 日韩一区有码在线| 在线观看三级视频欧美| 日韩一区精品视频| 久久精品日产第一区二区三区高清版 | 日韩精品一区二区三区三区免费| 国产一区二区三区免费播放| 亚洲人吸女人奶水| 日韩一区二区三区在线观看 | 欧美亚洲日本国产| 五月激情综合色| 久久老女人爱爱| 国产91丝袜在线播放0| 亚洲一区二区三区视频在线 | 韩国v欧美v日本v亚洲v| 欧美mv和日韩mv国产网站| 欧美一级生活片| 国产高清在线精品| 亚洲国产日韩精品| 久久久久久免费毛片精品| 色呦呦日韩精品| 美女视频黄 久久| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 国产精品美女久久久久av爽李琼 | 成人一区二区三区中文字幕| 亚洲男同性视频| 日韩精品一区二区三区在线| 成人免费观看男女羞羞视频| 欧美成人精精品一区二区频| 欧美日韩国产大片| 欧洲精品中文字幕| 91麻豆精品一区二区三区| 成人自拍视频在线| 国产一区二区三区综合| 免费美女久久99| 日韩影院精彩在线| 日日骚欧美日韩| 亚洲国产日韩一区二区| 亚洲国产一区二区三区青草影视| 亚洲欧美另类久久久精品| 国产日韩欧美电影| 日本一区二区电影| 国产精品毛片无遮挡高清| 中文字幕在线观看一区二区| 中文字幕在线观看一区二区| 亚洲丝袜美腿综合| 一级日本不卡的影视| 亚洲黄色小说网站| 亚洲二区在线视频| 午夜国产精品一区| 日韩精品91亚洲二区在线观看| 亚洲一级电影视频| 亚洲综合色视频| 亚洲高清视频在线| 久久精品国产网站| 国产福利91精品| heyzo一本久久综合| 一本久久a久久免费精品不卡| 91国产福利在线| 91精品国产综合久久蜜臀| 91精品国产品国语在线不卡| 欧美精品一区二区三区蜜桃视频 | 亚洲欧美影音先锋| 一区二区三区国产精品| 亚洲一区二区影院| 男男成人高潮片免费网站| 国产精品中文字幕欧美| 成人精品视频一区| 欧美亚洲综合网| 欧美www视频| 亚洲欧美日韩在线| 三级精品在线观看| 国产乱理伦片在线观看夜一区| 国产激情一区二区三区四区| 色婷婷香蕉在线一区二区| 正在播放亚洲一区| 国产三级精品在线| 亚洲成人免费影院| 国产麻豆一精品一av一免费 | 亚洲成a天堂v人片| 国产一区二区免费视频| 91女神在线视频| 欧美一级在线视频| 国产精品久久久久久久久动漫| 亚洲午夜电影在线| 国产精品亚洲第一| 欧美人狂配大交3d怪物一区| 国产欧美一区二区精品仙草咪| 亚洲精品视频观看| 国产精品中文欧美| 91麻豆精品国产自产在线| 国产精品传媒在线| 九一九一国产精品| 欧美四级电影网| 中文字幕一区二区视频| 麻豆91在线播放| 日本高清不卡视频| 久久精品人人做人人综合| 亚洲激情自拍视频| 国产suv精品一区二区883| 欧美日韩一区不卡| 一区免费观看视频| 久久精品国产一区二区三 | 国产视频一区二区在线| 天堂va蜜桃一区二区三区漫画版| 国产成人av网站| 欧美一区二区高清| 亚洲精品乱码久久久久久黑人| 国产精品996| 欧美成人精精品一区二区频| 亚洲国产日韩一级| 色综合色狠狠综合色| 国产日韩欧美精品电影三级在线| 日本欧美在线观看| 欧美体内she精高潮| 亚洲人成网站色在线观看| 国产电影一区在线| 精品国产区一区| 奇米一区二区三区| 欧美军同video69gay| 亚洲伊人伊色伊影伊综合网| eeuss鲁一区二区三区| 国产喂奶挤奶一区二区三区| 美女视频黄 久久| 91精品久久久久久久91蜜桃| 亚洲国产aⅴ成人精品无吗| 色欧美日韩亚洲| 亚洲美女屁股眼交3| 99天天综合性| 亚洲欧美激情小说另类| 91老师国产黑色丝袜在线| 亚洲欧洲韩国日本视频| av中文一区二区三区| 国产精品萝li| 成人黄色大片在线观看| 国产精品久久免费看| www.色精品| 《视频一区视频二区| 97国产一区二区| 亚洲天堂成人网| 91成人在线免费观看| 亚洲狠狠爱一区二区三区| 欧美日韩综合色| 三级欧美韩日大片在线看| 宅男噜噜噜66一区二区66| 美女精品一区二区| 久久久久久日产精品| 成人激情动漫在线观看| 日韩理论片一区二区| 在线免费观看视频一区| 图片区小说区国产精品视频|