工作方向

D900由于VIA发布了新的Baseline,需要在此基础上修改,合成新的公司发行版本,最近就在修改产生的Bug。分布式,嵌入式之间的整合依然是我努力研究的方向。由于想更换服务器,所以将来一个月这里可以会暂时关闭一段时间。 

Notepad Beta1

 

      我在VIA嵌入式平台上做的第一个完整的APP,一个记事本的程序,现在实现了添加,修改,删除等基本操作。
     
每条Note的数据是存储在SIDB中,对应一个KEY,每加一条KEY的值加1,删除时会把被删除项的后面所有项顺序向前推,有一个独立的变量记录了现在的总条数,读取列表时根据此数据从SIDB中逐条读出,动态添加到MenuItem中。
     
程序不是很复杂,但涉及的方面比较多,如SIDB的读写,Menu的动态设定等。这里有源程序可供下载。

VIA 安全认证机制

1.对消息进行加密
2.在函数调用过程中调用加密函数
唯一设定密码的地方:Setting->Security->Chang
Lock [ 设定密码 ]
if(!isCallRestrict)
     
        FsiSidbWrite(
ITEM_SECURITY, KEY_LOCKCODE,
                     
(void *)&temp, 0,&opsize);
      else
         
FsiSidbWrite(
ITEM_SECURITY, KEY_CALLRESTRICT_PWD,
                     
(void *)&temp, 0,&opsize);
共有两个密码:分别为 KEY_LOCKCODE 与
KEY_CALLRESTRICT_PWD
对消息进行加密的原理在以前文章中有过叙述,这里对在函数调用过程的加密进行说明:
CASENames
Menu
中选择Erase All 触发的消息为
CONTACTAPP_ERASE_CONTACT_ALL
对应的映射函数为:
    #ifdef
FEATURE_PWD_PROTECT_FOR_DELETE_ALL_CONTACTS_GROUPS
      ON_MAIL_VOIDPTR(CONTACTAPP_ERASE_CONTACT_ALL,
ContactApplicationC::
OnCheckSecretHint)
OnCheckSecretHint中首先要确定呼叫来源,如Erase All 时 设定的触发源的编号为 1
   打开窗口:IDD_SETTING_SECURITY_INPUTLOCKCODE_MENU在EditCtrL中输入密码
