xmodimpl.c
上传用户:xinjie
上传日期:2021-05-30
资源大小:491k
文件大小:2k
源码类别:

BREW编程

开发平台:

Visual C++

  1. #include "AEEStdLib.h"
  2. #include "AEEShell.h"           /* Shell interface definitions */
  3. #include "xmod.h"
  4. /*===========================================================================
  5.   || xModule stuff
  6.   ===========================================================================*/
  7. /*
  8.   || types
  9. */
  10. typedef struct xModule {
  11.    IModule   im; /* inline struct, has vtable */
  12.             
  13.    unsigned  uRef;
  14.    IShell   *piShell;
  15. } xModule;
  16. /*
  17.   || forward decls (vtable parts)
  18. */
  19. static uint32 xModule_AddRef(IModule *p);
  20. static uint32 xModule_Release(IModule *p);
  21. static void xModule_FreeResources(IModule *p, IHeap *ph, IFileMgr *pfm);
  22. static void xModule_Delete(xModule *me)
  23. {
  24.    ISHELL_Release(me->piShell);
  25.    FREE(me);
  26. }
  27. static void xModule_CtorZ(xModule *me, IShell *piShell)
  28. {
  29.    me->im.pvt = (IModuleVtbl *)(me + 1);
  30.    /* Initialize individual entries in the VTBL */
  31.    me->im.pvt->AddRef         = xModule_AddRef;
  32.    me->im.pvt->Release        = xModule_Release;
  33.    me->im.pvt->CreateInstance = xModule_CreateInstance;
  34.    me->im.pvt->FreeResources  = xModule_FreeResources;
  35.    me->uRef = 1;
  36.    me->piShell = piShell;
  37.    ISHELL_AddRef(piShell);
  38. }
  39. int xModule_New(IShell *piShell, IModule **pp)
  40. {
  41.    xModule *me = 0;
  42.    me = MALLOCREC_EX(xModule,sizeof(IModuleVtbl));
  43.    if ((xModule *)0 != me) {
  44.       xModule_CtorZ(me,piShell);
  45.       *pp = &me->im;
  46.       return SUCCESS;
  47.    } else {
  48.       return ENOMEMORY;
  49.    }
  50. }
  51. static uint32 xModule_AddRef(IModule *p)
  52. {
  53.    xModule *me = (xModule *)p;
  54.    return ++me->uRef;
  55. }
  56. static uint32 xModule_Release(IModule *p)
  57. {
  58.    xModule *me = (xModule *)p;
  59.    uint32 uRef = --me->uRef;
  60.    if (uRef == 0) {
  61.       xModule_Delete(me);
  62.    }
  63.    return uRef;
  64. }
  65. static void xModule_FreeResources(IModule *p, IHeap *ph, IFileMgr *pfm)
  66. {
  67.    (void)p,(void)ph,(void)pfm;
  68. }