/* ------------------------------------------------------------------
 * Copyright (C) 1998-2009 PacketVideo
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 * -------------------------------------------------------------------
 */
#ifndef PVRTSP_CLIENT_ENGINE_UTILS_H
#define PVRTSP_CLIENT_ENGINE_UTILS_H
//#include "pvrtsp_client_engine_utils.h"

#ifndef OSCL_BASE_H_INCLUDED
#include "oscl_base.h"
#endif

#ifndef OSCL_STDSTRING_H_INCLUDED
#include "oscl_stdstring.h"
#endif

#ifndef OSCL_UTF8CONV_H
#include "oscl_utf8conv.h"
#endif

#ifndef OSCL_ERROR_CODES_H_INCLUDED
#include "oscl_error_codes.h"
#endif

#ifndef OSCL_STRING_H_INCLUDED
#include "oscl_string.h"
#endif

#define MAX_LONG_TEXT_LEN 1024

typedef enum
{
    CONCATENATE,
    REPLACE_PATH,
    REPLACE_HOST,
    UNKNOWN
} URLType;

const char FWD_SLASH = '/';
const char COLON = ':';
const char DOT = '.';


/*
*Function   : bool composeURL(char *baseURL, char *relativeURL, char *completeURL)
*Parameters : char *baseURL       - input parameter, needs to be NULL terminated
*             char *relativeURL   - input parameter, needs to be NULL terminated
*             char *completeURL   - output parameter, will be NULL terminated
*             int completeURLLen  - input/output parameter
*Date       : 06/03/2002
*Description: This function composes a URL using a base URL and relative URL. It is based
*             on RFC 2396 and supports a sub-set of the exhaustive list of relative URL
*             specified in the document. It does not support relative URLs that begin
*             with a "." or those that contain a ":" in them.
*             No memory is allocated inside the function. The caller of this function
*             must take care of all memory allocation/deallocation for the parameters
*             passed to this function.
*Output     : This function returns TRUE or FALSE based on a successful
*             composition or not. In case of successful composition, the complete URL
*             is returned in the third parameter.
*/
bool composeURL(const char *baseURL, const char *relativeURL, \
                char *completeURL, unsigned int &completeURLLen);

/*
 * Function   : const char* findRelativeURL(const char *aURL)
 * Parameters : const char *aURL - input parameter
 * Date       : 10/05/2006
 * Description: This function finds the relative URL within the aURL, including the forward slash. Returns NULL if NOT found.
 * Output     : The relative URL or NULL.
 */
const char* findRelativeURL(const char *aURL);

/*
*Function   : URLType findRelativeURLType(char *relativeURL)
*Parameters : char *relativeURL   - input parameter, needs to be NULL terminated
*Date       : 06/03/2002
*Description: This function looks at the relative URL and determines what type of
*             operation needs to be performed to compose the complete URL.
*Output     : This function returns the URL type. The return values are of the
*             enumerated type URLType with values
*             CONCATENATE, REPLACE_PATH, REPLACE_HOST, UNKNOWN
*/
URLType findRelativeURLType(const char *relativeURL);

/*
 * Function   : void dropTextAfterLastSlash(char *copyOfBaseURL)
 * Parameters : char *copyOfBaseURL - input/output parameter
 * Date       : 06/03/2002
 * Description: This function drops text after the last "/" in the URL(if any).
 * Output     : The modified URL is pointed to by the input parameter.
 */
void dropTextAfterLastSlash(char *copyOfBaseURL);

/*
 * Function   : void dropTextAfterFirstSlash(char *copyOfBaseURL)
 * Parameters : char *copyOfBaseURL - input/output parameter
 * Date       : 06/03/2002
 * Description: This function drops text after the first "/" in the URL(if any).
 * Output     : The modified URL is pointed to by the input parameter.
 */
void dropTextAfterFirstSlash(char *copyOfBaseURL);

/*
 * Function   : OSCL_String& generatePseudoUUID(void)
 * Parameters : OSCL_String& aUUID - input/output parameter
 * Date       : 03/27/2006
 * Description: This function generate a pseudo UUID string.
 * Output     : The pseudo UUID string like 6e31c837-b458-4c27-b290-73805cb08da1.
 */
bool generatePseudoUUID(OSCL_String& aUUID);

#endif  //PVRTSP_CLIENT_ENGINE_UTILS_H
