Ejemplo n.º 1
0
void CAPI2_SimLockApi_GetStatus(ClientInfo_t* inClientInfoPtr, SIMLOCK_SIM_DATA_t *sim_data, Boolean is_testsim)
#endif
{
    SIMLOCK_STATE_t simlock_state;
    char msg[5 + IMSI_DIGITS + 1 + 1 + GID_DIGITS + 1 + GID_DIGITS]  ;	///< NULL terminated IMSI string in ASCII format
	
    KRIL_DEBUG(DBG_INFO,"Get SIM lock status\n");
    SetSIMData(inClientInfoPtr->simId,sim_data);
    
    simlock_state.network_lock_enabled = FALSE;			
    simlock_state.network_subset_lock_enabled = FALSE;			
    simlock_state.service_provider_lock_enabled = FALSE;		
    simlock_state.corporate_lock_enabled = FALSE;				
    simlock_state.phone_lock_enabled = FALSE;
    
    simlock_state.network_lock = SIM_SECURITY_OPEN; 
    simlock_state.network_subset_lock = SIM_SECURITY_OPEN;
    simlock_state.service_provider_lock = SIM_SECURITY_OPEN;
    simlock_state.corporate_lock = SIM_SECURITY_OPEN;
    simlock_state.phone_lock = SIM_SECURITY_OPEN;

#ifdef CONFIG_BRCM_SIM_SECURE_ENABLE     
    SIMLockCheckAllLocks(inClientInfoPtr->simId,sim_data->imsi_string, (0 != sim_data->gid1_len ? sim_data->gid1 : NULL), 
        (0 != sim_data->gid2_len ? sim_data->gid2 : NULL));
    
    SIMLockUpdateSIMLockState(inClientInfoPtr->simId);
    
    SIMLockGetSIMLockState(inClientInfoPtr->simId, &simlock_state);
#endif //CONFIG_BRCM_SIM_SECURE_ENABLE
    
    CAPI2_SimLockApi_GetStatus_RSP(inClientInfoPtr, simlock_state);
		
	memset(msg,0,sizeof(msg));
		
	msg[0]=(UInt8)'B';
	msg[1]=(UInt8)'R';
	msg[2]=(UInt8)'C';
	msg[3]=(UInt8)'M';
	msg[4]=(UInt8)BRIL_HOOK_UNSOL_SIM_DATA;

    strncpy(&msg[5],(char*)sim_data->imsi_string,(IMSI_DIGITS+1)); //IMSI
 
    msg[5 + IMSI_DIGITS +1] = sim_data->gid1_len;
 
    if (sim_data->gid1_len > 0)
        memcpy(&msg[5 + IMSI_DIGITS + 1 + 1], sim_data->gid1, GID_DIGITS); //GID1
    
    msg[5 + IMSI_DIGITS + 1 + 1 + GID_DIGITS] = sim_data->gid2_len;
  
    if (sim_data->gid2_len > 0)
        memcpy(&msg[5 + IMSI_DIGITS + 1 + 1 + GID_DIGITS + 1], sim_data->gid2, GID_DIGITS); //GID2

    KRIL_SendNotify(inClientInfoPtr->simId, BRCM_RIL_UNSOL_OEM_HOOK_RAW, msg, sizeof(msg));
}
void KRIL_QuerySimEmergencyNumberHandler(void *ril_cmd, Kril_CAPI2Info_t *capi2_rsp)
{
    KRIL_CmdList_t *pdata = (KRIL_CmdList_t*)ril_cmd;

    if (capi2_rsp != NULL)
    {
        KRIL_DEBUG(DBG_INFO, "handler_state:0x%lX::msgType:%d result:%d\n", pdata->handler_state, capi2_rsp->msgType, capi2_rsp->result);
        if(capi2_rsp->result != RESULT_OK)
        {
            pdata->result = RILErrorResult(capi2_rsp->result);
            pdata->handler_state = BCM_ErrorCAPI2Cmd;
            return;
        }
    }

    switch (pdata->handler_state)
    {
        case BCM_SendCAPI2Cmd:
        {
            pdata->bcm_ril_rsp = kmalloc(sizeof(Kril_SIMEmergency), GFP_KERNEL);
            pdata->rsp_len = sizeof(Kril_SIMEmergency);
            memset(pdata->bcm_ril_rsp, 0, pdata->rsp_len);
            CAPI2_PBK_SendInfoReq(GetNewTID(), GetClientID(), PB_EN);
            pdata->handler_state = BCM_PBK_SendInfoReq;
            break;
        }

        case BCM_PBK_SendInfoReq:
        {
            PBK_INFO_RSP_t *rsp = (PBK_INFO_RSP_t *) capi2_rsp->dataBuf;
            KRIL_DEBUG(DBG_INFO,"total_entries:[%d] result:[%d]\n", rsp->total_entries, rsp->result);
            if (0 == rsp->total_entries ||FALSE == rsp->result)
            {
                Kril_SIMEmergency *rdata = (Kril_SIMEmergency *)pdata->bcm_ril_rsp;
                rdata->simAppType = KRIL_GetSimAppType();
                KRIL_SendNotify(BRIL_UNSOL_EMERGENCY_NUMBER, pdata->bcm_ril_rsp, pdata->rsp_len);
                pdata->handler_state = BCM_FinishCAPI2Cmd;
            }
            else
            {
                CAPI2_PBK_SendReadEntryReq(GetNewTID(), GetClientID(), PB_EN, 0, (rsp->total_entries-1));
                pdata->handler_state = BCM_PBK_ReadENEnteryReq;
            }
            break;
        }

        case BCM_PBK_ReadENEnteryReq:
        {
            PBK_ENTRY_DATA_RSP_t *rsp = (PBK_ENTRY_DATA_RSP_t *) capi2_rsp->dataBuf;
            Kril_SIMEmergency *rdata = (Kril_SIMEmergency *)pdata->bcm_ril_rsp;
			
			if(rsp == NULL || rdata == NULL)
			{
				KRIL_DEBUG(DBG_INFO,"rsp or rdata is NULL. ERROR!!");
				pdata->handler_state = BCM_ErrorCAPI2Cmd;
				return;
			}
			
            KRIL_DEBUG(DBG_INFO,"rsp->data_result:%d\n", rsp->data_result);

            if (rsp->data_result == PBK_ENTRY_VALID_IS_LAST || rsp->data_result == PBK_ENTRY_VALID_NOT_LAST)
            {
                KRIL_DEBUG(DBG_INFO,"simecclist:[%s] number:[%s] numlen:%d\n", rdata->simecclist, rsp->pbk_rec.number, strlen(rsp->pbk_rec.number));
                if (strlen(rsp->pbk_rec.number) != 0 && 
                    !(strcmp("112", rsp->pbk_rec.number) == 0 || strcmp("911", rsp->pbk_rec.number) == 0))
                {
                    if (strlen(rdata->simecclist) != 0)
                    {
                        sprintf(&rdata->simecclist[0], "%s%s%s", rdata->simecclist, ",", rsp->pbk_rec.number);
                    } 
                    else
                    {
                        strcpy(rdata->simecclist, rsp->pbk_rec.number);
                    }
                }
                if (rsp->data_result == PBK_ENTRY_VALID_IS_LAST)
                {
                    rdata->simAppType = KRIL_GetSimAppType();
                    KRIL_SendNotify(BRIL_UNSOL_EMERGENCY_NUMBER, pdata->bcm_ril_rsp, pdata->rsp_len);
                    pdata->handler_state = BCM_FinishCAPI2Cmd;
                }
            }
            else
            {
                rdata->simAppType = KRIL_GetSimAppType();
                KRIL_SendNotify(BRIL_UNSOL_EMERGENCY_NUMBER, pdata->bcm_ril_rsp, pdata->rsp_len);
                pdata->handler_state = BCM_FinishCAPI2Cmd;
            }
            break;
        }

        default:
        {
            KRIL_DEBUG(DBG_ERROR,"Error handler_state:0x%lX\n", pdata->handler_state);
            pdata->handler_state = BCM_ErrorCAPI2Cmd;
            break;
        }
    }
}
void KRIL_RadioPowerHandler(void *ril_cmd, Kril_CAPI2Info_t *capi2_rsp)
{
    KRIL_CmdList_t *pdata = (KRIL_CmdList_t *)ril_cmd;
    ClientInfo_t clientInfo;

    if (capi2_rsp != NULL)    	
        KRIL_DEBUG(DBG_INFO, "handler_state:0x%lX::result:%d\n", pdata->handler_state, capi2_rsp->result);

    switch (pdata->handler_state)
    {
        case BCM_SendCAPI2Cmd:
        {
            int *OnOff = (int *)(pdata->ril_cmd->data);

            KRIL_DEBUG(DBG_INFO, "On-Off:%d\n", *OnOff);

			if(gIsStkRefreshReset == TRUE){
				
				RadioDuringRefresh ++;
				KRIL_DEBUG(DBG_INFO, "Refresh : RadioDuringRefresh %d\n",RadioDuringRefresh);
				if(RadioDuringRefresh >= 3){
					if(RadioDuringRefresh == 4){
						RadioDuringRefresh = 0;
						gIsStkRefreshReset = FALSE;
					}
						
					KRIL_DEBUG(DBG_INFO, "Skip power on-off - Refresh\n");
					pdata->bcm_ril_rsp = NULL;
					pdata->rsp_len = 0;
					pdata->handler_state = BCM_FinishCAPI2Cmd;
					break;

				}
				
				if(*OnOff == 0){
					KRIL_DEBUG(DBG_INFO, "Power off Sim card - Refresh\n");
                    CAPI2_InitClientInfo(&clientInfo, GetNewTID(), GetClientID());
                    CAPI2_SimApi_PowerOnOffCard (&clientInfo, FALSE, SIM_POWER_ON_INVALID_MODE);
                    pdata->handler_state = BCM_RESPCAPI2Cmd;

				}else{
					KRIL_DEBUG(DBG_INFO, "Power on Sim card - Refresh\n");
					CAPI2_InitClientInfo(&clientInfo, GetNewTID(), GetClientID());
					CAPI2_SimApi_PowerOnOffCard (&clientInfo, TRUE, SIM_POWER_ON_NORMAL_MODE);
					pdata->handler_state = BCM_RESPCAPI2Cmd;
					//gIsStkRefreshReset = FALSE;
				}
				break;

			}
			else {

            	if (*OnOff == 1)
            	{
                    CAPI2_InitClientInfo(&clientInfo, GetNewTID(), GetClientID());
                	CAPI2_PhoneCtrlApi_ProcessPowerUpReq(&clientInfo);
                    pdata->handler_state = BCM_RESPCAPI2Cmd;
            	}
				else{
                	CAPI2_InitClientInfo(&clientInfo, GetNewTID(), GetClientID());
                	CAPI2_PhoneCtrlApi_ProcessNoRfReq(&clientInfo);
                	pdata->handler_state = BCM_RESPCAPI2Cmd;
            	}
				break;
			}
        }

        case BCM_RESPCAPI2Cmd:
        {
	     //Irine_22June_airplanemode
            int *OnOff = (int *)(pdata->ril_cmd->data);

            KRIL_DEBUG(DBG_TRACE, "handler state:%lu\n", pdata->handler_state);
            pdata->bcm_ril_rsp = NULL;
            pdata->rsp_len = 0;
            pdata->handler_state = BCM_FinishCAPI2Cmd;
			
            KRIL_DEBUG(DBG_INFO, "On-Off:%d\n", *OnOff);
            if (1 == *OnOff)
            {
            	  KRIL_DEBUG(DBG_ERROR, "KRIL_RadioPowerHandler: Offline off\n");
            	  KRIL_DEBUG(DBG_ERROR, "satk_setup_menu_tlv_data_string: %s\n",satk_setup_menu_tlv_data_string);
            	  KRIL_DEBUG(DBG_ERROR, "satk_setup_menu_tlv_length: %d\n",satk_setup_menu_tlv_length);
	         if(satk_setup_menu_tlv_length!=0)
                	KRIL_SendNotify(RIL_UNSOL_STK_PROACTIVE_COMMAND, satk_setup_menu_tlv_data_string, (satk_setup_menu_tlv_length * 2 + 1));
            }

            break;
        }

        default:
        {
            KRIL_DEBUG(DBG_ERROR, "handler_state:%lu error...!\n", pdata->handler_state);
            pdata->handler_state = BCM_ErrorCAPI2Cmd;
            break;
        }
    }

    if (pdata->handler_state == BCM_ErrorCAPI2Cmd || pdata->handler_state == BCM_FinishCAPI2Cmd)
    {
        /* allow to send the radio state change notification to Android framework when request is done. */
        gIsFlightModeOnBoot = FALSE;
    }
}