XPPROV.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:12k
源码类别:

Windows编程

开发平台:

Visual C++

  1. ///////////////////////////////////////////////////////////////////////////////
  2. //
  3. //  File Name 
  4. //      XPPROV.CPP
  5. //
  6. //  Description
  7. //      This file implements the IXPProvider interface with the methods 
  8. //      specified in the MAPI SPI 1.0 specifications. Also some helper
  9. //      functions are implemented in this file.
  10. //
  11. //  Author
  12. //      Irving De la Cruz
  13. //
  14. //  Revision: 1.7
  15. //
  16. // Written for Microsoft Windows Developer Support
  17. // Copyright (c) 1995-1996 Microsoft Corporation. All rights reserved.
  18. //
  19. #define INITGUID
  20. #define USES_IID_IXPProvider
  21. #define USES_IID_IXPLogon
  22. #define USES_IID_IMAPIStatus
  23. #define USES_IID_IMAPIProp
  24. #define USES_IID_IMAPIPropData
  25. #define USES_IID_IMAPIControl
  26. #define USES_IID_IMAPIContainer
  27. #define USES_IID_IMAPIFolder
  28. #define USES_IID_IMAPITableData
  29. #include "XPWDSR.H"
  30. // Remark this line to turn verbose tracing OFF
  31. #define DO_INFO_TRACES
  32. #ifdef DO_INFO_TRACES
  33. #define InfoTrace(a)   TraceInfoMessage(a)
  34. #else
  35. #define InfoTrace(a)   
  36. #endif // DO_INFO_TRACES
  37. ///////////////////////////////////////////////////////////////////////////////
  38. //    CXPProvider::CXPProvider()
  39. //
  40. //    Parameters
  41. //      hInst                   Handle to instance of this XP DLL
  42. //
  43. //    Purpose
  44. //      Constructor of the object. Parameters are passed to initialize the
  45. //      data members with the appropiate values.
  46. //
  47. //    Return Value
  48. //      None
  49. //
  50. CXPProvider::CXPProvider (HINSTANCE hInst)
  51. {
  52.     InfoTrace ("CXPProvider: Constructor called");
  53.     m_hInstance    = hInst;
  54.     m_cRef         = 1;
  55.     // Initialize critical sections for this transport
  56.     InitializeCriticalSection (&m_csTransport);
  57. }
  58. ///////////////////////////////////////////////////////////////////////////////
  59. //    CXPProvider::~CXPProvider()
  60. //
  61. //    Parameters
  62. //      None
  63. //
  64. //    Purpose
  65. //      Close down and release resources and libraries
  66. //
  67. //    Return Value
  68. //      None
  69. //
  70. CXPProvider::~CXPProvider()
  71. {
  72.     InfoTrace ("CXPProvider: Destructor called");
  73.     m_hInstance = NULL;
  74.     // This is the last method called on a transport, close down the traces
  75.     UnInitTraces();
  76.     DeleteCriticalSection (&m_csTransport);
  77. }
  78. ///////////////////////////////////////////////////////////////////////////////
  79. //    CXPProvider::QueryInterface()
  80. //
  81. //    Parameters
  82. //      { Refer to OLE Documentation on this method }
  83. //
  84. //    Purpose
  85. //      Returns a pointer to a interface requested if the interface is 
  86. //      supported and implemented by this object. If it is not supported, it 
  87. //      returns NULL
  88. //
  89. //    Return Value
  90. //      An HRESULT
  91. //
  92. STDMETHODIMP CXPProvider::QueryInterface (REFIID riid, LPVOID * ppvObj)
  93. {
  94.     // OLE requires NULLing parameter
  95.     *ppvObj = NULL;
  96.     // If this is one of the two IID return an interface pointer to it
  97.     if (riid == IID_IXPProvider || riid == IID_IUnknown)
  98.     {
  99.         *ppvObj = (LPVOID)this;
  100.         // Increase usage count of this object
  101.         AddRef();
  102.         return S_OK;
  103.     }
  104.     // This object does not support the interface requested
  105.     return E_NOINTERFACE;
  106. }
  107. ///////////////////////////////////////////////////////////////////////////////
  108. // IXPProvider virtual member functions implementation
  109. //
  110. ///////////////////////////////////////////////////////////////////////////////
  111. //    CXPProvider::Shutdown()
  112. //
  113. //    Parameters
  114. //      { Refer to MAPI Documentation on this method }
  115. //
  116. //    Purpose
  117. //      Stub method.
  118. //
  119. //    Return Value
  120. //      An HRESULT
  121. //
  122. STDMETHODIMP CXPProvider::Shutdown (ULONG * pulFlags)
  123. {
  124.     InfoTrace ("CXPProvider::Shutdown method called");
  125.     CheckParameters_IXPProvider_Shutdown (this, pulFlags);
  126.     return S_OK;
  127. }
  128. ///////////////////////////////////////////////////////////////////////////////
  129. //    CXPProvider::TransportLogon()
  130. //
  131. //    Parameters
  132. //      { Refer to MAPI Documentation on this method }
  133. //
  134. //    Purpose
  135. //      Display the logon dialog to show the options saved in the profile for
  136. //      this provider and allow changes to it. Save new configuration settings
  137. //      back in the profile.
  138. //      Create a new CXPLogon object and return it to the spooler. Also, 
  139. //      initialize the properties array for each address type handled
  140. //      by this transport. Check all the flags and return them to the spooler
  141. //
  142. //    Return Value
  143. //      An HRESULT
  144. //
  145. STDMETHODIMP CXPProvider::TransportLogon (LPMAPISUP     pSupObj,
  146.                                           ULONG         ulUIParam,
  147.                                           LPTSTR        pszProfileName,
  148.                                           ULONG *       pulFlags,
  149.                                           LPMAPIERROR * ppMAPIError,
  150.                                           LPXPLOGON *   ppXPLogon)
  151. {
  152.     InfoTrace ("CXPProvider::TransportLogon method called");
  153.     CheckParameters_IXPProvider_TransportLogon (this,
  154.                                                 pSupObj,
  155.                                                 ulUIParam,
  156.                                                 pszProfileName,
  157.                                                 pulFlags,
  158.                                                 ppMAPIError,
  159.                                                 ppXPLogon);
  160.     CXPLogon * pXPLogon = NULL;
  161.     ULONG ulPropCount;
  162.     LPSPropValue pProps = NULL;
  163.     MAILBOX_INFO UserMBInfo = { 0 };
  164.     CFGDLG CfgDialog = { 0 };
  165.     LPPROFSECT pProfileObj;
  166.     HRESULT hResult = OpenServiceProfileSection (pSupObj, &pProfileObj, gpfnFreeBuffer);
  167.     if (hResult)
  168.     {
  169.         TraceResult ("CXPProvider::TransportLogon: Failed to open the service profile section", hResult);
  170.         return hResult;
  171.     }
  172.     HANDLE hUIMutex = CreateMutex (NULL, FALSE, CONFIG_UI_MUTEX);
  173.     if (NULL == hUIMutex)
  174.     {
  175.         HRESULT hResult = HRESULT_FROM_WIN32 (GetLastError());
  176.         TraceResult ("CXPProvider::TransportLogon: Failed to create UI mutext", hResult);
  177.     }
  178.     
  179.     hResult = pProfileObj->GetProps ((LPSPropTagArray)&sptLogonProps,
  180.                                      fMapiUnicode,
  181.                                      &ulPropCount,
  182.                                      &pProps);
  183.     if (FAILED(hResult))
  184.     {
  185.         TraceResult ("CXPProvider::TransportLogon: Failed to get the logon props", hResult);
  186.         goto ErrorExit;
  187.     }
  188.     // Fill in the logon UI structure
  189.     CfgDialog.hInst    = m_hInstance;
  190.     CfgDialog.hWnd     = (HWND)ulUIParam;
  191.     CfgDialog.ppProps  = &pProps;
  192.     CfgDialog.pSupObj  = pSupObj;
  193.     CfgDialog.hUIMutex = hUIMutex;
  194.     // In case we get MAPI_W_ERRORS_RETURNED, ignore it and reset 
  195.     // to S_OK. Now display the logon configuration dialog
  196.     if (MAPI_W_ERRORS_RETURNED == hResult)
  197.     {
  198.         if (PR_SMP_MAILBOX_ID       != pProps[MAILBOX_ID].ulPropTag  ||
  199.             PR_SMP_CONNECTION_TYPE  != pProps[NET_CON].ulPropTag     ||
  200.             PR_SMP_UPLOAD_TIME      != pProps[UPLOAD_TIME].ulPropTag ||
  201.             PR_SMP_HEADERS_FILENAME != pProps[HEADER_FILE].ulPropTag ||
  202.             PR_SMP_GET_HEADERS      != pProps[GET_HEADERS].ulPropTag)
  203.         {
  204.             TraceMessage ("CXPProvider::TransportLogon: Where are the provider properties?");
  205.             hResult = MAPI_E_UNCONFIGURED;
  206.             if (!(LOGON_NO_DIALOG & *pulFlags))
  207.             {
  208.                 PrivInitialize3DCtl (m_hInstance);
  209.                 PrivateMessageBox (IDS_MSG_SERVICE_NOT_PROPERLY_CFG, (HWND)ulUIParam);
  210.                 PrivUninitialize3DCtl (m_hInstance);
  211.             }
  212.             goto ErrorExit;
  213.         }
  214.         if (PR_SMP_REMOTE_SERVER != pProps[SERVER_NAME].ulPropTag ||
  215.             PR_SMP_MAILBOX_NAME != pProps[MAILBOX_NAME].ulPropTag ||
  216.             PR_SMP_USER_NAME != pProps[USER_NAME].ulPropTag ||
  217.             PR_SMP_MAILBOX_PASSWORD != pProps[PASSWORD].ulPropTag)
  218.         {
  219.             if (LOGON_NO_DIALOG & *pulFlags)
  220.             {
  221.                 TraceMessage ("CXPProvider::TransportLogon: UI not allowed but it is needed");
  222.                 hResult = MAPI_E_UNCONFIGURED;
  223.                 goto ErrorExit;
  224.             }
  225.             PrivInitialize3DCtl (m_hInstance);
  226. ReStartLogonDlg :
  227.             if ((hResult = DoLogonDlg (&CfgDialog)))
  228.             {
  229.                 goto ErrorExit;
  230.             }
  231.             hResult = pProfileObj->SetProps (4, pProps, NULL);
  232.             if (hResult)
  233.             {
  234.                 TraceResult ("CXPProvider::TransportLogon: Failed to set the properties", hResult);
  235.                 goto ErrorExit;
  236.             }
  237.         }
  238.     }
  239.     // Connect to the server with the stored information. If necessary (and allowed) display UI.
  240.     hResult = DoServerLogon (&UserMBInfo,
  241.                              pProps,
  242.                              pProfileObj,
  243.                              !(LOGON_NO_DIALOG & *pulFlags),
  244.                              (HWND)ulUIParam,
  245.                              FALSE,
  246.                              0,
  247.                              NULL,
  248.                              TRUE);
  249.     if (S_FALSE == hResult)
  250.     {
  251.         goto ReStartLogonDlg;
  252.     }
  253.     if (hResult)
  254.     {
  255.         goto ErrorExit;
  256.     }
  257.     // Once we have validated the remote credentials, terminate all connections
  258.     TerminateRemoteConnections();
  259.     try
  260.     {
  261.         // Allocate the IXPLogon-derived object. Initialize its data members with the necessary values
  262.         pXPLogon = new CXPLogon (m_hInstance,
  263.                                  pSupObj,
  264.                                  pProps[HEADER_FILE].Value.LPSZ,
  265.                                  pProps[GET_HEADERS].Value.b,
  266.                                  &UserMBInfo,
  267.                                  pProps[MAILBOX_ID].Value.l,
  268.                                  pProps[SERVER_NAME].Value.LPSZ,
  269.                                  hUIMutex);
  270.         if (!pXPLogon)
  271.         {
  272.             // New failed, propably due to memory shortage
  273.             TraceMessage ("CXPProvider::TransportLogon: Failed to allocate new CXPLogon object");
  274.             hResult = E_OUTOFMEMORY;
  275.         }
  276.     }
  277.     catch (CException & Exception)
  278.     {
  279.         hResult = Exception.GetError();
  280.     }
  281.     if (hResult)
  282.     {
  283.         goto ErrorExit;
  284.     }
  285.     hUIMutex = NULL;
  286.     pXPLogon->CheckForUnfinishedDownloads();
  287.     // Lock other threads because we are going to work on data that is 
  288.     // global to all threads (sessions) using this transport
  289.     EnterCriticalSection (&m_csTransport);
  290.     // Check the mode in which MAPI is logging into our transport and set
  291.     // the appropiate internal (this CXPLogon object) transport session flags
  292.     pXPLogon->InitializeTransportStatusFlags (*pulFlags);
  293.     // Initialize the transport ID prop array for this session
  294.     hResult = pXPLogon->SetIdentityProps();
  295.     if (!hResult)
  296.     {
  297.         // Build the transport status row for this session
  298.         hResult = pXPLogon->InitializeStatusRow();
  299.         if (!hResult)
  300.         {
  301.             // Set the session flags returned to MAPI by the transport
  302.             pXPLogon->SetSessionFlags (pulFlags);
  303.             // Set the upload delivery time to the current day, mo, yr and the hour and
  304.             // minute from the config dialog saved in the profile. The profile info
  305.             // is only valid for the hour and minute of day, the date can be old
  306.             pXPLogon->SetUploadTime (pProps[UPLOAD_TIME].Value.ft);
  307.             // Copy our allocated object back to the returned MAPI object pointer
  308.             *ppXPLogon = (LPXPLOGON)pXPLogon;
  309.         }
  310.     }
  311.     // Release the critical section
  312.     LeaveCriticalSection (&m_csTransport);
  313. ErrorExit:
  314.     // Release pProfileObj. This object was AddRef() by MAPI before it 
  315.     // came to us. The transport is in charge of cleaning it up (Release()ing it).
  316.     if (pProfileObj)
  317.     {
  318.         pProfileObj->Release();
  319.     }
  320.     PrivUninitialize3DCtl (m_hInstance);
  321.     if (hUIMutex)
  322.     {
  323.         CloseHandle (hUIMutex);
  324.     }
  325.     gpfnFreeBuffer (pProps);
  326.     if (hResult)
  327.     {   
  328.         // Something failed, so clean the session if it has been allocated.
  329.         // The Release() method of CXPLogon does the memory deallocation 
  330.         // of this object. The destructor of CXPLogon does the rest of 
  331.         // the clean up
  332.         if (pXPLogon)
  333.         {
  334.             pXPLogon->Release();
  335.         }
  336.     }
  337.     return hResult;
  338. }                                        
  339. // End of File for XPPROV.CPP