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