diff -r 000000000000 -r dd21522fd290 webengine/osswebengine/WebKit/s60/webview/WmlResourceLoaderClient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/osswebengine/WebKit/s60/webview/WmlResourceLoaderClient.cpp Mon Mar 30 12:54:55 2009 +0300 @@ -0,0 +1,175 @@ +/* +* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +// INCLUDES +#include "WmlResourceLoaderClient.h" +#include "WmlResourceLoader.h" +#include "WmlDispatcher.h" +#include "Page.h" +#include "Frame.h" +#include "FrameLoader.h" +#include "DocumentLoader.h" +#include "ProgressTracker.h" +#include "ResourceRequest.h" +#include "ResourceResponse.h" +#include "StaticObjectsContainer.h" + + +#include "WebKitLogger.h" + +// CONSTANTS + +// MACROS + +// DATA TYPES + +// FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS +using namespace WebCore; + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +WmlResourceLoaderClient* WmlResourceLoaderClient::CreateResourceLoaderClient(CWmlDispatcher* wmldispatcher) +{ + //this object get's deleted by the WmlStreamLoader. + return new WmlResourceLoaderClient(wmldispatcher); +} + +// ----------------------------------------------------------------------------- +// C++ default constructor. +// ----------------------------------------------------------------------------- +WmlResourceLoaderClient::WmlResourceLoaderClient(CWmlDispatcher* wmldispatcher) : + m_wmldispatcher(wmldispatcher), + m_loader(0), + m_contentType(0), + m_charset(0), + m_url(0), + m_error(0), + m_contentLength(0), + m_restLength(0), + m_httpStatus (0) +{ +} + +// ----------------------------------------------------------------------------- +// C++ destructor. +// ----------------------------------------------------------------------------- +WmlResourceLoaderClient::~WmlResourceLoaderClient( ) +{ + delete m_url; + delete m_contentType; + delete m_charset; +} + +void WmlResourceLoaderClient::start(TDesC8& url, Frame* frame) +{ + + WebCore::ResourceRequest* request = new WebCore::ResourceRequest(WebCore::String(url)); + m_loader = WebCore::WmlResourceLoader::create(frame, this); + + if (m_loader) { + m_loader->documentLoader()->addSubresourceLoader(m_loader); + m_loader->load(*request); + } +} + +void WmlResourceLoaderClient::stop() +{ + if (m_loader && !m_loader->isDone()) + m_loader->cancel(); +} + +void WmlResourceLoaderClient::cancelWithError(const WebCore::ResourceError& error) +{ + if (m_loader && !m_loader->isDone()) + m_loader->cancel(error); +} + +void WmlResourceLoaderClient::didReceiveResponse(const WebCore::ResourceResponse& response) +{ + int status = 200; + if(response.isHTTP()){ + status = response.httpStatusCode(); + } + + if (status < 200 || status >= 300) { + cancelWithError(WebCore::ResourceError(WebCore::String(response.url()), KErrGeneral, WebCore::String(response.url()), WebCore::String(response.httpStatusText()))); + return; + } + + delete m_contentType; + m_contentType = NULL; + + delete m_charset; + m_charset = NULL; + + delete m_url; + m_url = NULL; + + m_contentType = response.mimeType().des().AllocL(); + m_charset = response.textEncodingName().des().AllocL(); + + TPtrC myUrl = response.url().url().des(); + m_url = HBufC::New(myUrl.Length() + 1); + m_url->Des().Copy(myUrl); + m_url->Des().ZeroTerminate(); + + m_contentLength = response.expectedContentLength(); + m_httpStatus = status; + m_restLength = 0; +} + +void WmlResourceLoaderClient::didReceiveData(const char* data, int length, long long lengthReceived) +{ + //send data to wmlcontrol + TInt chunkIndex = 0; + if(m_contentLength > length && m_restLength){ + chunkIndex++; + } + + if (m_contentType && m_charset && m_url) { + m_wmldispatcher->WmlParameters( data, length, *m_contentType, *m_charset, m_httpStatus, chunkIndex, *m_url); + } + + m_restLength = m_contentLength - length; +} + +void WmlResourceLoaderClient::didFinishLoading() +{ + TInt chunkIndex = -1; // last chunk + if (m_contentType && m_charset && m_url) { + m_wmldispatcher->WmlParameters( NULL, 0, *m_contentType, *m_charset, m_httpStatus, chunkIndex, *m_url ); + } + m_wmldispatcher->HandleError(0,KErrCompletion); +} + +void WmlResourceLoaderClient::didFail(const WebCore::ResourceError& error) +{ + m_wmldispatcher->HandleError(0,error.errorCode()); +} + +void WmlResourceLoaderClient::didCancel(const WebCore::ResourceError& error) +{ + m_wmldispatcher->HandleError(0,error.errorCode()); +} + +// End of File +