/*
* 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

