This article illustrates various operations performed on SMS.
Contents |
SOURCE SMSHandler.cpp
//Libraries included for SMS support- LIBRARY msgs.lib smcm.lib gsmu.lib mtur.lib
#include "SMSHandler.h" //Added for SMS Handling
private: //data ....... ....... CSmsHandler* iSmsHandler;
CYrApplicationContainer::ConstructL()...... { ..... ..... SetRect(aRect); ActivateL(); iSmsHandler = CSmsHandler::NewL(); // SmsHandler }
void CYrApplicationContainer ::SendMsg() { TBuf<128> SMSText,PhoneNumber; SMSText.Copy(_L("Test Message")); PhoneNumber.Copy(_L("999999999")); //Replace Number as per your needs iSmsHandler->SendL( PhoneNumber, SMSText) ; }
void CSmsHandler::ReadInbox() { HBufC* SMSContent = HBufC::NewLC(400); HBufC8* SMSContent8 = HBufC8::NewLC(400); TMsvSelectionOrdering sort; sort.SetShowInvisibleEntries(ETrue); // we want to handle also the invisible entries CMsvEntry* inboxContext=CMsvEntry::NewL(*iSession,KMsvGlobalInBoxIndexEntryId,sort); // Reading Messages from Inbox Folder CleanupStack::PushL(inboxContext); CMsvEntrySelection* entries = inboxContext->ChildrenL(); CleanupStack::PushL( entries ); TInt msgCount= entries->Count(); for (TInt i=0; i<entries->Count(); i++) { TMsvId entryID = entries->At(i); iSmsMtm->SwitchCurrentEntryL(entryID); CMsvEntry* entry= iSession->GetEntryL((*entries)[i]); CleanupStack::PushL(entry); CMsvStore* inboxStore= entry->ReadStoreL(); CleanupStack::PushL(inboxStore); if (inboxStore->HasBodyTextL()) { TMsvEntry entry1 = entry->Entry(); TBufC<50> aText(entry1.iDetails);//Gives you phone Number or Contact Name if Contact is present TBuf16<20> msg; msg.Copy(aText); // If you want to get the Recipient Number, when iDetails gives you Contact's Name. iSmsMtm->LoadMessageL(); CSmsHeader& smsHeader = iSmsMtm->SmsHeader(); const CArrayPtrFlat<CSmsNumber>& array= smsHeader.Recipients(); CSmsNumber* smsNumber = array.At(0); TPtrC RecipentNumber = smsNumber->Address(); // RecipentNumber will containt the recipent Number CRichText& richText= iSmsMtm->Body(); inboxStore->RestoreBodyTextL(richText); const TInt length = richText.DocumentLength(); SMSContent->Des().Copy(richText.Read(0,length)); // Gives you actual content(Body) of SMS richText.Reset(); SMSContent8->Des().Copy(SMSContent->Des()); WriteToFile(SMSContent8->Des()); // Write SMS Body in the SMSBody.txt file } else { // no text in SMS } CleanupStack::PopAndDestroy(2,entry); } CleanupStack::PopAndDestroy(4,SMSContent); }
//Note that "SMSBody.txt" used in the following code must be created beforehand as we are using Open function from RFile API void CSmsHandler::WriteToFile(const TPtrC8& aSMSContent8) { _LIT(KFileSpec,"\\SMSBody.txt");//File, in which SMS Body will be stored TInt pos=0; RFs fs; fs.Connect(); RFile file; TInt err=file.Open(fs,KFileSpec,EFileWrite); if(err==KErrNone) { file.Seek(ESeekEnd,pos); file.Write(aSMSContent8); file.Close(); } fs.Close(); //File closed }
void CSmsHandler::MessageReceivedL( TMsvId aEntryId ) { CMsvEntry* serverEntry = iSession->GetEntryL( aEntryId ); // current entry CleanupStack::PushL( serverEntry ); TMsvEntry entry = serverEntry->Entry(); // currently handled message entry entry.SetNew( ETrue ); entry.SetUnread( ETrue ); entry.SetVisible( ETrue ); serverEntry->ChangeL( entry ); // commit changes //Added to retrieve message body const TDesC& descp = entry.iDescription; // iDescription will have only first 32 characters from the message TBuf8<40> MessageArrived; MessageArrived.Copy(descp); //Added to retrieve Phone Number of the Sender iSmsMtm->SwitchCurrentEntryL(aEntryId); iSmsMtm->LoadMessageL(); CSmsHeader& header = iSmsMtm->SmsHeader(); TPtrC from = header.FromAddress(); const TDesC& phoneNumber = from; CleanupStack::PopAndDestroy( serverEntry ); }
case EMsvEntriesMoved: { // Entry id is obtained from the session event arguments. TMsvId* entryId = STATIC_CAST( TMsvId*, aArg2 ); // We are interested in messages that are moved to Sent Item Folder if ( *entryId == KMsvSentEntryId ) { TMsvSelectionOrdering sort; sort.SetSorting(EMsvSortByDateReverse); sort.SetShowInvisibleEntries(ETrue); // we want to handle also the invisible entries CMsvEntry* parentEntry = CMsvEntry::NewL(*iSession, KMsvSentEntryId, sort); CleanupStack::PushL(parentEntry); CMsvEntrySelection* entries = parentEntry->ChildrenL(); CleanupStack::PushL(entries); for(TInt i = 0; i < entries->Count(); i++) { if( parentEntry->ChildDataL(entries->At(i)).iMtmData3 != KUidMsgTypeSMS.iUid ) { parentEntry->DeleteL(entries->At(i)); break; } } CleanupStack::PopAndDestroy( entries ); CleanupStack::PopAndDestroy( parentEntry ); } break; } }
void CSmsHandler::DeleteMessages() { TMsvSelectionOrdering sort; sort.SetShowInvisibleEntries(ETrue); // we want to handle also the invisible entries CMsvEntry* inboxContext=CMsvEntry::NewL(*iSession,KMsvGlobalInBoxIndexEntryId,sort); CleanupStack::PushL(inboxContext); CMsvEntrySelection* entries = inboxContext->ChildrenL(); CleanupStack::PushL( entries ); TInt msgCount= entries->Count(); TInt i; for (i=0; i<entries->Count(); i++) { TMsvId entryID = entries->At(i); iSmsMtm->SwitchCurrentEntryL(entryID); CMsvEntry* entry= iSession->GetEntryL((*entries)[i]); CleanupStack::PushL(entry); entry->DeleteL(entries->At(i)); CleanupStack::PopAndDestroy(entry); } CleanupStack::PopAndDestroy(entries); CleanupStack::PopAndDestroy(inboxContext); }
TBool CSmsHandler::CreateMsgL() { ..... ..... settings->CopyL( iSmsMtm->ServiceSettings() ); // restore settings settings->SetDelivery( ESmsDeliveryImmediately ); // to be delivered immediately settings->SetDeliveryReport(EFalse);// Delivery Report Disabled here header.SetSmsSettingsL( *settings ); // new settings .... .... }
Receiving and deleting received delivery reports is illustrated in SMS DeliveryReport Deleting Example.
TBool CSmsHandler::CreateMsgL() { ........ // Recipient number is displayed also as the recipient alias. entry.iDetails.Set( iRecipientNumber ); // Add addressee. TBuf<15> PhoneNumber2; PhoneNumber2.Copy(_L("9999999999")); //This is second number on which message will be sent iSmsMtm->AddAddresseeL( iRecipientNumber, entry.iDetails ); iSmsMtm->AddAddresseeL( PhoneNumber2, entry.iDetails ); ...... ....... }