📄 weburlresponse.cpp
字号:
// IUnknown -------------------------------------------------------------------HRESULT STDMETHODCALLTYPE WebURLResponse::QueryInterface(REFIID riid, void** ppvObject){ *ppvObject = 0; if (IsEqualGUID(riid, IID_IUnknown)) *ppvObject = static_cast<IWebURLResponse*>(this); else if (IsEqualGUID(riid, __uuidof(this))) *ppvObject = this; else if (IsEqualGUID(riid, IID_IWebURLResponse)) *ppvObject = static_cast<IWebURLResponse*>(this); else if (IsEqualGUID(riid, IID_IWebURLResponsePrivate)) *ppvObject = static_cast<IWebURLResponsePrivate*>(this); else if (m_response.isHTTP() && IsEqualGUID(riid, IID_IWebHTTPURLResponse)) *ppvObject = static_cast<IWebHTTPURLResponse*>(this); else return E_NOINTERFACE; AddRef(); return S_OK;}ULONG STDMETHODCALLTYPE WebURLResponse::AddRef(void){ return ++m_refCount;}ULONG STDMETHODCALLTYPE WebURLResponse::Release(void){ ULONG newRef = --m_refCount; if (!newRef) delete(this); return newRef;}// IWebURLResponse --------------------------------------------------------------------HRESULT STDMETHODCALLTYPE WebURLResponse::expectedContentLength( /* [retval][out] */ long long* result){ *result = m_response.expectedContentLength(); return S_OK;}HRESULT STDMETHODCALLTYPE WebURLResponse::initWithURL( /* [in] */ BSTR url, /* [in] */ BSTR mimeType, /* [in] */ int expectedContentLength, /* [in] */ BSTR textEncodingName){ m_response = ResourceResponse(MarshallingHelpers::BSTRToKURL(url), String(mimeType), expectedContentLength, String(textEncodingName), String()); return S_OK;}HRESULT STDMETHODCALLTYPE WebURLResponse::MIMEType( /* [retval][out] */ BSTR* result){ BString mimeType(m_response.mimeType()); *result = mimeType.release(); if (!m_response.mimeType().isNull() && !*result) return E_OUTOFMEMORY; return S_OK;}HRESULT STDMETHODCALLTYPE WebURLResponse::suggestedFilename( /* [retval][out] */ BSTR* result){ if (!result) { ASSERT_NOT_REACHED(); return E_POINTER; } *result = 0; if (m_response.url().isEmpty()) return E_FAIL; *result = BString(m_response.suggestedFilename()).release(); return S_OK;}HRESULT STDMETHODCALLTYPE WebURLResponse::textEncodingName( /* [retval][out] */ BSTR* result){ if (!result) return E_INVALIDARG; BString textEncodingName(m_response.textEncodingName()); *result = textEncodingName.release(); if (!m_response.textEncodingName().isNull() && !*result) return E_OUTOFMEMORY; return S_OK;}HRESULT STDMETHODCALLTYPE WebURLResponse::URL( /* [retval][out] */ BSTR* result){ if (!result) return E_INVALIDARG; BString url(m_response.url().string()); *result = url.release(); if (!m_response.url().isEmpty() && !*result) return E_OUTOFMEMORY; return S_OK;}// IWebHTTPURLResponse --------------------------------------------------------HRESULT STDMETHODCALLTYPE WebURLResponse::allHeaderFields( /* [retval][out] */ IPropertyBag** headerFields){ ASSERT(m_response.isHTTP()); *headerFields = COMPropertyBag<String, AtomicString, CaseFoldingHash>::createInstance(m_response.httpHeaderFields()); return S_OK;}HRESULT STDMETHODCALLTYPE WebURLResponse::localizedStringForStatusCode( /* [in] */ int statusCode, /* [retval][out] */ BSTR* statusString){ ASSERT(m_response.isHTTP()); if (statusString) *statusString = 0; LPCTSTR statusText = CFHTTPMessageCopyLocalizedShortDescriptionForStatusCode(statusCode); if (!statusText) return E_FAIL; if (statusString) *statusString = SysAllocString(statusText); return S_OK;}HRESULT STDMETHODCALLTYPE WebURLResponse::statusCode( /* [retval][out] */ int* statusCode){ ASSERT(m_response.isHTTP()); if (statusCode) *statusCode = m_response.httpStatusCode(); return S_OK;}HRESULT STDMETHODCALLTYPE WebURLResponse::isAttachment( /* [retval][out] */ BOOL *attachment){ *attachment = m_response.isAttachment(); return S_OK;}HRESULT STDMETHODCALLTYPE WebURLResponse::sslPeerCertificate( /* [retval][out] */ OLE_HANDLE* result){ if (!result) return E_POINTER; *result = 0;#if USE(CFNETWORK) CFDictionaryRef dict = certificateDictionary(); if (!dict) return E_FAIL; void* data = wkGetSSLPeerCertificateData(dict); if (!data) return E_FAIL; *result = (OLE_HANDLE)(ULONG64)data;#endif return *result ? S_OK : E_FAIL;}// WebURLResponse -------------------------------------------------------------HRESULT WebURLResponse::suggestedFileExtension(BSTR *result){ if (!result) return E_POINTER; *result = 0; if (m_response.mimeType().isEmpty()) return E_FAIL; BString mimeType(m_response.mimeType()); HKEY key; LONG err = RegOpenKeyEx(HKEY_CLASSES_ROOT, TEXT("MIME\\Database\\Content Type"), 0, KEY_QUERY_VALUE, &key); if (!err) { HKEY subKey; err = RegOpenKeyEx(key, mimeType, 0, KEY_QUERY_VALUE, &subKey); if (!err) { DWORD keyType = REG_SZ; TCHAR extension[MAX_PATH]; DWORD keySize = sizeof(extension)/sizeof(extension[0]); err = RegQueryValueEx(subKey, TEXT("Extension"), 0, &keyType, (LPBYTE)extension, &keySize); if (!err && keyType != REG_SZ) err = ERROR_INVALID_DATA; if (err) { // fallback handlers if (!_tcscmp(mimeType, TEXT("text/html"))) { _tcscpy(extension, TEXT(".html")); err = 0; } else if (!_tcscmp(mimeType, TEXT("application/xhtml+xml"))) { _tcscpy(extension, TEXT(".xhtml")); err = 0; } else if (!_tcscmp(mimeType, TEXT("image/svg+xml"))) { _tcscpy(extension, TEXT(".svg")); err = 0; } } if (!err) { *result = SysAllocString(extension); if (!*result) err = ERROR_OUTOFMEMORY; } RegCloseKey(subKey); } RegCloseKey(key); } return HRESULT_FROM_WIN32(err);}const ResourceResponse& WebURLResponse::resourceResponse() const{ return m_response;}#if USE(CFNETWORK)CFDictionaryRef WebURLResponse::certificateDictionary() const{ if (m_SSLCertificateInfo) return m_SSLCertificateInfo.get(); CFURLResponseRef cfResponse = m_response.cfURLResponse(); if (!cfResponse) return 0; m_SSLCertificateInfo = wkGetSSLCertificateInfo(cfResponse); return m_SSLCertificateInfo.get();}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -