Slide 2.7: BREW—Interactive BREW demo
  Slide 2.9: Symbian
  Home


BREW Programming



The right figure shows the following code running on a device. The left figure uses a separate MIF directory for helloworld.mif . The following files are required in order to produce the right figure: Note that this example is not complete. Many details are missing.

 helloworld.c 

/*=========================================================================
FILE: helloworld.c
=========================================================================*/

/*=========================================================================
INCLUDES AND VARIABLE DEFINITIONS
======================================================================== */

#include "AEEModGen.h" // Module interface definitions  
#include "AEEAppGen.h" // Applet interface definitions
#include "AEEShell.h" // Shell interface definitions
#include "helloworld.bid"  
25
QUALCOMM Proprietary
Writing BREW Applications


/*-------------------------------------------------------------------
Applet structure. All variables in here are reference via "pMe->"
-------------------------------------------------------------------*/

typedef struct _helloworld {  
  AEEApplet a ; // First element of this structure must be
  AEEApplet
  AEEDeviceInfo DeviceInfo; // always have access to the hardware device
  information
  IDisplay *pIDisplay; // give a standard way to access the Display
  interface
  IShell *pIShell; // give a standard way to access the Shell
  interface
  // add your own variables here...
} helloworld;


/*-------------------------------------------------------------------
Function Prototypes
-------------------------------------------------------------------*/

static boolean helloworld_HandleEvent(helloworld* pMe, AEEEvent eCode,
uint16 wParam, uint32 dwParam);
boolean helloworld_InitAppData(helloworld* pMe);
void helloworld_FreeAppData(helloworld* pMe);


/*=========================================================================
FUNCTION DEFINITIONS
======================================================================== */

/*=========================================================================
FUNCTION: AEEClsCreateInstance
=========================================================================*/
 
int AEEClsCreateInstance(AEECLSID ClsId, IShell *pIShell, IModule *po, void **ppObj)
{
  *ppObj = NULL;
  if( ClsId == AEECLSID_HELLOWORLD )
  {
    // Create the applet and make room for the applet structure
    if( AEEApplet_New(sizeof(helloworld),
      ClsId,
      pIShell,
      po,
      26
      QUALCOMM Proprietary
      Writing BREW Applications
      (IApplet**)ppObj,
      (AEEHANDLER)helloworld_HandleEvent,
      (PFNFREEAPPDATA)helloworld_FreeAppData) )
      // the FreeAppData function is called after sending EVT_APP_STOP to the HandleEvent
      // function
    {
      //Initialize applet data, this is called before sending EVT_APP_START
      // to the HandleEvent function
      if(helloworld_InitAppData((helloworld*)*ppObj))
      {
        //Data initialized successfully
        return(AEE_SUCCESS);
      }
      else
      {
        //Release the applet. This will free the memory allocated for the applet when
        // AEEApplet_New was called.
        IAPPLET_Release((IApplet*)*ppObj);
        return EFAILED;
      }
    } // end AEEApplet_New
    return(EFAILED);
  }


  /*=========================================================================
  FUNCTION SampleAppWizard_HandleEvent
  =========================================================================*/
 
  static boolean helloworld_HandleEvent(helloworld* pMe, AEEEvent eCode,
    uint16 wParam, uint32 dwParam)
  {
    switch (eCode)
    {
      // App is told it is starting up
      case EVT_APP_START:
        // Add your code here...
        return(TRUE);

      // App is told it is exiting
      case EVT_APP_STOP:
        27
        QUALCOMM Proprietary
        Writing BREW Applications
        // Add your code here...
        return(TRUE);

      // App is being suspended
      case EVT_APP_SUSPEND:
        // Add your code here...
        return(TRUE);

      // App is being resumed
      case EVT_APP_RESUME:
        // Add your code here...
        return(TRUE);

      // An SMS message has arrived for this app. Message is in the
      // dwParam above as (char *)
      // sender simply uses this format "//BREW:ClassId:Message", example
      //BREW:0x00000001:Hello World
      case EVT_APP_MESSAGE:
        // Add your code here...
        return(TRUE);

      // A key was pressed. Look at the wParam above to see which key was pressed.
      // The key codes are in AEEVCodes.h.
      // Example "AVK_1" means that the "1" key was pressed.
      case EVT_KEY:
        // Add your code here...
        return(TRUE);

      // If nothing fits up to this point then we'll just break out
      default:
        break;
    }
    return FALSE;
  }  
 
  // this function is called when your application is starting up
  boolean helloworld_InitAppData(helloworld* pMe)
  {
    // Get the device information for this handset.
    28
    QUALCOMM Proprietary
    Writing BREW Applications

    // Reference all the data by looking at the pMe->DeviceInfo structure
    // Check the API reference guide for all the handy device info you can get
    pMe->DeviceInfo.wStructSize = sizeof(pMe->DeviceInfo);
    ISHELL_GetDeviceInfo(pMe->a.m_pIShell,&pMe->DeviceInfo);

    // The display and shell interfaces are always created by
    // default, so we'll asign them so that you can access
    // them via the standard "pMe->" without the "a."
    pMe->pIDisplay = pMe->a.m_pIDisplay;
    pMe->pIShell = pMe->a.m_pIShell;

    // Insert your code here for initializing or allocating resources...
    // if there have been no failures up to this point then return success
    return TRUE;
  }  

  // this function is called when your application is exiting
  void helloworld_FreeAppData(helloworld* pMe)
  {
    // insert your code here for freeing any resources you have allocated...
    // example to use for releasing each interface:
    // if ( pMe->pIMenuCtl != NULL ) // check for NULL first
    // {
    // IMENUCTL_Release(pMe->pIMenuCtl) // release the interface
    // pMe->pIMenuCtl = NULL; // set to NULL so no problems trying to free later
  }
}