/*
* Copyright (c) 2003 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:  C interface to url loader
*
*/


#ifndef URLLOADERINT_H
#define URLLOADERINT_H

//  INCLUDES
#include "nwx_ctx.h" // this file includes nwx_defs.h, which includes nwx_status.h
#include "urlloader_urlresponse.h"
#include "BrsrStatusCodes.h"


#ifdef __cplusplus
extern "C" {
#endif
    
// CONSTANTS
    
#define NW_NUM_INSTANCES 3


// MACROS
    
// DATA TYPES
    
// The "TEnterStatus", relates to what security state the page is going to.
// This "page loading" status, is passed in HandleBrowserLoadEventL() using the
// TBrCtlLoadEvent enum. (see BrCtlDefs.h)  
// These constants must stay in sync with viewshellobserver.h
//R

enum TEnterStatus
    {
    EEnteringSecurePage,
    EExitingSecurePage,
    ESomeItemsNotSecure,
    ESubmittingToNonSecurePage,
    ERedirectConfirmation,
    ERepostConfirmation,
    ESecureItemInNonSecurePage
    // others to come        
    };

// The following schemes are only those supported by the browser
typedef enum
    {
    ESchemeInvalid,
    ESchemeUnknown,
    ESchemeHttps,
    ESchemeMailto,
    ESchemeFile,
    ESchemeHttp,
    ESchemeWtai,
    ESchemeTel
} TUrlLoaderScheme;
    
// Structure for holding context data
typedef struct
    {
  void *uniqueNum[NW_NUM_INSTANCES+1];
  void *contexts[NW_NUM_INSTANCES+1] [NW_NUM_CONTEXTS+1];
} NW_ContextArray_t;

// Structure for holding extra request headers information
typedef struct
    {
	NW_Uint8* accept;
	NW_Uint8* contentType;
	NW_Uint8* referer;
	NW_Uint8* boundary;
	NW_Uint32 contentLength;
    NW_Uint8* expectedContentType;
    } HttpRequestHeaders;
    
typedef enum
    {
	ECookieFilter,
	ECacheFilter
    } TFilters;
    
// FUNCTION PROTOTYPES
    
// FORWARD DECLARATIONS
    
// CLASS DECLARATION
    
/**
* Cancel all the pending requests due to a disconnect request.
*/
void UrlLoader_Disconnect();

/**
* Cancel a specific request, identified by its id.
*/
void UrlLoader_Cancel(NW_Uint16 aTid);

/**
* Cancel all requests.
*/
void UrlLoader_CancelAll();

/**
* Check if a specific url is in cache.
*/
NW_Bool UrlLoader_IsUrlInCache(NW_Ucs2* aUrl);

/**
* Get the number of entries in cache.
*/
NW_Uint32 UrlLoader_GetNumCacheEntries();

/**
* Remove all the cached items.
*/
NW_Uint32 UrlLoader_ClearCache();

/**
* Remove a specific item from cache, identified by its url.
*/
TBrowserStatusCode UrlLoader_ClearItemInCache(const NW_Ucs2* aUrl);

/**
* Set a header on a specic item, identified by its url.
*/
TBrowserStatusCode UrlLoader_SetHeaderInCache(const NW_Ucs2* aUrl,
                                              unsigned char* aName,
                                              NW_Ucs2* aValue);

/**
* Remove all the cookies.
*/
NW_Uint32 UrlLoader_ClearCookies();

/**
* Free the loaders and close the session to the http stack.
*/
void UrlLoader_Shutdown();

/**
* Make a load request to the loaders.
* aUrl The request URL
* aHeader The request headers or NULL if no request specific headers.
* aData The body of the request.
* aDataLen The body length of the request.
* aMethod The method to use for the request could be
*		  NW_URL_METHOD_GET or NW_URL_METHOD_POST.
* aTransId The request's transaction id.
* aLoadContext The load context that should be returned with the response.
* aPartialLoadCallback The callback to call when a chunk is ready.
* aCacheMode The cache mode, it is relevant only in case of http or https.
* aDefaultHeadersMask A flag indicating what default headers should be used.
* loadType The load type
* aIsTopLevel Boolean ETrue if page is top level (images, css, etc are not top)
* aIsScript Boolean ETrue if Request is being made by script.
*/
TBrowserStatusCode UrlLoader_Request(const NW_Ucs2* aUrl,
                                     void* aHeader,
                                     NW_Uint8* aData,
                                     NW_Uint32 aDataLen,
                                     NW_Uint8 aMethod,
                                     NW_Uint16* aTransId,
                                     void* aLoadContext,
                                     NW_Url_RespCallback_t* aLoadCallback,
                                     NW_Cache_Mode_t aCacheMode,
                                     NW_Uint32 aDefaultHeadersMask,
                                     NW_Uint8 loadType,
                                     NW_Bool aIsTopLevel,
                                     NW_Bool aIsScript,
                                     NW_Uint8 aReason,
                                     void* aLoadData);

/**
* Create a HttpHeaders structure with some or all of the following arguments.
* Each field can contain a value, or can be NULL.
* aAccept The accept header
* aContentType The content type of the request body
* aReferer The referer
* aBoundary The boundry if it is a multipart
* aContentLength The length of the request body
*/
void* UrlLoader_HeadersNew(const NW_Uint8* aAccept,
						   const NW_Uint8* aContentType,
						   const NW_Ucs2* aReferer,
						   const NW_Uint8* aBoundary,
						   NW_Uint32 aContentLength,
                           const NW_Uint8* aExpectedContentType);

/**
* Free the headers structure.
*/
void UrlLoader_HeadersFree(void* aHeaders);

/**
* Copy the headers.
*/
void* UrlLoader_HeadersCopy(const void* aHeaders);

/**
* Load / Unload filter specified by UID.
*/
void UrlLoader_ChangeFilterLoadStatusL(TFilters aFilter, NW_Bool aLoad);

/**
* Update security status on the UrlLoader
*/
void UrlLoader_UpdateSecurityStatus(TBrowserStatusCode aLoadStatus,
                                    NW_Url_Resp_t* aResponse);

/**
* Determine the scheme of the URL.
*/
TUrlLoaderScheme UrlLoader_FindUrlScheme(const NW_Ucs2* aUrl);

/**
* Determine if the URL is handled by the browser.
*/
NW_Bool UrlLoader_IsBrowserScheme(const NW_Ucs2* aUrl);

/**
* Set Internet Access Point id to use for connection
*/
void UrlLoader_SetIAPid(NW_Uint32 aIapId);

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif      // URLLOADERINT_H

// End of File
