chxavactivecompletiondispatch.h
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:3k
源码类别:

Symbian

开发平台:

C/C++

  1. /************************************************************************
  2.  * chxavactivecompletiondispatch.h
  3.  * -------------------------------
  4.  *
  5.  * Synopsis:
  6.  *
  7.  * Dispatch for CAtive derived objects.
  8.  *
  9.  * (c) 1995-2003 RealNetworks, Inc. Patents pending. All rights reserved.
  10.  *
  11.  ************************************************************************/ 
  12. #ifndef _chxavactivecompletiondispatch_h_
  13. #define _chxavactivecompletiondispatch_h_
  14. // Symbian includes...
  15. #include <e32base.h>
  16. #include <basched.h>
  17. // Helix includes...
  18. #include "unkimp.h"
  19. #include "ihxpckts.h"
  20. #include "hxstring.h"
  21. #include "hxurl.h"
  22. #include "hxwintyp.h"
  23. #include "hxcom.h"
  24. #include "hxcomm.h"
  25. #include "hxmon.h"
  26. #include "hxfiles.h"
  27. #include "hxcore.h"
  28. #include "hxwin.h"
  29. // Include from this project...
  30. #include "chxbody.h"
  31. #include "chxmakesmartptr.h"
  32. // CHXAvActiveCmpl:
  33. //   Active Object completion dispatch.
  34. class CHXAvActiveCmpl : 
  35.     public CActive, public CHXBody
  36. {
  37. public:
  38.     CHXAvActiveCmpl() : CActive(0) {}
  39.     virtual ~CHXAvActiveCmpl() {}
  40.     
  41.     virtual TRequestStatus& Status() = 0;
  42.     virtual void RunL() = 0;
  43.     virtual void Activate() = 0;
  44. protected:
  45.     virtual void DoCancel() = 0;
  46. };
  47. MakeSmartPtr(CHXAvActiveCmpl);   // Create a smart pointer class CHXAvActiveCmplPtr
  48. template<class Recv>
  49. class CHXAvActiveDisp : public CHXAvActiveCmpl {
  50. public:
  51.     typedef void (Recv::*FuncPtr)(int);
  52.     CHXAvActiveDisp(Recv* pRecv, FuncPtr pCmpl, FuncPtr pCancel);
  53.     virtual ~CHXAvActiveDisp();
  54.     
  55.     virtual TRequestStatus& Status();
  56.     virtual void RunL();
  57.     virtual void Activate();
  58. protected:
  59.     virtual void DoCancel();
  60. private:
  61.     Recv* m_pRecv; // Object receiving completion
  62.     FuncPtr m_pCmpl; // Completion function
  63.     FuncPtr m_pCancel; // Cancel function
  64. };
  65. template<class Recv>
  66. inline
  67. CHXAvActiveDisp<Recv>::CHXAvActiveDisp(Recv* pRecv, FuncPtr pCmpl, FuncPtr pCancel)
  68.     : m_pRecv(pRecv),
  69.       m_pCmpl(pCmpl),
  70.       m_pCancel(pCancel)
  71. {}
  72. template<class Recv>
  73. inline
  74. CHXAvActiveDisp<Recv>::~CHXAvActiveDisp()
  75. {
  76. }
  77. template<class Recv>
  78. inline
  79. TRequestStatus& CHXAvActiveDisp<Recv>::Status()
  80. {
  81.     return iStatus;
  82. }
  83. template<class Recv>
  84. inline
  85. void CHXAvActiveDisp<Recv>::RunL()
  86. {
  87. #if defined(DEBUG)
  88.     // our active object should not be leaving (except new)
  89.     TRAPD(err,
  90.     (m_pRecv->*m_pCmpl)(iStatus.Int()) );
  91.     HX_ASSERT(err == KErrNone);
  92.     User::LeaveIfError(err); // possibly continue leaving
  93. #else
  94.     (m_pRecv->*m_pCmpl)(iStatus.Int());
  95. #endif
  96. }
  97. template<class Recv>
  98. inline
  99. void CHXAvActiveDisp<Recv>::DoCancel()
  100. {
  101.     (m_pRecv->*m_pCancel)(0);
  102. }
  103. template<class Recv>
  104. inline
  105. void CHXAvActiveDisp<Recv>::Activate()
  106. {
  107.     if (!IsActive())
  108. SetActive();
  109. }
  110. #endif // _chxavactivecompletiondispatch_h_