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

VxWorks

开发平台:

C/C++

  1. /* comMisc.h - COM miscellaneous support functions */
  2. /* Copyright (c) 1999-2001 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01q,08nov01,nel  SPR#71582. Type case error return in vxcom_mbstowcs to
  7.                  size_t.
  8. 01p,30oct01,nel  Correct problem with buffer restricted strings in
  9.                  vxcom_wcstombs.
  10. 01o,30oct01,nel  SPR#71311. vxcom_wcstombs shouldn't count the terminator as a
  11.                  converted character.
  12. 01n,18jul01,dbs  add ostream operator for GUIDs
  13. 01m,16jul01,dbs  add copy-ctor and op= to sync classes
  14. 01l,13jul01,dbs  remove unwanted includes
  15. 01k,28jun01,dbs  move VxMutex to private header
  16. 01j,21jun01,dbs  convert to use VxWorks semaphores
  17. 01i,08feb01,nel  SPR#63885. SAFEARRAYs added. 
  18. 01h,29jul99,aim  added mutex accessor to VxMutex
  19. 01g,17jun99,dbs  move COM_MEM_ALLOC to vxdcom.h
  20. 01f,08jun99,dbs  add CritSec to assist with use of Mutex
  21. 01e,03jun99,dbs  make mutex lock return void
  22. 01d,03jun99,dbs  add VxMutex class
  23. 01c,04may99,drm  added function prototype for CLSIDFromAscii()
  24. 01b,28apr99,dbs  add mem-alloc funcs
  25. 01a,19apr99,dbs  created
  26. */
  27. /*
  28. DESCRIPTION:
  29. This file defines private data structures and utility routines used by
  30. the VxWorks COM implementation.
  31.   
  32. */
  33. #ifndef __INCcomMisc_h
  34. #define __INCcomMisc_h
  35. #include <vxWorks.h>
  36. #include "sysLib.h"
  37. #include "comLib.h"
  38. #ifdef __cplusplus
  39. #include <iostream>
  40. /* ostream operator to allow GUIDs to be easily streamed to text */
  41. inline ostream& operator<< (ostream& os, const GUID& g)
  42.     {
  43.     os << ::vxcomGUID2String (g);
  44.     return os;
  45.     }
  46. #define MS2TICKS(ms) (((ms) * sysClkRateGet()) / 1000)
  47. #define TICKS2MS(tk) ((1000 * tk) / sysClkRateGet())
  48. void comAssertFailed (const char *, const char *, int);
  49. #define COM_ASSERT(expr) 
  50.     if (!(expr)) { comAssertFailed(#expr, __FILE__, __LINE__); }
  51. #define DELZERO(X) (void)((delete X, X = 0), X)
  52. #define DECLARE_IUNKNOWN_METHODS                
  53.         STDMETHOD_(ULONG, AddRef) ();           
  54.         STDMETHOD_(ULONG, Release) ();          
  55.         STDMETHOD(QueryInterface) (REFIID riid, void** ppv);
  56. ////////////////////////////////////////////////////////////////////////////
  57. //
  58. // Various inline wide/narrow string conversion routines...
  59. //
  60. ////////////////////////////////////////////////////////////////////////////
  61. inline size_t vxcom_wcstombs
  62.     (
  63.     char*           pAsciiString,
  64.     const OLECHAR*  pWideString,
  65.     size_t          maxChars
  66.     )
  67.     {
  68.     // Check input parameters.
  69.     if (!pAsciiString)
  70. return (size_t)-1;
  71.     if (!pWideString)
  72. return (size_t)-1;
  73.     // Convert to plain-char...
  74.     size_t  n;
  75.     for (n=0; n < maxChars; ++n)
  76.         {
  77.         *pAsciiString++ = (char) *pWideString++;
  78.         if (*pWideString == 0)
  79.     {
  80.     n++;
  81.     break;
  82.     }
  83.         }
  84.     *pAsciiString = 0;
  85.     return n;
  86.     }
  87. ////////////////////////////////////////////////////////////////////////////
  88. inline size_t vxcom_mbstowcs
  89.     (
  90.     OLECHAR*        pWideString,
  91.     const char*     pAsciiString,
  92.     size_t          maxChars
  93.     )
  94.     {
  95.     // Check input parameters.
  96.     if (!pAsciiString)
  97. return (size_t)-1;
  98.     if (!pWideString)
  99. return (size_t)-1;
  100.     // Convert to wide-char...
  101.     size_t  n;
  102.     for (n=0; n < maxChars; ++n)
  103.         {
  104.         *pWideString++ = (OLECHAR) *pAsciiString++;
  105.         if (*pAsciiString == 0)
  106.             break;
  107.         }
  108.     *pWideString = 0;
  109.     return n;
  110.     }
  111. ////////////////////////////////////////////////////////////////////////////
  112. inline OLECHAR* vxcom_wcscpy (OLECHAR* dst, const OLECHAR* src)
  113.     {
  114.     OLECHAR* p = dst;
  115.     while ((*p++ = *src++))
  116.         {}
  117.     return dst;
  118.     }
  119. ////////////////////////////////////////////////////////////////////////////
  120. inline size_t vxcom_wcslen (const OLECHAR* str)
  121.     {
  122.     size_t n=0;
  123.     while (*str++)
  124.         ++n;
  125.     return n;
  126.     }
  127. //////////////////////////////////////////////////////////////////////////
  128. //
  129. // VxMutex - a simple mutex semaphore wrapper class
  130. //
  131. //////////////////////////////////////////////////////////////////////////
  132. class VxMutex
  133.     {
  134.   public:
  135.     enum { INFINITE_WAIT=0xFFFFFFFF };
  136.     
  137.     VxMutex ();
  138.     ~VxMutex ();
  139.     void lock (unsigned long millisecsWait=INFINITE_WAIT) const;
  140.     void unlock () const;
  141.     SEM_ID mutex () const { return m_mutex; };
  142.   private:
  143.     // copy/assignment -- not allowed
  144.     VxMutex (const VxMutex&);
  145.     VxMutex& operator= (const VxMutex&);
  146.     
  147.     SEM_ID m_mutex;
  148.     };
  149. //////////////////////////////////////////////////////////////////////////
  150. //
  151. // VxCondVar - a simple condition-variable wrapper class
  152. //
  153. //////////////////////////////////////////////////////////////////////////
  154. class VxCondVar
  155.     {
  156.   public:
  157.     VxCondVar ();
  158.     ~VxCondVar ();
  159.     void wait (const VxMutex& mtx);
  160.     void signal () const;
  161.   private:
  162.     // copy/assignment -- not allowed
  163.     VxCondVar (const VxCondVar&);
  164.     VxCondVar& operator= (const VxCondVar&);
  165.     
  166.     SEM_ID      m_condvar;
  167.     };
  168. //////////////////////////////////////////////////////////////////////////
  169. //
  170. // VxCritSec -- a simple critical-section implementation
  171. //
  172. //////////////////////////////////////////////////////////////////////////
  173. class VxCritSec
  174.     {
  175.   public:
  176.     VxCritSec (VxMutex& mtx) : m_mutex (mtx)
  177. { m_mutex.lock (); }
  178.     ~VxCritSec ()
  179. { m_mutex.unlock (); }
  180.   private:
  181.     // copy/assignment -- not allowed
  182.     VxCritSec (const VxCritSec&);
  183.     VxCritSec& operator= (const VxCritSec&);
  184.     
  185.     VxMutex& m_mutex;
  186.     };
  187. //////////////////////////////////////////////////////////////////////////
  188. //
  189. // VxGenericListElement - Template class for a generic list element in a
  190. // generic list.
  191. //
  192. template <class T> class VxGenericListElement : public T
  193.     {
  194.     public:
  195.     VxGenericListElement () : T () { m_nxt = NULL; m_prev = NULL; }
  196.     ~VxGenericListElement () {}
  197.     VxGenericListElement<T> * getNext () 
  198.         { 
  199.         return m_nxt; 
  200.         }
  201.     VxGenericListElement<T> * getPrev () 
  202.         { 
  203.         return m_prev; 
  204.         }
  205.     void setNext (const VxGenericListElement<T> * ptr) 
  206.         { 
  207.         m_nxt = const_cast<VxGenericListElement<T> *>(ptr); 
  208.         }
  209.     void setPrev (const VxGenericListElement<T> * ptr) 
  210.         { 
  211.         m_prev = const_cast<VxGenericListElement<T> *>(ptr); 
  212.         }
  213.     private:
  214.     VxGenericListElement<T> * m_prev;
  215.     VxGenericListElement<T> * m_nxt;
  216.     };
  217. //////////////////////////////////////////////////////////////////////////
  218. //
  219. // VxGenericList - Template class to implement a generic linked list 
  220. // class.
  221. //
  222. template <class E, class K, class Mx> class VxGenericList
  223.     {
  224.     public:
  225.     VxGenericList ()
  226.         {
  227.         m_head.setNext (NULL);
  228.         m_current = NULL;
  229.         }
  230.     virtual ~VxGenericList () 
  231.        {
  232.        }
  233.     void pushHead (E * ptr)
  234.         {
  235.         m_mutex.lock ();
  236.         ptr->setPrev (&m_head);
  237.         ptr->setNext (m_head.getNext ());
  238.         if (m_head.getNext () != NULL)
  239.             {
  240.             m_head.getNext ()->setPrev (const_cast<const E *>(ptr));
  241.             }
  242.         m_head.setNext (const_cast<const E *>(ptr));
  243.         m_mutex.unlock ();
  244.         }
  245.     E * popHead ()
  246.         {
  247.         E *     ptr = NULL;
  248.         m_mutex.lock ();
  249.         if (m_head.getNext () != NULL)
  250.             {
  251.             ptr = m_head.getNext ();
  252.             m_head.setNext (ptr->getNext ());
  253.             if (ptr->getNext () != NULL)
  254.                 {
  255.                 ptr->getNext ()->setPrev (&m_head);
  256.                 }
  257.             }
  258.         m_mutex.unlock ();
  259.         return ptr;
  260.         }
  261.     E * getHead ()
  262.         {
  263.         return m_head.getNext ();
  264.         }
  265.     int isEmpty () { return m_head.getNext () == NULL; }
  266.     virtual void destroyList () 
  267.         {
  268.          // Discard all objects and destroy all storage
  269.         while (!isEmpty ())
  270.             {
  271.             delete popHead ();
  272.             }
  273.         }
  274.     private:
  275.     void begin () { m_mutex.lock (); m_current = &m_head; }
  276.     E * next () 
  277.         { 
  278.         if (m_current != NULL)
  279.             {
  280.             m_current = m_current.getNext ();
  281.             }
  282.         return m_current;
  283.         }
  284.     void end () { m_mutex.unlock (); }
  285.     E *                     m_current;
  286.     E                       m_head;
  287.     Mx                      m_mutex;
  288.     };
  289. #define SAFEARRAY_SIG 0x53414645
  290. typedef struct tagMEM_SAFEARRAY
  291.     {
  292.     DWORD           signature;
  293.     VxMutex *       pMutex;
  294.     ULONG           dataCount;
  295.     VARTYPE         vt;
  296.     SAFEARRAY       arrayData;
  297.     } MEM_SAFEARRAY;
  298. #define SA2MSA(psa) (reinterpret_cast<MEM_SAFEARRAY *>                      
  299.                         (reinterpret_cast<BYTE *>(psa) -                    
  300.                             (sizeof (MEM_SAFEARRAY) - sizeof (SAFEARRAY))))
  301. extern "C" {
  302. #endif
  303. ///////////////////////////////////////////////////////////////////////////////
  304. // XXX
  305. // I've put these here until we sort out the _EXACT_ details of
  306. // Synchronisation classes et al. (aim)
  307. void* vxdcomCondVarCreate ();
  308. void vxdcomCondVarWait (void*, void*);
  309. void vxdcomCondVarDestroy (void*);
  310. void vxdcomCondVarSignal (void*);
  311. HRESULT CLSIDFromAscii
  312.     (
  313.     const char*         s, // Ascii string to be converted 
  314.     LPCLSID             pClsid // return value holding CLSID
  315.     );
  316. #ifdef __cplusplus
  317. }
  318. #endif
  319. #endif