diff -r 000000000000 -r a2952bb97e68 mpx/commonframework/common/src/mpxuser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mpx/commonframework/common/src/mpxuser.cpp Thu Dec 17 08:55:47 2009 +0200 @@ -0,0 +1,526 @@ +/* +* Copyright (c) 2006 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: mpx user helper classes +* +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "mpxuser.h" + +// ---------------------------------------------------------------------------- +// Recreate a buffer +// ---------------------------------------------------------------------------- +// +EXPORT_C void MPXUser::RecreateBufferL(TInt aSize, CBufBase*& aBuf) + { + delete aBuf; + aBuf=NULL; + CBufBase* buf=CBufFlat::NewL(aSize); + CleanupStack::PushL(buf); + buf->ResizeL(aSize); + CleanupStack::Pop(buf); + aBuf = buf; + } + + +// ---------------------------------------------------------------------------- +// Helper funciton to create descriptor array from buffer +// ---------------------------------------------------------------------------- +// +EXPORT_C void MPXUser::CreateFromBufferL( + const CBufBase &aBuf, + CDesCArray*& aArray) + { + delete aArray; + aArray = NULL; + RBufReadStream rs(aBuf); + CleanupClosePushL(rs); + InternalizeL(aArray, rs); + CleanupStack::PopAndDestroy(&rs); + } + +// ---------------------------------------------------------------------------- +// Helper funciton to create a buffer +// ---------------------------------------------------------------------------- +// +EXPORT_C CBufBase* MPXUser::CreateBufferLC(TInt aSize) + { + CBufBase* buf=CBufFlat::NewL(aSize); + CleanupStack::PushL(buf); + buf->ResizeL(aSize); + return buf; + } + +// ---------------------------------------------------------------------------- +// Create a buffer from an array +// aBuf replaced with the contents of the descriptor array and its sizes. +// The size of the buffer is the size of data in the buffer +// ---------------------------------------------------------------------------- +// +EXPORT_C void MPXUser::CreateBufferL(const MDesCArray* aArray, CBufBase*& aBuf) + { + delete aBuf; + aBuf = NULL; + + CBufBase* buffer=CreateBufferLC(KMPXBufGranularity); + RBufWriteStream ws(*buffer); + CleanupClosePushL(ws); + ExternalizeL(aArray, ws); + ws.CommitL(); + CleanupStack::PopAndDestroy(&ws); + buffer->Compress(); + CleanupStack::Pop(buffer); + aBuf = buffer; + } + +// ---------------------------------------------------------------------------- +// Create buffer from message +// ---------------------------------------------------------------------------- +// +EXPORT_C void MPXUser::CreateBufferL( + const RMessage2& aMessage, + TInt aMsgSlot, + CBufBase*& aBuffer) + { + TInt s=aMessage.GetDesLengthL(aMsgSlot); + if ( s <= 0 ) + { + User::Leave( KErrArgument ); + } + RecreateBufferL(s, aBuffer); + TPtr8 p(aBuffer->Ptr(0)); + aMessage.Read(aMsgSlot,p); + } + +// ---------------------------------------------------------------------------- +// Create buffer from a descriptor +// ---------------------------------------------------------------------------- +// +EXPORT_C void MPXUser::CreateBufferL(const TDesC& aDes, CBufBase*& aBuffer) + { + TPtrC8 ptr8 = MPXUser::Ptr(aDes); + RecreateBufferL(ptr8.Length(), aBuffer); + aBuffer->Write(0, ptr8); + aBuffer->Compress(); + } + +// ---------------------------------------------------------------------------- +// Creates a narrow heap descriptor from a unicode descriptor. +// No character conversion +// ---------------------------------------------------------------------------- +// +EXPORT_C HBufC8* MPXUser::Alloc8L(const TDesC& aDes) + { + HBufC8* des8=HBufC8::NewL(aDes.Length()); + des8->Des().Copy(aDes); + return des8; + } + +// ---------------------------------------------------------------------------- +// Creates a zero-terminated narrow heap descriptor from a unicode descriptor. +// No character conversion +// ---------------------------------------------------------------------------- +// +EXPORT_C HBufC8* MPXUser::Alloc8ZL(const TDesC& aDes) + { + HBufC8* des8=HBufC8::NewL(aDes.Length()+1); + des8->Des().Copy(aDes); + des8->Des().ZeroTerminate(); + return des8; + } + +// ---------------------------------------------------------------------------- +// Creates a heap descriptor from a narrow descriptor. +// No character conversion +// ---------------------------------------------------------------------------- +// +EXPORT_C HBufC* MPXUser::AllocL(const TDesC8& aDes) + { + HBufC* item = HBufC::NewL(aDes.Length()); + item->Des().Copy(aDes); + return item; + } + +// ---------------------------------------------------------------------------- +// Creates a narrow ptr descriptor on a unicode descriptor +// ---------------------------------------------------------------------------- +// +EXPORT_C TPtrC8 MPXUser::Ptr(const TDesC& aDes) + { +#ifdef _UNICODE + TInt len=aDes.Length()*2; // Unicode->Narrow + return TPtrC8((TUint8*)(&aDes[0]),len); +#else + return TPtrC8(aDes); +#endif + } + +// ---------------------------------------------------------------------------- +// Creates a wide ptr descriptor on a narrow descriptor +// ---------------------------------------------------------------------------- +// +EXPORT_C TPtrC MPXUser::Ptr(const TDesC8& aDes) + { +#ifdef _UNICODE + TInt len=aDes.Length()/2; // Narrrow->Unicode + return TPtrC((TUint16*)(&aDes[0]),len); +#else + return TPtrC(aDes); +#endif + } + +// ---------------------------------------------------------------------------- +// Helper internalize a descriptor array from a stream +// ---------------------------------------------------------------------------- +// +EXPORT_C void MPXUser::InternalizeL( + CDesCArray*& aArray, + RReadStream& aStream) + { + delete aArray; + aArray = NULL; + TInt n=aStream.ReadInt32L(); + if( n ) + { + CDesCArray* array=new(ELeave)CDesCArrayFlat(n); + CleanupStack::PushL(array); + TInt len; + for (TInt i=0;iDes(); + aStream.ReadL(bp,len); + array->AppendL(*item); + CleanupStack::PopAndDestroy(item); + } + CleanupStack::Pop(array); + aArray = array; + } + else + { + // Dummy + aArray = new(ELeave)CDesCArrayFlat(1); + } + } + +// ---------------------------------------------------------------------------- +// Helper externalize a descriptor array to a stream +// ---------------------------------------------------------------------------- +// +EXPORT_C void MPXUser::ExternalizeL( + const MDesCArray* aArray, + RWriteStream& aStream) + { + if (aArray) + { + TInt n = aArray->MdcaCount(); + aStream.WriteInt32L(n); + for (TInt i=0;iMdcaPoint(i); + aStream.WriteInt32L( item.Length() ); + aStream.WriteL(item, item.Length()); + } + } + else + { + // Nothing to externalize + aStream.WriteInt32L(0); + } + } + +// ---------------------------------------------------------------------------- +// Group attributes belonging to one content into an item in the array +// ---------------------------------------------------------------------------- +// +EXPORT_C void MPXUser::MergeAttributeL( + const TArray& aSrc, + RArray& aDest) + { + aDest.Reset(); + for (TInt i = 0; i < aSrc.Count(); i++) + { + const TMPXAttribute& s = aSrc[i]; + TInt index = aDest.Find(s, TMPXAttribute::MatchContentId); + if ( KErrNotFound == index ) + { + aDest.AppendL(s); + } + else + { + TMPXAttribute& d = aDest[index]; + d = TMPXAttribute(d.ContentId(), d.AttributeId() | s.AttributeId()); + } + } + } + +// ---------------------------------------------------------------------------- +// Determines the owning process id of the thread +// ---------------------------------------------------------------------------- +// +EXPORT_C TProcessId MPXUser::ProcessIdL(TThreadId aId) + { + RThread t; + User::LeaveIfError(t.Open(aId)); + CleanupClosePushL(t); + RProcess p; + User::LeaveIfError(t.Process(p)); + TProcessId pid=p.Id(); + p.Close(); + CleanupStack::PopAndDestroy(&t); + return pid; + } + +// ---------------------------------------------------------------------------- +// Add array items in aSrc into sorted array aDest if the item is not in +// the aDest yet +// ---------------------------------------------------------------------------- +// +EXPORT_C void MPXUser::MergeArray(const MDesCArray& aSrc, CDesCArray& aDest) + { + for (TInt i=aSrc.MdcaCount(); --i>=0 ;) + { + ////ignore leave when insert the same item + TRAP_IGNORE(aDest.InsertIsqL(aSrc.MdcaPoint(i))); + } + } + +// ---------------------------------------------------------------------------- +// Copies elements from one array of descriptors to another +// ---------------------------------------------------------------------------- +// +EXPORT_C void MPXUser::CopyArrayL(const MDesCArray& aSrc, CDesCArray& aDest) + { + aDest.Reset(); + for (TInt i=0; i < aSrc.MdcaCount(); ++i) + { + aDest.AppendL(aSrc.MdcaPoint(i)); + } + } + +// ---------------------------------------------------------------------------- +// Compare two uids +// ---------------------------------------------------------------------------- +// +EXPORT_C TInt MPXUser::CompareUids(const TUid& aId1, const TUid& aId2) + { + TInt ret(0); + if (aId1.iUid > aId2.iUid) + { + ret=1; + } + else if (aId1.iUid < aId2.iUid) + { + ret=-1; + } + return ret; + } + +// ---------------------------------------------------------------------------- +// Compare two sorted arrays of uids +// ---------------------------------------------------------------------------- +// +EXPORT_C TInt MPXUser::CompareOrderedUidArrays( + const TArray& aArray1, + const TArray& aArray2) + { + TInt ret(-1); + TInt count1 = aArray1.Count(); + TInt count2 = aArray2.Count(); + if (count1 >= count2) + { + TInt s1(0); // start point of array 1 + TBool found(ETrue); + for (TInt i=0; i& aArray, RReadStream& aStream) + { + TInt n=aStream.ReadInt32L(); + for (TInt i=0;i& aArray, RWriteStream& aStream) + { + TInt n=aArray.Count(); + aStream.WriteInt32L(n); + for (TInt i=0;i windowArray; + CleanupClosePushL( windowArray ); + aWsSession.WindowGroupList( &windowArray ); + TInt wgCount( windowArray.Count() ); + + for ( TInt i = 0; i < wgCount && wgId == KErrNotFound; i++ ) + { + TThreadId threadId; + User::LeaveIfError( + aWsSession.GetWindowGroupClientThreadId( + windowArray[i].iId, threadId ) ); + RThread thread; + CleanupClosePushL( thread ); + User::LeaveIfError( thread.Open( threadId )); + RProcess proc; + CleanupClosePushL( proc ); + User::LeaveIfError( thread.Process( proc )); + if ( proc.Id() == aProcId ) + { + wgId = windowArray[i].iId; + } + CleanupStack::PopAndDestroy( &proc ); + CleanupStack::PopAndDestroy( &thread ); + } + CleanupStack::PopAndDestroy( &windowArray ); + return wgId; + } + +// ----------------------------------------------------------------------------- +// Check if there is the given type call ongoing. +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool MPXUser::IsCallOngoing( TInt aCallType ) + { + MPX_FUNC( "MPXUser::IsCallOngoing" ); + // In case call info not fully received (err != KErrNone), + // assume no call exists. + TBool ret( EFalse ); + + // Get call status and type. + TInt callState( EPSCTsyCallStateUninitialized ); + + TInt err( RProperty::Get( + KPSUidCtsyCallInformation, + KCTsyCallState, + callState ) ); + + MPX_DEBUG3("MPXUser::IsCallOngoing() call state: %d , error (%d)", callState, err ); + + if ( !err && + ( callState != EPSCTsyCallStateUninitialized && + callState != EPSCTsyCallStateNone ) ) + { + TInt callType( EPSCTsyCallTypeUninitialized ); + + // There is call ongoing, check it's type. + err = RProperty::Get( + KPSUidCtsyCallInformation, + KCTsyCallType, + callType ); + + MPX_DEBUG3("MPXUser::IsCallOngoing() call type: %d, error (%d)", callType, err ); + + if ( !err ) + { + if ( aCallType == KMPXCallTypeGenericVoice ) + { + // Return true for CSVoice/Video/VOIP calls + ret = ( callType == EPSCTsyCallTypeCSVoice || + callType == EPSCTsyCallTypeH324Multimedia || + callType == EPSCTsyCallTypeVoIP ); + MPX_DEBUG2("MPXUser::IsCallOngoing KMPlayerCallTypeGenericVoice return (%d) ", ret ); + } + else + { + // Check the requested type call. + ret = ( callType == aCallType ); + MPX_DEBUG2("MPXUser::IsCallOngoing return (%d) ", ret ); + } + } + } + MPX_DEBUG2("MPXUser::IsCallOngoing return (%d) ", ret ); + return ret; + } + +// ----------------------------------------------------------------------------- +// Compelete file name with file path of the dll +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt MPXUser::CompleteWithDllPath(const TDesC& aDllName, TDes& aFileName) + { + MPX_DEBUG2("==>MPXUser::CompleteWithDllPath aFileName %S", &aFileName); + TInt error(KErrNotSupported); + MPX_DEBUG2("MPX Dll file path: %S", &aDllName); + TPtrC driveAndPath = TParsePtrC(aDllName).DriveAndPath(); + TParse parse; + error = parse.Set(aFileName, &driveAndPath, NULL); + if (!error) + { + aFileName.Zero(); + aFileName.Append(parse.FullName()); + } + MPX_DEBUG2("<==MPXUser::CompleteWithDllPath aFileName %S", &aFileName); + return error; + } + +// End of file