blob: 8112a87098f44cbef97abc818437c63d8855281b [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 2008 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
#include "pvrtsp_client_engine_utils.h"
#endif
#include "oscl_mem.h"
#include "oscl_mem_basic_functions.h"
bool composeURL(const char *baseURL, const char *relativeURL, char *completeURL, unsigned int &completeURLLen)
{
char* copyOfBaseURL = OSCL_ARRAY_NEW(char, 8 * MAX_LONG_TEXT_LEN);
if (NULL == copyOfBaseURL)
{
return false;
}
URLType urlType = findRelativeURLType(relativeURL);
switch (urlType)
{
case CONCATENATE:
{
int len = oscl_strlen(baseURL);
oscl_strncpy(copyOfBaseURL, baseURL, (len + 1));
//JJ 12/04/06
//dropTextAfterLastSlash(copyOfBaseURL);
if ((copyOfBaseURL[len-1] != '/') && (len > 0))
{
copyOfBaseURL[len] = '/';
copyOfBaseURL[len+1] = 0;
len++;
}
if (completeURLLen <= (len + oscl_strlen(relativeURL)))
{
OSCL_ARRAY_DELETE(copyOfBaseURL);
return false;
}
oscl_strncpy(completeURL, copyOfBaseURL, (oscl_strlen(copyOfBaseURL) + 1));
oscl_strcat(completeURL, relativeURL);
completeURLLen = oscl_strlen(completeURL);
break;
}
case REPLACE_PATH:
{
oscl_strncpy(copyOfBaseURL, baseURL, (oscl_strlen(baseURL) + 1));
//JJ 12/04/06
//dropTextAfterFirstSlash(copyOfBaseURL);
if (completeURLLen <= (oscl_strlen(copyOfBaseURL) + oscl_strlen(relativeURL)))
{
OSCL_ARRAY_DELETE(copyOfBaseURL);
return false;
}
oscl_strncpy(completeURL, copyOfBaseURL, (oscl_strlen(copyOfBaseURL) + 1));
oscl_strcat(completeURL, relativeURL);
completeURLLen = oscl_strlen(completeURL);
break;
}
case REPLACE_HOST:
{
const char RTSP[] = "rtsp:";
if (completeURLLen > (oscl_strlen(RTSP) + oscl_strlen(relativeURL)))
{
oscl_strncpy(completeURL, RTSP, (oscl_strlen(RTSP) + 1));
oscl_strcat(completeURL, relativeURL);
completeURLLen = oscl_strlen(completeURL);
}
else
{
OSCL_ARRAY_DELETE(copyOfBaseURL);
return false;
}
break;
}
case UNKNOWN:
{
OSCL_ARRAY_DELETE(copyOfBaseURL);
return false;
// break; This statement was removed to avoid compiler warning for Unreachable Code
}
}
if (copyOfBaseURL)
OSCL_ARRAY_DELETE(copyOfBaseURL);
return true;
}
const char* findRelativeURL(const char *aURL)
{
int i = 0;
while (aURL[i] != '\0')
{
if (aURL[i] == FWD_SLASH)
{
if (aURL[i+1] != FWD_SLASH)
{
return &(aURL[i]);
}
else
{// "//"
i++;
}
}
i++;
}
return NULL;
}
URLType findRelativeURLType(const char *relativeURL)
{
if ((FWD_SLASH == relativeURL[0]) && (FWD_SLASH == relativeURL[1]))
{
return REPLACE_HOST;
}
else if ((FWD_SLASH == relativeURL[0]) && (FWD_SLASH != relativeURL[1]))
{
return REPLACE_PATH;
}
else if ((oscl_strstr(relativeURL, &COLON) != NULL) || (DOT == relativeURL[0]))
{
return UNKNOWN;
}
else
{
return CONCATENATE;
}
}
void dropTextAfterLastSlash(char *copyOfBaseURL)
{
int textLen = oscl_strlen(copyOfBaseURL) - 1;
for (int ii = textLen; ii > 0; ii--)
{
if ((FWD_SLASH == copyOfBaseURL[ii]) && (ii == textLen))
{
return;
}
else if ((FWD_SLASH != copyOfBaseURL[ii-1]) &&
(FWD_SLASH == copyOfBaseURL[ii]) &&
(FWD_SLASH != copyOfBaseURL[ii+1]))
{
copyOfBaseURL[ii+1] = '\0';//NULL;
return;
}
}
//We reach this point only if we a base URL that is not terminated with a '/'.
//So, we need to append '/' to the string.
if (8*MAX_LONG_TEXT_LEN >= (textLen + 2))
{
copyOfBaseURL[textLen+1] = FWD_SLASH;
copyOfBaseURL[textLen+2] = '\0';//NULL;
}
return;
}
void dropTextAfterFirstSlash(char *copyOfBaseURL)
{
int textLen = oscl_strlen(copyOfBaseURL);
int ii;
for (ii = 1; ii < textLen - 1; ii++)
{
if ((FWD_SLASH != copyOfBaseURL[ii-1]) &&
(FWD_SLASH == copyOfBaseURL[ii]) &&
(FWD_SLASH != copyOfBaseURL[ii+1]))
{
copyOfBaseURL[ii] = '\0';//NULL;
return;
}
}
//We reach this point if we were not able to find a '/' in the end of the clip.
if (FWD_SLASH == copyOfBaseURL[ii])
{
copyOfBaseURL[ii] = '\0';//NULL;
}
return;
}
#ifndef OSCL_TIME_H_INCLUDED
#include "oscl_time.h"
#endif
#if (!defined(MD5_H) && defined(SDK_HAS_REAL_HTTP_CLOAKING_SUPPORT))
#include "md5.h"
#endif
#ifndef OSCL_SNPRINTF_H_INCLUDED
#include "oscl_snprintf.h"
#endif
#ifndef OSCL_STRING_CONTAINERS_H_INCLUDED
#include "oscl_string_containers.h"
#endif
bool generatePseudoUUID(OSCL_String& aUUID)
{
#ifdef SDK_HAS_REAL_HTTP_CLOAKING_SUPPORT
//6e31c837-b458-4c27-b290-73805cb08da1
TimeValue current_time;
current_time.set_to_current_time();
uint32 seed_1 = current_time.get_sec();
uint32 seed_2 = current_time.get_usec();
MD5 myMD5;
myMD5.add((const uint8 *)(&seed_1), sizeof(seed_1));
myMD5.add((const uint8 *)(&seed_2), sizeof(seed_2));
MD5OctetHashValue md5output;
myMD5.compute_hash(md5output);
const int MAX_UUID_BUFSIZE = 64;
char buffer[MAX_UUID_BUFSIZE+1];
{
const char hex[] = "0123456789abcdef";
char *ptr = buffer;
for (uint32 i = 0, j = 0; i < 16; i++)
{
ptr[j++] = hex[md5output.hash_array[i] >> 4];
ptr[j++] = hex[md5output.hash_array[i] & 0x0f];
if ((j == 8) || (j == 13) || (j == 18) || (j == 23))
ptr[j++] = '-';
ptr[j] = '\0';
}
}
aUUID = buffer;
#else
aUUID = NULL;
#endif
return true;
}