contentmgmt/referencedrmagent/RefTestAgent/localsdp/src/sdprepeatfield.cpp
changeset 72 de46a57f75fb
child 102 deec7e509f66
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contentmgmt/referencedrmagent/RefTestAgent/localsdp/src/sdprepeatfield.cpp	Thu Jun 24 15:39:07 2010 +0530
@@ -0,0 +1,385 @@
+// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "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:
+// Name          : SdpRepeatField.h
+// Part of       : Local SDP Codec
+// Version       : 1.0
+//
+
+
+
+#include <s32strm.h>
+#include "sdprepeatfield.h"
+#include "sdputil.h"
+#include "sdpcodec.pan"
+#include "_sdpdefs.h"
+#include "sdpcodecstringconstants.h"
+#include "sdpdocument.h"
+#include "sdpcodecConstants.h"
+#include "sdpcodecErr.h"
+#include "sdpcodecStringPool.h"
+
+
+// -----------------------------------------------------------------------------
+// CSdpRepeatField::DecodeL
+// Decodes bandwidth field from TDesC
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSdpRepeatField* CSdpRepeatField::DecodeL(const TDesC8& aText)
+	{
+	CSdpRepeatField* obj = DecodeLC(aText);
+	CleanupStack::Pop();
+	return obj;
+	}
+
+// -----------------------------------------------------------------------------
+// CSdpRepeatField::DecodeLC
+// Decodes bandwidth field from TDesC
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSdpRepeatField* CSdpRepeatField::DecodeLC(const TDesC8& aText)
+	{
+    CSdpRepeatField* obj = new (ELeave) CSdpRepeatField();
+	CleanupStack::PushL(obj);
+	obj->ConstructL(aText);
+	return obj;
+	}
+
+// -----------------------------------------------------------------------------
+// CSdpRepeatField::NewL
+// Two-phased constructor
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSdpRepeatField* CSdpRepeatField::NewL(
+                                        const TSdpTypedTime aRepeatInterval,
+										const TSdpTypedTime  aActiveDuration,
+										const RArray<TSdpTypedTime>& aOffsets)
+	{
+	CSdpRepeatField* obj = NewLC(aRepeatInterval, aActiveDuration, aOffsets);
+	CleanupStack::Pop();
+	return obj;
+	}
+
+// -----------------------------------------------------------------------------
+// CSdpRepeatField::NewLC
+// Two-phased constructor
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSdpRepeatField* CSdpRepeatField::NewLC(
+                                        const TSdpTypedTime aRepeatInterval,
+										const TSdpTypedTime aActiveDuration,
+										const RArray<TSdpTypedTime>& aOffsets)
+	{
+	CSdpRepeatField* obj = new (ELeave) CSdpRepeatField(aRepeatInterval,
+                                                    aActiveDuration);
+	CleanupStack::PushL(obj);
+	obj->ConstructL(aOffsets);
+	return obj;
+	}
+
+// -----------------------------------------------------------------------------
+// CSdpRepeatField::~CSdpRepeatField
+// Destructor
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSdpRepeatField::~CSdpRepeatField()
+	{
+    iTimeOffsets.Close();
+	}
+
+// -----------------------------------------------------------------------------
+// CSdpRepeatField::EncodeL
+// Writes attributes in proper format to the stream
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CSdpRepeatField::EncodeL(RWriteStream& aStream) const
+    {
+    const TDesC8& repeatName = iPool.StringF(SdpCodecStringConstants::ERepeat, 
+                                        SdpCodecStringConstants::Table).DesC();
+    aStream.WriteL(repeatName);
+    iRepeatInterval.EncodeL(aStream);
+    aStream.WriteL(KSPStr);
+    iActiveDuration.EncodeL(aStream);
+    for (TInt i = 0; i < iTimeOffsets.Count(); i++)
+        {
+        aStream.WriteL(KSPStr);
+        (iTimeOffsets)[i].EncodeL(aStream);
+        }
+    aStream.WriteL(KCRLFStr);
+    }
+
+// -----------------------------------------------------------------------------
+// CSdpRepeatField::CloneL
+// Creates an exact copy of the repeat field
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSdpRepeatField* CSdpRepeatField::CloneL() const
+	{
+	__TEST_INVARIANT;
+	CSdpRepeatField* obj = NewL(iRepeatInterval, iActiveDuration, 
+                                iTimeOffsets);
+	__ASSERT_DEBUG(*this == *obj, User::Panic(KSdpCodecPanicCat, 
+                                            KSdpCodecPanicInternal));
+	return obj;
+	}
+
+// -----------------------------------------------------------------------------
+// CSdpRepeatField::operator ==
+// Checks if two repeat fields are equal
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CSdpRepeatField::operator == (const CSdpRepeatField & aObj) 
+        const
+	{
+	__TEST_INVARIANT;
+	TBool result = iRepeatInterval == aObj.iRepeatInterval
+		&& iActiveDuration == aObj.iActiveDuration
+		&& iTimeOffsets.Count() == (aObj.iTimeOffsets).Count();
+	if (result)
+		{
+		int i = 0;
+		while (result && i < iTimeOffsets.Count())
+			{
+			result = (iTimeOffsets)[i] == (aObj.iTimeOffsets)[i];
+			i++;
+			}
+		}
+	return result;
+	}
+
+// -----------------------------------------------------------------------------
+// CSdpRepeatField::RepeatInterval
+// Return repeat interval value
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TSdpTypedTime CSdpRepeatField::RepeatInterval() const
+	{
+	__TEST_INVARIANT;
+	return iRepeatInterval;
+	}
+
+// -----------------------------------------------------------------------------
+// CSdpRepeatField::SetRepeatIntervalL
+// Sets repeat interval to one of predefined values
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CSdpRepeatField::SetRepeatIntervalL(const TSdpTypedTime aValue)
+	{
+	__TEST_INVARIANT;
+    __ASSERT_ALWAYS(aValue.iValue > 0, User::Leave(KErrSdpCodecRepeatField));
+    iRepeatInterval = aValue;
+	__TEST_INVARIANT;
+	}
+
+// -----------------------------------------------------------------------------
+// CSdpRepeatField::ActiveDuration
+// Returns active duration value
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TSdpTypedTime CSdpRepeatField::ActiveDuration() const
+	{
+	__TEST_INVARIANT;
+	return iActiveDuration;
+	}
+
+// -----------------------------------------------------------------------------
+// CSdpRepeatField::SetActiveDuration
+// Sets new active duration value
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CSdpRepeatField::SetActiveDuration(const TSdpTypedTime aValue)
+	{
+	__TEST_INVARIANT;
+	iActiveDuration = aValue;
+	__TEST_INVARIANT;
+	}
+
+// -----------------------------------------------------------------------------
+// CSdpRepeatField::TimeOffsets
+// CReturns timeoffsets
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const RArray<TSdpTypedTime>& CSdpRepeatField::TimeOffsets() const
+	{
+	__TEST_INVARIANT;
+	return iTimeOffsets;
+	}
+
+// -----------------------------------------------------------------------------
+// CSdpRepeatField::SetTimeOffsetsL
+// Sets timeoffsets
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CSdpRepeatField::SetTimeOffsetsL(
+                                        const RArray<TSdpTypedTime>& aValue)
+    {
+    RArray<TSdpTypedTime> tempOffsets;                 
+    if (aValue.Count() > 0)
+	    {
+        CleanupClosePushL( tempOffsets );         
+		for (TInt i = 0; i < aValue.Count(); i++)
+		    {
+            User::LeaveIfError(tempOffsets.Append(aValue[i]));
+			}
+        CleanupStack::Pop();    // tempOffsets
+        iTimeOffsets.Close();
+        iTimeOffsets = tempOffsets;
+        }
+    else
+        {
+   	    // remove old timeoffsets
+        iTimeOffsets.Reset();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CSdpRepeatField::ExternalizeL
+// Externalizes the object to stream
+// -----------------------------------------------------------------------------
+//
+void CSdpRepeatField::ExternalizeL(RWriteStream& aStream) const
+    {
+    iRepeatInterval.ExternalizeL(aStream);
+    iActiveDuration.ExternalizeL(aStream);
+    aStream.WriteUint32L(iTimeOffsets.Count());
+    for (TInt i = 0; i < iTimeOffsets.Count(); i++)
+        {
+        (iTimeOffsets)[i].ExternalizeL(aStream);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CSdpRepeatField::InternalizeL
+// Internalizes the object from stream
+// -----------------------------------------------------------------------------
+//
+CSdpRepeatField* CSdpRepeatField::InternalizeL(RReadStream& aStream)
+    {
+    const TSdpTypedTime repeatInterval = TSdpTypedTime::InternalizeL(aStream);
+    TSdpTypedTime activeDuration = TSdpTypedTime::InternalizeL(aStream);
+    TUint32 offsetsCount = aStream.ReadUint32L();
+    RArray<TSdpTypedTime> offsets;
+    CleanupClosePushL(offsets);
+
+    if (offsetsCount > 0)
+        {
+		for (TUint i = 0; i < offsetsCount; i++)
+			{
+            User::LeaveIfError(offsets.Append(
+                TSdpTypedTime::InternalizeL(aStream)));
+			}
+        
+        }
+
+    CSdpRepeatField* obj = CSdpRepeatField::NewL(repeatInterval,
+                                                activeDuration, offsets);
+    
+    CleanupStack::PopAndDestroy(); // offsets
+    return obj;
+    }
+
+// -----------------------------------------------------------------------------
+// CSdpRepeatField::CSdpRepeatField
+// Constructor
+// -----------------------------------------------------------------------------
+//
+CSdpRepeatField::CSdpRepeatField(const TSdpTypedTime aRepeatInterval,
+								const TSdpTypedTime aActiveDuration)
+:	iRepeatInterval(aRepeatInterval), iActiveDuration(aActiveDuration)
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CSdpRepeatField::CSdpRepeatField
+// Constructor
+// -----------------------------------------------------------------------------
+//
+CSdpRepeatField::CSdpRepeatField()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CSdpRepeatField::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CSdpRepeatField::ConstructL(const TDesC8& aText)
+	{
+    iPool = SdpCodecStringPool::StringPoolL();
+    RArray <TPtrC8> lines;
+    lines = SdpUtil::DivideToLinesL(aText, KErrSdpCodecRepeatField);
+    CleanupClosePushL(lines);
+    RArray<TPtrC8> repeatArray;
+    repeatArray = SdpUtil::GetElementsFromLineL(lines[0], 
+                                                KErrSdpCodecRepeatField);
+    CleanupClosePushL(repeatArray);
+    const TDesC8& repeatName = iPool.StringF(SdpCodecStringConstants::ERepeat,
+                                        SdpCodecStringConstants::Table).DesC();    
+    __ASSERT_ALWAYS(lines.Count() == 1
+        && repeatArray.Count() >= 3
+        && repeatName.CompareF(repeatArray[0]) == 0,
+        User::Leave(KErrSdpCodecRepeatField));
+
+    // repeat interval
+    __ASSERT_ALWAYS(TLex8(repeatArray[1]).Peek() != '0', 
+        User::Leave(KErrSdpCodecRepeatField));
+    iRepeatInterval = TSdpTypedTime::DecodeL(repeatArray[1]);
+    
+    // active duration
+    iActiveDuration = TSdpTypedTime::DecodeL(repeatArray[2]);
+
+	if (repeatArray.Count() > 3)
+		{
+		for (TInt i = 3; i < repeatArray.Count(); i++)
+			{
+            User::LeaveIfError(iTimeOffsets.Append(
+                TSdpTypedTime::DecodeL(repeatArray[i])));
+			}
+		}
+    CleanupStack::PopAndDestroy(2); // lines, repeatArray
+	__TEST_INVARIANT;
+	}
+
+// -----------------------------------------------------------------------------
+// CSdpRepeatField::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CSdpRepeatField::ConstructL(const RArray<TSdpTypedTime>& aOffsets)
+	{
+    __ASSERT_ALWAYS(iRepeatInterval.iValue > 0, 
+                    User::Leave(KErrSdpCodecRepeatField));
+    iPool = SdpCodecStringPool::StringPoolL();
+    if (aOffsets.Count() > 0)
+		{
+        for (TInt i = 0; i < aOffsets.Count(); i++)
+			{
+            User::LeaveIfError(iTimeOffsets.Append(aOffsets[i]));
+			}
+		}
+	__TEST_INVARIANT;
+	}
+
+// -----------------------------------------------------------------------------
+// CSdpRepeatField::__DbgTestInvariant
+// Test invariant
+// -----------------------------------------------------------------------------
+//
+void CSdpRepeatField::__DbgTestInvariant() const
+	{
+	TBool invariant = iRepeatInterval.iValue > 0;
+	if (!invariant)
+		User::Invariant();
+	}
+
+