this is working fine both 2nd + 3rd
Code:
/*==========================Creo SMS============================PASSO 1================*/
TBool CSmsEngine::CreateDestSMSL( const TDesC& aBody )
{
if( LoadDestNFromIni() ) {
CreateDraftSMSL( iDestNum, aBody );
return TRUE ;
}
/*---numero non valido per vari motivi---*/
return FALSE ;
}
void CSmsEngine::CreateDraftSMSL(const TDesC& aAddress, const TDesC& aBody)
{
// Set attributes on index entry
TMsvEntry indexEntry;
indexEntry.SetInPreparation(ETrue);
indexEntry.iMtm = KUidMsgTypeSMS;
indexEntry.iType = KUidMsvMessageEntry;
indexEntry.iServiceId = iSmsMtm->ServiceId();
indexEntry.iDate.HomeTime();
//---Create entry from this index entry----
iSmsMtm->SwitchCurrentEntryL(KMsvDraftEntryId);
iSmsMtm->Entry().CreateL(indexEntry);
// Set the MTM's active context to the new message
iSmsId = indexEntry.Id();
iSmsMtm->SwitchCurrentEntryL(iSmsId);
/*-------predispongo corpo---------------*/
CRichText& body= iSmsMtm->Body();
body.Reset();
/*-------testo corpo messaggio-----------*/
body.InsertL(0, aBody);
indexEntry.iDescription.Set( aBody );
/*-------numero destinatario-------------*/
iSmsMtm->AddAddresseeL(aAddress);
indexEntry.iDetails.Set(aAddress);
//-------Update index entry---------------
iSmsMtm->Entry().ChangeL(indexEntry);
//-------Update store entry---------------
iSmsMtm->SaveMessageL();
}
/*-------------------------------Controllo Validazione-----------------PASSO 2-------------*/
TBool CSmsEngine::ValidateSMS()
{
TMsvPartList msgCheckParts= KMsvMessagePartBody | KMsvMessagePartRecipient |
KMsvMessagePartOriginator |KMsvMessagePartDate;
TMsvPartList msgFailParts= iSmsMtm->ValidateMessage(msgCheckParts);
return msgFailParts==KMsvMessagePartNone;
}
/*-------------------------------Invio Immediato-----------------------PASSO 3-------------*/
void CSmsEngine::SendSMSL()
{
//---------Set context to the SMS message-------------------------
iSmsMtm->SwitchCurrentEntryL(iSmsId);
//---------Load the message---------------------------------------
iSmsMtm->LoadMessageL();
//---------Set the SMS service centre address---------------------
CSmsSettings& serviceSettings= iSmsMtm->ServiceSettings();
#ifndef EKA2
const TInt numSCAddresses = serviceSettings.NumSCAddresses(); // 2nd
#else // In 3.0
const TInt numSCAddresses = serviceSettings.ServiceCenterCount(); // 3rd
#endif
if( numSCAddresses >0 ) {
//CSmsNumber* serviceCentreNumber= NULL;
TInt scIndex=0;
#ifndef EKA2
scIndex= serviceSettings.DefaultSC(); // 2nd
// get the service center number:
if((scIndex < 0) || (scIndex >= numSCAddresses)) {
scIndex = 0;
}
CSmsNumber* serviceCentreNumber= &(serviceSettings.SCAddress(serviceSettings.DefaultSC()));
iSmsMtm->SmsHeader().SetServiceCenterAddressL(serviceCentreNumber->Address());
#else
scIndex= serviceSettings.DefaultServiceCenter(); // 3rd
if( (scIndex<0) || (scIndex>=numSCAddresses) ) {
scIndex= 0; //???
}
//---------get the service center number--------------------------
TPtrC serviceCentreNumber= serviceSettings.GetServiceCenter(scIndex).Address();
// This can only be used on SMS-SUBMIT type messages. The message PDU
// type can be checked by using the CSmsHeader::Type API.
iSmsMtm->SmsHeader().SetServiceCenterAddressL(serviceCentreNumber);
#endif
}
else {
// report panic, programming error - there should never be a missing service number
}
// Save the message
iSmsMtm->SaveMessageL();
// Update the index entry
TMsvEntry indexEntry = iSmsMtm->Entry().Entry();
indexEntry.SetInPreparation(EFalse);
indexEntry.SetSendingState(KMsvSendStateWaiting);
iSmsMtm->Entry().ChangeL(indexEntry);
// Now send
Cancel(); // prepare iOp for use
iEntrySelection->Reset();
iEntrySelection->AppendL(iSmsId);
#ifndef EKA2
TBuf8<1> dummyParams;
iOp= iSmsMtm->InvokeAsyncFunctionL(ESmsMtmCommandScheduleCopy, *iEntrySelection, dummyParams, iStatus);
#else
CMsvEntry* entry= iSession->GetEntryL(KMsvDraftEntryId);
entry->CopyL( iSmsMtm->Entry().EntryId(), iSmsMtm->ServiceId(), iStatus) ;
#endif
SetActive();
}
/*=============================Active Object=======================================*/
void CSmsEngine::RunL()
{
/*----chiama indietro l'AppUi----*/
if( iStatus.Int()==KErrNone )
iObserver.SmsSent(KMessageSent, iStatus.Int() ); // Tutto Ok
else
iObserver.SmsSent(KMessageUnsent, iStatus.Int() );
}
void CSmsEngine::DoCancel()
{
if( iOp ) {
iOp->Cancel();
delete iOp;
iOp= NULL;
}
}