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

Symbian

开发平台:

C/C++

  1. /*
  2.         BIOexample.CPP - source file for BIOexample application
  3.         C++ implementation
  4. */
  5. //  Include Files
  6. #include <eiklabel.h>                   // for CEikLabel 
  7. #include <e32std.h>                     // for TPckgBuf
  8. #include <smut.h>                       // for KUidMsgTypeSMS
  9. #include <txtrich.h>                    // for CRichText
  10. #include <eikenv.h>                     // for CEikonEnv
  11. #include <editwatc.h>                   // for TEditorParameters
  12. #include <txtfmlyr.h>                   // for CParaFormatLayer, CCharFormatLayer 
  13. #include <sendui.h>                     // for CSendAppUi 
  14. #include "BIOexample.h"             // own header
  15. #include "BIOexample.hrh"           // own enumerations
  16. // Constants
  17. const TUid KUidBIOexampleApp = { 0x101F402A };      // BIOexample application UID 
  18. const TUid KUidExampleMessageType = { 0x1000ffff }; // example BIO message type UID
  19. _LIT(KBIOExampleTag, "//BIOEX #");                  // Our BIO message identifier tag + '#' (defined also in bioexamplebif.rss)
  20. _LIT(KBIOExampleFrom, "From: ");
  21. _LIT(KBIOExampleMessage, "Message: ");
  22. const TInt KEditorTextLimit = 160;
  23. //
  24. // CBIOexampleContainer 
  25. //
  26. CBIOexampleContainer::~CBIOexampleContainer()
  27.     {
  28.     delete iComponentControl;
  29.     delete iSender;
  30.     }
  31. void CBIOexampleContainer::ConstructL(TDes& aText, TDes& aSender)
  32.     {
  33.     ConstructContainerControlL();                     // Construct self
  34.     ConstructComponentControlL(aText, aSender);       // Construct component control(s)
  35.     }
  36. TInt CBIOexampleContainer::CountComponentControls() const
  37.     {
  38.     return 2;                                         // iComponentControl is always there
  39.     }
  40. CCoeControl* CBIOexampleContainer::ComponentControl(TInt aIndex) const
  41.     {
  42.     if(aIndex==0)
  43.         return iComponentControl;
  44.     if(aIndex==1)
  45.         return iSender;
  46.     return NULL;
  47.     }
  48. void CBIOexampleContainer::ConstructContainerControlL()
  49.     {
  50.     CreateWindowL();                                   // Makes the control window owning
  51.     }
  52. void CBIOexampleContainer::ConstructComponentControlL(TDes& aText, TDes& aSender)
  53.     {
  54.     iComponentControl=new(ELeave)CEikLabel;                         // Create a CEikLabel object
  55.     iComponentControl->SetTextL(aText);                             // Set label text
  56.     
  57.     iSender = new(ELeave)CEikLabel;
  58.     iSender->SetTextL(aSender);
  59.     
  60.     }
  61. void CBIOexampleContainer::SizeChanged()
  62.     {
  63.     TSize controlSize=iComponentControl->MinimumSize();             // Ask iComponentControl's size
  64.     TSize containerSize=Rect().Size();                              // containerSize is CBIOexampleContainer's own size and can be found in the size of its rectangle.
  65.     TPoint controlPosition((containerSize.iWidth-controlSize.iWidth)/2, 
  66.                            (containerSize.iHeight-controlSize.iHeight)/2); // Calculate a position for control that places it to the center of CBIOexampleContainer
  67.     TRect controlRect(controlPosition,controlSize);
  68.         
  69.     iComponentControl->SetRect(controlRect);                        // Set iComponentControl a rect in which it is supposed to appear.
  70.     
  71.     controlSize=iSender->MinimumSize();
  72.     controlPosition.SetXY((containerSize.iWidth-controlSize.iWidth)/2,
  73.                           ((containerSize.iHeight-controlSize.iHeight)/2) + controlSize.iHeight );
  74.     TRect senderRect(controlPosition,controlSize);
  75.     iSender->SetRect(senderRect);
  76.     }
  77. void CBIOexampleContainer::Draw(const TRect& /*aRect*/) const
  78.     {
  79.     CGraphicsContext& gc=SystemGc();                                // Get the graphics context in which to draw.
  80.     gc.SetBrushStyle(CGraphicsContext::ESolidBrush);                // Set brush style to solid. Initial value in a graphics context is ENullBrush.
  81.     gc.DrawRect(Rect());                                            // Draw a rectangle.
  82.     }
  83. TKeyResponse CBIOexampleContainer::OfferKeyEventL(const TKeyEvent& /*aKeyEvent*/, TEventCode /*aType*/)
  84. {
  85.     TKeyResponse response=EKeyWasNotConsumed;   // not consuming any keys
  86.     return response;
  87.     }
  88. //
  89. //  CBIOexampleAppUi
  90. //
  91. /*
  92. -------------------------------------------------------------------------------
  93.     ~CBIOexampleAppUi
  94.     Description: Destructor
  95.     Return value: N/A
  96. -------------------------------------------------------------------------------
  97. */
  98. CBIOexampleAppUi::~CBIOexampleAppUi()
  99.     {
  100.     delete iContainerControl;
  101.     iId = NULL;
  102.     delete paraFormatLayer;
  103.     delete charFormatLayer;
  104.     delete messageBodyContent; 
  105.     delete sendAppUi;
  106.     }
  107. /*
  108. -------------------------------------------------------------------------------
  109.     ProcessCommandParametersL();
  110.     Description: Processing the command line parameters (when message is opened
  111.                  from the messaging application, TMsvId of the message is passed
  112.                  in command line parameters)
  113.     Return value: TBool
  114. -------------------------------------------------------------------------------
  115. */
  116. TBool CBIOexampleAppUi::ProcessCommandParametersL(TApaCommand /*aCommand*/,TFileName& /*aDocumentName*/,const TDesC8& aTail)
  117.     {
  118.     // Only aTail parameter is of interest to us, it contains TEditorParameters object that contains
  119.     // the TMsvId as one attribute.
  120.     // Checking the length of comm line params
  121.     if (aTail.Length() > 0) // we have comm line params => program was started from Messaging application
  122.         {
  123.         iNormalStart = EFalse;
  124.         
  125.         // --- reading command line parameters ---
  126.         // Get the parameters passed by the launching MTMUI
  127.         TPckgBuf<TEditorParameters> paramPack;      // the params are read into a TPckgBuf template (see SDK documentation for more info)
  128.         paramPack.Copy(aTail);
  129.         TEditorParameters params(paramPack());
  130.         // saving the message id
  131.         iId = &params.iId;
  132.         }
  133.     else    
  134.         {
  135.         // no command line params => program started manually
  136.         iNormalStart = ETrue;
  137.         }
  138.     CompleteConstructL();     // complete construction with the command line parameters.
  139.     return EFalse;
  140.     }
  141. /*
  142. -------------------------------------------------------------------------------
  143.     ConstructL();
  144.     Description: 2nd phase Constructor. Setting up attributes, construction
  145.     continues in CompleteConstructL() below.
  146.     Return value: N/A
  147. -------------------------------------------------------------------------------
  148. */
  149. void CBIOexampleAppUi::ConstructL()
  150.     {
  151.     BaseConstructL();
  152.     iNormalStart = ETrue;   // at this point we suppose that no comm line params have been given
  153.     iId = NULL;             // set message id to NULL as default
  154.     // for message sending
  155.     paraFormatLayer=CParaFormatLayer::NewL();
  156.     charFormatLayer=CCharFormatLayer::NewL();
  157.     messageBodyContent=CRichText::NewL(paraFormatLayer, charFormatLayer); 
  158.     
  159.     // create sendAppUi
  160.     sendAppUi=CSendAppUi::NewL(EBIOexampleCmdSend); // New Send ui object (number 'EBIOexampleCmdSend' is tied
  161.                                                     // to our menu item "Send message" in "Messaging"
  162.     }
  163. /*
  164. -------------------------------------------------------------------------------
  165.     CompleteContructL();
  166.     Description: Continuing construction... (after processing command line params)
  167.     Return value: N/A
  168. -------------------------------------------------------------------------------
  169. */
  170. void CBIOexampleAppUi::CompleteConstructL()
  171.     {
  172.     TBuf<KEditorTextLimit> text, sender;    // for reading & presenting the message sender & body
  173.     sender.Append(KBIOExampleFrom);         // insert field description ("From: ")
  174.     // First check if app has been started from the messaging app or "the normal way", manually...
  175.     if(iNormalStart == EFalse)  // we have comm line params and will open up message with the given TMsvId
  176.         {
  177.         
  178.         // read the message into descriptors
  179.         ReadMessageL(text, sender);
  180.         // read message text and locate "//BIOEX #" header part
  181.         TInt pos;
  182.     User::LeaveIfError(pos = text.Locate('#'));   // # is in the message only to test string handling here (it could be omitted)
  183.     pos++;
  184.         text.Delete(0, pos);                          // delete message header tag
  185.         // insert field description in front
  186.         text.Insert(0, KBIOExampleMessage);     // "Message: "
  187.         
  188.         // Delete message from messaging server
  189.         DeleteMessageL(*iId);
  190.         iId = NULL;
  191.         }
  192.     else    // no comm line params, opening "empty" application
  193.         {
  194.         text.Append(KBIOExampleMessage);        // "Message: "
  195.         text.Append(_L("No message loaded"));   // "Message: No message loaded"
  196.         sender.Append(_L("N/A"));               // "From: N/A"
  197.         }
  198.     // Then construct the UI components
  199.     iContainerControl = new(ELeave) CBIOexampleContainer;             
  200.     iContainerControl->ConstructL(text, sender);             // Construct a view control with message text and sender number (in normal start these are empty)
  201.     iContainerControl->SetRect(ClientRect());                // Sets view control's extent to the space available
  202.     iContainerControl->ActivateL();                          // Activate the view control
  203.     CCoeAppUi::AddToStackL(iContainerControl);               // Add container to Control Stack to make it automatically receive key events.
  204.     }
  205. /*
  206. -------------------------------------------------------------------------------
  207.     ReadMessageL();
  208.     Description: Read the message data. This could be done also in BIOexampleParser.
  209.     Return value: N/A
  210. -------------------------------------------------------------------------------
  211. */
  212. void CBIOexampleAppUi::ReadMessageL(TDes& aText, TDes& aSender)
  213. {
  214.     // Using the Send As API to read message
  215.     CSendAs* sendAs=CSendAs::NewL(*this);
  216.     sendAs->SetMtmL(KUidMsgTypeSMS);        // this implementation assumes that message arrived over SMS
  217. CleanupStack::PushL(sendAs);
  218.     if (sendAs->AvailableServices().Count() < 1)
  219.         {
  220.         User::Leave(KErrNotFound);
  221.         }
  222.     sendAs->SetService(0);
  223.     CBaseMtm* smsMtm = sendAs->ClientRegistry().NewMtmL(KUidMsgTypeSMS);
  224. CleanupStack::PushL(smsMtm);
  225. smsMtm->SwitchCurrentEntryL(*iId);
  226.     smsMtm->LoadMessageL();
  227.     aText.Append( smsMtm->Body().Read(0) );
  228.     aSender.Append( smsMtm->Entry().Entry().iDetails );
  229. CleanupStack::PopAndDestroy(2);     // sendAs, smsMtm
  230. }
  231. /*
  232. -------------------------------------------------------------------------------
  233.     HandleCommandL
  234.     Description: Handles a given command
  235.     Return value: N/A
  236. -------------------------------------------------------------------------------
  237. */
  238. void CBIOexampleAppUi::HandleCommandL(TInt aCommand)
  239.     {
  240.     switch(aCommand)
  241.         {
  242.         case EBIOexampleCmdSend:
  243.             SendMessageL();
  244.             break;
  245.         case EClose:
  246.             CBaActiveScheduler::Exit();
  247.             break;
  248.         default:
  249.             break;
  250.         }
  251.     }
  252. /*
  253. -------------------------------------------------------------------------------
  254.     SendMessageL();
  255.     Description: Sending a new BIO message. This is done using the SendAppUi API.
  256.     Return value: N/A
  257. -------------------------------------------------------------------------------
  258. */
  259. void CBIOexampleAppUi::SendMessageL()
  260.     {
  261.     //-- Sending a BIO message through the SendUi API: --
  262.     // create parameters for sendUi object
  263.     MDesC16Array* attachments = NULL;                   // no attachments
  264.     const TUid bioTypeUid = KNullUid;                   // Our message UID (defined in bioexamplebif.rss file) would go
  265.                                                         //  here but this type was not supported by SendUi so using KNullUid
  266.     CPtrC16Array* recipients = NULL;                    // define recipients later (through msg editor UI)
  267.     MDesC16Array* aliases = NULL;                       // no aliases
  268.     // create message body (insert our BIO message identifier in the beginning)
  269.     messageBodyContent->DeleteL( 0, messageBodyContent->DocumentLength() );     // first clear the document (the //BIOEX header of previous sending)
  270.     messageBodyContent->InsertL( 0, KBIOExampleTag );  // our tag ( "//BIOEX #" ) the # is not needed by the BIO header, it is only our own message separator
  271.                                                        //  Only "//BIOEX" is needed in the beginning for the system to recognize the message as 'BIOexample' message.         
  272.     // Sending message over SMS bearer
  273.     sendAppUi->CreateAndSendMessageL(KUidMsgTypeSMS, messageBodyContent, attachments, bioTypeUid, recipients, aliases);
  274.        
  275.     // The message could be deleted after the sending with the delete function...
  276.     // just get the newly created message id from somewhere (not implemented in this example)
  277.     //DeleteMessage(messageId);
  278.     }
  279. /*
  280. -------------------------------------------------------------------------------
  281.     DeleteMessageL();
  282.     Description: Delete message (with given id) from messaging server. 
  283.     Return value: N/A
  284. -------------------------------------------------------------------------------
  285. */
  286. void CBIOexampleAppUi::DeleteMessageL(TMsvId aEntryId)
  287.     {
  288.     CSendAs* sendAs=CSendAs::NewL(*this);
  289.     sendAs->SetMtmL(KUidMsgTypeSMS);
  290. CleanupStack::PushL(sendAs);
  291.     if (sendAs->AvailableServices().Count() < 1)
  292.         {
  293.         User::Leave(KErrNotFound);
  294.         }
  295.     sendAs->SetService(0);
  296.     CBaseMtm* smsMtm = sendAs->ClientRegistry().NewMtmL(KUidMsgTypeSMS);
  297. CleanupStack::PushL(smsMtm);
  298.     smsMtm->Session().RemoveEntry(aEntryId);     // remove message entry from the server
  299.    CleanupStack::PopAndDestroy(2); // sendAs, smsMtm
  300.     }
  301. /*
  302. -------------------------------------------------------------------------------
  303.     CapabilityOK
  304.     Description: Returns component control with a given index.
  305.     Return value: TBool
  306. -------------------------------------------------------------------------------
  307. */
  308. TBool CBIOexampleAppUi::CapabilityOK(TUid /*aCapabilty*/, TInt /*aResponse*/)
  309.     {
  310.     return ETrue;
  311.     }
  312. //
  313. //  CBIOexampleDocument
  314. //
  315. /*
  316. -----------------------------------------------------------------------------
  317.     CBIOexampleDocument
  318.     Creates new BIOexample document.
  319.     Return Values:  N/A
  320. -----------------------------------------------------------------------------
  321. */
  322. CBIOexampleDocument::CBIOexampleDocument(CEikApplication& aApp)
  323.     : CEikDocument(aApp)
  324.     {}
  325. /*
  326. -----------------------------------------------------------------------------
  327.     CreateAppUiL
  328.     Creates new CBIOexampleAppUi and returns a pointer to it.
  329.     Return Values:  pointer to CBIOexampleAppUi
  330. -----------------------------------------------------------------------------
  331. */
  332. CEikAppUi* CBIOexampleDocument::CreateAppUiL()
  333.     {  
  334.     CBIOexampleAppUi* appui = new (ELeave) CBIOexampleAppUi;
  335.     return appui;
  336.     }
  337. //
  338. //  CBIOexampleApplication
  339. //
  340. /*
  341. -----------------------------------------------------------------------------
  342.     CreateDocumentL()
  343.     Description: Creates new BIOexample document.
  344.     Return Values:  pointer to new CBIOexampleDocument object
  345. -----------------------------------------------------------------------------
  346. */
  347. CApaDocument* CBIOexampleApplication::CreateDocumentL()
  348.     {
  349.     return new (ELeave) CBIOexampleDocument(*this);
  350.     }
  351. /*
  352. -----------------------------------------------------------------------------
  353.     AppDllUid()
  354.     Return the UID of BIOexample application.
  355.     Return Values:  UID
  356. -----------------------------------------------------------------------------
  357. */
  358. TUid CBIOexampleApplication::AppDllUid() const
  359.     {
  360.     return KUidBIOexampleApp;
  361.     }
  362. //  OTHER EXPORTED FUNCTIONS
  363. //=============================================================================
  364. /*
  365. -----------------------------------------------------------------------------
  366.     NewApplication
  367.     Creates new CBIOexampleApplication application and returns a pointer to it.
  368.     Return Values:  pointer to CApaApplication
  369. -----------------------------------------------------------------------------
  370. */
  371. EXPORT_C CApaApplication* NewApplication()
  372.     {
  373.     return new CBIOexampleApplication;
  374.     }
  375. /*
  376. -----------------------------------------------------------------------------
  377.     E32Dll
  378.     Called when the DLL is loaded and unloaded.
  379.     Return Values:  KErrNone
  380. -----------------------------------------------------------------------------
  381. */
  382. GLDEF_C TInt E32Dll(TDllReason /*aReason*/)
  383.     {
  384.     return KErrNone;
  385.     }
  386. //  End of File