videofeeds/mrssplugin/src/ciptvxmldatetime.cpp
changeset 0 96612d01cf9f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videofeeds/mrssplugin/src/ciptvxmldatetime.cpp	Mon Jan 18 20:21:12 2010 +0200
@@ -0,0 +1,503 @@
+/*
+* Copyright (c) 2005-2008 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:    Utility class and constants used by Iptv application.*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <e32base.h>
+
+#include "ciptvxmldatetime.h"
+#include "ciptvxmlconsts.h"
+#include "IptvDebug.h"
+
+_LIT( KIptvEmptyDes, "" );
+
+// --------------------------------------------------------------------------
+// Parse GMT time.
+// --------------------------------------------------------------------------
+//
+void CIptvXmlDateTime::ParseGmtL( const HBufC* aBuffer, TTime& aTime )
+    {
+    IPTVLOGSTRING_LOW_LEVEL(
+        "RSS Plugin::CIptvXmlContentHandler::ParseGmtL" );
+
+    TBool success( EFalse );
+    TInt index( KErrNotFound );
+    TInt gmtIndex( KErrNotFound );
+    TInt gmtLength( KErrNotFound );
+
+    if ( !aBuffer )
+        {
+        User::Leave( KErrArgument );
+        }
+    else
+        {
+        TInt bufLength = aBuffer->Length();
+        index = aBuffer->Locate( ',' );
+        gmtIndex = aBuffer->LocateReverse( ' ' );
+        gmtLength = bufLength - gmtIndex;
+
+        if ( ( index != KErrNotFound ) && ( gmtIndex != KErrNotFound ) )
+            {
+            success = ETrue;
+            }
+        }
+
+    TInt parseStatus( KErrNone );
+
+    if ( success )
+        {
+        // Time shifting from GMT
+        TInt hourShift = 0;
+
+        // Get zone
+        HBufC* zone = HBufC::NewLC( gmtLength );
+        TPtr16 zonePtr = zone->Des();
+        zonePtr.Copy( aBuffer->Mid( gmtIndex, gmtLength ) );
+        zonePtr.Trim();
+
+        // Get hour shift from time zone.
+        hourShift = GetHourShiftFromZone( zonePtr );
+        IPTVLOGSTRING2_LOW_LEVEL(
+            "RSS Plugin::CIptvXmlContentHandler::ParseGmtL Hour shift from time zone = %d",
+            hourShift );
+
+        // Do we increment or decrement from time zone.
+        gmtLength = zonePtr.Length();
+        TBuf<KIptvShiftNumberMaxCount > temp;
+        TBool add = ETrue;
+        for ( TInt i = 0; i < gmtLength; i++ )
+            {
+            //lint -e{961} Else block not needed, other characters ignored.
+            if ( TChar( zonePtr[i] ).IsDigit() )
+                {
+                if ( KIptvShiftNumberMaxCount > temp.Length() )
+                    {
+                    temp.Append( zonePtr[i] );
+                    }
+                }
+            else if ( zonePtr[i] == '+' )
+                {
+                add = ETrue;
+                }
+            else if ( zonePtr[i] == '-' )
+                {
+                add = EFalse;
+                }
+            }
+
+        // Additional shift
+        TInt additionalHourShift = 0;
+        TInt additionalMinuteShift = 0;
+        TInt shiftLength = temp.Length();
+        TBuf<KIptvHourNumberCount> hs;
+        TBuf<KIptvMinuteNumberCount> ms;
+
+        //lint -e{961} Else block not needed, default is empty.
+        if ( shiftLength == KIptvShiftNumberCountH )
+            {
+            hs.Append( temp[KIptvShiftHourHighIndex] );
+            }
+        else if ( shiftLength == KIptvShiftNumberCountHH )
+            {
+            hs.Append( temp[KIptvShiftHourHighIndex] );
+            hs.Append( temp[KIptvShiftHourLowIndex] );
+            }
+        else if ( shiftLength == KIptvShiftNumberCountHHM )
+            {
+            hs.Append( temp[KIptvShiftHourHighIndex] );
+            hs.Append( temp[KIptvShiftHourLowIndex] );
+            ms.Append( temp[KIptvShiftMinuteHighIndex] );
+            }
+        else if ( shiftLength == KIptvShiftNumberCountHHMM )
+            {
+            hs.Append( temp[KIptvShiftHourHighIndex] );
+            hs.Append( temp[KIptvShiftHourLowIndex] );
+            ms.Append( temp[KIptvShiftMinuteHighIndex] );
+            ms.Append( temp[KIptvShiftMinuteLowIndex] );
+            }
+
+        if ( hs.Compare( KIptvEmptyDes ) != 0 )
+            {
+            TLex hlex( hs );
+            hlex.Val( additionalHourShift );
+            }
+
+        if ( ms.Compare( KIptvEmptyDes ) != 0 )
+            {
+            TLex mlex( ms );
+            mlex.Val( additionalMinuteShift );
+            }
+
+        hourShift = hourShift + additionalHourShift;
+
+        TTimeIntervalHours hourInterval( hourShift );
+        TTimeIntervalMinutes minuteInterval( additionalMinuteShift );
+        CleanupStack::PopAndDestroy( zone );
+        zone = NULL;
+
+        // Date
+        TInt dateLength = gmtIndex - index;
+        HBufC* date = HBufC::NewLC( dateLength );
+        TPtr16 datePtr = date->Des();
+        datePtr.Copy( aBuffer->Mid( index + 1, dateLength - 1 ) );
+        datePtr.Trim();
+
+        // Convert english strings "jan", "feb" etc. to local "tam", "hel" etc.
+        // Needed because TTime always performs locale specific conversion.
+        HBufC* fixedDate = ConvertMonthStringToLocaleL( datePtr );
+        CleanupStack::PushL( fixedDate );
+
+        // Parse the actual date string.
+        parseStatus = aTime.Parse( *fixedDate );
+        CleanupStack::PopAndDestroy( fixedDate );
+        fixedDate = NULL;
+        CleanupStack::PopAndDestroy( date );
+        date = NULL;
+
+        if ( parseStatus >= 0 )
+            {
+
+#ifdef _DEBUG
+            const TInt KIptvDebugBufLen( 100 );
+            TBuf<KIptvDebugBufLen> datePrint;
+            _LIT( KIptvDatePrint, "%D%M%Y%/0%1%/1%2%/2%3%/3" );
+            aTime.FormatL( datePrint, KIptvDatePrint );
+            IPTVLOGSTRING2_LOW_LEVEL(
+                "RSS Plugin::CIptvXmlContentHandler::ParseGmtL -- Publish date : %S",
+                &datePrint );
+
+            TBuf<KIptvDebugBufLen> timePrint;
+            _LIT( KIptvTimePrint, "%-B%:0%J%:1%T%:2%S%.%*C4%:3%+B" );
+            aTime.FormatL( timePrint, KIptvTimePrint );
+            IPTVLOGSTRING2_LOW_LEVEL(
+                "RSS Plugin::CIptvXmlContentHandler::ParseGmtL -- Publish time : %S",
+                &timePrint );
+
+            IPTVLOGSTRING_LOW_LEVEL(
+                "RSS Plugin::CIptvXmlContentHandler::ParseGmtL -- In universal time" );
+#endif
+
+            if ( add )
+                {
+                IPTVLOGSTRING2_LOW_LEVEL(
+                    "RSS Plugin::CIptvXmlContentHandler::ParseGmtL -- decrement %d hours",
+                    hourShift );
+                IPTVLOGSTRING2_LOW_LEVEL(
+                    "RSS Plugin::CIptvXmlContentHandler::ParseGmtL -- decrement %d minutes",
+                    additionalMinuteShift );
+                aTime -= hourInterval;
+                aTime -= minuteInterval;
+                }
+            else
+                {
+                IPTVLOGSTRING2_LOW_LEVEL(
+                    "RSS Plugin::CIptvXmlContentHandler::ParseGmtL -- increment %d hours",
+                    hourShift );
+                IPTVLOGSTRING2_LOW_LEVEL(
+                    "RSS Plugin::CIptvXmlContentHandler::ParseGmtL -- increment %d minutes",
+                    additionalMinuteShift );
+                aTime += hourInterval;
+                aTime += minuteInterval;
+                }
+
+#ifdef _DEBUG
+            aTime.FormatL( datePrint, KIptvDatePrint );
+            IPTVLOGSTRING2_LOW_LEVEL(
+                "RSS Plugin::CIptvXmlContentHandler::ParseGmtL -- Publish date : %S",
+                &datePrint );
+
+            aTime.FormatL( timePrint, KIptvTimePrint );
+            IPTVLOGSTRING2_LOW_LEVEL(
+                "RSS Plugin::CIptvXmlContentHandler::ParseGmtL -- Publish time : %S",
+                &timePrint );
+#endif
+
+            }
+        else
+            {
+            success = EFalse;
+            }
+        }
+
+    // On case failure, return zero time.
+    if ( !success )
+        {
+        TTime ztime( TInt64( 0 ) );
+        aTime = ztime;
+
+#ifdef _DEBUG
+
+        switch ( parseStatus )
+            {
+            case KErrGeneral:
+                IPTVLOGSTRING_LOW_LEVEL(
+                    "RSS Plugin::CIptvXmlContentHandler::ParseGmtL -- parse error KErrGeneral" );
+                break;
+
+            case KErrNotSupported:
+                IPTVLOGSTRING_LOW_LEVEL(
+                    "RSS Plugin::CIptvXmlContentHandler::ParseGmtL -- parse error KErrNotSupported" );
+                break;
+
+            case KErrArgument:
+                IPTVLOGSTRING_LOW_LEVEL(
+                    "RSS Plugin::CIptvXmlContentHandler::ParseGmtL -- parse error KErrArgument" );
+                break;
+
+            default:
+                IPTVLOGSTRING_LOW_LEVEL(
+                    "RSS Plugin::CIptvXmlContentHandler::ParseGmtL -- parse error default" );
+                break;
+            }
+#endif
+
+        }
+    }
+
+// --------------------------------------------------------------------------
+// Parses hour shift value from time zone.
+// --------------------------------------------------------------------------
+//
+TInt CIptvXmlDateTime::GetHourShiftFromZone(
+    const TPtr16& aZone )
+    {
+    IPTVLOGSTRING_LOW_LEVEL(
+        "RSS Plugin::CIptvXmlContentHandler::GetHourShiftFromZone" );
+
+    TInt hourShift( KIptvTimeZoneShift_None );
+
+    if ( ( aZone.CompareF( KIptvTimeZone_GMT ) == 0 ) ||
+         ( aZone.CompareF( KIptvTimeZone_UT ) == 0 ) ||
+         ( aZone.CompareF( KIptvTimeZone_Z ) == 0 ) )
+        {
+        hourShift = KIptvTimeZoneShift_Z;
+        }
+    else if ( aZone.CompareF( KIptvTimeZone_A ) == 0 )
+        {
+        hourShift = KIptvTimeZoneShift_A;
+        }
+    else if ( aZone.CompareF( KIptvTimeZone_B ) == 0 )
+        {
+        hourShift = KIptvTimeZoneShift_B;
+        }
+    else if ( aZone.CompareF( KIptvTimeZone_C ) == 0 )
+        {
+        hourShift = KIptvTimeZoneShift_C;
+        }
+    else if ( ( aZone.CompareF( KIptvTimeZone_EDT ) == 0 ) ||
+              ( aZone.CompareF( KIptvTimeZone_D ) == 0 ) )
+        {
+        hourShift = KIptvTimeZoneShift_D;
+        }
+    else if ( ( aZone.CompareF( KIptvTimeZone_EST ) == 0 ) ||
+              ( aZone.CompareF( KIptvTimeZone_CDT ) == 0 ) ||
+              ( aZone.CompareF( KIptvTimeZone_E ) == 0 ) )
+        {
+        hourShift = KIptvTimeZoneShift_E;
+        }
+    else if ( ( aZone.CompareF( KIptvTimeZone_CST ) == 0 ) ||
+              ( aZone.CompareF( KIptvTimeZone_MDT ) == 0 ) ||
+              ( aZone.CompareF( KIptvTimeZone_F ) == 0 ) )
+        {
+        hourShift = KIptvTimeZoneShift_F;
+        }
+    else if ( ( aZone.CompareF( KIptvTimeZone_MST ) == 0 ) ||
+              ( aZone.CompareF( KIptvTimeZone_PDT ) == 0 ) ||
+              ( aZone.CompareF( KIptvTimeZone_G ) == 0 ) )
+        {
+        hourShift = KIptvTimeZoneShift_G;
+        }
+    else if ( ( aZone.CompareF( KIptvTimeZone_PST ) == 0 ) ||
+              ( aZone.CompareF( KIptvTimeZone_H ) == 0 ) )
+        {
+        hourShift = KIptvTimeZoneShift_H;
+        }
+    else if ( aZone.CompareF( KIptvTimeZone_I ) == 0 )
+        {
+        hourShift = KIptvTimeZoneShift_I;
+        }
+    else if ( aZone.CompareF( KIptvTimeZone_K ) == 0 )
+        {
+        hourShift = KIptvTimeZoneShift_K;
+        }
+    else if ( aZone.CompareF( KIptvTimeZone_L ) == 0 )
+        {
+        hourShift = KIptvTimeZoneShiftL;
+        }
+    else if ( aZone.CompareF( KIptvTimeZone_M ) == 0 )
+        {
+        hourShift = KIptvTimeZoneShift_M;
+        }
+    else if ( aZone.CompareF( KIptvTimeZone_N ) == 0 )
+        {
+        hourShift = KIptvTimeZoneShift_N;
+        }
+    else if ( aZone.CompareF( KIptvTimeZone_O ) == 0 )
+        {
+        hourShift = KIptvTimeZoneShift_O;
+        }
+    else if ( aZone.CompareF( KIptvTimeZone_P ) == 0 )
+        {
+        hourShift = KIptvTimeZoneShift_P;
+        }
+    else if ( aZone.CompareF( KIptvTimeZone_Q ) == 0 )
+        {
+        hourShift = KIptvTimeZoneShift_Q;
+        }
+    else if ( aZone.CompareF( KIptvTimeZone_R ) == 0 )
+        {
+        hourShift = KIptvTimeZoneShift_R;
+        }
+    else if ( aZone.CompareF( KIptvTimeZone_S ) == 0 )
+        {
+        hourShift = KIptvTimeZoneShift_S;
+        }
+    else if ( aZone.CompareF( KIptvTimeZone_T ) == 0 )
+        {
+        hourShift = KIptvTimeZoneShift_T;
+        }
+    else if ( aZone.CompareF( KIptvTimeZone_U ) == 0 )
+        {
+        hourShift = KIptvTimeZoneShift_U;
+        }
+    else if ( aZone.CompareF( KIptvTimeZone_V ) == 0 )
+        {
+        hourShift = KIptvTimeZoneShift_V;
+        }
+    else if ( aZone.CompareF( KIptvTimeZone_W ) == 0 )
+        {
+        hourShift = KIptvTimeZoneShift_W;
+        }
+    else if ( aZone.CompareF( KIptvTimeZone_X ) == 0 )
+        {
+        hourShift = KIptvTimeZoneShift_X;
+        }
+    else if ( aZone.CompareF( KIptvTimeZone_Y ) == 0 )
+        {
+        hourShift = KIptvTimeZoneShift_Y;
+        }
+    else
+        {
+        hourShift = KIptvTimeZoneShift_None;
+        }
+
+    return hourShift;
+    }
+
+// --------------------------------------------------------------------------
+// Converts english month in date string to locale specific month string.
+// --------------------------------------------------------------------------
+//
+HBufC* CIptvXmlDateTime::ConvertMonthStringToLocaleL(
+    const TDesC& aDateString )
+    {
+    IPTVLOGSTRING_LOW_LEVEL(
+        "RSS Plugin::CIptvXmlContentHandler::ConvertMonthStringToLocaleL" );
+
+    HBufC* newString =
+        HBufC::NewLC( aDateString.Length() + KMaxMonthNameAbb );
+    TInt monthIndex = KErrNotFound;
+    TMonthNameAbb localMonth;
+
+    *newString = aDateString;
+    newString->Des().LowerCase();
+
+    // Find the month string and init matching locale specific string.
+    if ( KErrNotFound !=
+         ( monthIndex = newString->Find( KIptvJan ) ) )
+        {
+        localMonth.Set( EJanuary );
+        }
+    else if ( KErrNotFound !=
+              ( monthIndex = newString->Find( KIptvFeb ) ) )
+        {
+        localMonth.Set( EFebruary );
+        }
+    else if ( KErrNotFound !=
+              ( monthIndex = newString->Find( KIptvMar ) ) )
+        {
+        localMonth.Set( EMarch );
+        }
+    else if ( KErrNotFound !=
+              ( monthIndex = newString->Find( KIptvApr ) ) )
+        {
+        localMonth.Set( EApril );
+        }
+    else if ( KErrNotFound !=
+              ( monthIndex = newString->Find( KIptvMay ) ) )
+        {
+        localMonth.Set( EMay );
+        }
+    else if ( KErrNotFound !=
+              ( monthIndex = newString->Find( KIptvJun ) ) )
+        {
+        localMonth.Set( EJune );
+        }
+    else if ( KErrNotFound !=
+              ( monthIndex = newString->Find( KIptvJul ) ) )
+        {
+        localMonth.Set( EJuly );
+        }
+    else if ( KErrNotFound !=
+              ( monthIndex = newString->Find( KIptvAug ) ) )
+        {
+        localMonth.Set( EAugust );
+        }
+    else if ( KErrNotFound !=
+              ( monthIndex = newString->Find( KIptvSep ) ) )
+        {
+        localMonth.Set( ESeptember );
+        }
+    else if ( KErrNotFound !=
+              ( monthIndex = newString->Find( KIptvOct ) ) )
+        {
+        localMonth.Set( EOctober );
+        }
+    else if ( KErrNotFound !=
+              ( monthIndex = newString->Find( KIptvNov ) ) )
+        {
+        localMonth.Set( ENovember );
+        }
+    else if ( KErrNotFound !=
+              ( monthIndex = newString->Find( KIptvDec ) ) )
+        {
+        localMonth.Set( EDecember );
+        }
+    else
+        {
+        CleanupStack::Pop( newString );
+        return newString;
+        }
+
+     // 3 = length of old month string.
+    HBufC* temp =
+        HBufC::NewLC( newString->Length() -
+            ( monthIndex + KIptvMonthShortNameLen ) );
+    *temp = newString->Mid( monthIndex + KIptvMonthShortNameLen );
+
+    // Re-construct the string with new month name.
+    newString->Des().SetLength( monthIndex );
+    newString->Des().Append( localMonth );
+    newString->Des().Append( *temp );
+
+    CleanupStack::PopAndDestroy( temp );
+    temp = NULL;
+    CleanupStack::Pop( newString );
+    return newString;
+    }
+