home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / vc98 / mfc / src / afxstate.cpp < prev    next >
C/C++ Source or Header  |  1998-06-16  |  7KB  |  278 lines

  1. // This is a part of the Microsoft Foundation Classes C++ library.
  2. // Copyright (C) 1992-1998 Microsoft Corporation
  3. // All rights reserved.
  4. //
  5. // This source code is only intended as a supplement to the
  6. // Microsoft Foundation Classes Reference and related
  7. // electronic documentation provided with the library.
  8. // See these sources for detailed information regarding the
  9. // Microsoft Foundation Classes product.
  10.  
  11. #include "stdafx.h"
  12. #include <stddef.h>
  13.  
  14. #ifdef AFX_INIT_SEG
  15. #pragma code_seg(AFX_INIT_SEG)
  16. #endif
  17.  
  18. #ifdef _DEBUG
  19. #undef THIS_FILE
  20. static char THIS_FILE[] = __FILE__;
  21. #endif
  22.  
  23. #pragma warning(disable: 4074)
  24. #pragma init_seg(compiler)
  25.  
  26. /////////////////////////////////////////////////////////////////////////////
  27. // AFX_MODULE_STATE push/pop implementation
  28.  
  29. #ifdef _AFXDLL
  30. AFX_MODULE_STATE* AFXAPI AfxSetModuleState(AFX_MODULE_STATE* pNewState)
  31. {
  32.     _AFX_THREAD_STATE* pState = _afxThreadState;
  33.     AFX_MODULE_STATE* pPrevState = pState->m_pModuleState;
  34.     pState->m_pModuleState = pNewState;
  35.     return pPrevState;
  36. }
  37.  
  38. AFX_MAINTAIN_STATE::~AFX_MAINTAIN_STATE()
  39. {
  40.     _AFX_THREAD_STATE* pState = _afxThreadState;
  41.     pState->m_pModuleState = m_pPrevModuleState;
  42. }
  43.  
  44. AFX_MAINTAIN_STATE2::AFX_MAINTAIN_STATE2(AFX_MODULE_STATE* pNewState)
  45. {
  46.     m_pThreadState = _afxThreadState;
  47.     m_pPrevModuleState = m_pThreadState->m_pModuleState;
  48.     m_pThreadState->m_pModuleState = pNewState;
  49. }
  50. #endif //_AFXDLL
  51.  
  52. /////////////////////////////////////////////////////////////////////////////
  53. // _AFX_THREAD_STATE implementation
  54.  
  55. _AFX_THREAD_STATE::_AFX_THREAD_STATE()
  56. {
  57.     m_nLastHit = -1;
  58.     m_nLastStatus = -1;
  59. }
  60.  
  61. _AFX_THREAD_STATE::~_AFX_THREAD_STATE()
  62. {
  63.     // cleanup thread local tooltip window
  64.     if (m_pToolTip != NULL)
  65.     {
  66.         m_pToolTip->DestroyWindow();
  67.         delete m_pToolTip;
  68.     }
  69.  
  70.     // unhook windows hooks
  71.     if (m_hHookOldMsgFilter != NULL)
  72.         ::UnhookWindowsHookEx(m_hHookOldMsgFilter);
  73.     if (m_hHookOldCbtFilter != NULL)
  74.         ::UnhookWindowsHookEx(m_hHookOldCbtFilter);
  75.  
  76.     // free safety pool buffer
  77.     if (m_pSafetyPoolBuffer != NULL)
  78.         free(m_pSafetyPoolBuffer);
  79.  
  80.     // parking window must have already been cleaned up by now!
  81.     ASSERT(m_pWndPark == NULL);
  82. }
  83.  
  84. _AFX_THREAD_STATE* AFXAPI AfxGetThreadState()
  85. {
  86.     return _afxThreadState.GetData();
  87. }
  88.  
  89. THREAD_LOCAL(_AFX_THREAD_STATE, _afxThreadState)
  90.  
  91. /////////////////////////////////////////////////////////////////////////////
  92. // AFX_MODULE_STATE implementation
  93.  
  94. #ifdef _AFXDLL
  95. AFX_MODULE_STATE::AFX_MODULE_STATE(BOOL bDLL, WNDPROC pfnAfxWndProc,
  96.     DWORD dwVersion, BOOL bSystem)
  97. #else
  98. AFX_MODULE_STATE::AFX_MODULE_STATE(BOOL bDLL)
  99. #endif
  100. {
  101. #ifndef _AFX_NO_OLE_SUPPORT
  102.     m_factoryList.Construct(offsetof(COleObjectFactory, m_pNextFactory));
  103. #endif
  104.     m_classList.Construct(offsetof(CRuntimeClass, m_pNextClass));
  105.  
  106.     m_fRegisteredClasses = 0;
  107.     m_bDLL = (BYTE)bDLL;
  108. #ifdef _AFXDLL
  109.     m_pfnAfxWndProc = pfnAfxWndProc;
  110.     m_dwVersion = dwVersion;
  111.     m_bSystem = (BYTE)bSystem;
  112. #endif
  113.  
  114.     // app starts out in "user control"
  115.     m_bUserCtrl = TRUE;
  116.  
  117. #ifndef _AFX_NO_OCC_SUPPORT
  118.     m_lockList.Construct(offsetof(COleControlLock, m_pNextLock));
  119. #endif
  120. #ifdef _AFXDLL
  121.     m_libraryList.Construct(offsetof(CDynLinkLibrary, m_pNextDLL));
  122. #endif
  123. #ifdef _AFX_OLD_EXCEPTIONS
  124.     m_pfnTerminate = AfxAbort;
  125. #endif
  126. }
  127.  
  128. // Note: this constructor is purely for backward compatibility to the ISV drop
  129. #ifdef _AFXDLL
  130. AFX_MODULE_STATE::AFX_MODULE_STATE(BOOL bDLL, WNDPROC pfnAfxWndProc,
  131.     DWORD dwVersion)
  132. {
  133.     ::new((void*)this) AFX_MODULE_STATE(bDLL, pfnAfxWndProc, dwVersion, FALSE);
  134. }
  135. #endif
  136.  
  137. AFX_MODULE_STATE::~AFX_MODULE_STATE()
  138. {
  139. #ifndef _AFX_NO_DAO_SUPPORT
  140.     delete m_pDaoState;
  141. #endif
  142.  
  143.     // clean up type lib cache map, if any
  144.     if (m_pTypeLibCacheMap != NULL)
  145.     {
  146.         m_pTypeLibCacheMap->RemoveAll(&m_typeLibCache);
  147.         delete m_pTypeLibCacheMap;
  148.     }
  149. }
  150.  
  151. void CTypeLibCacheMap::RemoveAll(void* pExcept)
  152. {
  153.     POSITION pos = GetStartPosition();
  154.     void* pTypeLibID;
  155.     CTypeLibCache* pCache;
  156.     while (pos != NULL)
  157.     {
  158.         GetNextAssoc(pos, pTypeLibID, (void*&)pCache);
  159.         if (pCache != pExcept)
  160.             delete pCache;
  161.     }
  162. }
  163.  
  164. AFX_MODULE_THREAD_STATE::AFX_MODULE_THREAD_STATE()
  165. {
  166.     m_frameList.Construct(offsetof(CFrameWnd, m_pNextFrameWnd));
  167.  
  168.     // Note: it is only necessary to initialize non-zero data
  169.     m_pfnNewHandler = &AfxNewHandler;
  170. }
  171.  
  172. AFX_MODULE_THREAD_STATE::~AFX_MODULE_THREAD_STATE()
  173. {
  174.     // cleanup temp/permanent maps (just the maps themselves)
  175.     delete m_pmapHWND;
  176.     delete m_pmapHMENU;
  177.     delete m_pmapHDC;
  178.     delete m_pmapHGDIOBJ;
  179.     delete m_pmapHIMAGELIST;
  180.  
  181. #ifndef _AFX_NO_SOCKET_SUPPORT
  182.     // cleanup socket notification list
  183.     if (m_plistSocketNotifications != NULL)
  184.         while (!m_plistSocketNotifications->IsEmpty())
  185.             delete m_plistSocketNotifications->RemoveHead();
  186. #ifndef _AFXDLL
  187.     // cleanup dynamically allocated socket maps
  188.     delete m_pmapSocketHandle;
  189.     delete m_pmapDeadSockets;
  190.     delete m_plistSocketNotifications;
  191. #endif
  192. #endif //!_AFX_NO_SOCKET_SUPPORT
  193. }
  194.  
  195. /////////////////////////////////////////////////////////////////////////////
  196. // AFX_MODULE_STATE for base application
  197.  
  198. LRESULT CALLBACK AfxWndProcBase(HWND, UINT, WPARAM, LPARAM);
  199.  
  200. class _AFX_BASE_MODULE_STATE : public AFX_MODULE_STATE
  201. {
  202. public:
  203. #ifdef _AFXDLL
  204.     _AFX_BASE_MODULE_STATE() : AFX_MODULE_STATE(TRUE, AfxWndProcBase, _MFC_VER)
  205. #else
  206.     _AFX_BASE_MODULE_STATE() : AFX_MODULE_STATE(TRUE)
  207. #endif
  208.         { }
  209. };
  210.  
  211. PROCESS_LOCAL(_AFX_BASE_MODULE_STATE, _afxBaseModuleState)
  212.  
  213. #ifdef _AFXDLL
  214.  
  215. #undef AfxWndProc
  216. LRESULT CALLBACK
  217. AfxWndProcBase(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
  218. {
  219.     AFX_MANAGE_STATE(_afxBaseModuleState.GetData());
  220.     return AfxWndProc(hWnd, nMsg, wParam, lParam);
  221. }
  222.  
  223. #endif
  224.  
  225. /////////////////////////////////////////////////////////////////////////////
  226. // helper functions for module state
  227.  
  228. AFX_MODULE_STATE* AFXAPI AfxGetAppModuleState()
  229. {
  230.     return _afxBaseModuleState.GetData();
  231. }
  232.  
  233. AFX_MODULE_STATE* AFXAPI AfxGetModuleState()
  234. {
  235.     _AFX_THREAD_STATE* pState = _afxThreadState;
  236.     AFX_MODULE_STATE* pResult;
  237.     if (pState->m_pModuleState != NULL)
  238.     {
  239.         // thread state's module state serves as override
  240.         pResult = pState->m_pModuleState;
  241.     }
  242.     else
  243.     {
  244.         // otherwise, use global app state
  245.         pResult = _afxBaseModuleState.GetData();
  246.     }
  247.     ASSERT(pResult != NULL);
  248.     return pResult;
  249. }
  250.  
  251. AFX_MODULE_THREAD_STATE* AFXAPI AfxGetModuleThreadState()
  252. {
  253.     return AfxGetModuleState()->m_thread.GetData();
  254. }
  255.  
  256. /////////////////////////////////////////////////////////////////////////////
  257. // CTypeLibCache::Unlock
  258. // (Note: the rest of CTypeLibCache is implemented in oletyplb.cpp)
  259.  
  260. void CTypeLibCache::Unlock()
  261. {
  262.     ASSERT(m_cRef > 0);
  263.  
  264.     if (InterlockedDecrement(&m_cRef) == 0)
  265.     {
  266.         if (m_ptinfo != NULL)
  267.         {
  268.             m_ptinfo->Release();
  269.             m_ptinfo = NULL;
  270.         }
  271.         if (m_ptlib != NULL)
  272.         {
  273.             m_ptlib->Release();
  274.             m_ptlib = NULL;
  275.         }
  276.     }
  277. }
  278.