--- /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;
+ }
+