comShow.cpp
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:9k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* comShow.cpp - main COM show routine library module */
  2. /* Copyright (c) 1999 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01l,17dec01,nel  Add include symbol for diab build.
  7. 01k,06dec01,nel  Add docs comments.
  8. 01j,25sep01,nel  Add method to translate a guid to a string.
  9. 01i,06aug01,dbs  add registry-show capability
  10. 01h,30jul01,dbs  add vxdcomShow function
  11. 01g,27jun01,dbs  fix include paths and names
  12. 01f,30mar00,nel  Added extern c to comTrackShow
  13. 01e,06mar00,nel  Added VxComTrack class
  14. 01d,26apr99,aim  added TRACE_CALL
  15. 01c,14apr99,dbs  export registry-instance function to comShow
  16. 01b,09apr99,drm  added diagnostic output
  17. 01a,24mar99,drm  created
  18. */
  19. #include "comShow.h"
  20. #include "comLib.h"
  21. #include "private/comMisc.h"
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <string.h>
  25. /*
  26. DESCRIPTION
  27. This library implements a number of useful show functions that can
  28. be used to display information about user CoClasses.
  29. */
  30. /* Include symbol for diab */
  31. extern "C" int include_vxcom_comShow (void)
  32.     {
  33.     return 0;
  34.     }
  35. /**************************************************************************
  36. *
  37. * comShowInit - VxWorks COM show library init function
  38. *
  39. * This function initializes the VxWorks COM show library.
  40. *
  41. * RETURNS: OK
  42. *
  43. */
  44. extern "C" int comShowInit ()
  45.     {
  46.     return 0;
  47.     }
  48. /**************************************************************************
  49. *
  50. * vxdcomShow - Displays the build date of the library.
  51. *
  52. * Displays the build date of the library for patching purposes.
  53. *
  54. * RETURNS: OK
  55. * NOMANUAL
  56. */
  57. extern "C" int vxdcomShow ()
  58.     {
  59.     printf ("VxDCOM (Bubbles) Built %sn", __DATE__);
  60.     return 0;
  61.     }
  62. /**************************************************************************
  63. *
  64. * comRegShow - Prints the VxCOM registry
  65. *
  66. * Displays a list of all the currently registered CoClasses in the VxCOM
  67. * registry. This includes any CoClasses registered by VxDCOM.
  68. *
  69. * RETURNS: OK
  70. */
  71. extern "C" int comRegShow ()
  72.     {
  73.     return comCoreRegShow ();
  74.     }
  75. /**************************************************************************
  76. *
  77. * comTrackShow - List of all instances of all instrumented CoClasses.
  78. *
  79. * This function displays a list of all the current instances of all
  80. * instrumented CoClasses. To instrument a CoClass add the following
  81. * to the build settings:
  82. *
  83. * -DVXDCOM_COMTRACK_LEVEL=1
  84. *
  85. * This build option adds a small amount of code to all the COM MAP macros
  86. * so there is a small code size and throughput penalty.
  87. *
  88. * RETURNS: OK
  89. */
  90. extern "C" int comTrackShow ()
  91.     {
  92.     return VxComTrack::theInstance ()->print ();
  93.     }
  94. #if defined (VXDCOM_PLATFORM_SOLARIS) || defined (VXDCOM_PLATFORM_LINUX) || (VXDCOM_PLATFORM_VXWORKS == 5)
  95. unsigned long pdIdSelf (void)
  96.     {
  97.     return 0x12345678;
  98.     }
  99. #else
  100. #include "pdLib.h"
  101. #endif
  102. extern "C" void setComTrackEntry (unsigned long, void * , void *);
  103. static VxMutex trackMutex;
  104. static VxComTrack :: INTERFACE comTrackInterfaces = { 0, 0, 0, };
  105. static VxComTrack :: CLASS comTrackClasses = { 0, 0, };
  106. VxComTrack :: VxComTrack ()
  107.     {
  108.     setComTrackEntry ((unsigned long)pdIdSelf (), 
  109.                       (void *)(&comTrackClasses), 
  110.                       (void *)(&comTrackInterfaces));
  111.     }
  112. VxComTrack :: ~VxComTrack ()
  113.     {
  114.     setComTrackEntry (0, NULL, NULL);
  115.     }
  116. VxComTrack * VxComTrack :: theInstance ()
  117.     {
  118.     static VxComTrack * s_pTheList = NULL;
  119.     VxCritSec cs (trackMutex);
  120.     if (s_pTheList == NULL)
  121.         s_pTheList = new VxComTrack ();
  122.     return s_pTheList;
  123.     }
  124. int VxComTrack :: print ()
  125.     {
  126.     VxCritSec cs (trackMutex);
  127.     CLASS * classPtr = comTrackClasses.next;
  128.     while (classPtr != NULL)
  129.         {
  130.         printf ("Class:%s - %sn", classPtr->name, classPtr->guid);
  131.         printf ("Instance:%pnRefCount:%ldn", 
  132.                 classPtr->thisPtr, classPtr->refCount);
  133.         INTERFACE * interPtr = classPtr->interfaces;
  134.         while (interPtr != NULL)
  135.             {
  136.             printf("t%s - %sn", interPtr->name, interPtr->guid);
  137.             interPtr = interPtr->next;
  138.             }
  139.         printf("n");
  140.         classPtr = classPtr->next;
  141.         }
  142.     return 0;
  143.     }
  144. const char * VxComTrack :: findGUID (REFGUID guid)
  145.     {
  146.     VxCritSec cs (trackMutex);
  147.     CLASS * classPtr = comTrackClasses.next;
  148.     while (classPtr != NULL)
  149.         {
  150. if (guid == classPtr->cls)
  151.     return classPtr->name;
  152.     
  153.         INTERFACE * interPtr = classPtr->interfaces;
  154.         while (interPtr != NULL)
  155.             {
  156.     if (interPtr->iid == guid)
  157. return interPtr->name;
  158.             interPtr = interPtr->next;
  159.             }
  160.         classPtr = classPtr->next;
  161.         }
  162.     return 0;
  163.     }
  164. VxComTrack :: CLASS * VxComTrack :: findClass 
  165.     (
  166.     void * thisPtr
  167.     )
  168.     {
  169.     CLASS * ptr = comTrackClasses.next;
  170.     while (ptr != NULL)
  171.         {
  172.         if (ptr->thisPtr == thisPtr)
  173.             {
  174.             return ptr;
  175.             }
  176.         ptr = ptr->next;
  177.         }
  178.     return NULL;
  179.     }
  180. void * VxComTrack :: addClassInstance
  181.     (
  182.     void          * thisPtr,
  183.     char          * guid,
  184.     char          * name,
  185.     unsigned long   refCount,
  186.     REFCLSID     cls 
  187.     )
  188.     {
  189.     VxCritSec cs (trackMutex);
  190.     CLASS * ptr = findClass (thisPtr);
  191.     /* if the class hasn't been tracked before set-up an entry */
  192.     if (ptr == NULL)
  193.         {
  194.         ptr = new CLASS ();
  195.         /* link into list */
  196.         ptr->next = comTrackClasses.next;
  197.         ptr->prev = &comTrackClasses;
  198.         if (comTrackClasses.next != NULL)
  199.             {
  200.             comTrackClasses.next->prev = ptr;
  201.             }
  202.         comTrackClasses.next = ptr;
  203.         /* fill in details */
  204.         ptr->thisPtr = thisPtr;
  205.         ptr->guid = new char [strlen (guid) + 1];
  206.         strcpy (ptr->guid, guid);
  207.         ptr->name = new char [strlen (name) + 1];
  208.         strcpy (ptr->name, name);
  209.         ptr->owner = (unsigned long)pdIdSelf ();
  210.         ptr->refCount = refCount;
  211.         ptr->magic1 = MAGIC1;
  212. ptr->cls = cls;
  213.         /* initially there will be no interfaces listed */
  214.         ptr->interfaces = NULL;
  215.         return (void *)ptr;
  216.         }
  217.     ptr->refCount = refCount;
  218.     return NULL;
  219.     }
  220. void VxComTrack :: updateClassInstance
  221.     (
  222.     void          * thisPtr,
  223.     unsigned long   refCount
  224.     )
  225.     {
  226.     VxCritSec cs (trackMutex);
  227.     CLASS * classPtr = findClass (thisPtr);
  228.     if (classPtr != NULL)
  229.         {
  230.         if (refCount > 0)
  231.             {
  232.             classPtr->refCount = refCount;
  233.             }
  234.         else
  235.             {
  236.             // delete chain of interfaces
  237.             INTERFACE * interPtr = classPtr->interfaces;
  238.             while (interPtr != NULL)
  239.                 {
  240.                 INTERFACE * tmp;
  241.                 interPtr->listPrev->listNext = interPtr->listNext;
  242.                 if (interPtr->listNext != NULL)
  243.                     interPtr->listNext->listPrev = interPtr->listPrev;
  244.                 tmp = interPtr;
  245.                 interPtr = interPtr->next;
  246.                 delete tmp->name;
  247.                 delete tmp->guid;
  248.                 delete tmp;
  249.                 }
  250.             // delete class
  251.             classPtr->prev->next = classPtr->next;
  252.             if (classPtr->next != NULL)
  253.                 classPtr->next->prev = classPtr->prev;
  254.             delete classPtr->name;
  255.             delete classPtr->guid;
  256.             delete classPtr;
  257.             }
  258.         }
  259.     }
  260. VxComTrack :: INTERFACE * VxComTrack :: findInterface
  261.     (
  262.     CLASS * classPtr,
  263.     char * guid
  264.     )
  265.     {
  266.     if (classPtr != NULL)
  267.         {
  268.         INTERFACE * interPtr = classPtr->interfaces;
  269.         while (interPtr != NULL)
  270.             {
  271.             if (!strcmp(interPtr->guid, guid))
  272.                 {
  273.                 return interPtr;
  274.                 }
  275.             interPtr = interPtr->next;
  276.             }
  277.         }
  278.     return NULL;
  279.     }
  280. void VxComTrack :: addInterface
  281.     (
  282.     void              * thisPtr,
  283.     char              * guid,
  284.     char              * name,
  285.     REFIID iid
  286.     )
  287.     {
  288.     VxCritSec cs (trackMutex);
  289.     CLASS * parent = findClass (thisPtr);
  290.     if (parent != NULL)
  291.         {
  292.         if (findInterface (parent, guid) == NULL)
  293.             {
  294.             INTERFACE * interPtr;
  295.             interPtr = new INTERFACE ();
  296.             interPtr->name = new char [strlen (name) + 1];
  297.             strcpy (interPtr->name, name);
  298.             interPtr->guid = new char [strlen (guid) + 1];
  299.             strcpy (interPtr->guid, guid);
  300.             interPtr->owner = (unsigned long)parent;
  301.             interPtr->magic1 = MAGIC1;
  302.     interPtr->iid = iid;
  303.             interPtr->next = parent->interfaces;
  304.             parent->interfaces = interPtr;
  305.             interPtr->listNext = comTrackInterfaces.listNext;
  306.             interPtr->listPrev = &comTrackInterfaces;
  307.             if (comTrackInterfaces.listNext != NULL)
  308.                 {
  309.                 comTrackInterfaces.listNext->listPrev = interPtr;
  310.                 }
  311.             comTrackInterfaces.listNext = interPtr;
  312.             }
  313.         }
  314.     }