blob: 0be870845dfa945389ec92ab5a834b490ae81075 [file] [log] [blame]
/* ------------------------------------------------------------------
* 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 HTTP_PARCOM_INTERNAL_H_
#define HTTP_PARCOM_INTERNAL_H_
#ifndef OSCL_REFCOUNTER_MEMFRAG_H_INCLUDED
#include "oscl_refcounter_memfrag.h"
#endif
///////////////////////////////////////////////////////////////////////////////////////
const char HTTP_CHAR_CR = 13;
const char HTTP_CHAR_LF = 10;
const char HTTP_CHAR_NULL = 0;
const char HTTP_CHAR_COLON = ':';
const char HTTP_CHAR_DOLLAR = '$';
const char HTTP_CHAR_SPACE = ' ';
const char HTTP_CHAR_SLASH = '/';
const char HTTP_CHAR_SEMICOLON = ';';
const char HTTP_CHAR_STAR = '*';
const char HTTP_CHAR_PLUS = '+';
const char HTTP_CHAR_MINUS = '-';
const char HTTP_CHAR_DOT = '.';
const char HTTP_CHAR_TAB = '\t';
const char HTTP_CHAR_COMMA = ',';
const char HTTP_CHAR_EQUAL = '=';
//An array of strings corresponding to HTTPMethod enum
static const char* const HTTPMethodString[] =
{
"GET", //METHOD_GET
"HEAD", //METHOD_HEAD
"POST", //METHOD_POST
"DELETE", //METHOD_DELETE
"LINK", //METHOD_LINK
"UNLINK", //METHOD_UNLINK
"OPTIONS", //METHOD_OPTIONS
"PUT", //METHOD_PUT
"TRACE", //METHOD_TRACE
"CONNECT", //METHOD_CONNECT
};
// The following structure is an extension of OsclMemoryFragment with a differentation between memory usage and memory capacity
struct HTTPMemoryFragment
{
void *iPtr;
uint32 iLen; // refer to the memory usage, initially (no memory use), len=0
uint32 iCapacity;
// constructor
HTTPMemoryFragment()
{
clear();
}
// copy constructor
HTTPMemoryFragment(const void *aPtr, const uint32 aCapacity) : iPtr((void *)aPtr), iLen(0), iCapacity(aCapacity)
{
;
}
// copy constructor
HTTPMemoryFragment(const OsclMemoryFragment &x)
{
iPtr = x.ptr;
iLen = 0;
iCapacity = x.len;
}
// operator "="
HTTPMemoryFragment& operator=(const HTTPMemoryFragment& rhs)
{
iPtr = rhs.iPtr;
iLen = rhs.iLen;
iCapacity = rhs.iCapacity;
return *this;
}
// operator "="
HTTPMemoryFragment& operator=(const OsclMemoryFragment& rhs)
{
iPtr = rhs.ptr;
iLen = 0;
iCapacity = rhs.len;
return *this;
}
// destructor
~HTTPMemoryFragment()
{
clear();
}
// clear
void clear()
{
oscl_memset(this, 0, sizeof(HTTPMemoryFragment));
}
// bind
void bind(const void *aPtr, const uint32 aCapacity)
{
iPtr = (void *)aPtr;
iLen = 0;
iCapacity = aCapacity;
}
void bind(const OsclMemoryFragment &x)
{
iPtr = x.ptr;
iLen = 0;
iCapacity = x.len;
}
// empty
bool empty()
{
return ((uint8 *)iPtr == NULL || (iCapacity == 0));
}
// get functions
void *getPtr()
{
return (void *)((uint8 *)iPtr + iLen);
}
uint32 getLen() const
{
return iLen;
}
uint32 getCapacity()
{
return iCapacity;
}
uint32 getAvailableSpace()
{
return iCapacity - iLen;
}
// update length
bool update(const uint32 aLength)
{
if (isSpaceEnough(aLength))
{
iLen += aLength;
return true;
}
return false;
}
bool update(const void *aPtr)
{
int32 aLen = (uint8*)aPtr - (uint8*)iPtr;
if (aLen < 0 || (uint32)aLen > iCapacity) return false;
iLen = aLen;
return true;
}
// is remaining space enough for the new memory usage
bool isSpaceEnough(uint32 aNewUsage)
{
return (iLen + aNewUsage <= iCapacity);
}
};
// wrap OsclMemoryFragment and add more functionalities
struct OsclMemoryFragWrapper
{
OsclMemoryFragment iMemFrag;
// constructor
OsclMemoryFragWrapper()
{
clear();
}
// copy constructers
OsclMemoryFragWrapper(const OsclMemoryFragWrapper &rhs)
{
iMemFrag.ptr = rhs.iMemFrag.ptr;
iMemFrag.len = rhs.iMemFrag.len;
}
OsclMemoryFragWrapper(const OsclMemoryFragment &rhs)
{
iMemFrag.ptr = rhs.ptr;
iMemFrag.len = rhs.len;
}
OsclMemoryFragWrapper(const void *aPtr, const uint32 aLen)
{
bind(aPtr, aLen);
}
// assignment Operator
OsclMemoryFragWrapper& operator= (const OsclMemoryFragment &x)
{
bind(x);
return *this;
}
OsclMemoryFragWrapper& operator= (OsclMemoryFragWrapper &x)
{
bind((const OsclMemoryFragment &)(x.get()));
return *this;
}
// clear
void clear()
{
iMemFrag.ptr = NULL;
iMemFrag.len = 0;
}
// empty
bool empty()
{
return (((uint8*)iMemFrag.ptr == NULL) || (iMemFrag.len == 0));
}
// bind
void bind(const void *aPtr, const uint32 aLen)
{
iMemFrag.ptr = (void *)aPtr;
iMemFrag.len = aLen;
}
void bind(const OsclMemoryFragment &aFrag)
{
iMemFrag.ptr = aFrag.ptr;
iMemFrag.len = aFrag.len;
}
// update
void update(const uint32 aLen)
{
iMemFrag.len = aLen;
}
void update(const void *aPtr)
{
iMemFrag.ptr = (void *)aPtr;
}
// get
OsclMemoryFragment &get()
{
return iMemFrag;
}
void *getPtr()
{
return iMemFrag.ptr;
}
uint32 getLen()
{
return iMemFrag.len;
}
};
// This class is based on OsclRefCounterMemFrag, but with the following change,
// memory fragment and its associated with reference counter can be updated any time
class RefCounterMemoryFragment
{
public:
// constructor
RefCounterMemoryFragment(OsclMemoryFragment &m, OsclRefCounter *r) :
iMemfrag(m), iRefcnt(r)
{
if (iRefcnt) iRefcnt->addRef();
}
RefCounterMemoryFragment(const void *aPtr, const uint32 aLen, OsclRefCounter *r) :
iMemfrag(aPtr, aLen), iRefcnt(r)
{
if (iRefcnt) iRefcnt->addRef();
}
// Copy constructor.
RefCounterMemoryFragment(const OsclRefCounterMemFrag &x) :
iMemfrag(((OsclRefCounterMemFrag &)x).getMemFrag()),
iRefcnt(((OsclRefCounterMemFrag &)x).getRefCounter())
{
if (iRefcnt) iRefcnt->addRef();
}
RefCounterMemoryFragment(const RefCounterMemoryFragment &x) :
iMemfrag(x.iMemfrag), iRefcnt(x.iRefcnt)
{
if (iRefcnt) iRefcnt->addRef();
}
// Default constructor.
RefCounterMemoryFragment()
{
iMemfrag.clear();
iRefcnt = 0;
}
// Assignment Operator
RefCounterMemoryFragment& operator= (const RefCounterMemoryFragment &x)
{
if (this == &x) return *this; // protect against self-assignment
bind((RefCounterMemoryFragment &)x);
return *this;
}
// Destructor
~RefCounterMemoryFragment()
{
if (iRefcnt) iRefcnt->removeRef();
}
bool empty()
{
return (iMemfrag.empty() && iRefcnt == NULL);
}
// get functions
// Returns a pointer to the contained reference counter object
OsclRefCounter* getRefCounter()
{
return iRefcnt;
}
// Returns a reference to the contained memory fragment
OsclMemoryFragment& getMemFrag()
{
return iMemfrag.get();
}
// Returns a pointer to the memory fragment data.
OsclAny* getMemFragPtr()
{
return iMemfrag.get().ptr;
}
// Returns the size of the memory fragment data which equals its filled size.
uint32 getMemFragSize()
{
return iMemfrag.get().len;
}
// Returns the reference counter's current count.
uint32 getCount()
{
return (iRefcnt) ? iRefcnt->getCount() : 0;
}
void getRefCountMemFrag(OsclRefCounterMemFrag &aFrag)
{
aFrag = OsclRefCounterMemFrag(iMemfrag.get(), iRefcnt, iMemfrag.getLen());
iRefcnt->addRef(); // have to add ref-count manually
}
// set functions
void bind(OsclMemoryFragment &m, OsclRefCounter *r)
{
if (iRefcnt) iRefcnt->removeRef(); // remove ref for current memfrag
iMemfrag = m;
iRefcnt = r;
if (iRefcnt) iRefcnt->addRef(); // add ref for new memfrag
}
void bind(OsclRefCounterMemFrag &x)
{
if (iRefcnt) iRefcnt->removeRef(); // remove ref for current memfrag
// copy assigned object
iMemfrag = x.getMemFrag();
iRefcnt = x.getRefCounter();
if (iRefcnt) iRefcnt->addRef(); // add ref for new memfrag
}
void bind(RefCounterMemoryFragment &x)
{
if (iRefcnt) iRefcnt->removeRef(); // remove ref for current memfrag
// copy assigned object
iMemfrag = x.iMemfrag;
iRefcnt = x.iRefcnt;
if (iRefcnt) iRefcnt->addRef(); // add ref for new memfrag
}
// update memory fragment with the same reference counter
void update(OsclMemoryFragment &m)
{
iMemfrag.bind(m);
}
void update(void *aPtr)
{
iMemfrag.update(aPtr);
}
void update(uint32 aLen)
{
iMemfrag.update(aLen);
}
private:
OsclMemoryFragWrapper iMemfrag;
OsclRefCounter *iRefcnt;
};
#endif // HTTP_PARCOM_INTERNAL_H_