windowing/windowserver/nonnga/graphicdrawer/graphicmsgbuf.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/nonnga/graphicdrawer/graphicmsgbuf.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,269 @@
+// Copyright (c) 1995-2009 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:
+//
+
+#include "Graphics/WSGRAPHICMSGBUF.H"
+#include "W32STDGRAPHIC.H"
+
+#define KSizeOfTInt (TInt)sizeof(TInt)
+
+// TWsGraphicMsgBufParser \\\\\\\\\\\\\\\\\\\\\\\\
+
+EXPORT_C TWsGraphicMsgBufParser::TWsGraphicMsgBufParser(const TDesC8& aData): iData(aData)
+/** Initialise a parser for the specified message buffer */
+	{
+	}
+
+EXPORT_C TInt TWsGraphicMsgBufParser::Verify() const
+/** Verifies that the message buffer is properly formed
+	@return KErrNone if buffer is ok, else a system-wide error code */
+	{
+	const TInt length = iData.Length();
+	TInt ofs = 0;
+	const TInt tmp = (length - sizeof(TInt));
+	while(ofs < tmp)
+		{
+		ofs += IntAt(ofs+KSizeOfTInt) + (KSizeOfTInt*2);
+		}
+	if(ofs == length)
+		{
+		return KErrNone;
+		}
+	return KErrCorrupt;
+	}
+
+EXPORT_C TInt TWsGraphicMsgBufParser::Count() const
+/** Returns the number of elements in the buffer.
+@return the count of elements.
+*/
+	{
+	const TInt length = iData.Length();
+	TInt ofs = 0, count = 0;
+	while(ofs < length)
+		{
+		count++;
+		ofs += IntAt(ofs+KSizeOfTInt) + (KSizeOfTInt*2);
+		}
+	return count;
+	}
+
+EXPORT_C TUid TWsGraphicMsgBufParser::Uid(TInt aIndex) const
+/** Returns the UID if the message, or null UID if the buffer is empty.
+@return KNullUid if the buffer is empty, otherwise the stored Uid
+*/
+	{
+	const TInt length = iData.Length();
+	TInt ofs = 0, count = 0;
+	while(ofs < length)
+		{
+		if(count == aIndex)
+			{
+			return TUid::Uid(IntAt(ofs));
+			}
+		count++;
+		ofs += IntAt(ofs+KSizeOfTInt) + (KSizeOfTInt*2);
+		}
+	return KNullUid;
+	}
+
+EXPORT_C TPtrC8 TWsGraphicMsgBufParser::Data(TInt aIndex) const
+/**Returns the buffer contents at a perticular offset (aIndex).
+@param aIndex - the index into of the buffer element required.
+@return KNullDesC8 if index is more than the element count, otherwise, the element at index aIndex.
+*/
+	{
+	const TInt length = iData.Length();
+	TInt ofs = 0, count = 0;
+	while(ofs < length)
+		{
+		if(count == aIndex)
+			{
+			return iData.Mid(ofs+(KSizeOfTInt*2),IntAt(ofs+KSizeOfTInt));
+			}
+		count++;
+		ofs += IntAt(ofs+KSizeOfTInt) + (KSizeOfTInt*2);
+		}
+	return TPtrC8(KNullDesC8());
+	}
+
+EXPORT_C TInt TWsGraphicMsgBufParser::Find(TUid aUid,TInt aStartingFrom) const
+/** Finds the element equal to the aUid, and returns the index of the element in the buffer.
+@param aUid - the search item to be found in the buffer.
+@param aStartingFrom - the starting index.
+@return the position (index) of the found element, or KErrNotFound
+*/
+	{
+	const TInt length = iData.Length();
+	TInt ofs = 0, count = 0;
+	while(ofs < length)
+		{
+		if((count >= aStartingFrom) && (aUid == TUid::Uid(IntAt(ofs))))
+			{
+			return count;
+			}
+		count++;
+		ofs += IntAt(ofs+KSizeOfTInt) + (KSizeOfTInt*2);
+		}
+	return KErrNotFound;
+	}
+
+EXPORT_C TBool TWsGraphicMsgBufParser::LoadFixed(TUid aUid,TAny* aMsg,TInt aMsgSize,TInt aStartingFrom) const
+/** Loads the buffer of aMsg with the contents of the buffer, based on the aUid and aMsgSize.
+@param aUid - the Uid to match after which the loading is performed.
+@param aMsg - the pointer to the output buffer.
+@param aMsgSize - the size of the output buffer.
+@param aStartingFrom - the starting position to be used in the search of the buffer.
+@return ETrue if loaded, EFalse otherwise.
+*/
+	{
+	const TInt length = iData.Length();
+	TInt ofs = 0, count = 0;
+	while(ofs < length)
+		{
+		if((count >= aStartingFrom) && (aUid == TUid::Uid(IntAt(ofs))))
+			{
+			// found it?  return it
+			const TInt len = IntAt(ofs+KSizeOfTInt);
+			if(len == aMsgSize)
+				{
+				TPtr8 msg(reinterpret_cast<TUint8*>(aMsg),aMsgSize);
+				msg = iData.Mid(ofs+(KSizeOfTInt*2),len);
+				return ETrue;
+				}
+			else // message was not the expected size!
+				{
+				return EFalse;
+				}
+			}
+		count++;
+		ofs += IntAt(ofs+KSizeOfTInt) + (KSizeOfTInt*2);
+		}
+	return EFalse;
+	}
+
+TInt TWsGraphicMsgBufParser::IntAt(TInt aOfs) const
+/** @internalComponent @released */
+	{
+	if((aOfs < 0) || ((aOfs+KSizeOfTInt) > iData.Length()))
+		{
+		return 0;
+		}
+	TInt ret;
+	memcpy(&ret,iData.Ptr()+aOfs,KSizeOfTInt);
+	return ret;
+	}
+
+// TWsGraphicMsgAnimation \\\\\\\\\\\\\\\\\\\\\\\\
+
+EXPORT_C TWsGraphicMsgAnimation::TWsGraphicMsgAnimation(): iFlags(EStopped)
+	{
+	}
+
+EXPORT_C TInt TWsGraphicMsgAnimation::Load(const TWsGraphicMsgBufParser& aData)
+	{
+	const TInt index = aData.Find(TUid::Uid(TWsGraphicAnimation::ETypeId));
+	if(index >= 0)
+		{
+		return Load(aData,index);
+		}
+	return index;
+	}
+
+EXPORT_C TInt TWsGraphicMsgAnimation::Load(const TWsGraphicMsgBufParser& aData,TInt aIndex)
+	{
+	if(aData.Uid(aIndex).iUid != TWsGraphicAnimation::ETypeId)
+		{
+		return KErrArgument;
+		}
+	const TPtrC8 pckg = aData.Data(aIndex);
+	if(pckg.Size() != sizeof(TWsGraphicMsgAnimation))
+		{
+		return KErrCorrupt;
+		}
+	memcpy(this,pckg.Ptr(),sizeof(TWsGraphicMsgAnimation));
+	return KErrNone;
+	}
+
+EXPORT_C TTimeIntervalMicroSeconds TWsGraphicMsgAnimation::AnimationTime(const TTime& aNow,const TTimeIntervalMicroSeconds& aAnimationLength) const
+	{
+	// an animation to time?
+	if(aAnimationLength <= 0LL)
+		{
+		return 0LL;
+		}
+	switch(iFlags & EStateMask)
+		{
+		case EPaused:
+			return ((iPauseOrStopping.Int64() - iPlay.Int64()) % aAnimationLength.Int64());
+		case EStopping:
+			{
+			const TInt64 elapsed = (aNow.Int64() - iPlay.Int64());
+			if(elapsed <= aAnimationLength.Int64())
+				{
+				return (elapsed % aAnimationLength.Int64());
+				}
+			return 0LL;
+			}
+		case EStopped:
+			return 0LL;
+		case EPlaying:
+			{
+			const TInt64 elapsed = (aNow.Int64() - iPlay.Int64());
+			if((iFlags & ELoop) || (elapsed <= aAnimationLength.Int64()))
+				{
+				return (elapsed % aAnimationLength.Int64());
+				}
+			return 0LL;
+			}
+		default:
+			return 0LL;
+		}
+	}
+
+EXPORT_C TBool TWsGraphicMsgAnimation::IsPlaying(const TTime& aNow,const TTimeIntervalMicroSeconds& aAnimationLength) const
+	{
+	// an animation to time?
+	if(aAnimationLength <= 0LL)
+		{
+		return EFalse;
+		}
+	switch(iFlags & EStateMask)
+		{
+		case EPaused:
+			return EFalse;
+		case EStopping:
+			{
+			const TInt64 elapsed = (aNow.Int64() - iPlay.Int64());
+			if(elapsed <= aAnimationLength.Int64())
+				{
+				return ETrue;
+				}
+			return EFalse;
+			}
+		case EStopped:
+			return EFalse;
+		case EPlaying:
+			{
+			const TInt64 elapsed = (aNow.Int64() - iPlay.Int64());
+			if((iFlags & ELoop) || (elapsed <= aAnimationLength.Int64()))
+				{
+				return ETrue;
+				}
+			return EFalse;
+			}
+		default:
+			return EFalse;
+		}
+	}
+