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