📄 iap_s.c
字号:
return_type=iasdata[i].type[j]|(iasdata[i].sel[j]<<8);
goto exit_decode_gvbc;
}
}
}
}
exit_decode_gvbc:
Send_ias_gvbc_response(return_type);
}
/*************************************************************************
* FUNCTION
* Send_ias_gvbc_response
*
* DESCRIPTION
* Format and send the GVBC response to the client
*
* PARAMETERS
* kal_uint16 [msb:sel][lsb:return_type]
* RETURNS
* None
*
* GLOBALS AFFECTED
* return_type= type of data to format and return
sel = LSAP-SEL of attribute
*************************************************************************/
void Send_ias_gvbc_response(kal_uint16 return_type)
{
kal_uint8 * tmpbuf;
FBUF * tmpptr;
kal_uint8 * tmpstr;
kal_uint16 tmpint;
#ifdef IRDA_KAL_TRACE
kal_trace(TRACE_FUNC, IRDA_MSG54);
#endif
/* get a frame buffer */
tmpptr=(FBUF*)Getbuf();
tmpbuf=(kal_uint8*)tmpptr+I_TX_PACKET_OFFSET;
/* format the iap ctl byte */
tmpbuf[2]=LST&NACK|GETVALUEBYCLASS_OP; /* the ctl field (byte 0) of IAP message */
/* format the return data */
switch (return_type&0x00ff)/* mask out sel */
{
case UNSUPPORTED_TYP:
/* unsupported opcode */
tmpbuf[3]=0xff;
tmpptr->size=2;
break;
case NO_CLASS_TYP:
/* return no such class */
tmpbuf[3]=1;
tmpptr->size=2;
break;
case NO_ATTR_TYP:
/* return no such attribute */
tmpbuf[3]=2;
tmpptr->size=2;
break;
case DEV_NAME_TYP:/*P.84 in LMP spec.*/
Format_IAS_return( 0, (kal_uint8*)tmpbuf, (FBUF*)tmpptr, 3, (kal_uint8*)OUR_DEV_NAM, 0, 0 );
break;
case IrDA_SUP_TYP:
/* respond with irdasupport */
tmpbuf[3]=0; /* return code = success */
/* list size = 1, msb first */
tmpint=Swap_int_order((kal_uint16)1);
xmemcpy((kal_uint8*)((kal_uint8*)tmpbuf+4),(kal_uint8*)&tmpint,2);
/* object id = 1 */
tmpint=Swap_int_order(1);
xmemcpy((kal_uint8*)((kal_uint8*)tmpbuf+6),(kal_uint8*)&tmpint,2);
/* format the attribute user octet sequence */
tmpbuf[8] =2; /* type = octet sequence */
/* int length of sequence */
tmpint=Swap_int_order((kal_uint16)3);
xmemcpy((kal_uint8*)((kal_uint8*)tmpbuf+9),(kal_uint8*)&tmpint,2);
/* Irlmp version byte */
tmpbuf[11]=IAS_LMP_VER;
/* ias support byte */
tmpbuf[12]=(IAS_SUP_GET_INFO|IAS_SUP_GET_OBJECTS|IAS_SUP_GET_VALUE|IAS_SUP_GET_OBJ_INFO|IAS_SUP_GET_ATTRIB_NAME);
/* lm-mux support byte*/
tmpbuf[13]= (IAS_LMMUX_EXCLU|IAS_LMMUX_ROLEEX|IAS_LMMUX_CLESS);
tmpptr->size=11+1;/*11 for this query, 1 for IAP control field*/
break;
case COMM_PAR_TYP: /*object id=2*/
Format_IAS_return( 2,(kal_uint8*)tmpbuf, (FBUF*)tmpptr, 2, 0, (kal_uint8*)comm_params, (kal_uint32)comm_params_size);
break;
case SEL_TYP: /*object id=3*/
if(((return_type>>8)&0x007f)==COMMX_LSAP_SEL)
Format_IAS_return( 2,(kal_uint8*)tmpbuf, (FBUF*)tmpptr, 1, 0, 0, (kal_uint32) ( (return_type>>8)&0x007f) );
else
Format_IAS_return( 3,(kal_uint8*)tmpbuf, (FBUF*)tmpptr, 1, 0, 0, (kal_uint32) ( (return_type>>8)&0x007f) );
break;
#ifdef PNP_FLAG
/* all type 3 format responses*/
case PNP_DEVICEID_TYP:
tmpstr = (kal_uint8 *) PNP_DEVICEID;
goto format_label;
case PNP_NAME_TYP:
tmpstr = (kal_uint8 *) PNP_NAME;
goto format_label;
case PNP_MANUFACTURER_TYP:
tmpstr = (kal_uint8 *) PNP_MANUFACTURER;
goto format_label;
case PNP_CATEGORY_TYP:
tmpstr = (kal_uint8 *) PNP_CATEGORY;
goto format_label;
format_label: /*object id=4*/
Format_IAS_return( 4,(kal_uint8*)tmpbuf, (FBUF*)tmpptr, 3, (kal_uint8*)tmpstr, 0, 0 );
break;
case PNP_COMPCNT_TYP:
Format_IAS_return( 4,(kal_uint8*)tmpbuf, (FBUF*)tmpptr, 1, 0, 0, 1 );
break;
case PNP_COMP01_TYP:
tmpstr = (kal_uint8 *) PNP_COMP01;
Format_IAS_return( 4,(kal_uint8*)tmpbuf, (FBUF*)tmpptr, 3, (kal_uint8*)tmpstr, 0, 0 );
break;
case PNP_VERSION_TYP:
Format_IAS_return( 4,(kal_uint8*)tmpbuf, (FBUF*)tmpptr, 2, 0, (kal_uint8*)pnp_version, (kal_uint32)2 );
break;
case PNP_STATUS_TYP:
Format_IAS_return( 4,(kal_uint8*)tmpbuf, (FBUF*)tmpptr, 1, 0, 0, (kal_uint32) PNP_STATUS );
break;
#endif
default:
/* unknown */
/* return no such class */
tmpbuf[3]=1;
tmpptr->size=2;
break;
}
/* send the data */
/*@@@@MSG_ID_LMP_DATA_REQUEST*/
irda_lmp_flag=MSG_ID_LMP_DATA_REQUEST;
irda_data_buffer=tmpptr;
local_lsap_sel=IAS_SERVER_LSAP_SEL;
remote_lsap_sel=remote_ias_client_sel;
}
/*************************************************************************
* FUNCTION
* Format_IAS_return
*
* DESCRIPTION
* Format the IAS return based on the type code
*
* PARAMETERS
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*************************************************************************/
void Format_IAS_return(
kal_uint16 object_id,
kal_uint8 * tmpbuf,
FBUF * tmpptr,
kal_uint8 type_code,
kal_uint8 * ustring,
kal_uint8 * uarray,
kal_uint32 uintv )
{
kal_uint16 tmpint;
kal_uint32 tmplong;
switch ( type_code )
{
case 1: /* type = 1, 32 bit int, internet order */
/* respond with selector */
tmpbuf[3]=0; /* return code = success */
/* list size = 1, msb first */
tmpint=Swap_int_order((kal_uint16)1);
xmemcpy((kal_uint8*)((kal_uint8*)tmpbuf+4),(kal_uint8*)&tmpint,2);
/* object id = 0 */
tmpint=Swap_int_order(object_id);
xmemcpy((kal_uint8*)((kal_uint8*)tmpbuf+6),(kal_uint8*)&tmpint,2);
/* format the attribute user octet sequence */
tmpbuf[8]=1; /* type = 1, 32 bit int, internet order */
/* convert lmp selector */
tmplong=Swap_long_order(uintv);
xmemcpy((kal_uint8*)((kal_uint8*)tmpbuf+9),(kal_uint8*)&tmplong,4);
tmpptr->size=10+1;
break;
case 2: /* type = octet sequence */
/* respond with irdasupport */
tmpbuf[3]=0; /* return code = success */
/* list size = 1, msb first */
tmpint=Swap_int_order((kal_uint16)1);
xmemcpy((kal_uint8*)((kal_uint8*)tmpbuf+4),(kal_uint8*)&tmpint,2);
/* object id = 0 */
tmpint=Swap_int_order(object_id);
xmemcpy((kal_uint8*)((kal_uint8*)tmpbuf+6),(kal_uint8*)&tmpint,2);
/* format the attribute user octet sequence */
tmpbuf[8] =2; /* type = octet sequence */
/* int length of sequence */
tmpint=Swap_int_order((kal_uint16)uintv);
xmemcpy((kal_uint8*)((kal_uint8*)tmpbuf+9),(kal_uint8*)&tmpint,2);
/* add the comm parameters */
xmemcpy((kal_uint8*)((kal_uint8*)tmpbuf+11),(kal_uint8*)uarray,(kal_uint16)uintv);
tmpptr->size=8+1+uintv;
break;
case 3: /* type = user string */
tmpbuf[3]=0; /* return code = success */
/* list size = 1, msb first */
tmpint=Swap_int_order((kal_uint16)1);
xmemcpy((kal_uint8*)((kal_uint8*)tmpbuf+4),(kal_uint8*)&tmpint,2);
/* object id = 0 */
tmpint=Swap_int_order(object_id);
xmemcpy((kal_uint8*)((kal_uint8*)tmpbuf+6),(kal_uint8*)&tmpint,2);
/* format the attribute user string type */
tmpbuf[8]=3; /* type = user string */
/* respond with char set code */
tmpbuf[9]=0;
/* respond with dev name */
tmpbuf[10]=xstrlen((kal_char *)ustring);//+1; /* length of string */
xmemcpy((kal_uint8*)&tmpbuf[11],(kal_uint8*)ustring,tmpbuf[10]);
tmpptr->size=8+tmpbuf[10]+1;//+1
break;
default:
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -