Chinaunix首页 | 论坛 | 博客
  • 博客访问: 803991
  • 博文数量: 244
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 2420
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-29 09:07
文章分类

全部博文(244)

文章存档

2011年(4)

2010年(3)

2009年(72)

2008年(119)

2007年(46)

我的朋友

分类: LINUX

2009-04-28 09:07:30

======================================================================
mReceiver = new RILReceiver()
RILReceiver对像的 run()中
InputStream is = mSocket.getInputStream();
LocalSocket
 
 
==============================================================================
 
==============================================================================
GsmSimCard.java (frameworks\base\telephony\java\com\android\internal\telephony\gsm)
public void handleMessage(Message msg)
  判断 msg.what
  case EVENT_SIM_READY:
       phone.mCM.getSimStatus(obtainMessage(EVENT_GET_SIM_STATUS_DONE));
  case EVENT_SIM_LOCKED_OR_ABSENT:
       phone.mCM.getSimStatus(obtainMessage(EVENT_GET_SIM_STATUS_DONE));
  case EVENT_PINPUK_DONE:
      // a PIN/PUK/PIN2/PUK2/Network Personalization
      phone.mCM.getSimStatus(obtainMessage(EVENT_REPOLL_STATUS_DONE, ar.userObj));
 
GsmSimCard(GSMPhone phone)
  phone.mCM.registerForSIMReady(this, EVENT_SIM_READY, null);    
  updateStateProperty(); 
 
GsmSimCard.java (frameworks\base\telephony\java\com\android\internal\telephony\gsm)              
ServiceStateTracker.java (frameworks\base\telephony\java\com\android\internal\telephony\gsm)
SIMRecords.java (frameworks\base\telephony\java\com\android\internal\telephony\gsm)
 
public abstract class BaseCommands implements CommandsInterface
BaseCommands 类实现了 CommandsInterface接口
public void registerForSIMReady(Handler h, int what, Object obj)
{
    Registrant r = new Registrant (h, what, obj);
    synchronized (mStateMonitor) {
        mSIMReadyRegistrants.add(r)
        if (mState.isSIMReady()) {
            r.notifyRegistrant(new AsyncResult(null, null, null));
        }
    }
}
GsmSimCard(GSMPhone phone)
  phone.mCM.registerForSIMReady(this, EVENT_SIM_READY, null);
 
static void pollSIMState (void *param)
  switch(getSIMStatus()) {
        case RIL_SIM_ABSENT:
        case RIL_SIM_PIN:
        case RIL_SIM_PUK:
        case RIL_SIM_NETWORK_PERSONALIZATION:
        default:
            setRadioState(RADIO_STATE_SIM_LOCKED_OR_ABSENT);
        return;
 
        case RIL_SIM_NOT_READY:
            RIL_requestTimedCallback (pollSIMState, NULL, &TIMEVAL_SIMPOLL);
        return;
 
        case RIL_SIM_READY:
            setRadioState(RADIO_STATE_SIM_READY);
        return;
    }
//Reference-ril.c (hardware\ril\reference-ril)
static void setRadioState(RIL_RadioState newState) 
  如果RadioState 为 RADIO_STATE_SIM_READY 执行
  onSIMReady();
  如果RadioState 为 RADIO_STATE_SIM_NOT_READY 执行:
  onRadioPowerOn();
 
 
======================================================================
获取sim卡状态流程:                   
getSIMStatus()
CommandsInterface.java (frameworks\base\telephony\java\com\android\internal\telephony\gsm)
接口 public interface CommandsInterface 中有
void getSimStatus(Message result);
RIL.java (frameworks\base\telephony\java\com\android\internal\telephony\gsm)
public final class RIL extends BaseCommands implements CommandsInterface
RIL 类实现了 CommandsInterface 接口
getSimStatus(Message result)
  RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_SIM_STATUS, result);
    send(rr);
 
rild 程序流程       
  static void processCommandsCallback(int fd, short flags, void *param)
    processCommandBuffer(p_record, recordlen);
      status = p.readInt32(&request);
      pRI->pCI = &(s_commands[request]); 
      pRI->pCI->dispatchFunction(p, pRI);
      因为有 {RIL_REQUEST_GET_SIM_STATUS,dispatchVoid, responseInts},
      所以执行的是 Ril.cpp (hardware\ril\libril) 文件中的函数:
      static void dispatchVoid (Parcel& p, RequestInfo *pRI)
        s_callbacks.onRequest(pRI->pCI->requestNumber, NULL, 0, pRI);
        //Reference-ril.c (hardware\ril\reference-ril):
          case RIL_REQUEST_GET_SIM_STATUS:
             getSIMStatus()
               err = at_send_command_singleline("AT+CPIN?", "+CPIN:", &p_response);
               return ret;
             //Ril.cpp (hardware\ril\libril)
             RIL_onRequestComplete(t, RIL_E_SUCCESS, &simStatus, sizeof(simStatus));
               sendResponse(p);
                 sendResponseRaw(p.data(), p.dataSize());
                    blockingWrite(fd, data, dataSize);
    
==========================================================================================
pin码验证流程:
KeyguardViewManager.java (frameworks\policies\base\phone\com\android\internal\policy\impl
show()
  mKeyguardView = mKeyguardViewProperties.createKeyguardView(mContext, mUpdateMonitor, this);
    new LockPatternKeyguardView(context, updateMonitor,mLockPatternUtils, controller);
      mUnlockScreen = createUnlockScreenFor(unlockMode);
      createUnlockScreenFor(UnlockMode unlockMode)
        如果 unlockMode == UnlockMode.SimPin
        那么 new SimUnlockScreen(mContext,mUpdateMonitor,mKeyguardScreenCallback);
      updateScreen(mMode);
      
由 SimUnlockScreen 类的
public void onClick(View v)
  mOkButton 执行的是 checkPin()
    new CheckSimPin(mPinText.getText().toString())
    
 
//PhoneInterfaceManager.java (packages\apps\phone\src\com\android\phone)   
supplyPin(String pin)
  return checkSimPin.checkPin(pin);
  mSimCard.supplyPin(pin, callback);
  //private final SimCard mSimCard;
  //因为类 GsmSimCard 实现了 SimCard 接口所以实际执行的是:
  //GsmSimCard.java (frameworks\base\telephony\java\com\android\internal\telephony\gsm)文件中的
  public void supplyPin (String pin, Message onComplete)
    phone.mCM.supplySimPin(pin,obtainMessage(EVENT_PINPUK_DONE, onComplete));
    //RIL.java (frameworks\base\telephony\java\com\android\internal\telephony\gsm)
    public void supplySimPin(String pin, Message result)
      RILRequest rr = RILRequest.obtain(RIL_REQUEST_ENTER_SIM_PIN, result);
      send(rr); //通过socket 向 rild 发送 RIL_REQUEST_ENTER_SIM_PIN 请求
 
rild端处理流程:       
  static void processCommandsCallback(int fd, short flags, void *param)
    processCommandBuffer(p_record, recordlen);
      status = p.readInt32(&request);
      pRI->pCI = &(s_commands[request]); 
      pRI->pCI->dispatchFunction(p, pRI);
      因为有 {RIL_REQUEST_ENTER_SIM_PIN, dispatchStrings, responseVoid},
      所以执行的是 Ril.cpp (hardware\ril\libril) 文件中的函数:
      static void dispatchStrings (Parcel &p, RequestInfo *pRI)
        s_callbacks.onRequest(pRI->pCI->requestNumber, pStrings, datalen, pRI);
        此处的 pRI->pCI->requestNumber 为 RIL_REQUEST_ENTER_SIM_PIN
        //Reference-ril.c (hardware\ril\reference-ril)
        static void  onRequest (int request, void *data, size_t datalen, RIL_Token t)
          case RIL_REQUEST_ENTER_SIM_PIN:
          requestEnterSimPin(data, datalen, t);
            err = at_send_command_singleline(cmd, "+CPIN:", &p_response);
              err = at_send_command_full (command, SINGLELINE, responsePrefix,...);
                err = at_send_command_full_nolock(command, type,responsePrefix,...);
                  err = writeline (command);
                    written = write (s_fd, s + cur, len - cur);//往串口写数据
            RIL_onRequestComplete(t, RIL_E_SUCCESS, NULL, 0);
      
===========================================================
开启sim卡的pin
EnableSimPinScreen.java
rild端处理流程:       
  static void processCommandsCallback(int fd, short flags, void *param)
    processCommandBuffer(p_record, recordlen);
      status = p.readInt32(&request);
      pRI->pCI = &(s_commands[request]); 
      pRI->pCI->dispatchFunction(p, pRI);
      因为有 {RIL_REQUEST_ENTER_SIM_PIN, dispatchStrings, responseVoid},
      所以执行的是 Ril.cpp (hardware\ril\libril) 文件中的函数:
      static void dispatchStrings (Parcel &p, RequestInfo *pRI)
        s_callbacks.onRequest(pRI->pCI->requestNumber, pStrings, datalen, pRI);
        此处的 pRI->pCI->requestNumber 为 RIL_REQUEST_ENTER_SIM_PIN
 
==============================================================================
阅读(1167) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~