Symbian OS应用开发-SMS的故事(二)


摘要:上节我们了解了Symbian OS中对SMS的主要操作,比如新建、修改以及删除等等,这篇文章我们主要认识一下有关SMS的发送。

发送SMS也许我们大多数人都操作过,简单说来就是编辑一段文本,然后选择一个或多个目标号码,点击发送一切ok。其实在程序中实现的步骤也是如此,只不过需要我们了解更多的知识。
老方法,我们先来了解一些必须的类:
CSmsSettings
设置sms服务的属性类
CSmsHeader
sms头信息,主要有关消息的各种参数,当然与上面的CSmsSettings密切相关

其他有关sms的类在上一节我们都大致介绍了,这里不重复说明,接下来我们会用一些具体的源码加以分析。
首先,我们需要新建一个sms而且得到接受方的号码,这两步可以参照上一节的内容,里边详细介绍了如何新建一条sms。
然后就是要设定发送前的一些参数信息,并选择做一些相应的操作。
---------------------------------------------------------------------------------------------------
    //iMtm是在新建sms阶段设定
    TMsvEntry msvEntry = iMtm->Entry().Entry();
    // 得到sms内容
    CRichText& mtmBody = iMtm->Body();
    mtmBody.Reset();
    mtmBody.InsertL(0, KGDSMSTag);   //插入我们的短信标示
    //重新设定TMsvEntry
    msvEntry.iDetails.Set(iRecipient->Des());  // set recipient info in details
    msvEntry.SetInPreparation(EFalse);         // set inPreparation to false
    msvEntry.SetSendingState(KMsvSendStateWaiting);   // set the sending state (immediately)
    msvEntry.iDate.HomeTime();                        // set time to Home Time
    // 使用CSmsClientMtm类处理sms
    CSmsClientMtm* smsMtm = STATIC_CAST(CSmsClientMtm*, iMtm);
    smsMtm->RestoreServiceAndSettingsL();
    // CSmsHeader封装sms消息的参数,像服务中心号码和发送设定
    CSmsHeader& header = smsMtm->SmsHeader();
    //CSmsSettings类用来详细设定sms Header
    CSmsSettings* sendOptions = CSmsSettings::NewL();
    CleanupStack::PushL(sendOptions);
    sendOptions->CopyL(smsMtm->ServiceSettings());
    sendOptions->SetDelivery(ESmsDeliveryImmediately);//设定立即发送
    header.SetSmsSettingsL(*sendOptions);
    //检查服务中心号码有效性
 if (header.Message().ServiceCenterAddress().Length() == 0)
  {
  // 如果没有设定,则查找默认中心号码
  CSmsSettings* serviceSettings = &(smsMtm->ServiceSettings());
         // 中心号码列表为空
         if (!serviceSettings->NumSCAddresses())
             {
   // 错误消息
   iEikonEnv->InfoWinL(_L("No service center number"),_L("cannot send this one."));
   }
  else
   {
              // 设定为默认服务中心号码
              CSmsNumber* sc = 0;
   sc = &(serviceSettings->SCAddress(serviceSettings->DefaultSC()));
   header.Message().SetServiceCenterAddressL(sc->Address());
   }
  }
 CleanupStack::PopAndDestroy();

    ... ...

    CMsvEntrySelection* selection = new (ELeave) CMsvEntrySelection;
    CleanupStack::PushL(selection);
    selection->AppendL(movedId);            // 添加我们要发送的sms,movedId在省略部分有定义,是TMsvId型变量
    // 调用的这个函数是用于发送的,具体的代码后面介绍
    SetScheduledSendingStateL(selection);  
    CleanupStack::PopAndDestroy(); // selection
    return ETrue; // 到这里sms已被发送
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
void ...::SetScheduledSendingStateL(CMsvEntrySelection* aSelection)
    {
    CBaseMtm* smsMtm = iMtm;
    // 添加entry到任务列表
    TBuf8<1> dummyParams;
    CCommandAbsorbingControl::NewLC();
    CMsvOperationWait* waiter = CMsvOperationWait::NewLC();
    waiter->Start();
    // 这个函数是关键
    CMsvOperation* op= smsMtm->InvokeAsyncFunctionL(
            ESmsMtmCommandScheduleCopy,
            *aSelection,
            dummyParams,
            waiter->iStatus);
    CleanupStack::PushL(op);
    CActiveScheduler::Start(); //开始时间表中任务
    CleanupStack::PopAndDestroy(3); // waiter, op, CCommandAbsorbingControl
    }
---------------------------------------------------------------------------------------------------

需要我们注意的是:在发送sms的过程中大部分的操作都是用于设定发送sms时的参数,所以东西比较琐碎;如果您想自己实现这部分工作,给您的建议就是尽量采用一个比较通用的方法,无需设定一些让人捉摸不定的信息。在发送sms中起主要作用的还是CBaseMtm类,这个类以及从它继承的类负责sms的具体发送,所以整个过程的结束点一定是使用这些类的函数来实现发送的动作,犹如上述的InvokeAsyncFunctionL函数。


源码下载请点击此处>>>

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值