HRESULT InternetTransport_DoCommand(InternetTransport *This, LPCSTR pszCommand, INETXPORT_COMPLETION_FUNCTION fnCompletion) { if (This->Status == IXP_DISCONNECTED) return IXP_E_NOT_CONNECTED; if (This->fnCompletion) return IXP_E_BUSY; if (This->pCallback && This->fCommandLogging) { ITransportCallback_OnCommand(This->pCallback, CMD_SEND, (LPSTR)pszCommand, 0, (IInternetTransport *)&This->u.vtbl); } return InternetTransport_Write(This, pszCommand, strlen(pszCommand), fnCompletion); }
static void SMTPTransport_CallbackMessageSendDataStream(IInternetTransport *iface, char *pBuffer, int cbBuffer) { SMTPTransport *This = (SMTPTransport *)iface; SMTPRESPONSE response; HRESULT hr; char *pszBuffer; ULONG cbSize; TRACE("\n"); hr = SMTPTransport_ParseResponse(This, pBuffer, &response); if (FAILED(hr)) { /* FIXME: handle error */ return; } if (FAILED(response.rIxpResult.hrServerError)) { ERR("server error: %s\n", debugstr_a(pBuffer)); /* FIXME: handle error */ return; } pszBuffer = HeapAlloc(GetProcessHeap(), 0, This->pending_message.cbSize); hr = IStream_Read(This->pending_message.pstmMsg, pszBuffer, This->pending_message.cbSize, NULL); if (FAILED(hr)) { /* FIXME: handle error */ return; } cbSize = This->pending_message.cbSize; /* FIXME: map "\n.\n" to "\n..\n", reallocate memory, update cbSize */ /* FIXME: properly stream the message rather than writing it all at once */ hr = InternetTransport_Write(&This->InetTransport, pszBuffer, cbSize, SMTPTransport_CallbackMessageSendDOT); HeapFree(GetProcessHeap(), 0, pszBuffer); }