static OSErr ExtractULTInfo( PPInfoRec *info, Ptr AlienFile) { short i, maxInstru, tracksNo; ULTForm ULTinfo; /********************************/ /**** Header principal *****/ BlockMoveData( AlienFile, &ULTinfo, 49); /*** Signature ***/ info->signature = 'ULT '; /*** Internal name ***/ ULTinfo.name[ 31] = '\0'; pStrcpy( (unsigned char*) info->internalFileName, MYC2PStr( ULTinfo.name)); /*** Total Patterns ***/ info->totalPatterns = 0; //Tdecode16( &ITinfo.patNum); /*** Partition Length ***/ info->partitionLength = 0; //Tdecode16( &ITinfo.orderNum); /*** Total Instruments ***/ info->totalInstruments = 0; /*** Tracks ***/ info->totalTracks = 0; strcpy( info->formatDescription, "ULT Plug"); return noErr; }
int prh_test_rfcomm_pe_connect_port(t_bdaddr remote_bd_addr, prh_t_rfcomm_schan rem_schan, char *pName, prh_t_rfcomm_dlci *dlci, struct prh_rfcomm_pe_port **pe_info_ptr, u_int16 max_frame_size) { struct prh_rfcomm_multi_cb multi_cbs; struct prh_rfcomm_dlc_cb dlc_cbs; prh_t_rfcomm_dlc_params dlc_params; int dbit; t_api ret; struct prh_rfcomm_l2cap_inst *l2cap_inst; void *multi_inst; struct prh_rfcomm_pe_port *pe_info; /* Allocate memory for pe_info */ pe_info=(struct prh_rfcomm_pe_port *)pMalloc(sizeof(struct prh_rfcomm_pe_port)); if (pe_info==pNULL) return BT_NORESOURCES; pe_info->portname=(char *)pMalloc(pStrlen(pName)+1); if (pe_info->portname==pNULL) { pFree(pe_info); return BT_NORESOURCES; } /* copy in portname */ pStrcpy(pe_info->portname, pName); /* Check does a multiplexer to the remote BD Address exist already */ ret=prh_rfcomm_lookup_l2cap_inst_by_bd_addr(remote_bd_addr, &l2cap_inst); if (ret==BT_INVALIDPARAM) { ret=prh_test_rfcomm_open_multiplexer(remote_bd_addr, &multi_inst); if (ret!=BT_NOERROR) return ret; dbit=1; } else { dbit=l2cap_inst->initiating; multi_inst=(void *)l2cap_inst; } /* Either Multiplexer is started or we've returned */ dlc_params.max_frame_size=max_frame_size; dlc_params.priority=0; /* Generate the DLCI from direction and remote server channel */ pe_info->dlci=*dlci=((!dbit) | (rem_schan<<1)); pe_info->multi_inst=multi_inst; pe_info->flow_sem=pSemCreate(0); pe_info->remote_device_addr=remote_bd_addr; pe_info->portnum=0; pe_info->mode=PRH_PORT_ENT_CLIENT_CONN; prh_rfcomm_init_pe_struct(pe_info); prh_test_rfcomm_dlc_estab(remote_bd_addr, *dlci,multi_inst, &dlc_params); pSemLock(test_prh_rfcomm_ms.sem, 0); pSemFree(test_prh_rfcomm_ms.sem); if (test_prh_rfcomm_ms.status==PRH_RFCOMM_REFUSE) return BT_UNKNOWNERROR; else { prh_rfcomm_pe_add_port_entity(pe_info); *pe_info_ptr=pe_info; return BT_NOERROR; } }
APIDECL1 t_api APIDECL2 PE_SrvRegisterPort(char *port, prh_t_rfcomm_schan *serv_chan, void (*port_callback)(prh_t_rfcomm_schan schan, t_bdaddr bd_addr, u_int8 connection_state)) { struct prh_rfcomm_pe_port *pe_info; struct prh_rfcomm_dlc_cb dlc_cbs; int ret=0; int portnum; /* three traps, illegal server channel number, 0 server channel number (user requested), 1-30 */ if (*serv_chan>PRH_RFCOMM_MAX_SCHAN) return BT_INVALIDPARAM; /* Has user requested a server channel */ if (*serv_chan==0) { ret=PRH_RFCOMM_UE_Allocate_Server_Channel(serv_chan); if (ret!=BT_NOERROR) return ret; } else { ret=PRH_RFCOMM_UE_Get_Channel_State(*serv_chan); if (ret==BT_NOERROR) /*Channel Exists already */ return BT_INVALIDPARAM; } portnum=*serv_chan; /* Add port to list of registered port numbers */ pe_info=(struct prh_rfcomm_pe_port *)pMalloc(sizeof(struct prh_rfcomm_pe_port)); if (pe_info==pNULL) { ret=BT_NORESOURCES; goto err_out_dealloc; } pMemset(pe_info, 0, sizeof(struct prh_rfcomm_pe_port)); prh_rfcomm_init_pe_struct(pe_info); pe_info->portname=(char *)pMalloc(pStrlen(port)+1); if (pe_info->portname==pNULL) { ret=BT_NORESOURCES; goto err_out_free_info; } pStrcpy(pe_info->portname, port); pe_info->port_cbfunc=port_callback; pe_info->portnum=portnum; dlc_cbs.dlc_estab_ind=port_ent_dlc_estab_ind_cb; dlc_cbs.dlc_estab_conf=port_ent_dlc_estab_conf_cb; dlc_cbs.dlc_rel_ind=port_ent_dlc_rel_ind_cb; dlc_cbs.dlc_data_ind=port_ent_dlc_data_ind_cb; dlc_cbs.linestat=port_ent_dlc_linestat_cb; dlc_cbs.portneg=port_ent_dlc_portneg_cb; dlc_cbs.control=port_ent_dlc_control_cb; dlc_cbs.agg_flow_ind=port_ent_dlc_flow_ind_cb; dlc_cbs.dlc_paramneg=port_ent_dlc_paramneg_cb; dlc_cbs.credit_flow_ind=port_ent_dlc_credit_flow_cb; ret=prh_rfcomm_pe_add_port_entity(pe_info); if (ret==BT_NORESOURCES) { goto err_out_free_info; } ret=PRH_RFCOMM_UE_Register_Server(*serv_chan, &dlc_cbs); if (ret!=BT_NOERROR) { goto err_out_remove_pe; } /* Do OS Specific Registering */ ret=PE_OS_SrvRegisterPort(pe_info); if (ret!=BT_NOERROR) { PRH_RFCOMM_UE_Deregister_Server(*serv_chan); goto err_out_remove_pe; } return BT_NOERROR; /* handle different error conditions .. make sure to clean up */ err_out_remove_pe: prh_rfcomm_pe_remove_port_entity_by_portnum(&pe_info, *serv_chan); err_out_free_info: prh_rfcomm_free_pe_struct(pe_info); err_out_dealloc: PRH_RFCOMM_UE_Deallocate_Server_Channel(*serv_chan); return ret; }