cppapp.cpp
上传用户:smh666999
上传日期:2007-01-14
资源大小:553k
文件大小:12k
源码类别:

BREW编程

开发平台:

Visual C++

  1. #include "cppapp.h"
  2. #include "cppapp.bid"
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. //-------------------------------------------------------------------------
  6. // This application serves as a sample C++ application. The C++ capabilities
  7. // being demonstrated are inheritance, operator overloading, function overloading, 
  8. // new/delete overloading and polymorphism.
  9. // CPPApp is the applet class that derives from AEEApplet. This class uses
  10. // two helper classes, Writer and SmartWriter to display messages on device
  11. // screen.
  12. // Writer class writes messages on device screen using ITextCtl. SmartWriter
  13. // extends Writer class and writes messages in bold using IStatic. Writer
  14. // class provides WriteLine() method for writiting any message to device display.
  15. // This method is specialised by derived class SmartWriter to write message
  16. // in bold. Writer class has overloaded DisplayOutput() methods to support
  17. // WriteLine() methods of base as well as derived class.
  18. // Both of the classes have overloaded new, delete and stream out operators.
  19. //-------------------------------------------------------------------------
  20. // App specific constants
  21. #define TEST1 100
  22. #define TEST2 101
  23. #define TEST3 102
  24. #define TEST4 103
  25. #define TEST5 104
  26. #define TEST6 105
  27. #define TEST7 106
  28. #define APP_RES_FILE    "cppapp.bar"
  29. //--------------------------------------------------------------------------
  30. // All static functions of CPPApp class.
  31. //--------------------------------------------------------------------------
  32. extern "C" 
  33. int AEEClsCreateInstance(AEECLSID clsID, IShell* pIShell, IModule* pIModule, void **ppobj)
  34. {
  35. if(clsID == AEECLSID_CPPAPP)
  36. {
  37. // We want to load this App. So, invoke AEEApplet_New().To it, pass the
  38. // address of the app-specific handle event function.
  39. if(!AEEApplet_New(sizeof(CPPApp), clsID, pIShell, pIModule, (IApplet**)ppobj,(AEEHANDLER)CPPApp::HandleEvent,
  40. (PFNFREEAPPDATA)CPPApp::freeAppData))
  41. return EFAILED;
  42. // Allocate and initialize app specific data
  43. if (!CPPApp::InitAppData((IApplet *)*ppobj))
  44. return EFAILED;
  45. return SUCCESS;
  46. }
  47. return EFAILED;
  48. }
  49. boolean  CPPApp::InitAppData(IApplet *pIApplet)
  50. {
  51. CPPApp* pCPPApp = (CPPApp*)pIApplet;
  52. return pCPPApp->OnAppInitData();
  53. }
  54. void  CPPApp::freeAppData(CPPApp *pCPPApp)
  55. {
  56. pCPPApp->OnAppfreeData();
  57. }
  58. boolean  CPPApp::HandleEvent(CPPApp *pCPPApp, AEEEvent eCode, uint16 wParam, uint32 dwParam)
  59. {   
  60. return pCPPApp->OnEvent(eCode, wParam, dwParam);
  61. }
  62. //--------------------------------------------------------------------------
  63. // All member functions of CPPApp class.
  64. //--------------------------------------------------------------------------
  65. boolean CPPApp::OnAppInitData()
  66. {
  67.     m_pIMenuCtl = NULL;
  68. rr_ = new ResourceRegistry(3);
  69.     return TRUE;
  70. }
  71. void CPPApp::OnAppfreeData()
  72. {
  73.     if (m_pIMenuCtl)
  74.         IMENUCTL_Release(m_pIMenuCtl);
  75. delete rr_;
  76. }
  77. boolean CPPApp::OnEvent(AEEEvent eCode, uint16 wParam, uint32 dwParam)
  78. {
  79. switch (eCode) 
  80. {
  81.     case EVT_APP_START:
  82. // When this applet is started, try to create the main menu
  83. // that allows the user to select a usage example to execute.
  84. // If we cannot create an instance of the menu class, exit and
  85. // indicate that we have handled the event by returning TRUE
  86. if(ISHELL_CreateInstance(m_pIShell, AEECLSID_MENUCTL, 
  87.   (void **)&m_pIMenuCtl) != SUCCESS)
  88. return TRUE;
  89. // Succeeded in obtaining a menu instance pointer, so
  90. // construct the menu and display it on the screen
  91. BuildMainMenu();
  92. return(TRUE);
  93.     case EVT_KEY:
  94.             IMENUCTL_SetActive(m_pIMenuCtl, TRUE);
  95.             if (wParam == AVK_CLR)
  96.                 return TRUE;
  97. else 
  98.                 return IMENUCTL_HandleEvent(m_pIMenuCtl, EVT_KEY, wParam, dwParam);
  99.     case EVT_COMMAND:
  100.             switch(wParam)
  101. {
  102. // The following commands are generated by user selections
  103. // from the main usage app menu.
  104.     case TEST1:
  105.                 case TEST2:
  106.     case TEST3:
  107.                 case TEST4:
  108.                 case TEST5:
  109.                 case TEST6:
  110.                 case TEST7:
  111.    IMENUCTL_SetActive(m_pIMenuCtl, FALSE);
  112.    // Execute the usage example the user has selected
  113.                    CPPUsage (wParam);
  114.        return TRUE;
  115.     default:
  116.     return FALSE;
  117. }
  118.     case EVT_APP_STOP:
  119.     return(TRUE);
  120.     default:
  121.     return(FALSE);    
  122. }
  123. }
  124. bool CPPApp::CPPUsage(uint16 wParam)
  125. {
  126.     switch (wParam)
  127.     {
  128.         case TEST1:
  129.         {
  130.             test1();
  131.             break;
  132.         }
  133.         case TEST2:
  134.         {
  135.            test2();
  136.             break;
  137.         }
  138.         case TEST3:
  139.         {
  140.            test3();
  141.             break;
  142.         }
  143.         case TEST4:
  144.         {
  145.            test4();
  146.             break;
  147.         }
  148.         default:
  149.             return FALSE;
  150.     }
  151.     return TRUE;
  152. }
  153. /*===========================================================================
  154. FUNCTION: BuildMainMenu
  155. DESCRIPTION
  156.     This function constructs the menu control that allows the user to
  157. select a usage example to execute.  The command ID for each menu item
  158. is passed to the usage example function above when the user selects the
  159. menu item for that example.
  160.     
  161. PROTOTYPE:
  162.     void CPPApp::BuildMainMenu()
  163. PARAMETERS:
  164.     None  
  165. DEPENDENCIES
  166.     None
  167. RETURN VALUE
  168.     None
  169. SIDE EFFECTS
  170.     None
  171. ===========================================================================*/
  172. void CPPApp::BuildMainMenu()
  173. {
  174. AEERect qrc;
  175. AEEDeviceInfo di;
  176.     AECHAR* szBuf;
  177.     char* charBuf;
  178. // Make sure the pointers we'll be using are valid
  179.     if (m_pIShell == NULL || m_pIMenuCtl == NULL)
  180.    return;
  181.     if ((szBuf = (AECHAR *) MALLOC(TEXT_BUFFER_SIZE)) == NULL)
  182.    return;
  183.     if ((charBuf = (char *) MALLOC(TEXT_BUFFER_SIZE/sizeof(AECHAR))) == NULL)
  184.     {
  185.        FREE(szBuf);
  186.     return;
  187.     }
  188. // Set Title
  189.     STRCPY(charBuf, "C++ Examples");
  190.     STR_TO_WSTR(charBuf, szBuf, TEXT_BUFFER_SIZE);
  191. IMENUCTL_SetTitle(m_pIMenuCtl, NULL, 0, szBuf);
  192. //Set the Rectangle for the Menu
  193. ISHELL_GetDeviceInfo(m_pIShell,&di);
  194. qrc.x = 0;
  195. qrc.y = 0;
  196. qrc.dx = di.cxScreen;
  197. qrc.dy = di.cyScreen;
  198. IMENUCTL_SetRect(m_pIMenuCtl, &qrc);  
  199. //Add individual entries to the Menu
  200.     // Add Base Class Usage to menu
  201.     STRCPY(charBuf, "1. Http Test");
  202.     STR_TO_WSTR(charBuf, szBuf, TEXT_BUFFER_SIZE);
  203. IMENUCTL_AddItem(m_pIMenuCtl, 0, 0, TEST1, szBuf, 0);
  204.     STRCPY(charBuf, "2. File Test");
  205.     STR_TO_WSTR(charBuf, szBuf, TEXT_BUFFER_SIZE);
  206. IMENUCTL_AddItem(m_pIMenuCtl, 0, 0, TEST2, szBuf, 0);
  207. STRCPY(charBuf, "3. File Test");
  208.     STR_TO_WSTR(charBuf, szBuf, TEXT_BUFFER_SIZE);
  209. IMENUCTL_AddItem(m_pIMenuCtl, 0, 0, TEST3, szBuf, 0);
  210. STRCPY(charBuf, "4. Generic Resource");
  211.     STR_TO_WSTR(charBuf, szBuf, TEXT_BUFFER_SIZE);
  212. IMENUCTL_AddItem(m_pIMenuCtl, 0, 0, TEST4, szBuf, 0);
  213.     
  214.     // Activate menu
  215. IMENUCTL_SetActive(m_pIMenuCtl,TRUE);
  216. FREE(szBuf);
  217.     FREE(charBuf);
  218. }
  219. template <class Y, class S>
  220. struct pkAEECBK_Reg : public pkAEECBK<Y>, IRelease
  221. {
  222. pkAEECBK_Reg(  )
  223. {}
  224. virtual void releaseResource( ) 
  225. {
  226. delete this;
  227. }
  228. virtual int getUID( ) 
  229. {
  230. return 200+ S::getID();
  231. }
  232. static int getID()
  233. {
  234. return 200 + S::getID();
  235. }
  236. private: 
  237. pkAEECBK_Reg( const pkAEECBK_Reg &Value );
  238. const pkAEECBK_Reg &operator = ( const pkAEECBK_Reg &Rhs );
  239. };
  240. void CPPApp::test1()
  241. {
  242. String s2("Weendedupwithasimpleplug-inFSMcomponentthatisportableacrossmanyplatformsandisoptimizedforexecutionspeed.Gettingridofuglylookingnestedswitchstatementsgreatlyimprovesthedesignofstate-machinebasedprograms.Thebasiccomponentreliesonathird-partylistclasstoimplementtheeventqueue.YoucanuseanycommerciallistimplementationortheSTLqueuetemplateWeendedupwithasimpleplug-inFSMcompon
  243. entthatisportableacrossmanyplatformsandisoptimizedforexecutionspeed.Gettingridofuglylookingnestedswitchstatementsgreatlyimprovesthedesignofstate-machinebasedprograms.Thebas
  244. iccomponentreliesonathird-partylistclasstoimplementtheeventqueue.YoucanuseanycommerciallistimplementationortheSTLqueuetemplateWeendedupwithasimpleplug-inFSMcomponentthatisportableacrossmanyplatformsandisoptimizedforexecutionspeed.Gettingridofuglylookingnestedswitchstatementsgreatlyimprovesthedesignofstate-machinebasedprograms.Theb
  245. asiccomponentreliesonathird-partylistclasstoimplementtheeventqueue.YoucanuseanycommerciallistimplementationortheSTLqueuetemplateWeendedupwithasimpleplug-inFSMcomponentthatisportableacrossmanyplatformsandisoptimizedforexecutionspeed.Gettingridofuglylookingnestedswitchstatementsgreatlyimprovesthedesignofstate-machinebasedprograms.Thebasiccomponentreliesonathird-partylistclasstoimplementtheeventqueue.Yo
  246. ucanuseanycommerciallistimplementationortheSTLqueuetemplateWeendedupwithasimpleplug-inFSMcomponentthatisportableacrossmanyplatformsandisoptimizedforexecutionspeed.Gettingridofuglylookingnestedswitchstatementsgreatlyimprovesthedesignofstate-machinebasedprograms.Thebasiccomponentreliesonathird-partylistclasstoimplementtheeventq
  247. ueue.YoucanuseanycommerciallistimplementationortheSTLqueuetemplateWeendedupwithasimpleplug-inFSMcompon
  248. entthatisportableacrossmanyplatformsandisoptimizedforexecutionspeed.Gettingridofuglylookingnestedswitchstatements
  249. greatlyimprov");
  250. String s;
  251. s.ensureCapacity(5 * s2.length() + 12);
  252. s+="/a.htm?a=";
  253. for (int i = 0; i <5; i++)
  254. {
  255. s += s2;
  256. }
  257. initIO(&CPPApp::onWriteCbk,"bubumic", String("abcdefgh"), Type2Type<FileStream>() , Type2Type<FDS>());
  258. initIO(&CPPApp::onReadHttpCbk, "192.168.10.100", String("/a.htm"), Type2Type<HTTPpipe>() , Type2Type<HDS>());
  259. }
  260. void CPPApp::test2()
  261. initIO(&CPPApp::onWriteCbk,"bubu", String("1234567890"), Type2Type<FileStream>() , Type2Type<FDS>());
  262. }
  263. void CPPApp::test3()
  264. initIO(&CPPApp::onWriteCbk,"bubumic", String("WWWW"), Type2Type<FileStream>() , Type2Type<FDS>());
  265. }
  266. void CPPApp::test4()
  267. initIO(&CPPApp::onWriteCbk,"San Diego", String("Qualcomm"), Type2Type<GResource>() , Type2Type<GDS>());
  268. }
  269. void CPPApp::onWriteCbk()
  270. {
  271. FDS* ds = static_cast<FDS*>(rr_->getRegistered(FDS::getID()));
  272. if (ds->error == SUCCESS)
  273. {
  274. initIO(&CPPApp::onReadFSCbk, ds->address, String(""), Type2Type<FileStream>() , Type2Type<FDS>());
  275. initIO(&CPPApp::onReadHttpCbk, "192.168.10.100", String("/a.htm"), Type2Type<HTTPpipe>() , Type2Type<HDS>());
  276. }
  277. else
  278. {
  279. Writer writer(m_pIShell);
  280. String e((long)ds->error);
  281. String s("ERROR: ", 7, e, e.length());
  282. writer.WriteLine(s.toCharArray());
  283. }
  284. }
  285. void CPPApp::onReadHttpCbk()
  286. {
  287. onReadCbk(Type2Type<HDS>());
  288. }
  289. void CPPApp::onReadFSCbk()
  290. {
  291. onReadCbk(Type2Type<FDS>());
  292. }
  293. void CPPApp::onReadGSCbk()
  294. {
  295. onReadCbk(Type2Type<GDS>());
  296. template <class S>
  297. void CPPApp::onReadCbk(Type2Type<S>)
  298. {
  299. Writer writer(m_pIShell);
  300. S* ds = static_cast<S*>(rr_->getRegistered(S::getID()));
  301. if (ds->error == SUCCESS)
  302. {
  303. const char* s  = ds->data.toCharArray();
  304. if (s)
  305. writer.WriteLine(s);
  306. }
  307. else
  308. {
  309. String e((long)ds->error);
  310. String s("ERROR: ", 7, e, e.length());
  311. writer.WriteLine(s.toCharArray());
  312. }
  313. }
  314. template <class R, class S>
  315. void CPPApp::initIO(FNC f, char* address,const String& param, Type2Type<R> , Type2Type<S> )
  316. {
  317. typedef pkAEECBK_Reg<CPPApp,S> PR;
  318. PR& pr = PR::initCbk(rr_,this,f, m_pIShell, Type2Type<PR>());
  319. S* ds = S::initDataStruct(rr_,address, param);
  320. CbkDispatcher<PR, ConnectionPolicy, R, S>::getDispatcher(m_pIShell, rr_, pr, ds);
  321. }