确定后和处理在Keyhandle中定义:
 case KP_EVT_PRESS:
 {
    switch (Input)
    {
    case KP_SELECT_KEY:
      {           
        if
(DialogStackP->GetTopDialog()->GetResourceId()== (ResourceIdT)IDD_SETTING_SECURITY_INPUTLOCKCODE_MENU)
          OnCheckSecretData();
      }
      break;             
输入密码按“OK”键,就会调用OnCheckSercretData()进行密码的验证,并跟据上步确定的呼叫源转到不同的函数中去。
    if (m_nCheckSecretCaller == 0)
//Erase contact all.
      OnEraseContactAll();
    else if (m_nCheckSecretCaller ==
1)    // edit record
     
OnEditRecordAfterCheckSecret();
    else if (m_nCheckSecretCaller ==
2) // call contact
     
OnCallContactAfterCheckSecret();
相对于对消息进行的加密,对函数调用过程的加密的可操作空间更大一些,但相对也更麻烦些。

 

Messages加密功能在新短信浏览时不起作用

为了避免直接从Messages 进入
Inbox时的验证与从Idle界面进入进行不同的验证,增加了一个新的消息和处理函数,对应两个不同的消息,有两种不同的验证。
步骤:
1.在 appmids.h 中添加 一个新的消息:    
SMSAPP_INCOMING_MESSAGE_VIEW_FROM_IDLE
2.在 appsms.h 中添加一个新的函数声明:
          MailHandlerResultT OnViewIncomingMessageFromIdle(void *
MsgBufferP);
3.在 appsms.cpp 中添加此函数的定义(同OnViewIncomingMessage):
             MailHandlerResultT
SMSApplicationC::OnViewIncomingMessageFromIdle(void * MsgBufferP)
//ZJJ
 {
 }
   添加了对应的消息映射关系:
ON_MAIL_VOIDPTR(SMSAPP_INCOMING_MESSAGE_VIEW_FROM_IDLE,
SMSApplicationC::OnViewIncomingMessageFromIdle)
4.在 appprivacyguard.cpp 中对此消息进行加密注册
ApplicationManagerP->RegisterPrivacyMsg(SMSAPP_INCOMING_MESSAGE_VIEW_FROM_IDLE);
      //ZJJ
ApplicationManagerP->UnRegisterPrivacyMsg(SMSAPP_INCOMING_MESSAGE_VIEW_FROM_IDLE);  //ZJJ
5.在 资源中 更改了 IDD_SMS_MESSAGE_INCOMING 中 RCC_SMS_MESSAGE_INCOMING_SOFTKEY
里 左软健的消息
        为: SMSAPP_INCOMING_MESSAGE_VIEW_FROM_IDLE

 

Forwarding中从电话本中取出一个号码的过程

[Appsetting.cpp 中]
1. (入口)
         MailHandlerResultT SettingApplicationC::OnSelectCallForwarding(void
*MsgBufferP)
          {
打开窗口:IDD_CALL_FORWARD_ENTER_NUMBER_DIALOG
                 选择
Options->Names 会触发 SETTINGAPP_LIST_CONTACT 消息,执行 OnListContact() ;
                  Goto
2
           }
2. MailHandlerResultT SettingApplicationC::OnListContact()
     {
会执行
:ContactAppP->ChooseNumberFromSMS(SETTINGAPP_NUMBER_INSERT);
第一个消息:SETTINGAPP_NUMBER_INSERT是执行完ChooseNumberFromSMS后要接着执行的消息,
     }
[Appcontact.cpp 中]
3.MailHandlerResultT ContactApplicationC::ChooseNumberFromSMS(const
long SelectMsgId)
    {         
      m_ChooseNumberFromSMSMsg
= SelectMsgId; // 把消息保存在此字符串中
  ChooseContactNameNumber(CONTACTAPP_CHOOSE_CONTACT_NUMBER_FROM_SMS_AFTER,
FALSE);
消息:CONTACTAPP_CHOOSE_CONTACT_NUMBER_FROM_SMS_AFTER是第二条消息用于在 Contact
中选择号码 [将在第9步中使用]
    }
4.void
ContactApplicationC::ChooseContactNameNumber(
const long SelectMsgId,uint8
bSelectEmpty
{
  m_ChooseNameNumberSelectNumberMsg = SelectMsgId;
// 把消息保存在此字符串中
打开窗口:IDD_PHB_CHOOSE_NAME_NUMBER_NAME_LIST_MENU 会列出Contanct中的人员姓名
}
在列表中选择任意一个姓名触发消息:CONTACTAPP_CHOOSE_NAME_NUMBER_SELECT_NAME
根据姓号找到其对应的所有号码:GOTO 5
5.MailHandlerResultT ContactApplicationC::OnChooseNameNumberSelectName()
{
    uint32
secret_caller=5;
 //这里强制规定了OnCheckSecretHint
的参数为
5
   
OnCheckSecretHint(&secret_caller);
}
6.MailHandlerResultT ContactApplicationC::OnCheckSecretHint(void
*MsgBufferP)
{
      else if
(m_nCheckSecretCaller == 5) 
  // choose name number
    OnChooseNameNumberSelectNameAfterCheckSecret();
}
7.void
ContactApplicationC::
OnChooseNameNumberSelectNameAfterCheckSecret()
{
    ChooseContactNumber(m_ChooseNameNumberSelectNumberMsg,
      m_ChooseNameNumberSelectEmpty,
     
m_ChooseNameNumberLeftKeyId,
      TRUE,
     
m_ChooseNameNumberAutoSelectNumber);
}
8.void
ContactApplicationC::
ChooseContactNumber(const
long SelectMsgId,
                       
uint8 bSelectEmpty/*=TRUE*/,
                       
RESOURCE_ID(StringT) LeftKeyStringId/*=NULL*/,
                       
uint8 bNameTitle/*=TRUE*/,
                       
ContactNumberTypeT AutoSelectNumber/*=NONE*/)
{
打开窗口:IDD_PHB_SELECT_CONTACT_NUMBER
                  Title
动态 显示联系 人的姓名 ,列表中显示此联系人的所有电话
  AddNumberToMenu(mNumberListMenuP, SelectMsgId,
bSelectEmpty, (int)AutoSelectNumber);
 }
9.void
ContactApplicationC::
AddNumberToMenu(MenuControlC *RecordMenuP, const long SelectMsgId, uint8
bAddEmpty, int NumberType/*=-1*/)
{
列表中显示此联系人的所有电话
每条记录动态地设置其MenuItem的消息IDSelectMsgId即(m_ChooseNameNumberSelectNumberMsg亦即CONTACTAPP_CHOOSE_CONTACT_NUMBER_FROM_SMS_AFTER第二条消息
     不同的记录其参数不同 从 :(0x14)
开始 FixNumber 和 两个ExternNumber (0x14+1) (0x14+2) 
    newEditRecordItemControlP->SetMessageId(SelectMsgId);
   
newEditRecordItemControlP->SetDisplayMode(TEXT_AND_BITMAP);
   
newEditRecordItemControlP->SetFont(DISP_FONT_NORMAL_PLAIN);
    newEditRecordItemControlP->SetParameter(0x14);
选择一此联系人的号码则发送消息:CONTACTAPP_CHOOSE_CONTACT_NUMBER_FROM_SMS_AFTER
}
10.MailHandlerResultT
ContactApplicationC::
OnChooseNumberFromSMSAfter()
{
  MailHub.SendMailMsg(m_ChooseNumberFromSMSMsg,&RetNumber,sizeof(RetNumber));
m_ChooseNumberFromSMSMsg亦即SETTINGAPP_NUMBER_INSERT第一个消息
}
 [appsetting.cpp 中]
12.(从电话本中携带号码出来)
 MailHandlerResultT
SettingApplicationC::
OnNumberInsert(void
*MsgBufferP)
{
          MsgBufferP
即为所携带的电话号码!
         把号码插入到第一步打开的
EditCtrl 中。
}
END 至此完成号码的插入过程。

 

VIA阶段总结 5.6.2008

1.消息加密:
例如打开对阅读“短信”的密码验证,并不是在短信这个APP处理里面进行的加密,而是对此打开消息进行了拦截,暂时保存起来,触发统一的验证窗口,如果验证的用户密码正确则,把保存起来的那条消息发送出去,否则丢弃,从而达到了验证的目的。
以上验证逻辑的实现在Appprivacyguard.cpp文件中:
首先把需要注册所要验证的消息。
void PrivacyGuardApplicationC::RegisterIntceptingMsg(){}
其次可以跟据不同的消息打开不同的验证窗口:
MailHandlerResultT
PrivacyGuardApplicationC::OnPrivacyVerify(void * MsgBufferP)
{    ……
if(mInterceptingMsg.MsgId==CALLGUARDAPP_OPEN_MAINMENU) //可判断当前的消息ID
     ……
}
2.打开Dialog后也可更改其Title
        For example:
     mVerifyDlgP =
DialogStackP->
OpenDialog(IDD_PRIVACYGUARD_VERIFY_DLG, this, PRIVACYGUARDAPP_CANCEL_VERIFY);
     StaticTextControlC*
StaticTextControlP= (StaticTextControlC*)mVerifyDlgP->
GetControlById((ResourceIdT)RCC_PRIVACYGUARD_TEXT);
   
StaticTextControlP->
SetText(UIIDS_CALLGUARD);//blank
   
MailHub.SendWindowMailMsg(VTUI_PAINT,ALL_WINDOWS,0,0);
3.阅读短信时的处理
    首先执行OnViewIncomingMessage()
    然后调用StringT * messageStringP =
MessageToString(uiSMSMessageP);
把Message转换成StringT的结构输出,在MessageToString中会跟据收到的短信的类别(见下图)进行不同的转换过程:
/*—————————————————————-
      IS-637
Teleservices
Short Message Services for Spread Spectrum
Cellular Systems
    
—————————————————————–*/
     UISMS_TS_ID_IS91        =
4096,
     UISMS_TS_ID_PAGE        =
4097,
     UISMS_TS_ID_MESSAGE     =
4098,
     UISMS_TS_ID_VOICE_MAIL = 4099,
     UISMS_TS_ID_WAP,         
     UISMS_TS_ID_WEMT ,        /*add
for EMS*/
     UISMS_TS_ID_SCPT,         /*add
for SCPT*/
     UISMS_TS_ID_CATPT,            
/*add for UIM card application*/
     UISMS_BROAD_CAST_SRV,     /*add
for the broadcast service*/
     UISMS_RELIANCE_BROAD_CAST_SRV =
49172,
     UISMS_MAX_TS_ID
4.极联
极联是在Web设计中,特别是Javascript制作联动表单时的一种技术,在VIA 的UI中也有与其极其类似的
    例如当在 EditCtrl 中 Insert
Char 时,会跟据Insert的状态,如达到最大值时,触发SoftKeyBar的状态的改变,如改变SoftKeyBar的文字或使其消失。
EditControlC::InsertChar()
{
 if(MaxRangeStatus == MAX_RANGE_EXCEED)
                  {
SetNavigateStatus(NAVIGATE_NONE); //
会改变SetSoftkeybarOkStatus(STATUS_OK);
                   mInsertStatus = INSERT_FAIL; /*Avoid
moving of cursor*/
                   PopupPrompt();
                   PlayTextFullAlert();
                   return 2;
                 }
}
*以上皆是为了说明问题而举例,并非完整的程序或片段