<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><style type="text/css"><!--
#msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; }
#msg ul, pre { overflow: auto; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<title>[20658] S60/branches/3.1m/WebKit</title>
</head>
<body>

<div id="msg">
<dl>
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/20658">20658</a></dd>
<dt>Author</dt> <dd>spadma</dd>
<dt>Date</dt> <dd>2007-04-02 11:22:46 -0700 (Mon, 02 Apr 2007)</dd>
</dl>

<h3>Log Message</h3>
<pre>2007-04-02  bujtas  &lt;zbujtas@gmail.com&gt;

        Reviewed by Sachin.
        DESC: implement client side accept header support 
        http://bugs.webkit.org/show_bug.cgi?id=13256

        * BrowserControl/src/BrCtl.cpp:
        (CBrCtl::SetParamL):
        * ResourceLoader/inc/LoaderContainer.h:
        (CLoaderContainer::ClientAcceptHeaders):
        * ResourceLoader/src/HttpTransaction.cpp:
        (CHttpTransaction::AddRequestHeadersL):
        * ResourceLoader/src/LoaderContainer.cpp:
        (CLoaderContainer::~CLoaderContainer):
        (CLoaderContainer::SetClientAcceptHeadersL):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#S60branches31mWebKitBrowserControlsrcBrCtlcpp">S60/branches/3.1m/WebKit/BrowserControl/src/BrCtl.cpp</a></li>
