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