MMSExample.cpp
上传用户:sempras
上传日期:2007-03-04
资源大小:821k
文件大小:19k
源码类别:

Symbian

开发平台:

C/C++

  1. /*
  2.         MMSExample.CPP - source file for MMSExample application
  3.         
  4. */
  5. #include <mtclreg.h>                        // for CClientMtmRegistry 
  6. #include <msvids.h>                         // for Message type IDs
  7. #include <mmsclient.h>                      // for CMmsClientMtm
  8. #include <AknQueryDialog.h>                 // for CAknTextQueryDialog
  9. #include "MMSExample.h"                     // own definitions
  10. #include "MMSExample.hrh"                   // own resource header
  11. #include <MMSExample.rsg>
  12. // Own constants
  13. const TUid KUidMMSExample = { 0x101F402F }; // MMSExample application UID 
  14. const TInt KMaxAddressLength = 80;          // maximum length for a recipient address
  15. const TUid KMMSExampleViewId = { 1 };       // UID of MMSExample view
  16. //
  17. // CMMSExampleContainer
  18. //
  19. /*
  20. -------------------------------------------------------------------------------
  21.     CMMSExampleContainer::ConstructL()
  22.     Description: 2nd phase Constructor.
  23.     Return value: N/A
  24. -------------------------------------------------------------------------------
  25. */
  26. void CMMSExampleContainer::ConstructL()
  27.     {
  28.     CreateWindowL();
  29.     }
  30. /*
  31. -----------------------------------------------------------------------------
  32.     CMMSExampleContainer::Draw()
  33.     Simple Draw method.
  34. -----------------------------------------------------------------------------
  35. */
  36. void CMMSExampleContainer::Draw(const TRect& /*aRect*/) const
  37.     {
  38.     CWindowGc& gc = SystemGc();
  39.     gc.Clear();
  40.     
  41.     // Draw text "MMS Example for Series 60"
  42.     gc.SetPenColor(KRgbBlack); 
  43.     const CFont* fontUsed = iEikonEnv->TitleFont();
  44.     gc.UseFont(fontUsed);
  45.     TInt baseline = (Rect().Height() / 2) - fontUsed->AscentInPixels()*2; // set text 2 * text ascent abowe the centerline
  46.     TInt margin=0; // margin is zero so that the text will be cenetred
  47.     _LIT(K1stLine,"MMS example");
  48.     gc.DrawText(K1stLine,Rect(),baseline,CGraphicsContext::ECenter, margin);
  49.         
  50.     baseline = (Rect().Height() / 2) + fontUsed->AscentInPixels()*2; // 2nd line goes below the centerline
  51.     _LIT(K2ndLine,"for Series 60");
  52.     gc.DrawText(K2ndLine, Rect(), baseline, CGraphicsContext::ECenter, margin);
  53.     }
  54. //
  55. // CMMSExampleAppView
  56. //
  57. /*
  58. -----------------------------------------------------------------------------
  59.     CMMSExampleAppView::NewL()
  60.     2nd phase construction.
  61.     Return values:      CMMSExampleAppView*
  62. -----------------------------------------------------------------------------
  63. */
  64. CMMSExampleAppView* CMMSExampleAppView::NewL()
  65.     {
  66.     CMMSExampleAppView* self=NewLC();
  67.     CleanupStack::Pop(); // self
  68.     return self;
  69.     }
  70. /*
  71. -----------------------------------------------------------------------------
  72.     CMMSExampleAppView::NewLC()
  73.     2nd phase construction. Created object is put into CleanupStack
  74.     before calling ConstructL(). Note that object is left in CS so the caller 
  75.     must take care of popping it out.
  76.     Return values:      CMMSExampleAppView*
  77. -----------------------------------------------------------------------------
  78. */
  79. CMMSExampleAppView* CMMSExampleAppView::NewLC()
  80.     {
  81.     CMMSExampleAppView* self = new(ELeave) CMMSExampleAppView();
  82.     CleanupStack::PushL(self);
  83.     self->ConstructL();
  84.     return self;
  85.     }
  86. /*
  87. -----------------------------------------------------------------------------
  88.     CMMSExampleAppView::CMMSExampleAppView()
  89.     C++ constructor
  90. -----------------------------------------------------------------------------
  91. */
  92. CMMSExampleAppView::CMMSExampleAppView()
  93.     {
  94.     }
  95. /*
  96. -----------------------------------------------------------------------------
  97.     CMMSExampleAppView::ConstructL()
  98.     2nd phase constructor.
  99.     Return value: N/A
  100. -----------------------------------------------------------------------------
  101. */
  102. void CMMSExampleAppView::ConstructL()
  103.     {
  104.     }
  105. /*
  106. -------------------------------------------------------------------------------
  107.     ~CMMSExampleAppView()
  108.     Description: Destructor.
  109.     Return value: N/A
  110. -------------------------------------------------------------------------------
  111. */
  112. CMMSExampleAppView::~CMMSExampleAppView()
  113.     {
  114.     if(iContainer)
  115.         AppUi()->RemoveFromStack(iContainer);
  116.     }
  117. /*
  118. -------------------------------------------------------------------------------
  119.     CMMSExampleAppView::Id()
  120.     Description: Returns the id of the view object.
  121.     Return value: TUid
  122. -------------------------------------------------------------------------------
  123. */
  124. TUid CMMSExampleAppView::Id() const
  125.     {
  126.     return KMMSExampleViewId;
  127.     }
  128. /*
  129. -------------------------------------------------------------------------------
  130.     CMMSExampleAppView::DoActivateL()
  131.     Description: Activate this view.
  132.     Return value: N/A
  133. -------------------------------------------------------------------------------
  134. */
  135. void CMMSExampleAppView::DoActivateL(const TVwsViewId& /*aPrevViewId*/, TUid /*aCustomMessageId*/, const TDesC8& /*aCustomMessage*/ )
  136.     {
  137.     if (!iContainer) // container hasn't been created yet
  138.         {
  139.         // Then construct the UI components
  140.         iContainer = new(ELeave) CMMSExampleContainer;             
  141.         iContainer->ConstructL();                   // Construct a view control
  142.         iContainer->SetRect(ClientRect());          // Sets view control's extent to the space available
  143.         }
  144.     iContainer->ActivateL();                        // Activate the view control
  145.     }
  146. /*
  147. -------------------------------------------------------------------------------
  148.     CMMSExampleAppView::DoDeactivate()
  149.     Description: Deactivate this view.
  150.     Return value: N/A
  151. -------------------------------------------------------------------------------
  152. */
  153. void CMMSExampleAppView::DoDeactivate()
  154.     {
  155.     if (iContainer)
  156.         {
  157.         delete iContainer;
  158.         iContainer = NULL;
  159.         }
  160.     }
  161. //
  162. // CMMSExampleAppUi
  163. //
  164. /*
  165. -----------------------------------------------------------------------------
  166.   CMMSExampleAppUi::ConstructL()                          
  167.   
  168.   2nd phase constructor
  169. -----------------------------------------------------------------------------
  170. */
  171. void CMMSExampleAppUi::ConstructL()
  172.     {
  173.     BaseConstructL();                                   // init this AppUi with standard values
  174.     iRecipient = HBufC::NewL(KMaxAddressLength);          // for recipient address (gsm number or E-Mail addr)
  175.     // Create CMsvSession
  176.     iSession = CMsvSession::OpenAsyncL(*this); // new session is opened asynchronously
  177.                                                // CompleteConstructL() is called when async finishes
  178.     // Series60 view launching
  179.     CMMSExampleAppView* view = CMMSExampleAppView::NewLC(); 
  180.     AddViewL(view);                            // add created view to this AppUi
  181.     ActivateLocalViewL( view->Id() );          // activate view
  182.     CleanupStack::Pop(); // view
  183.     }
  184. /*
  185. -----------------------------------------------------------------------------
  186.     CMMSExampleAppUi::~CMMSExampleAppUi()
  187.     Destructor.
  188. -----------------------------------------------------------------------------
  189. */
  190. CMMSExampleAppUi::~CMMSExampleAppUi()
  191.     {    
  192.     delete iRecipient;
  193.     delete iMmsMtm;
  194.     delete iMtmReg;
  195.     delete iSession;    // session must be deleted last (and constructed first)
  196.     }
  197. /*
  198. -----------------------------------------------------------------------------
  199.     CMMSExampleAppUi::CompleteConstructL()
  200.     Creates client MTM registry when session is ready for use. 
  201.     This completes model construction and is called after 'server
  202.     ready' event is received after async opening of CMsvSession.
  203. -----------------------------------------------------------------------------
  204. */
  205. void CMMSExampleAppUi::CompleteConstructL()
  206.     {
  207.     // We get a MtmClientRegistry from our session
  208.     // this registry is used to instantiate new mtms.
  209.     iMtmReg = CClientMtmRegistry::NewL(*iSession);
  210.     iMmsMtm = (CMmsClientMtm*) iMtmReg->NewMtmL( KUidMsgTypeMultimedia );
  211.     // notify the user with a InfoWin (this will be shown in emulator only)
  212.     iEikonEnv->InfoMsg(_L("Server session opened."));
  213.     }
  214. /*
  215. -----------------------------------------------------------------------------
  216.     CMMSExampleAppUi::HandleSessionEventL()
  217.     Receives session events from observer and calls event handling functions. 
  218.     Note that if additional session event handlers are defined 
  219.     in the session, they are called before this function (as this is the
  220.     main session observer).
  221.     The type of event is indicated by the value of aEvent. The 
  222.     interpretation of the TAny arguments depends on this type. For most 
  223.     event types, the action that is taken, for example updating the 
  224.     display, is client-specific. All clients though should respond to 
  225.     EMsvCloseSession and EMsvServerTerminated events. 
  226. -----------------------------------------------------------------------------
  227. */
  228. void CMMSExampleAppUi::HandleSessionEventL(TMsvSessionEvent aEvent, TAny* /*aArg1*/, TAny* /*aArg2*/, TAny* /*aArg3*/)
  229.     {
  230.     switch (aEvent)
  231.         {
  232.             // This event tells us that the session has been opened
  233.         case EMsvServerReady:
  234.             CompleteConstructL();       // Construct the mtm registry & MMS mtm
  235.             break;
  236.         default:
  237.             // All other events are ignored
  238.             break;
  239.         }
  240.     }
  241. /*
  242. -----------------------------------------------------------------------------
  243.     CMMSExampleAppUi::HandleCommandL(TInt aCommand)
  244.     Handle the commands from CBA and menu items
  245. -----------------------------------------------------------------------------
  246. */
  247. void CMMSExampleAppUi::HandleCommandL(TInt aCommand)
  248.     {
  249.     switch (aCommand)
  250.         {
  251.     case EMMSExampleCmdSend:
  252.         CmdSendL();
  253.         break;
  254.     case EAknSoftkeyExit:
  255.     case EClose:
  256.         CmdExitL();
  257.         break;
  258.     default:
  259.         break;
  260.         }
  261.     }
  262. /*
  263. -----------------------------------------------------------------------------
  264.     CMMSExampleAppUi::CmdSendL()
  265.     Handle send command  
  266.     
  267. -----------------------------------------------------------------------------
  268. */
  269. void CMMSExampleAppUi::CmdSendL()
  270.     {
  271.     if (!InitializeCommunicationsL())
  272.         {
  273.         // Note that this message will be shown in emulator only!
  274.         iEikonEnv->InfoMsg(_L("Problems in initializingncommunications."));
  275.         return;
  276.         }
  277.     if (!SendMessageL())
  278.         {
  279.         // Note that this message will be shown in emulator only!
  280.         iEikonEnv->InfoMsg(_L("Problems in sendingnmessage."));
  281.         return;
  282.         }
  283.     }
  284. /*
  285. -----------------------------------------------------------------------------
  286.     CMMSExampleAppUi::CmdExitL()
  287.     
  288.     Exit application
  289.   
  290. -----------------------------------------------------------------------------
  291. */
  292. void CMMSExampleAppUi::CmdExitL()
  293.     {
  294.     CBaActiveScheduler::Exit(); // Call the CBaActiveScheduler's Exit function
  295.                                     // that stops the application's thread and destroys it.
  296.     }
  297. /*
  298. -----------------------------------------------------------------------------
  299.     CMMSExampleAppUi::InitializeCommunicationsL()
  300.     
  301.     Initialize a new message and ask the user for a recipient address.
  302.     Return values:      ETrue or EFalse
  303. -----------------------------------------------------------------------------
  304. */
  305. TBool CMMSExampleAppUi::InitializeCommunicationsL()
  306.     { 
  307.     // First the recipients address
  308.     // we get it from a data query dialog.
  309.     TBuf<20> addr = iRecipient->Des();
  310.     CAknTextQueryDialog* telNumDialog = CAknTextQueryDialog::NewL(addr, CAknQueryDialog::ENoTone);
  311.     if (!telNumDialog->ExecuteLD(R_MMSEXAMPLE_TEL_NUMBER_DIALOG))
  312.         return EFalse;
  313.     iRecipient->Des() = addr; // Note that the user can give both numeric and textual data in the query dialog,
  314.                               // so the address can be a GSM number or an e-mail address.
  315.     // set up a new message 
  316.     CreateNewMessageL();
  317.     return ETrue;
  318.     }
  319. /*
  320. -----------------------------------------------------------------------------
  321.     CMMSExampleAppUi::CreateNewMessageL()
  322.     Creates a new message server entry and set up default values.
  323.     Return values:      N/A
  324. -----------------------------------------------------------------------------
  325. */
  326. void CMMSExampleAppUi::CreateNewMessageL()
  327. {
  328.     // - CMsvEntry accesses and acts upon a particular Message Server entry.
  329.     // - NewL() does not create a new entry, but simply a new object to access an existing entry.
  330.     // - It takes in as parameters the client's message server session,
  331.     //   ID of the entry to access and initial sorting order of the children of the entry. 
  332. //
  333.     CMsvEntry* entry = CMsvEntry::NewL(*iSession, KMsvGlobalOutBoxIndexEntryId ,TMsvSelectionOrdering());
  334.     CleanupStack::PushL(entry);
  335.     // Set context to the parent folder (Outbox)
  336.     iMmsMtm->SwitchCurrentEntryL( entry->EntryId() );
  337.     // Create new message in the parent folder (Outbox) and set it as the current context.
  338.     // choose the default service settings for Multimedia message sending (this is set in the Messaging
  339.     // applications Settings menu)
  340.     iMmsMtm->CreateMessageL( iMmsMtm->DefaultSettingsL() );
  341.     CleanupStack::PopAndDestroy(); // entry
  342. }
  343. /* 
  344. -----------------------------------------------------------------------------
  345.     CMMSExampleAppUi::SendMessageL()
  346.     Prepares the message body and sends the message.
  347.     Return values:      ETrue or EFalse
  348. -----------------------------------------------------------------------------
  349. */
  350. TBool CMMSExampleAppUi::SendMessageL()
  351.     {
  352.     // Setting recipients
  353.     //
  354.     // This method has no distinction betweed "To" and "Cc" recipients,
  355.     // use this to add the "To" recipients.
  356.     iMmsMtm->AddAddresseeL( iRecipient->Des() );
  357.     // This example sends the message to only one address but here is the code how to
  358.     // define a "Cc" addressee:
  359. /*
  360.     _LIT( KAddress2, "name.surname@company.com" );
  361.     TBufC<20> address2( KAddress2 );
  362.     iMmsMtm->AddTypedAddresseeL( address2, EMmsCc ); // typed addressee "Cc"
  363. */
  364.     // Setting attachments (message parts)
  365.     //
  366.     // Our message consists of one image
  367.     TMsvId attachmentID = KMsvNullIndexEntryId;
  368.     TFileName attachmentFile( _L("c:\system\apps\MMSExample\mmsexample.jpg") );
  369.     iMmsMtm->CreateAttachment2L( attachmentID, attachmentFile );
  370.     // It is possible to give more specific data about the content,
  371.     // for example to define attachment type:
  372. /*
  373.     TBufC8<20> content = _L8( "image/jpeg" );
  374.     iMmsMtm->SetAttachmentTypeL( attachmentID, content );
  375. */
  376.     // You can specify the message part that is the root of the presentation. Normally
  377.     // this is SMIL or WML type of entity. If this is omitted then the message does
  378.     // not have presentation part but contains just a bunch of equal media parts.
  379. /*
  380.     iMmsMtm->SetMessageRoot( attachmentID );
  381. */
  382.     // Set InPreparation to false
  383.     TMsvEntry ent = iMmsMtm->Entry().Entry();
  384.     ent.SetInPreparation(EFalse);
  385.     ent.SetVisible(ETrue);            // mark as visible, after this the message can be seen in Outbox and, after sending, in Sent folder.
  386.     iMmsMtm->Entry().ChangeL(ent);    // Commit changes
  387.     // Move message to "Sent" folder after sending
  388.     //iMmsMtm->SetMoveToSent(EFalse); // This method has not been implemented. Therefore it is up to the designer to insure that all messages
  389.                                       // created by a 3rd party application (especially invisible entries) will be cleaned from the folders.
  390.     // Save changes (If you do not call this method, all changes made will be lost when the context is changed.)
  391.     iMmsMtm->SaveMessageL();
  392.     
  393.     // Start sending the message via the Server MTM to the MMS server
  394.     CMsvOperationWait* wait = CMsvOperationWait::NewLC(); // left in CS
  395.     wait->iStatus = KRequestPending;
  396.     CMsvOperation* op = NULL;
  397.     op = iMmsMtm->SendL( wait->iStatus );
  398.     wait->Start();
  399.     CleanupStack::PushL( op );
  400.     CActiveScheduler::Start();
  401.     // The following is to ignore the completion of other active objects. It is not
  402.     // needed if the app has a command absorbing control.
  403.     while( wait->iStatus.Int() == KRequestPending )
  404.         {
  405.         CActiveScheduler::Start();
  406.         }
  407.     CleanupStack::PopAndDestroy(2); // op, wait
  408.     return ETrue;
  409.     }
  410. //
  411. // CMMSExampleDocument
  412. //
  413. /*
  414. -----------------------------------------------------------------------------
  415.     CMMSExampleDocument::NewL(
  416.     2nd phase construction.
  417. -----------------------------------------------------------------------------
  418. */
  419. CMMSExampleDocument* CMMSExampleDocument::NewL(CEikApplication& aApp)
  420.     {
  421.     CMMSExampleDocument* self = new(ELeave) CMMSExampleDocument(aApp);
  422.     CleanupStack::PushL(self);
  423.     self->ConstructL();
  424.     CleanupStack::Pop(); //self.
  425.     return self;
  426.     }
  427. /*
  428. -----------------------------------------------------------------------------
  429.     CMMSExampleDocument::CMMSExampleDocument()
  430.     C++ constructor
  431. -----------------------------------------------------------------------------
  432. */
  433. CMMSExampleDocument::CMMSExampleDocument(CEikApplication& aApp)
  434.     : CEikDocument(aApp)
  435.     {
  436.     }
  437. /*
  438. -----------------------------------------------------------------------------
  439.     CMMSExampleDocument::ConstructL()
  440.     2nd phase constructor.
  441. -----------------------------------------------------------------------------
  442. */
  443. void CMMSExampleDocument::ConstructL()
  444.     {    
  445.     }
  446. /*
  447. -----------------------------------------------------------------------------
  448.     CMMSExampleDocument::CreateAppUiL()
  449.     Create new CMMSExampleAppUi object
  450.     Return values:      CEikAppUi*
  451. -----------------------------------------------------------------------------
  452. */
  453. CEikAppUi* CMMSExampleDocument::CreateAppUiL()
  454.     {
  455.     return (new(ELeave) CMMSExampleAppUi);
  456.     }
  457. //
  458. // CMMSExampleApplication
  459. //
  460. /*
  461. -----------------------------------------------------------------------------
  462.     CMMSExampleApplication::AppDllUid()
  463.     Returns application UID of MMSExample application
  464. -----------------------------------------------------------------------------
  465. */
  466. TUid CMMSExampleApplication::AppDllUid() const
  467.     {
  468.     return KUidMMSExample;
  469.     }
  470. /*
  471. -----------------------------------------------------------------------------
  472.     CMMSExampleApplication::CreateDocumentL()
  473.     Create new application document
  474.     Return values:      CApaDocument*
  475. -----------------------------------------------------------------------------
  476. */
  477. CApaDocument* CMMSExampleApplication::CreateDocumentL()
  478.     {
  479.     return (CMMSExampleDocument::NewL(*this));
  480.     }
  481. //
  482. // Functions for Application Architecture
  483. //
  484. EXPORT_C CApaApplication* NewApplication()
  485.     {
  486.     return (new CMMSExampleApplication);
  487.     }
  488. //
  489. // DLL entry point
  490. //
  491. GLDEF_C TInt E32Dll(TDllReason)
  492.     {
  493.     return KErrNone;
  494.     }