OSCL_EXPORT_REF bool
RTSPOutgoingMessage::compose()
{



    // compose the first line
    //
    switch (msgType)
    {
        case RTSPResponseMsg:

        {
            // RTSP version
            //
            oscl_memcpy(fullRequestBuffer, RTSPVersionString, RTSPVersionString_len);
            fullRequestBufferSpace += RTSPVersionString_len;

            *(fullRequestBufferSpace++) = ' ';


            // Status code
            //
            oscl_snprintf(fullRequestBufferSpace, RTSP_MAX_FULL_REQUEST_SIZE - 1, "%d", statusCode);

            // resync the pointer and size used
            fullRequestBufferSizeUsed = oscl_strlen(fullRequestBufferSpace);
            fullRequestBufferSpace += fullRequestBufferSizeUsed;
            *(fullRequestBufferSpace++) = ' ';
            fullRequestBufferSizeUsed += 1 + RTSPVersionString_len + 1;

            if (0 != reasonString.length())
            {
                // user specified his own string
                //
                oscl_memcpy(fullRequestBufferSpace, reasonString.c_str(),
                            reasonString.length());

                fullRequestBufferSpace += reasonString.length();
                fullRequestBufferSizeUsed += reasonString.length();
            }
            else
            {
                StrPtrLen  realReasonString ;

                // user wants the built-in default
                //
                switch (statusCode)
                {
                    case CodeContinue:

                        realReasonString =  RtspReasonStringContinue;

                        break;

                    case CodeOK:

                        realReasonString =  RtspReasonStringOK;

                        break;

                    case CodeCreated:
                        realReasonString =  RtspReasonStringCreated;

                        break;

                    case CodeLowOnStorageSpace:
                        realReasonString =  RtspReasonStringLowOnStorageSpace;

                        break;

                    case CodeMultipleChoices:
                        realReasonString =  RtspReasonStringMultipleChoices;

                        break;

                    case CodeMovedPermanently:
                        realReasonString =  RtspReasonStringMovedPermanently;

                        break;

                    case CodeMovedTemporarily:
                        realReasonString =  RtspReasonStringMovedTemporarily;

                        break;

                    case CodeSeeOther:
                        realReasonString =  RtspReasonStringSeeOther;

                        break;

                    case CodeNotModified:
                        realReasonString =  RtspReasonStringNotModified;

                        break;

                    case CodeUseProxy:
                        realReasonString =  RtspReasonStringUseProxy;

                        break;

                    case CodeBadRequest:
                        realReasonString =  RtspReasonStringBadRequest;

                        break;

                    case CodeUnauthorized:
                        realReasonString =  RtspReasonStringUnauthorized;

                        break;

                    case CodePaymentRequired:
                        realReasonString =  RtspReasonStringPaymentRequired;

                        break;

                    case CodeForbidden:
                        realReasonString =  RtspReasonStringForbidden;

                        break;

                    case CodeNotFound:
                        realReasonString =  RtspReasonStringNotFound;

                        break;

                    case CodeMethodNotAllowed:
                        realReasonString =  RtspReasonStringMethodNotAllowed;

                        break;

                    case CodeNotAcceptable:
                        realReasonString =  RtspReasonStringNotAcceptable;

                        break;

                    case CodeProxyAuthenticationRequired:
                        realReasonString =
                            RtspReasonStringProxyAuthenticationRequired;

                        break;

                    case CodeRequestTimeOut:
                        realReasonString =  RtspReasonStringRequestTimeOut;

                        break;

                    case CodeGone:
                        realReasonString =  RtspReasonStringGone;

                        break;

                    case CodeLengthRequired:
                        realReasonString =  RtspReasonStringLengthRequired;

                        break;

                    case CodePreconditionFailed:
                        realReasonString =  RtspReasonStringPreconditionFailed;

                        break;

                    case CodeRequestEntityTooLarge:
                        realReasonString =
                            RtspReasonStringRequestEntityTooLarge;

                        break;

                    case CodeRequestURITooLarge:
                        realReasonString =  RtspReasonStringRequestURITooLarge;

                        break;

                    case CodeUnsupportedMediaType:
                        realReasonString =  RtspReasonStringUnsupportedMediaType;

                        break;

                    case CodeSessionNotFound:
                        realReasonString =  RtspReasonStringSessionNotFound;

                        break;

                    case CodeMethodNotValidInThisState:
                        realReasonString =  RtspReasonStringMethodNotValidInThisState;

                        break;

                    case CodeHeaderFieldNotValidForResource:
                        realReasonString =
                            RtspReasonStringHeaderFieldNotValidForResource;

                        break;

                    case CodeInvalidRange:
                        realReasonString =  RtspReasonStringInvalidRange;

                        break;

                    case CodeParameterIsReadOnly:
                        realReasonString =  RtspReasonStringParameterIsReadOnly;

                        break;

                    case CodeAggregateOperationNotAllowed:
                        realReasonString =
                            RtspReasonStringAggregateOperationNotAllowed;

                        break;

                    case CodeOnlyAggregateOperationAllowed:
                        realReasonString =
                            RtspReasonStringOnlyAggregateOperationAllowed;

                        break;

                    case CodeUnsupportedTransport:
                        realReasonString =  RtspReasonStringUnsupportedTransport;

                        break;

                    case CodeDestinationUnreachable:
                        realReasonString =  RtspReasonStringDestinationUnreachable;

                        break;

                    case CodeUnsupportedClient:
                        realReasonString =  RtspReasonStringUnsupportedClient;

                        break;

                    case CodeInternalServerError:
                        realReasonString =  RtspReasonStringInternalServerError;

                        break;

                    case CodeNotImplemented:
                        realReasonString =  RtspReasonStringNotImplemented;

                        break;

                    case CodeBadGateway:
                        realReasonString =  RtspReasonStringBadGateway;

                        break;

                    case CodeServiceUnavailable:
                        realReasonString =  RtspReasonStringServiceUnavailable;

                        break;

                    case CodeGatewayTimeout:
                        realReasonString =  RtspReasonStringGatewayTimeout;

                        break;

                    case CodeRTSPVersionNotSupported:
                        realReasonString =  RtspReasonStringRTSPVersionNotSupported;

                        break;

                    case CodeOptionNotSupported:
                        realReasonString =  RtspReasonStringOptionNotSupported;

                        break;

                    case CodeParameterNotUnderstood:
                        realReasonString =  RtspReasonStringParameterNotUnderstood;

                        break;

                    default:
                        // no string was found, since code is unknown...
                        ;;;
                }

                if (realReasonString.length())
                {
                    oscl_memcpy(fullRequestBufferSpace, realReasonString.c_str(), realReasonString.length());

                    fullRequestBufferSpace += realReasonString.length();
                    fullRequestBufferSizeUsed += realReasonString.length();
                }
            }

            break;
        }


        case RTSPRequestMsg:
        {
            if (METHOD_BINARY_DATA == method)
            { // it's interleaved stuff

                // leading dollar
                *(fullRequestBufferSpace++) = CHAR_DOLLAR;

                // 8-bit channel-id from the content-type
                *(fullRequestBufferSpace++) = contentType.c_str()[0];

                // 16-bit content length, in network byte order
                *(fullRequestBufferSpace++) = char((contentLength & 0xFF00) >> 8);
                *(fullRequestBufferSpace++) = char((contentLength & 0xFF));

                *fullRequestBufferSpace = CHAR_NULL;

                fullRequestBufferSizeUsed = 4;

                fullRequestPLS = fullRequestBuffer;

                return true;
            }

            // okay, it's a normal request

            // do the method
            if (method < 0 || method >= METHOD_NUM_ENTRIES)
            { // method unknown
                return false;
            }

            uint32 method_strlen = oscl_strlen(RtspMethodStringPLSS[method]);
            oscl_memcpy(fullRequestBufferSpace,
                        RtspMethodStringPLSS[method],
                        method_strlen
                       );
            fullRequestBufferSpace += method_strlen;
            *(fullRequestBufferSpace++) = CHAR_SPACE;
            fullRequestBufferSizeUsed += method_strlen + 1;

            // do the URI

            oscl_memcpy(fullRequestBufferSpace,
                        originalURI.c_str(),
                        originalURI.length()
                       );
            fullRequestBufferSpace += originalURI.length();
            *(fullRequestBufferSpace++) = CHAR_SPACE;
            fullRequestBufferSizeUsed += originalURI.length() + 1;

            // do the RTSP version
#ifdef SIMPLE_HTTP_SUPPORT
            if ((method == METHOD_GET) || (method == METHOD_POST))
            {
                oscl_memcpy(fullRequestBufferSpace,
                            HTTPVersion_1_0_String,
                            HTTPVersionString_len
                           );
            }
            else
#endif
                oscl_memcpy(fullRequestBufferSpace,
                            RTSPVersionString,
                            RTSPVersionString_len
                           );
            fullRequestBufferSpace += RTSPVersionString_len;
            fullRequestBufferSizeUsed += RTSPVersionString_len;

            break;
        }

        default:
        {	// cannot encode an unknown type of message

            return false;
        }
    }
OSCL_EXPORT_REF bool compose_range_string(char *str, unsigned int max_len,
        const AbsTimeFormat& abs_range,
        int& len_used)
{
    len_used = 0;
    int length;


    char tmp[17];

    if (max_len < 16)
    {
        return false;
    }

    length = oscl_snprintf(tmp, 17, "%04d%02d%02dT%02d%02d%02d",
                           abs_range.year, abs_range.month, abs_range.day,
                           abs_range.hours, abs_range.min, abs_range.sec);

    if (length != 15)
    {
        return false;
    }

    oscl_memcpy(str, tmp , length);
    str += length;
    len_used += length;
    max_len -= length;

    if (abs_range.frac_sec > 0.0)
    {
        if (abs_range.frac_sec >= 1.0)
        {
            return false;
        }
        char tmpstr[MAX_RANGE_FLOAT_SIZE + 2];
        length = oscl_snprintf(tmpstr, MAX_RANGE_FLOAT_SIZE + 2, RANGE_FLOAT_FORMAT,
                               abs_range.frac_sec);
        if (length < 0 || length > MAX_RANGE_FLOAT_SIZE + 1)
        {
            return false;
        }
        if (length > (int)max_len || tmp[1] != '.')
        {
            return false;
        }

        oscl_memcpy(str, tmp + 1, length - 1);
        str += length - 1;
        len_used += length - 1;
        max_len -= (length - 1);
    }

    if (max_len < 1)
    {
        return false;
    }

    *str = 'Z';
    len_used++;

    return true;

}
OSCL_EXPORT_REF bool compose_range_string(char *str, unsigned int max_len,
        const NptTimeFormat& npt_range,
        int& len_used)
{
    len_used = 0;
    int length;


    switch (npt_range.npt_format)
    {
        case NptTimeFormat::NOW:
        {
            StrPtrLen now_str("now");
            if ((int)max_len < now_str.length())
            {
                return false;
            }
            oscl_memcpy(str, now_str.c_str(), now_str.length());
            str += now_str.length();
            len_used += now_str.length();
            max_len -= now_str.length();
            break;
        }

        case NptTimeFormat::NPT_SEC:
        {
            char tmpstr[MAX_RANGE_INT_SIZE + 1];
            length = oscl_snprintf(tmpstr, MAX_RANGE_INT_SIZE + 1, "%d",
                                   npt_range.npt_sec.sec);
            if (length < 0 || length > MAX_RANGE_INT_SIZE)
            {
                return false;
            }
            if (length > (int) max_len)
            {
                return false;
            }
            oscl_memcpy(str, tmpstr, length);
            str += length;
            len_used += length;
            max_len -= length;
            if (npt_range.npt_sec.milli_sec > 0.0)
            {
                if (npt_range.npt_sec.milli_sec >= 1.0)
                {
                    return false;
                }
                char tmp[MAX_RANGE_FLOAT_SIZE + 2];
                length = oscl_snprintf(tmp, MAX_RANGE_FLOAT_SIZE + 2, RANGE_FLOAT_FORMAT,
                                       npt_range.npt_sec.milli_sec);
                if (length < 0 || length > MAX_RANGE_FLOAT_SIZE + 1)
                {
                    return false;
                }
                if (length > (int)max_len || tmp[1] != '.')
                {
                    return false;
                }

                oscl_memcpy(str, tmp + 1, length - 1);
                str += length - 1;
                len_used += length - 1;
                max_len -= (length - 1);
            }

            break;
        }

        case NptTimeFormat::NPT_HHMMSS:
        {
            char tmpstr[MAX_RANGE_INT_SIZE + 1];
            length = oscl_snprintf(tmpstr, MAX_RANGE_INT_SIZE + 1, "%d",
                                   npt_range.npt_hhmmss.hours);
            if (length < 0 || length >= MAX_RANGE_INT_SIZE)
            {
                return false;
            }
            if (length > (int) max_len)
            {
                return false;
            }
            oscl_memcpy(str, tmpstr, length);
            str += length;
            len_used += length;
            max_len -= length;

            if (max_len < 6)
            {
                return false;
            }

            length = oscl_snprintf(tmpstr, MAX_RANGE_INT_SIZE + 1, ":%02d:%02d",
                                   npt_range.npt_hhmmss.min, npt_range.npt_hhmmss.sec);
            if (length != 6)
            {
                return false;
            }

            oscl_memcpy(str, tmpstr, length);
            str += length;
            len_used += length;
            max_len -= length;


            if (npt_range.npt_hhmmss.frac_sec > 0.0)
            {
                if (npt_range.npt_hhmmss.frac_sec >= 1.0)
                {
                    return false;
                }
                char tmp[MAX_RANGE_FLOAT_SIZE + 2];
                length = oscl_snprintf(tmp, MAX_RANGE_FLOAT_SIZE + 2, RANGE_FLOAT_FORMAT,
                                       npt_range.npt_hhmmss.frac_sec);
                if (length < 0 || length > MAX_RANGE_FLOAT_SIZE + 1)
                {
                    return false;
                }
                if (length > (int) max_len || tmp[1] != '.')
                {
                    return false;
                }

                oscl_memcpy(str, tmp + 1, length - 1);
                str += length - 1;
                len_used += length - 1;
                max_len -= (length - 1);
            }

            break;
        }

    }

    return true;

}
OSCL_EXPORT_REF bool compose_range_string(char *str, unsigned int max_len,
        const SmpteTimeFormat& smpte_range,
        int& len_used)
{
    len_used = 0;
    int length;


    char tmp[10];

    if (max_len < 8)
    {
        return false;
    }

    length = oscl_snprintf(tmp, 9, "%02d:%02d:%02d", smpte_range.hours,
                           smpte_range.minutes, smpte_range.seconds);

    if (length != 8)
    {
        return false;
    }

    oscl_memcpy(str, tmp , length);
    str += length;
    len_used += length;
    max_len -= length;

    if (smpte_range.frames)
    {
        if (max_len < 3)
        {
            return 0;
        }
        length = oscl_snprintf(tmp, 4, ":%02d", smpte_range.frames);
        if (length != 3)
        {
            return false;
        }

        oscl_memcpy(str, tmp , length);
        str += length;
        len_used += length;
        max_len -= length;
    }

    if (smpte_range.subframes)
    {
        if (max_len < 3)
        {
            return 0;
        }
        length = oscl_snprintf(tmp, 4, ".%02d", smpte_range.subframes);
        if (length != 3)
        {
            return false;
        }

        oscl_memcpy(str, tmp , length);
        str += length;
        len_used += length;
        max_len -= length;
    }

    return true;

}
OSCL_wHeapString<OsclMemAllocator> MovieHeaderAtom::convertTimeToDate(uint32 time)
{
    OSCL_HeapString<OsclMemAllocator> date;

    char buf[64];

    int32 numDaysInMonth[12] =
        {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    int32 numDaysInMonthLeap[12] =
        {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    int32 refYear = 1904;

    // (365*4 + 1) * 24 * 3600
    int32 numSecsInABlkofFourYears = 126230400;

    // 365*24*3600
    int32 numSecInYear = 31536000;

    int32 numBlksOfFour = (time / numSecsInABlkofFourYears);

    int32 leftOverSecs = (time - (numBlksOfFour * numSecsInABlkofFourYears));

    int32 leftOverYears = 0;
    int32 year    = 0;
    int32 numDays = 0;
    int32 numHrs  = 0;
    int32 numMins = 0;
    int32 month   = 0;
    int32 milliSecs = 0;

    if (leftOverSecs > numSecInYear)
    {
        /*To take in to consideration at least 1 year among the number of years
         as leap among leftOverYear*/

        leftOverSecs -= (24 * 3600);

        leftOverYears = (leftOverSecs / numSecInYear);

        leftOverSecs -= (leftOverYears * numSecInYear);


        numDays = (uint16)(leftOverSecs / (24 * 3600));

        leftOverSecs -= (numDays * 24 * 3600);


        for (uint32 i = 0; i < 12; i++)
        {
            if (numDays >= numDaysInMonth[i])
            {
                numDays = (numDays - numDaysInMonth[i]);
            }
            else
            {
                month = (i + 1);
                break;
            }
        }


    }
    else
    {
        numDays = (leftOverSecs / (24 * 3600));

        leftOverSecs -= (numDays * 24 * 3600);

        for (int32 i = 0; i < 12; i++)
        {
            if (numDays >= numDaysInMonthLeap[i])
            {
                numDays = (numDays - numDaysInMonthLeap[i]);
            }
            else
            {
                month = (i + 1);
                break;
            }
        }

    }

    // Considering a situation where by the date is 1st Jan of any year
    // the leftOverSecs would be less than the sec available in a day resulting numDays
    // as 0, however that is 1st Jan from user perspective. So a day adjustment factor
    // is added into numDays.


    numDays += ADJUST_DAY_COUNT_USER_PERSPECTIVE_FOR_FIRST_DAY_OF_YEAR;



    numHrs = (leftOverSecs / 3600);

    leftOverSecs -= (numHrs * 3600);

    numMins = (leftOverSecs / 60);

    leftOverSecs -= (numMins * 60);

    year = (refYear + (numBlksOfFour * 4) + leftOverYears);

    oscl_snprintf(buf,
                  256,
                  "%04d%02d%02dT%02d%02d%02d.%03dZ",
                  year, month, numDays, numHrs,
                  numMins, leftOverSecs, milliSecs);

    date += buf;

    /* convert to unicode */
    uint32 wDateBufLen = 64 * sizeof(oscl_wchar);
    oscl_wchar wDate[64*sizeof(oscl_wchar)];
    oscl_memset((OsclAny*)wDate, 0, wDateBufLen);
    oscl_UTF8ToUnicode(date.get_cstr(),
                       (int32)(date.get_size()),
                       wDate,
                       (int32)(wDateBufLen));

    OSCL_wHeapString<OsclMemAllocator> wDateStr;
    wDateStr += wDate;

    return (wDateStr);
}