Module: wine Branch: master Commit: d4071b56a1dbdee9afea990903e22915979f1436 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d4071b56a1dbdee9afea990903...
Author: Jacek Caban jacek@codeweavers.com Date: Fri Sep 17 18:33:10 2010 +0200
mshtml: Added nsIHttpChannel::VisitResponseHeaders implementation.
---
dlls/mshtml/nsiface.idl | 11 ++++++++++- dlls/mshtml/nsio.c | 36 ++++++++++++++++++++++++++++++++++-- 2 files changed, 44 insertions(+), 3 deletions(-)
diff --git a/dlls/mshtml/nsiface.idl b/dlls/mshtml/nsiface.idl index d4ab0b7..c7aaf88 100644 --- a/dlls/mshtml/nsiface.idl +++ b/dlls/mshtml/nsiface.idl @@ -107,7 +107,6 @@ interface nsISupports /* Currently we don't need a full declaration of these interfaces */ typedef nsISupports nsISHistory; typedef nsISupports nsIWidget; -typedef nsISupports nsIHttpHeaderVisitor; typedef nsISupports nsIDOMBarProp; typedef nsISupports nsIPrompt; typedef nsISupports nsIAuthPrompt; @@ -430,6 +429,16 @@ interface nsIChannel : nsIRequest
[ object, + uuid(0cf40717-d7c1-4a94-8c1e-d6c9734101bb), + local +] +interface nsIHttpHeaderVisitor : nsISupports +{ + nsresult VisitHeader(const nsACString *aHeader, const nsACString *aValue); +} + +[ + object, uuid(9277fe09-f0cc-4cd9-bbce-581dd94b0260), local ] diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c index 08d3c06..a157a4c 100644 --- a/dlls/mshtml/nsio.c +++ b/dlls/mshtml/nsio.c @@ -419,6 +419,38 @@ static nsresult set_channel_http_header(struct list *headers, const nsACString * return SUCCEEDED(hres) ? NS_OK : NS_ERROR_UNEXPECTED; }
+static nsresult visit_http_headers(struct list *headers, nsIHttpHeaderVisitor *visitor) +{ + nsACString header_str, value_str; + char *header, *value; + http_header_t *iter; + nsresult nsres; + + LIST_FOR_EACH_ENTRY(iter, headers, http_header_t, entry) { + header = heap_strdupWtoA(iter->header); + if(!header) + return NS_ERROR_OUT_OF_MEMORY; + + value = heap_strdupWtoA(iter->data); + if(!value) { + heap_free(header); + return NS_ERROR_OUT_OF_MEMORY; + } + + nsACString_InitDepend(&header_str, header); + nsACString_InitDepend(&value_str, value); + nsres = nsIHttpHeaderVisitor_VisitHeader(visitor, &header_str, &value_str); + nsACString_Finish(&header_str); + nsACString_Finish(&value_str); + heap_free(header); + heap_free(value); + if(NS_FAILED(nsres)) + break; + } + + return NS_OK; +} + static void free_http_headers(struct list *list) { http_header_t *iter, *iter_next; @@ -1211,9 +1243,9 @@ static nsresult NSAPI nsChannel_VisitResponseHeaders(nsIHttpChannel *iface, { nsChannel *This = NSCHANNEL_THIS(iface);
- FIXME("(%p)->(%p)\n", This, aVisitor); + TRACE("(%p)->(%p)\n", This, aVisitor);
- return NS_ERROR_NOT_IMPLEMENTED; + return visit_http_headers(&This->response_headers, aVisitor); }
static nsresult NSAPI nsChannel_IsNoStoreResponse(nsIHttpChannel *iface, PRBool *_retval)