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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 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 */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品456| 久久亚洲综合av| 夜夜夜精品看看| 欧美在线观看视频在线| 亚洲美女在线国产| 欧美美女一区二区三区| 首页亚洲欧美制服丝腿| 日韩一区二区麻豆国产| 韩国欧美国产1区| 国产精品久久久久影院老司| 99这里只有久久精品视频| 中文字幕视频一区| 欧美影院一区二区| 美女在线一区二区| 久久精品视频一区二区三区| 丁香亚洲综合激情啪啪综合| 亚洲永久精品大片| 91精品国产一区二区三区蜜臀| 精品一区二区三区的国产在线播放| 欧美videossexotv100| 高清不卡一区二区在线| 一区二区不卡在线视频 午夜欧美不卡在 | 日本一区二区在线不卡| 91玉足脚交白嫩脚丫在线播放| 亚洲精品大片www| 91精品国产综合久久蜜臀| 国产麻豆成人精品| 一区二区三区影院| wwww国产精品欧美| 欧洲av在线精品| 久久丁香综合五月国产三级网站| 国产精品久久久久aaaa樱花| 欧美人动与zoxxxx乱| 国产精品18久久久久久久网站| 亚洲免费高清视频在线| 精品日韩在线一区| 91国产精品成人| 国产精品一区二区x88av| 亚洲综合成人在线| 国产色婷婷亚洲99精品小说| 欧美丰满嫩嫩电影| 成人精品在线视频观看| 青青草91视频| 一区二区不卡在线视频 午夜欧美不卡在| 日韩一区国产二区欧美三区| 91麻豆国产福利在线观看| 国内精品伊人久久久久av一坑| 亚洲精品福利视频网站| 国产日韩欧美制服另类| 51精品久久久久久久蜜臀| 99久久99久久综合| 国产毛片一区二区| 日本aⅴ免费视频一区二区三区| 亚洲欧美激情视频在线观看一区二区三区 | 国产成人综合在线观看| 日韩精品1区2区3区| 中文字幕欧美一区| 国产精品午夜免费| 精品国产亚洲在线| 欧美一二三四区在线| 欧美男女性生活在线直播观看| 成人性生交大片免费看中文网站| 美女mm1313爽爽久久久蜜臀| 亚洲国产美国国产综合一区二区| 国产精品麻豆99久久久久久| 久久久久亚洲综合| 日韩欧美一级精品久久| 欧美一区二区三区在线观看| 欧美天堂一区二区三区| 日本乱人伦aⅴ精品| 97精品久久久久中文字幕| 国产乱理伦片在线观看夜一区| 全部av―极品视觉盛宴亚洲| 亚洲一二三四区| 亚洲国产成人porn| 亚洲最大的成人av| 一区二区免费在线| 亚洲成人激情综合网| 亚洲一区二区三区中文字幕在线 | 日韩伦理电影网| 中文字幕中文字幕中文字幕亚洲无线 | 国产综合色在线| 国模一区二区三区白浆| 久久国产剧场电影| 国产精品99久| 成人一级视频在线观看| 成人黄色在线看| 成人av小说网| 99精品国产视频| 在线看国产一区| 91精品国产综合久久久久久久久久| 欧美日韩亚洲国产综合| 亚洲色图清纯唯美| 中文字幕在线观看不卡视频| 亚洲欧美自拍偷拍色图| 亚洲伦理在线精品| 性做久久久久久| 美国av一区二区| 国内精品国产成人| 99国产欧美久久久精品| 欧美视频在线观看一区二区| 欧美日韩国产在线播放网站| 日韩一级片在线观看| 精品第一国产综合精品aⅴ| 久久久久国产一区二区三区四区| 中国色在线观看另类| 亚洲尤物在线视频观看| 免费人成精品欧美精品| 国产精品18久久久久久久网站| 99久久婷婷国产精品综合| 在线视频亚洲一区| 在线成人av网站| 久久久久久久久99精品| 亚洲男人的天堂av| 天天免费综合色| 国产乱码一区二区三区| 色哟哟国产精品| 欧美一区二区在线免费播放| 国产日韩精品一区| 亚欧色一区w666天堂| 国产真实乱偷精品视频免| 色综合久久中文综合久久牛| 777午夜精品视频在线播放| 国产欧美日韩三级| 午夜视黄欧洲亚洲| av亚洲产国偷v产偷v自拍| 欧美人狂配大交3d怪物一区| 国产欧美日韩不卡免费| 丝袜美腿一区二区三区| 99久久精品免费观看| 欧美一级久久久| 亚洲制服丝袜一区| 国产精品一区二区果冻传媒| 欧美精品久久99| 成人免费在线播放视频| 韩国一区二区在线观看| 欧美男女性生活在线直播观看| 国产精品久久久久久一区二区三区 | 欧美顶级少妇做爰| 日韩码欧中文字| 国产成人免费xxxxxxxx| 制服.丝袜.亚洲.另类.中文| 亚洲视频一区在线观看| 国产成人一区在线| 日韩三级在线免费观看| 亚洲永久免费av| 97久久精品人人澡人人爽| 国产亚洲视频系列| 美国十次综合导航| 欧美日韩精品福利| 一区二区三区四区av| 岛国一区二区三区| xnxx国产精品| 久久精品噜噜噜成人av农村| 欧美视频一区在线观看| 一区二区在线观看视频 | 国产精品国模大尺度视频| 国产在线麻豆精品观看| 亚洲国产日韩a在线播放性色| 国产99久久久久| 久久综合色婷婷| 精一区二区三区| 精品日韩99亚洲| 另类人妖一区二区av| 欧美日韩精品系列| 亚洲国产人成综合网站| 欧美性xxxxxxxx| 亚洲一卡二卡三卡四卡| 7777精品伊人久久久大香线蕉最新版 | 久久综合九色欧美综合狠狠| 天堂成人免费av电影一区| 欧美喷潮久久久xxxxx| 日韩主播视频在线| 91精品国产综合久久久久久久久久| 亚洲一卡二卡三卡四卡五卡| 欧美日韩精品欧美日韩精品一| 亚洲中国最大av网站| 欧美日韩国产成人在线免费| 亚洲成va人在线观看| 在线不卡一区二区| 日本aⅴ免费视频一区二区三区| 日韩一区国产二区欧美三区| 精品亚洲国内自在自线福利| 精品国产免费人成在线观看| 国产一区二区三区在线观看精品| 久久久国际精品| 成人听书哪个软件好| 一区二区三区日韩欧美精品| 欧美综合久久久| 奇米888四色在线精品| 亚洲精品一区二区三区精华液 | 国产精品乱码一区二区三区软件| 久久久久国产一区二区三区四区 | 日韩一区中文字幕| 欧美三级资源在线| 理论电影国产精品| 国产日韩精品视频一区| 91国模大尺度私拍在线视频| 日本一道高清亚洲日美韩| 精品久久一二三区|