<li><a href="#S60branches31mWebKitChangeLog">S60/branches/3.1m/WebKit/ChangeLog</a></li>
<li><a href="#S60branches31mWebKitResourceLoaderincLoaderContainerh">S60/branches/3.1m/WebKit/ResourceLoader/inc/LoaderContainer.h</a></li>
<li><a href="#S60branches31mWebKitResourceLoadersrcHttpTransactioncpp">S60/branches/3.1m/WebKit/ResourceLoader/src/HttpTransaction.cpp</a></li>
<li><a href="#S60branches31mWebKitResourceLoadersrcLoaderContainercpp">S60/branches/3.1m/WebKit/ResourceLoader/src/LoaderContainer.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="S60branches31mWebKitBrowserControlsrcBrCtlcpp"></a>
<div class="modfile"><h4>Modified: S60/branches/3.1m/WebKit/BrowserControl/src/BrCtl.cpp (20657 => 20658)</h4>
<pre class="diff"><span>
<span class="info">--- S60/branches/3.1m/WebKit/BrowserControl/src/BrCtl.cpp        2007-04-02 17:39:53 UTC (rev 20657)
+++ S60/branches/3.1m/WebKit/BrowserControl/src/BrCtl.cpp        2007-04-02 18:22:46 UTC (rev 20658)
</span><span class="lines">@@ -78,7 +78,7 @@
</span><span class="cx"> #include &quot;UrlRequestInfo.h&quot;
</span><span class="cx"> #include &quot;ToolBar.h&quot;
</span><span class="cx"> #include &lt;EscapeUtils.h&gt;
</span><del>-
</del><ins>+#include &quot;LoaderContainer.h&quot;
</ins><span class="cx"> #ifdef RD_32_BROWSER
</span><span class="cx"> #include &quot;SmartLinkHandler.h&quot;
</span><span class="cx"> #endif
</span><span class="lines">@@ -1400,9 +1400,14 @@
</span><span class="cx"> // -----------------------------------------------------------------------------
</span><span class="cx"> //
</span><span class="cx"> EXPORT_C void CBrCtl::SetParamL(
</span><del>-    TBrCtlDefs::TBrCtlParams /*aParam*/,
-    const TDesC&amp; /*aValue*/ )
</del><ins>+    TBrCtlDefs::TBrCtlParams aParam,
+    const TDesC&amp; aValue )
</ins><span class="cx">     {
</span><ins>+    //
+    if (aParam == TBrCtlDefs::EParamsRequestHeaders)
+        {
+        CStaticObjectContainer::Instance().LoaderContainerL(*this).SetClientAcceptHeadersL(aValue);
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> // -----------------------------------------------------------------------------
</span></span></pre></div>
<a id="S60branches31mWebKitChangeLog"></a>
<div class="modfile"><h4>Modified: S60/branches/3.1m/WebKit/ChangeLog (20657 => 20658)</h4>
<pre class="diff"><span>
<span class="info">--- S60/branches/3.1m/WebKit/ChangeLog        2007-04-02 17:39:53 UTC (rev 20657)
+++ S60/branches/3.1m/WebKit/ChangeLog        2007-04-02 18:22:46 UTC (rev 20658)
</span><span class="lines">@@ -1,3 +1,19 @@
</span><ins>+2007-04-02  bujtas  &lt;zbujtas@gmail.com&gt;
+
+        Reviewed by Sachin.
+        DESC: implement client side accept header support 
+        http://bugs.webkit.org/show_bug.cgi?id=13256
+
+        * BrowserControl/src/BrCtl.cpp:
+        (CBrCtl::SetParamL):
+        * ResourceLoader/inc/LoaderContainer.h:
+        (CLoaderContainer::ClientAcceptHeaders):
+        * ResourceLoader/src/HttpTransaction.cpp:
+        (CHttpTransaction::AddRequestHeadersL):
+        * ResourceLoader/src/LoaderContainer.cpp:
+        (CLoaderContainer::~CLoaderContainer):
+        (CLoaderContainer::SetClientAcceptHeadersL):
+
</ins><span class="cx"> 2007-03-29  vbradley  &lt;vincent.bradley@nokia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Reviewed by Yongjan.
</span></span></pre></div>
<a id="S60branches31mWebKitResourceLoaderincLoaderContainerh"></a>
<div class="modfile"><h4>Modified: S60/branches/3.1m/WebKit/ResourceLoader/inc/LoaderContainer.h (20657 => 20658)</h4>
<pre class="diff"><span>
<span class="info">--- S60/branches/3.1m/WebKit/ResourceLoader/inc/LoaderContainer.h        2007-04-02 17:39:53 UTC (rev 20657)
+++ S60/branches/3.1m/WebKit/ResourceLoader/inc/LoaderContainer.h        2007-04-02 18:22:46 UTC (rev 20658)
</span><span class="lines">@@ -9,9 +9,9 @@
</span><span class="cx"> *    Copyright (c) 2006, Nokia Corporation
</span><span class="cx"> *    All rights reserved.
</span><span class="cx"> *  
</span><del>-*          Redistribution and use in source and binary forms, with or without
-*          modification, are permitted provided that the following conditions
-*          are met:
</del><ins>+*   Redistribution and use in source and binary forms, with or without
+*   modification, are permitted provided that the following conditions
+*   are met:
</ins><span class="cx"> *  
</span><span class="cx"> *      * Redistributions of source code must retain the above copyright
</span><span class="cx"> *        notice, this list of conditions and the following disclaimer.
</span><span class="lines">@@ -23,18 +23,18 @@
</span><span class="cx"> *        contributors may be used to endorse or promote products derived
</span><span class="cx"> *        from this software without specific prior written permission.
</span><span class="cx"> *  
</span><del>-*          THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-*          &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-*          LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-*          A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-*          OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-*          SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-*          LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-*          DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-*          THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-*          (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
-*          USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-*          DAMAGE.
</del><ins>+*   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+*   &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+*   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+*   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+*   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+*   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+*   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+*   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+*   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+*   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+*   USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+*   DAMAGE.
</ins><span class="cx"> *  
</span><span class="cx"> *    Please see file patentlicense.txt for further grants.
</span><span class="cx"> * ==============================================================================
</span><span class="lines">@@ -60,11 +60,11 @@
</span><span class="cx"> // DATA TYPES
</span><span class="cx"> 
</span><span class="cx"> enum TCookieFilterLoad
</span><del>-        {
-        ELoadNone,
-        ELoadFilter,
-        EUnloadFilter
-        };
</del><ins>+    {
+    ELoadNone,
+    ELoadFilter,
+    EUnloadFilter
+    };
</ins><span class="cx"> 
</span><span class="cx"> // FUNCTION PROTOTYPES
</span><span class="cx"> 
</span><span class="lines">@@ -168,6 +168,20 @@
</span><span class="cx">         TBool HTTPPipelining() const { return iHttpPipelining; }
</span><span class="cx"> 
</span><span class="cx">         /**
</span><ins>+        * Set accept headers set by the client application
+        * @since 3.1
+        * @return
+        */
+        void SetClientAcceptHeadersL( const TPtrC&amp; aAcceptHeaders );
+
+        /**
+        * return accept headers set by the client application
+        * @since 3.1
+        * @return
+        */
+        const RPointerArray&lt;HBufC8&gt;&amp; ClientAcceptHeaders() const { return iClientAcceptHeaders; }
+
+        /**
</ins><span class="cx">         * Get load observer
</span><span class="cx">         * @since 3.1
</span><span class="cx">         * @return
</span><span class="lines">@@ -180,8 +194,8 @@
</span><span class="cx">         * @return
</span><span class="cx">         */
</span><span class="cx">         void SetLoadObservers( MBrCtlSpecialLoadObserver&amp; aLoadObserver,
</span><del>-                                                                MBrCtlDownloadObserver&amp; aBrCtlDownloadObserver,
-                                                                CHttpLoaderEventToUiListener&amp; aUiEventListener);
</del><ins>+                                MBrCtlDownloadObserver&amp; aBrCtlDownloadObserver,
+                                CHttpLoaderEventToUiListener&amp; aUiEventListener);
</ins><span class="cx"> 
</span><span class="cx">         /**
</span><span class="cx">         * Get load observer
</span><span class="lines">@@ -297,6 +311,8 @@
</span><span class="cx">         TCookieFilterLoad iCookieFilterLoad;
</span><span class="cx">         //
</span><span class="cx">         CHttpCacheManager*  iCache;          // owned
</span><ins>+        //
+        RPointerArray&lt;HBufC8&gt; iClientAcceptHeaders;
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx"> #endif      // LOADERCONTAINER_H
</span></span></pre></div>
<a id="S60branches31mWebKitResourceLoadersrcHttpTransactioncpp"></a>
<div class="modfile"><h4>Modified: S60/branches/3.1m/WebKit/ResourceLoader/src/HttpTransaction.cpp (20657 => 20658)</h4>
<pre class="diff"><span>
<span class="info">--- S60/branches/3.1m/WebKit/ResourceLoader/src/HttpTransaction.cpp        2007-04-02 17:39:53 UTC (rev 20657)
+++ S60/branches/3.1m/WebKit/ResourceLoader/src/HttpTransaction.cpp        2007-04-02 18:22:46 UTC (rev 20658)
</span><span class="lines">@@ -825,6 +825,43 @@
</span><span class="cx">     THTTPHdrVal tokenVal = (TInt)(MConnectionCallback*)this;
</span><span class="cx">     iTrans-&gt;PropertySet().RemoveProperty( connectionCallbackStr );
</span><span class="cx">     iTrans-&gt;PropertySet().SetPropertyL( connectionCallbackStr, tokenVal );
</span><ins>+    
+    // add client request headers
+    CLoaderContainer* loaderContainer = static_cast&lt;CLoaderContainer*&gt;
+        (TWebCoreLoaderContainer::LoaderContainer());
+    const RPointerArray&lt;HBufC8&gt;&amp; clientHeaders = loaderContainer-&gt;ClientAcceptHeaders();
+    int i=0;
+    // clientHeaders.Count()-1 for the double i++ to make sure that we 
+    // have both the key and the value string
+    while (i &lt; clientHeaders.Count()-1)
+        {
+        TPtrC8 headerName = *(clientHeaders[i++]);
+        TPtrC8 headerValue = *(clientHeaders[i++]);
+        // header name
+        RStringF headerNameStr = stringPool.OpenFStringL(headerName);
+        CleanupClosePushL(headerNameStr);
+        
+        // date type
+        if (headerNameStr == stringPool.StringF(HTTP::EIfModifiedSince, RHTTPSession::GetTable()) ||
+            headerNameStr == stringPool.StringF(HTTP::EIfUnmodifiedSince, RHTTPSession::GetTable()))
+            {
+            TInternetDate date;
+            date.SetDateL(headerValue);
+            TDateTime modifyTime(date.DateTime());
+            hdr.SetFieldL(headerNameStr, modifyTime);
+            }
+        // string    
+        else     
+            {
+            RStringF headerValueStr = stringPool.OpenFStringL( headerValue ); 
+            CleanupClosePushL(headerValueStr);
+            
+            hdr.SetFieldL( headerNameStr, headerValueStr );
+            CleanupStack::PopAndDestroy(); // headerNameStr
+            }
+        //
+        CleanupStack::PopAndDestroy(); // headerNameStr
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> // -----------------------------------------------------------------------------
</span></span></pre></div>
<a id="S60branches31mWebKitResourceLoadersrcLoaderContainercpp"></a>
<div class="modfile"><h4>Modified: S60/branches/3.1m/WebKit/ResourceLoader/src/LoaderContainer.cpp (20657 => 20658)</h4>
<pre class="diff"><span>
<span class="info">--- S60/branches/3.1m/WebKit/ResourceLoader/src/LoaderContainer.cpp        2007-04-02 17:39:53 UTC (rev 20657)
+++ S60/branches/3.1m/WebKit/ResourceLoader/src/LoaderContainer.cpp        2007-04-02 18:22:46 UTC (rev 20658)
</span><span class="lines">@@ -130,6 +130,8 @@
</span><span class="cx">     delete iCache;
</span><span class="cx">     delete iDownloadObserver;
</span><span class="cx">     iLoaderArray.Close();
</span><ins>+    iClientAcceptHeaders.ResetAndDestroy();
+    iClientAcceptHeaders.Close();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> // -----------------------------------------------------------------------------
</span><span class="lines">@@ -447,4 +449,68 @@
</span><span class="cx">     }
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+// -----------------------------------------------------------------------------
+// CLoaderContainer::SetClientAcceptHeaders
+//
+// -----------------------------------------------------------------------------
+//
+void CLoaderContainer::SetClientAcceptHeadersL( const TPtrC&amp; aAcceptHeaders )
+    {
+    // cleanup pervious accept headers
+    iClientAcceptHeaders.ResetAndDestroy();
+    
+    TInt startName = 0;
+    TInt endName = 0;
+    TInt startValue = 0;
+    TInt endValue = 0;
+    TInt consumed = 0;
+    TInt len = aAcceptHeaders.Length();    
+    
+    HBufC8* acceptHeaders = HBufC8::NewLC(aAcceptHeaders.Length());
+    acceptHeaders-&gt;Des().Copy(aAcceptHeaders);
+    while (consumed &lt; len)
+        {
+        TPtrC8 ptr(acceptHeaders-&gt;Ptr() + consumed, len - consumed);
+        // find the headers separator first
+        endValue = ptr.Locate('\r');
+        if (endValue == 0)
+            {
+            // skip empty headers
+            consumed++;
+            continue;
+            }
+        if (endValue == KErrNotFound)
+            {
+            endValue = ptr.Length();
+            }
+        TPtrC8 header(ptr.Ptr(), endValue);
+        startName = 0;
+        endName = header.Locate(':');
+        if (endName &lt;= 0)
+            {
+            // No separator in the header, or it is the first character
+            User::Leave(KErrArgument);
+            }
+        // Skip leading spaces in header value
+        for (startValue = endName + 1; startValue &lt; endValue &amp;&amp; header[startValue] == ' '; startValue++)
+            {
+            }
+        //    
+        TInt headerPos = startName;
+        TInt valuePos = startValue;
+        //
+        HBufC8* headerBuf = HBufC8::NewLC(endName);
+        HBufC8* valueBuf = HBufC8::NewLC(endValue-startValue);
+
+        headerBuf-&gt;Des().Copy(ptr.Left(endName));
+        valueBuf-&gt;Des().Copy(ptr.Mid(startValue, endValue - startValue));
+        
+        User::LeaveIfError(iClientAcceptHeaders.Append(headerBuf)); 
+        User::LeaveIfError(iClientAcceptHeaders.Append(valueBuf));
+        CleanupStack::Pop(2); // headerBuf, valueBuf   
+        consumed += (endValue + 1);
+        }
+    CleanupStack::PopAndDestroy(); // acceptHeaders
+    }
+    
</ins><span class="cx"> //  End of File
</span></span></pre>
</div>
</div>

</body>
</html>