Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

309 lines
9.2 KiB

  1. // --------------------------------------------------------------------------------
  2. // Smtpcall.cpp
  3. // --------------------------------------------------------------------------------
  4. #define INC_OLE2
  5. #include "windows.h"
  6. #include "main.h"
  7. #include "smtpcb.h"
  8. extern void err(LPSTR); // main.cpp
  9. // --------------------------------------------------------------------------------
  10. // HrCreateSMTPTransport
  11. // --------------------------------------------------------------------------------
  12. HRESULT HrCreateSMTPTransport(ISMTPTransport **ppSMTP)
  13. {
  14. // Locals
  15. HRESULT hr;
  16. CSMTPCallback *pCallback=NULL;
  17. // Create callback object
  18. pCallback = new CSMTPCallback();
  19. if (NULL == pCallback)
  20. return E_OUTOFMEMORY;
  21. // Load SMTP Transport
  22. hr = CoCreateInstance(CLSID_ISMTPTransport, NULL, CLSCTX_INPROC_SERVER, IID_ISMTPTransport, (LPVOID *)ppSMTP);
  23. if (FAILED(hr))
  24. {
  25. pCallback->Release();
  26. return E_FAIL;
  27. }
  28. // InitNew
  29. hr = (*ppSMTP)->InitNew(NULL, pCallback);
  30. if (FAILED(hr))
  31. {
  32. pCallback->Release();
  33. return E_FAIL;
  34. }
  35. // Done
  36. pCallback->Release();
  37. return S_OK;
  38. }
  39. // --------------------------------------------------------------------------------
  40. // CSMTPCallback::CSMTPCallback
  41. // --------------------------------------------------------------------------------
  42. CSMTPCallback::CSMTPCallback(void)
  43. {
  44. m_cRef = 1;
  45. }
  46. // --------------------------------------------------------------------------------
  47. // CSMTPCallback::~CSMTPCallback
  48. // --------------------------------------------------------------------------------
  49. CSMTPCallback::~CSMTPCallback(void)
  50. {
  51. }
  52. // --------------------------------------------------------------------------------
  53. // CSMTPCallback::QueryInterface
  54. // --------------------------------------------------------------------------------
  55. STDMETHODIMP CSMTPCallback::QueryInterface(REFIID riid, LPVOID *ppv)
  56. {
  57. // Locals
  58. HRESULT hr=S_OK;
  59. // Bad param
  60. if (ppv == NULL)
  61. {
  62. hr = E_INVALIDARG;
  63. goto exit;
  64. }
  65. // Init
  66. *ppv=NULL;
  67. // IID_IUnknown
  68. if (IID_IUnknown == riid)
  69. *ppv = (IUnknown *)this;
  70. // IID_ISMTPCallback
  71. else if (IID_ISMTPCallback == riid)
  72. *ppv = (ISMTPCallback *)this;
  73. // If not null, addref it and return
  74. if (NULL != *ppv)
  75. {
  76. ((LPUNKNOWN)*ppv)->AddRef();
  77. goto exit;
  78. }
  79. // No Interface
  80. hr = E_NOINTERFACE;
  81. exit:
  82. // Done
  83. return hr;
  84. }
  85. // --------------------------------------------------------------------------------
  86. // CSMTPCallback::AddRef
  87. // --------------------------------------------------------------------------------
  88. STDMETHODIMP_(ULONG) CSMTPCallback::AddRef(void)
  89. {
  90. return ++m_cRef;
  91. }
  92. // --------------------------------------------------------------------------------
  93. // CSMTPCallback::Release
  94. // --------------------------------------------------------------------------------
  95. STDMETHODIMP_(ULONG) CSMTPCallback::Release(void)
  96. {
  97. if (0 != --m_cRef)
  98. return m_cRef;
  99. delete this;
  100. return 0;
  101. }
  102. // --------------------------------------------------------------------------------
  103. // CSMTPCallback::OnLogonPrompt
  104. // --------------------------------------------------------------------------------
  105. STDMETHODIMP CSMTPCallback::OnLogonPrompt(
  106. LPINETSERVER pInetServer,
  107. IInternetTransport *pTransport)
  108. {
  109. return S_OK;
  110. }
  111. // --------------------------------------------------------------------------------
  112. // CSMTPCallback::OnPrompt
  113. // --------------------------------------------------------------------------------
  114. STDMETHODIMP_(INT) CSMTPCallback::OnPrompt(
  115. HRESULT hrError,
  116. LPCTSTR pszText,
  117. LPCTSTR pszCaption,
  118. UINT uType,
  119. IInternetTransport *pTransport)
  120. {
  121. return S_OK;
  122. }
  123. // --------------------------------------------------------------------------------
  124. // CSMTPCallback::OnStatus
  125. // --------------------------------------------------------------------------------
  126. STDMETHODIMP CSMTPCallback::OnError(
  127. IXPSTATUS ixpstatus,
  128. LPIXPRESULT pIxpResult,
  129. IInternetTransport *pTransport)
  130. {
  131. char szErr[256];
  132. if (FAILED(pIxpResult->hrResult))
  133. {
  134. if (!pIxpResult->pszResponse)
  135. wsprintf(szErr, "OnError was called: hr=0x%x", pIxpResult->hrResult);
  136. else
  137. wsprintf(szErr, "Error: %s (hr=0x%x)", pIxpResult->pszResponse, pIxpResult->hrResult);
  138. err(szErr);
  139. }
  140. return S_OK;
  141. }
  142. // --------------------------------------------------------------------------------
  143. // CSMTPCallback::OnStatus
  144. // --------------------------------------------------------------------------------
  145. STDMETHODIMP CSMTPCallback::OnStatus(
  146. IXPSTATUS ixpstatus,
  147. IInternetTransport *pTransport)
  148. {
  149. INETSERVER rServer;
  150. pTransport->GetServerInfo(&rServer);
  151. switch(ixpstatus)
  152. {
  153. case IXP_DISCONNECTED:
  154. PostThreadMessage(GetCurrentThreadId(), g_msgSMTP, IXP_DISCONNECTED, 0);
  155. PostThreadMessage(GetCurrentThreadId(), g_msgSMTP, SMTP_QUIT, 0);
  156. break;
  157. }
  158. return S_OK;
  159. }
  160. // --------------------------------------------------------------------------------
  161. // CSMTPCallback::OnProgress
  162. // --------------------------------------------------------------------------------
  163. STDMETHODIMP CSMTPCallback::OnProgress(
  164. DWORD dwIncrement,
  165. DWORD dwCurrent,
  166. DWORD dwMaximum,
  167. IInternetTransport *pTransport)
  168. {
  169. return S_OK;
  170. }
  171. // --------------------------------------------------------------------------------
  172. // CSMTPCallback::OnCommand
  173. // --------------------------------------------------------------------------------
  174. STDMETHODIMP CSMTPCallback::OnCommand(
  175. CMDTYPE cmdtype,
  176. LPSTR pszLine,
  177. HRESULT hrResponse,
  178. IInternetTransport *pTransport)
  179. {
  180. return S_OK;
  181. }
  182. // --------------------------------------------------------------------------------
  183. // CSMTPCallback::OnTimeout
  184. // --------------------------------------------------------------------------------
  185. STDMETHODIMP CSMTPCallback::OnTimeout(
  186. DWORD *pdwTimeout,
  187. IInternetTransport *pTransport)
  188. {
  189. return S_OK;
  190. }
  191. // --------------------------------------------------------------------------------
  192. // CSMTPCallback::OnResponse
  193. // --------------------------------------------------------------------------------
  194. STDMETHODIMP CSMTPCallback::OnResponse(
  195. LPSMTPRESPONSE pResponse)
  196. {
  197. switch(pResponse->command)
  198. {
  199. case SMTP_NONE:
  200. break;
  201. case SMTP_BANNER:
  202. break;
  203. case SMTP_CONNECTED:
  204. if (pResponse->fDone)
  205. PostThreadMessage(GetCurrentThreadId(), g_msgSMTP, SMTP_CONNECTED, 0);
  206. break;
  207. case SMTP_SEND_MESSAGE:
  208. if (pResponse->fDone)
  209. PostThreadMessage(GetCurrentThreadId(), g_msgSMTP, SMTP_SEND_MESSAGE, 0);
  210. break;
  211. case SMTP_EHLO:
  212. if (pResponse->fDone)
  213. PostThreadMessage(GetCurrentThreadId(), g_msgSMTP, SMTP_EHLO, 0);
  214. break;
  215. case SMTP_HELO:
  216. if (pResponse->fDone)
  217. PostThreadMessage(GetCurrentThreadId(), g_msgSMTP, SMTP_HELO, 0);
  218. break;
  219. case SMTP_MAIL:
  220. if (pResponse->fDone)
  221. PostThreadMessage(GetCurrentThreadId(), g_msgSMTP, SMTP_MAIL, 0);
  222. break;
  223. case SMTP_RCPT:
  224. if (pResponse->fDone)
  225. PostThreadMessage(GetCurrentThreadId(), g_msgSMTP, SMTP_RCPT, 0);
  226. break;
  227. case SMTP_RSET:
  228. if (pResponse->fDone)
  229. PostThreadMessage(GetCurrentThreadId(), g_msgSMTP, SMTP_RSET, 0);
  230. break;
  231. case SMTP_QUIT:
  232. if (pResponse->fDone)
  233. PostThreadMessage(GetCurrentThreadId(), g_msgSMTP, SMTP_QUIT, 0);
  234. break;
  235. case SMTP_DATA:
  236. if (pResponse->fDone)
  237. PostThreadMessage(GetCurrentThreadId(), g_msgSMTP, SMTP_DATA, 0);
  238. break;
  239. case SMTP_DOT:
  240. if (pResponse->fDone)
  241. PostThreadMessage(GetCurrentThreadId(), g_msgSMTP, SMTP_DOT, 0);
  242. break;
  243. case SMTP_SEND_STREAM:
  244. if (pResponse->fDone)
  245. PostThreadMessage(GetCurrentThreadId(), g_msgSMTP, SMTP_SEND_STREAM, 0);
  246. break;
  247. case SMTP_CUSTOM:
  248. if (pResponse->fDone)
  249. PostThreadMessage(GetCurrentThreadId(), g_msgSMTP, SMTP_CUSTOM, 0);
  250. break;
  251. }
  252. char szErr[256];
  253. if (FAILED(pResponse->rIxpResult.hrResult))
  254. {
  255. if (!pResponse->rIxpResult.pszResponse)
  256. wsprintf(szErr, "OnReponse reported an error: hr=0x%x", pResponse->rIxpResult.hrResult);
  257. else
  258. wsprintf(szErr, "Error: %s (hr=0x%x)", pResponse->rIxpResult.pszResponse, pResponse->rIxpResult.hrResult);
  259. err(szErr);
  260. }
  261. return S_OK;
  262. }