📄 smshandler.cpp,v
字号:
{ return EFalse; } entry.SetVisible( ETrue ); // set message as visible entry.SetInPreparation( EFalse ); // set together with the visibility flag serverEntry.ChangeL( entry ); // commit changes iSmsMtm->SaveMessageL(); // save message TMsvSelectionOrdering selection; CMsvEntry* parentEntry = CMsvEntry::NewL( iSmsMtm->Session(), KMsvDraftEntryId, selection ); CleanupStack::PushL( parentEntry ); // Move message to Outbox. iOperation = parentEntry->MoveL( entry.Id(), KMsvGlobalOutBoxIndexEntryId, iStatus ); CleanupStack::PopAndDestroy( parentEntry ); iState = EWaitingForMoving; SetActive(); return ETrue; }// -----------------------------------------------------------------------------// CSmsHandler::ValidateL()// Validate an SMS message.// -----------------------------------------------------------------------------//TBool CSmsHandler::ValidateL() { // Empty part list to hold the result. TMsvPartList result( KMsvMessagePartNone ); // Validate message body. result = iSmsMtm->ValidateMessage( KMsvMessagePartBody ); if ( result != KMsvMessagePartNone ) {/* HBufC* text = StringLoader::LoadLC( R_SMS_MSG_BODY ); CAknWarningNote* warningNote = new ( ELeave ) CAknWarningNote; warningNote->ExecuteLD( *text ); CleanupStack::PopAndDestroy( text ); */ return EFalse; } // Validate recipient. result = iSmsMtm->ValidateMessage( KMsvMessagePartRecipient ); if ( result != KMsvMessagePartNone ) {/* HBufC* text = StringLoader::LoadLC( R_SMS_RECIPIENT_NBR ); CAknWarningNote* warningNote = new ( ELeave ) CAknWarningNote; warningNote->ExecuteLD( *text ); CleanupStack::PopAndDestroy( text );*/ return EFalse; } return ETrue; }// -----------------------------------------------------------------------------// CSmsHandler::ScheduleL()// Schedule an SMS message for sending.// -----------------------------------------------------------------------------//void CSmsHandler::ScheduleL() { CMsvEntrySelection* selection = new ( ELeave ) CMsvEntrySelection; CleanupStack::PushL( selection ); selection->AppendL( iSmsMtm->Entry().EntryId() ); // add message to selection // Add entry to task scheduler. TBuf8<1> dummyParams; // dummy parameters needed for InvokeAsyncFunctionL iOperation = iSmsMtm->InvokeAsyncFunctionL( ESmsMtmCommandScheduleCopy, *selection, dummyParams, iStatus ); CleanupStack::PopAndDestroy( selection ); iState = EWaitingForScheduling; SetActive(); }// -----------------------------------------------------------------------------// CSmsHandler::MessageReceivedL()// Handles a received SMS message.// -----------------------------------------------------------------------------//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 //iSmsAppUi->MessageReceived(); // let UI know we have received a message CleanupStack::PopAndDestroy( serverEntry );/* HBufC* text = StringLoader::LoadLC( R_SMS_MSG_RECEIVED ); CAknInformationNote* informationNote = new ( ELeave ) CAknInformationNote; informationNote->ExecuteLD( *text ); CleanupStack::PopAndDestroy( text );*/ }// -----------------------------------------------------------------------------// CSmsHandler::ViewL()// Dispalys a received SMS message.// -----------------------------------------------------------------------------//void CSmsHandler::ViewL() { // There is an own registry for UI MTM's. iMtmUiRegistry = CMtmUiRegistry::NewL( *iSession ); // We are interested in the next unread message. TMsvId entryId( iSelection->At( iNextUnread ) ); CMsvEntry* serverEntry = iSession->GetEntryL( entryId ); CleanupStack::PushL( serverEntry ); // Create new MTM. CBaseMtm* clientMtm = iMtmRegistry->NewMtmL( serverEntry->Entry().iMtm ); CleanupStack::PushL( clientMtm ); clientMtm->SwitchCurrentEntryL( serverEntry->EntryId() ); // Check if there are more unreads messages. iNextUnread++; if ( iNextUnread < iSelection->Count() ) { // iSmsAppUi->MessageReceived(); // still messages to read } else {// iSmsAppUi->NoMoreUnread(); // no more messages to read } TMsvEntry entry( serverEntry->Entry() ); entry.SetNew( EFalse ); // message is no longer new entry.SetUnread( EFalse ); // message is no longer unread serverEntry->ChangeL( entry ); // commit changes CBaseMtmUi* ui = iMtmUiRegistry->NewMtmUiL( *clientMtm ); // UI MTM for SMS CleanupStack::PushL( ui ); // Display the SMS using the UI MTM. iOperation = ui->ViewL( iStatus ); CleanupStack::PopAndDestroy( 3 ); // ui, clientMtm, serverEntry SetActive(); }void CSmsHandler::ReadInbox(){ TBuf16<400> SMSContent; // To store the body part of SMS 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); TMsvEntry entry1 = entry->Entry(); CMsvStore* inboxStore= entry->ReadStoreL(); CleanupStack::PushL(inboxStore); if (inboxStore->HasBodyTextL()) { TBufC<50> aText(entry1.iDetails); // Gives u phone Number TBuf16<20> msg; msg.Copy(aText); CRichText& richText= iSmsMtm->Body(); inboxStore->RestoreBodyTextL(richText); const TInt length = richText.DocumentLength(); SMSContent.Copy(richText.Read(0,length)); // Gives u actual content(Body) of SMS richText.Reset(); TBuf8<400> SMSContent8; SMSContent8.Copy(SMSContent); WriteToFile(SMSContent8); // Write SMS Body in the SMSBody.txt file } else { // no text in SMS } CleanupStack::PopAndDestroy(inboxStore); CleanupStack::PopAndDestroy(entry); } CleanupStack::PopAndDestroy(entries); CleanupStack::PopAndDestroy(inboxContext);}void CSmsHandler::WriteToFile(TBuf8<400> SMSContent8){ _LIT(KFileSpec,"\\SMSBody.txt");//File, in which SMS Body will be stored TInt iPos=0; RFs iFs; iFs.Connect(); RFile iFile; TInt iErr=iFile.Open(iFs,KFileSpec,EFileWrite); if(iErr==KErrNone) { iFile.Seek(ESeekEnd,iPos); iFile.Write(SMSContent8); iFile.Close(); } iFs.Close(); //File closed}[edit] Read incoming message ( Online Mode ) [edit] Retrieve Message Body [edit] Retrieve Phone Number You will find MessageReceivedL() in the SMSHandler.cpp file. Perform following changes to read incoming message body and phone number. 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 );}[edit] Delete message from Sent Item ( Online Mode ) Add following case in the HandleSessionEventL() of SmsHandler.cpp So when you send message from your application, it will be deleted from "Sent Item" folder. 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.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; }}[edit] Delete messages from Messaging Folders [edit] Inbox [edit] Outbox [edit] Draft [edit] Sent Item Following code snippet illustrates deleting messages from Inbox Folder. KMsvGlobalInBoxIndexEntryId is used. To delete messages from Outbox Folder, use KMsvGlobalOutBoxIndexEntryId To delete messages from Draft Folder, use KMsvDraftEntryId To delete messages from Sent Item Folder, use KMsvSentEntryId 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);}[edit] Disable "Delivery Report" Open SmsHandler.cpp and add SetDeliverReport = EFalse in CreateMsgL() 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........}[edit] Send message to multiple reciepients Open SmsHandler.cpp and set multiple numbers in AddAddresseeL() in CreateMsgL() 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 );.............}@1.1.1.1log@no message@text@@
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -