📄 isapistrm.cpp
字号:
#endif
}
else
{
const char szTypeString[] = "Content-Type: %s\r\nContent-Length: %s\r\n";
if(strlen(szTypeString) +
strlen(g_szContentTextXML) +
strlen(szLength) + 1 >= MAX_HEADER_LENGTH) {
ASSERT(FALSE);
return FALSE;
}
#ifdef UNDER_CE
hr = StringCchPrintfA(
szHeaderTemp,
MAX_HEADER_LENGTH,
szTypeString,
(char *)g_szContentTextXML,
szLength);
if(FAILED(hr)) {
ASSERT(FALSE);
return FALSE;
}
#else
cchHeader = wsprintfA(
szHeaderTemp,
szTypeString,
(char *)g_szContentTextXML,
szLength);
#endif
}
if (pszHeaderEx)
{
strncat(szHeaderTemp, pszHeaderEx, MAX_HEADER_LENGTH - strlen(szHeaderTemp) - 3);
}
const char szStringNewLine[] = "%s\r\n";
if(strlen(szStringNewLine) +
strlen(szHeaderTemp) + 1 >= MAX_HEADER_LENGTH) {
ASSERT(FALSE);
return FALSE;
}
#ifdef UNDER_CE
hr = StringCchPrintfA(
szHeader,
MAX_HEADER_LENGTH,
"%s\r\n",
szHeaderTemp);
if(FAILED(hr)) {
ASSERT(FALSE);
return FALSE;
}
#else
cchHeader = wsprintfA(szHeader, "%s\r\n", szHeaderTemp);
#endif
}
//ask the server if we are allowed to use keepalives (we might know that
// we WANT to -- but the client might not support it
BOOL fCanKeepAlive = FALSE;
//do a check to see if we CAN do a keepalive
m_pECB->ServerSupportFunction(m_pECB->ConnID,
HSE_REQ_IS_KEEP_CONN,
&fCanKeepAlive, NULL, NULL );
if(!fCanKeepAlive)
KeepAlive = FALSE;
//fill out the header info
HeaderExInfo.pszStatus = pszStatus;
HeaderExInfo.cchStatus = (DWORD) strlen(HeaderExInfo.pszStatus);
HeaderExInfo.pszHeader = szHeader;
#ifdef UNDER_CE
HeaderExInfo.cchHeader = (DWORD) strlen(HeaderExInfo.pszHeader);
#else
HeaderExInfo.cchHeader = cchHeader;
#endif
HeaderExInfo.fKeepConn = KeepAlive;
m_pECB->ServerSupportFunction(m_pECB->ConnID,
HSE_REQ_SEND_RESPONSE_HEADER_EX,
&HeaderExInfo, NULL, NULL );
m_fHeaderSent = TRUE;
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
// function: COutputStream::WriteFaultMessage(HRESULT hrResult, BSTR bstrActor)
//
// parameters:
//
// description:
// Writes a SOAP Fault message to the output Http stream
// returns:
//
////////////////////////////////////////////////////////////////////////////////////////////////////
void COutputStream::WriteFaultMessage(HRESULT hrResult, BSTR bstrActor)
{
HRESULT hr = S_OK;
VARIANT vStream;
CAutoBSTR bstrFaultString;
CAutoRefc<ISoapSerializer> pISoapSerializer;
CAutoRefc<IStream> pIStrmOut;
DWORD hrId;
#ifndef UNDER_CE
WCHAR tempbuf[FOURK];
#else
WCHAR *tempbuf = new WCHAR[FOURK];
CHK_MEM(tempbuf);
#endif
VariantInit(&vStream);
// error code must already be set when we come here
ASSERT (m_errorcode != Error_Success);
// Make sure we didn't send headers yet!
ASSERT(!m_fHeaderSent);
// Clear all the linked buffers
m_pBuffersList.DeleteList();
m_pLastBuffer = NULL;
m_cLinkedBuffers = 0;
m_cbFirstBuffer = 0;
m_cbLastBuffer = 0;
// Send the headers first, set status code to 500
m_SOAPIsapiResponse.put_HTTPStatus((BSTR)g_pwszStatusInternalError);
hr = CoCreateInstance(CLSID_SoapSerializer, NULL,
CLSCTX_INPROC_SERVER,
IID_ISoapSerializer,
(void**)&pISoapSerializer);
CHK(hr);
CHK(QueryInterface(IID_IStream, (void **) &pIStrmOut));
vStream.vt = VT_UNKNOWN;
V_UNKNOWN(&vStream) = (IUnknown *)pIStrmOut;
CHK(pISoapSerializer->Init(vStream));
CHK(pISoapSerializer->startEnvelope((BSTR)g_pwstrEnvPrefix, (BSTR)g_pwstrEncStyleNS, L""));
CHK(pISoapSerializer->startBody(/* BSTR enc_style_uri */ NULL));
// Get the faultstring, detail, etc...
if (m_bstrErrorDescription.Len())
{
wcscpy((WCHAR *)tempbuf, g_pwstrISAPIErrorSource);
wcsncat((WCHAR *)tempbuf, (WCHAR *)m_bstrErrorSource, FOURK-1-wcslen(g_pwstrISAPIErrorSource));
}
else
{
// No IErrorInfo set, find a generic faultstring
hrId = HrToMsgId(hrResult);
GetResourceString(hrId, (WCHAR *)tempbuf, FOURK);
}
CHK(bstrFaultString.Assign((BSTR)tempbuf))
CHK(pISoapSerializer->startFault(L"Server",
bstrFaultString,
bstrActor));
// Get the detail info here
if (m_bstrErrorDescription.Len())
{
CHK(pISoapSerializer->startFaultDetail( ));
// WriteDetailTree
CHK(pISoapSerializer->startElement(_T("errorInfo"), 0, 0, _T("mserror")));
CHK(pISoapSerializer->SoapNamespace(_T("mserror"), (BSTR)g_pwstrMSErrorNS));
CHK(pISoapSerializer->startElement(_T("returnCode"), 0, 0, _T("mserror")));
swprintf(&(tempbuf[0]), L" HRESULT=0x%lX", hrResult);
CHK(pISoapSerializer->writeString((WCHAR *)tempbuf));
CHK(pISoapSerializer->endElement());
CHK(pISoapSerializer->startElement(_T("callStack"), 0, 0, _T("mserror")));
CHK(pISoapSerializer->startElement(_T("callElement"), 0, 0, _T("mserror")));
CHK(pISoapSerializer->startElement(_T("description"), 0, 0, _T("mserror")));
CHK(pISoapSerializer->writeString((WCHAR *)m_bstrErrorDescription));
CHK(pISoapSerializer->endElement());
CHK(pISoapSerializer->endElement());
// close the callstack
CHK(pISoapSerializer->endElement());
// close the errorinfo
CHK(pISoapSerializer->endElement());
CHK(pISoapSerializer->endFaultDetail());
}
CHK(pISoapSerializer->endFault());
// End of Soap body element
CHK(pISoapSerializer->endBody());
// Finally end the envelope
CHK(pISoapSerializer->endEnvelope());
m_bstrErrorDescription.Clear();
m_bstrErrorSource.Clear();
Cleanup:
#ifdef UNDER_CE
if(tempbuf)
delete [] tempbuf;
#endif
return;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
// function: CSOAPIsapiResponse::AddRef()
//
// parameters:
//
// description:
// returns:
//
////////////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG) CSOAPIsapiResponse::AddRef()
{
// Delegate to outer IUnknown
if (!m_pIUnkOuter)
return OLE_E_BLANK;
return m_pIUnkOuter->AddRef();
}
////////////////////////////////////////////////////////////////////////////////////////////////////
// function: CSOAPIsapiResponse::Release()
//
// parameters:
//
// description:
// returns:
//
////////////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG) CSOAPIsapiResponse::Release()
{
// Delegate to outer IUnknown
if (!m_pIUnkOuter)
return OLE_E_BLANK;
return m_pIUnkOuter->Release();
}
////////////////////////////////////////////////////////////////////////////////////////////////////
// function: CSOAPIsapiResponse::QueryInterface(REFIID riid, LPVOID *ppv)
//
// parameters:
//
// description:
// returns:
//
////////////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CSOAPIsapiResponse::QueryInterface(REFIID riid, LPVOID *ppv)
{
// Delegate to outer IUnknown
if (!m_pIUnkOuter)
return OLE_E_BLANK;
return m_pIUnkOuter->QueryInterface(riid, ppv);
}
////////////////////////////////////////////////////////////////////////////////////////////////////
// function: CSOAPIsapiResponse::Init(IUnknown *pIUnkOuter)
//
// parameters:
//
// description:
// returns:
//
////////////////////////////////////////////////////////////////////////////////////////////////////
void CSOAPIsapiResponse::Init(IUnknown *pIUnkOuter)
{
ASSERT(m_pIUnkOuter == NULL);
m_pIUnkOuter = pIUnkOuter;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
// function: CSOAPIsapiResponse::get_HTTPStatus(BSTR *pbstrStatus)
//
// parameters:
//
// description:
// Returns the Http stream status
// returns:
//
////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CSOAPIsapiResponse::get_HTTPStatus(BSTR *pbstrStatus)
{
#ifndef UNDER_CE
try
#else
__try
#endif
{
if (!m_pwstrHTTPStatus)
*pbstrStatus = NULL;
else
*pbstrStatus = SysAllocString((WCHAR *)m_pwstrHTTPStatus);
return S_OK;
}
#ifndef UNDER_CE
catch (...)
#else
__except(1)
#endif
{
ASSERTTEXT (FALSE, "CSOAPIsapiResponse::get_HTTPStatus - Unhandled Exception");
return E_FAIL;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
// function: CSOAPIsapiResponse::put_HTTPStatus(BSTR bstrStatus)
//
// parameters:
//
// description:
// Sets the Http stream status
// returns:
//
////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CSOAPIsapiResponse::put_HTTPStatus(BSTR bstrStatus)
{
// Called by mssoap1.dll, when a fault message is written to the HTTP body
WCHAR *pwstrStat;
#ifndef UNDER_CE
try
#else
__try
#endif
{
if (!bstrStatus || (*bstrStatus == 0))
return E_INVALIDARG;
pwstrStat = new WCHAR[wcslen(bstrStatus)+1];
if (!pwstrStat)
return E_OUTOFMEMORY;
wcscpy (pwstrStat, (WCHAR *) bstrStatus);
if (m_pwstrHTTPStatus)
m_pwstrHTTPStatus.Clear();
m_pwstrHTTPStatus = pwstrStat;
return S_OK;
}
#ifndef UNDER_CE
catch (...)
#else
__except(1)
#endif
{
ASSERTTEXT (FALSE, "COutputStream::put_HTTPStatus - Unhandled Exception");
return E_FAIL;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
// function: CSOAPIsapiResponse::get_HTTPCharset(BSTR *pbstrCharset)
//
// parameters:
//
// description:
// Returns the Http stream status
// returns:
//
////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CSOAPIsapiResponse::get_HTTPCharset(BSTR *pbstrCharset)
{
#ifndef UNDER_CE
try
#else
__try
#endif
{
if (!m_pwstrHTTPCharset)
*pbstrCharset = NULL;
else
{
*pbstrCharset = SysAllocString((WCHAR *)m_pwstrHTTPCharset);
#ifndef UNDER_CE
if(NULL == *pbstrCharset)
return E_OUTOFMEMORY;
#endif
}
return S_OK;
}
#ifndef UNDER_CE
catch (...)
#else
__except(1)
#endif
{
ASSERTTEXT (FALSE, "CSOAPIsapiResponse::get_HTTPCharset - Unhandled Exception");
return E_FAIL;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
// function: CSOAPIsapiResponse::put_HTTPCharset(BSTR bstrCharset)
//
// parameters:
//
// description:
// Sets the Http stream status
// returns:
//
////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CSOAPIsapiResponse::put_HTTPCharset(BSTR bstrCharset)
{
// Called by mssoap1.dll, when a fault message is written to the HTTP body
WCHAR *pwstrCharset;
#ifndef UNDER_CE
try
#else
__try
#endif
{
if (!bstrCharset || (*bstrCharset == 0))
return E_INVALIDARG;
pwstrCharset = new WCHAR[wcslen(bstrCharset)+1];
if (!pwstrCharset)
return E_OUTOFMEMORY;
wcscpy (pwstrCharset, (WCHAR *) bstrCharset);
if (m_pwstrHTTPCharset)
m_pwstrHTTPCharset.Clear();
m_pwstrHTTPCharset = pwstrCharset;
return S_OK;
}
#ifndef UNDER_CE
catch (...)
#else
__except(1)
#endif
{
ASSERTTEXT (FALSE, "COutputStream::put_HTTPCharset - Unhandled Exception");
return E_FAIL;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
// function: void COutputStream::SetErrorCode(ERROR_CODE errcode)
//
// parameters:
//
// description:
// sets the error code and remembers the relevant error info
// returns:
//
////////////////////////////////////////////////////////////////////////////////////////////////////
void COutputStream::SetErrorCode(ERROR_CODE errcode)
{
if (m_errorcode == Error_Success)
{
m_errorcode = errcode;
CAutoRefc<IErrorInfo> pIErrInfo;
if (GetErrorInfo(0, &pIErrInfo)==S_OK && pIErrInfo)
{
m_bstrErrorDescription.Clear();
m_bstrErrorSource.Clear();
// if that fails, we ignore it. send a little generic error
pIErrInfo->GetSource(&m_bstrErrorSource);
pIErrInfo->GetDescription(&m_bstrErrorDescription);
}
}
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -