sl@0: // Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // openwfcstream.cpp sl@0: // C API for surface stream implementation of OpenWF-C NativeStream sl@0: // sl@0: sl@0: sl@0: // Include Files sl@0: #include sl@0: #include sl@0: #include sl@0: #include "symbianstream.h" sl@0: #include "surfacestream.h" sl@0: #include "streammap.h" sl@0: #include "openwfcpanic.h" sl@0: sl@0: sl@0: extern "C"{ sl@0: sl@0: EXPORT_C TErrCode SymbianStreamAcquire( const TSurfaceId* aId, SymbianStreamType* aReturnStream) sl@0: { sl@0: if (aId && !aId->IsNull()) sl@0: { sl@0: CSurfaceStream* stream = NULL; sl@0: if (aId->Type()==TSurfaceId::EStreamHandle) sl@0: { sl@0: stream=CSurfaceStream::FromHandle(aId); sl@0: __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamUnexpectedError)); sl@0: stream->AddReference(); sl@0: *aReturnStream= stream->ToHandle(); sl@0: return KErrNone; sl@0: } sl@0: else sl@0: { sl@0: TRAPD(err,stream = COpenWfcStreamMap::InstanceL().AcquireL(*aId)); sl@0: if (stream) sl@0: { sl@0: *aReturnStream = stream->ToHandle(); sl@0: return KErrNone; sl@0: } sl@0: else sl@0: { sl@0: return err; sl@0: } sl@0: } sl@0: } sl@0: else sl@0: { sl@0: *aReturnStream = NULL; sl@0: return KErrBadHandle; sl@0: } sl@0: } sl@0: sl@0: EXPORT_C TErrCode SymbianStreamFind( const TSurfaceId* aId, SymbianStreamType* aReturnStream) sl@0: { sl@0: if (aId && !aId->IsNull()) sl@0: { sl@0: CSurfaceStream* stream=NULL; sl@0: if (aId->Type()==TSurfaceId::EStreamHandle) sl@0: { sl@0: stream=CSurfaceStream::FromHandle(aId); sl@0: __ASSERT_DEBUG(stream, Panic(EOwfSymbianStreamBadArgument)); sl@0: stream->AddReference(); sl@0: *aReturnStream= stream->ToHandle(); sl@0: return KErrNone; sl@0: } sl@0: else sl@0: { sl@0: TRAPD(err,stream = COpenWfcStreamMap::InstanceL().Find(*aId)); sl@0: if (stream) sl@0: { sl@0: *aReturnStream = stream->ToHandle(); sl@0: return KErrNone; sl@0: } sl@0: else sl@0: { sl@0: *aReturnStream = NULL; sl@0: if (err==KErrNone) sl@0: { sl@0: return KErrNotFound; sl@0: } sl@0: else sl@0: { sl@0: return err; sl@0: } sl@0: } sl@0: } sl@0: } sl@0: else sl@0: { sl@0: *aReturnStream = NULL; sl@0: return KErrBadHandle; sl@0: } sl@0: } sl@0: sl@0: EXPORT_C void SymbianStreamAddReference(SymbianStreamType aStream) sl@0: { sl@0: CSurfaceStream* sstream=CSurfaceStream::FromHandle(aStream); sl@0: if (sstream) sl@0: { sl@0: sstream->AddReference(); sl@0: } sl@0: } sl@0: sl@0: EXPORT_C TErrCode SymbianStreamGetBufferId( SymbianStreamType aStream, sl@0: SymbianStreamBuffer aBufferHandle, sl@0: khronos_int32_t* aReturnIndex, sl@0: const TSurfaceId** aReturnSurface) sl@0: { sl@0: CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream); sl@0: __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument)); sl@0: if (aReturnIndex) sl@0: { sl@0: *aReturnIndex=stream->BufferHandleToIndex(aBufferHandle); sl@0: *aReturnSurface = &stream->SurfaceId(); sl@0: } sl@0: return KErrNone; sl@0: } sl@0: sl@0: EXPORT_C void SymbianStreamRemoveReference(SymbianStreamType aStream) sl@0: { sl@0: CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream); sl@0: __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument)); sl@0: stream->ReleaseReference(); sl@0: } sl@0: EXPORT_C void SymbianStreamGetHeader( SymbianStreamType aStream, sl@0: khronos_int32_t* aWidth, sl@0: khronos_int32_t* aHeight, sl@0: khronos_int32_t* aStride, sl@0: khronos_int32_t* aFormat, sl@0: khronos_int32_t* aPixelSize) sl@0: { sl@0: CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream); sl@0: __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument)); sl@0: stream->GetHeader(aWidth,aHeight,aStride,aFormat,aPixelSize); sl@0: } sl@0: sl@0: EXPORT_C TErrCode SymbianStreamAcquireReadBuffer( SymbianStreamType aStream, SymbianStreamBuffer* aReturnBuffer) sl@0: { sl@0: CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream); sl@0: __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument)); sl@0: *aReturnBuffer = stream->AcquireReadBuffer(); sl@0: return KErrNone; sl@0: } sl@0: EXPORT_C TErrCode SymbianStreamReleaseReadBuffer( SymbianStreamType aStream, sl@0: SymbianStreamBuffer aBuffer) sl@0: { sl@0: CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream); sl@0: __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument)); sl@0: return stream->ReleaseReadBuffer(aBuffer); sl@0: } sl@0: sl@0: EXPORT_C TErrCode SymbianStreamAcquireWriteBuffer( SymbianStreamType aStream, SymbianStreamBuffer* aReturnBuffer) sl@0: { sl@0: CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream); sl@0: __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument)); sl@0: *aReturnBuffer = stream->AcquireWriteBuffer(); sl@0: if (*aReturnBuffer != NULL) sl@0: { sl@0: return KErrNone; sl@0: } sl@0: else sl@0: { sl@0: return KErrInUse; sl@0: } sl@0: } sl@0: sl@0: EXPORT_C TErrCode SymbianStreamReleaseWriteBuffer( SymbianStreamType aStream, sl@0: SymbianStreamBuffer aBuffer) sl@0: { sl@0: CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream); sl@0: __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument)); sl@0: stream->ReleaseWriteBuffer(aBuffer); sl@0: return KErrNone; sl@0: } sl@0: sl@0: EXPORT_C TErrCode SymbianStreamAddObserver( SymbianStreamType aStream, sl@0: SymbianStreamCallback aObserver, sl@0: void* aData) sl@0: { sl@0: CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream); sl@0: if (stream && aObserver) sl@0: { sl@0: SYMOWF_DEFAULT_EVENT_PARAM eventPar; sl@0: eventPar.length = sizeof(eventPar); sl@0: eventPar.event = ESOWF_NoEvent; sl@0: aObserver(SYMBIAN_INVALID_HANDLE, ESOWF_ObserverReturnDefaultEvent, NULL, &eventPar); sl@0: return stream->AddObserver(aObserver, eventPar.event, KNoAssociatedScreenNumber, aData); sl@0: } sl@0: return KErrBadHandle; sl@0: } sl@0: sl@0: EXPORT_C TErrCode SymbianStreamRemoveObserver( SymbianStreamType aStream, sl@0: void* aData, sl@0: SymbianStreamEventBits aEvents) sl@0: { sl@0: CSurfaceStream* stream = CSurfaceStream::FromHandle(aStream); sl@0: if (stream) sl@0: { sl@0: return stream->RemoveObserver(aEvents, aData); sl@0: } sl@0: return KErrBadHandle; sl@0: } sl@0: sl@0: sl@0: EXPORT_C TErrCode SymbianStreamGetBufferPointer( SymbianStreamType aStream, sl@0: SymbianStreamBuffer aBuffer, sl@0: void** aReturnPointer) sl@0: { sl@0: CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream); sl@0: __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument)); sl@0: *aReturnPointer = NULL; sl@0: TRAPD(err,*aReturnPointer = stream->GetBufferPtrL(aBuffer)); sl@0: return err; sl@0: } sl@0: sl@0: EXPORT_C void sl@0: SymbianStreamSetProtectionFlag( SymbianStreamType aStream, khronos_bool aFlag) sl@0: { sl@0: CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream); sl@0: if (stream) sl@0: { sl@0: stream->SetProtectionFlag(aFlag); sl@0: } sl@0: } sl@0: sl@0: /*! sl@0: * \brief Register a screen number for surface update notifications. sl@0: * sl@0: * \param aScreenNum Screen number. sl@0: * sl@0: * sl@0: * \return Standard error code or KErrNone sl@0: */ sl@0: EXPORT_C TErrCode SymbianStreamRegisterScreenNotifications( khronos_int32_t aScreenNumber, sl@0: khronos_int32_t aPriority, sl@0: khronos_int32_t aInternalVersion) sl@0: { sl@0: khronos_int32_t err2=KErrUnknown; sl@0: TRAPD(err,err2=COpenWfcStreamMap::InstanceL().RegisterScreenNotifications(aScreenNumber,aPriority,aInternalVersion)); sl@0: if (err) sl@0: { sl@0: return err; sl@0: } sl@0: else sl@0: { sl@0: return err2; sl@0: } sl@0: } sl@0: /*! sl@0: * \brief Get handle to registration of a screen number for surface update notifications. sl@0: * sl@0: * \param aScreenNum Screen number. sl@0: * sl@0: * sl@0: * \return Handle to internal object (currently a CBase), or NULL if not registered sl@0: */ sl@0: EXPORT_C TErrCode sl@0: SymbianStreamHasRegisteredScreenNotifications( khronos_int32_t aScreenNumber,void** aReturnState) sl@0: { sl@0: TRAPD(err,*aReturnState=(COpenWfcStreamMap::InstanceL().RegisteredScreenNotifications(aScreenNumber))); sl@0: return err; sl@0: } sl@0: sl@0: sl@0: /*! sl@0: * \brief Unregister a screen number for surface update notifications. sl@0: * sl@0: * \param aScreenNum Screen number. sl@0: * sl@0: * sl@0: * \return Standard error code or KErrNone sl@0: */ sl@0: EXPORT_C TErrCode sl@0: SymbianStreamUnregisterScreenNotifications(khronos_int32_t aScreenNumber) sl@0: { sl@0: khronos_int32_t err2=KErrUnknown; sl@0: TRAPD(err,err2=COpenWfcStreamMap::InstanceL().UnregisterScreenNotifications(aScreenNumber)); sl@0: if (err) sl@0: { sl@0: return err; sl@0: } sl@0: else sl@0: { sl@0: return err2; sl@0: } sl@0: } sl@0: sl@0: /*! sl@0: * \brief Check if two stream objects are the same surface. sl@0: * sl@0: * \param aStream compare these two streams. sl@0: * \param aStream2 compare these two streams. sl@0: * sl@0: * \return TRUE if they are the same object. sl@0: */ sl@0: EXPORT_C khronos_bool SymbianStreamSame(SymbianStreamType aStream, SymbianStreamType aStream2) sl@0: { sl@0: if (aStream==aStream2) sl@0: return KHR_BOOLEAN_TRUE; sl@0: if (!aStream || !aStream2) sl@0: return KHR_BOOLEAN_FALSE; sl@0: if (*aStream==*aStream2) sl@0: return KHR_BOOLEAN_TRUE; sl@0: SymbianStreamType found; sl@0: if ( aStream->Type()!=aStream->EStreamHandle sl@0: && aStream2->Type()==aStream2->EStreamHandle) sl@0: { sl@0: if(KErrNone==SymbianStreamFind(aStream,&found)) sl@0: { sl@0: if (found==aStream2) sl@0: return KHR_BOOLEAN_TRUE; sl@0: } sl@0: return KHR_BOOLEAN_FALSE; sl@0: } sl@0: if ( aStream2->Type()!=aStream2->EStreamHandle sl@0: && aStream->Type()==aStream->EStreamHandle) sl@0: { sl@0: if(KErrNone==SymbianStreamFind(aStream2,&found)) sl@0: { sl@0: if (aStream==found) sl@0: return KHR_BOOLEAN_TRUE; sl@0: } sl@0: return KHR_BOOLEAN_FALSE; sl@0: } sl@0: return KHR_BOOLEAN_FALSE; sl@0: } sl@0: sl@0: EXPORT_C void sl@0: SymbianStreamProcessNotifications(SymbianStreamType aStream, sl@0: khronos_int32_t aEvent, sl@0: khronos_int32_t aScreenNumber, sl@0: khronos_int32_t aSerialNumber, sl@0: khronos_int32_t* aReturnMask) sl@0: { sl@0: CSurfaceStream* stream = CSurfaceStream::FromHandle(aStream); sl@0: if (stream) sl@0: { sl@0: stream->ProcessNotifications(aEvent, aScreenNumber, CSurfaceStream::EDefaultOperation, aSerialNumber, aReturnMask); sl@0: } sl@0: } sl@0: sl@0: EXPORT_C void sl@0: SymbianStreamCheckVisible(SymbianStreamType aStream, sl@0: khronos_int32_t aEvent, sl@0: khronos_int32_t aScreenNumber, sl@0: khronos_int32_t aSerialNumber) sl@0: { sl@0: CSurfaceStream* stream = CSurfaceStream::FromHandle(aStream); sl@0: if (stream) sl@0: { sl@0: stream->ProcessNotifications(aEvent, aScreenNumber, CSurfaceStream::ECheckVisibleOperation, aSerialNumber, NULL); sl@0: } sl@0: } sl@0: sl@0: EXPORT_C TErrCode sl@0: SymbianStreamAddExtendedObserver(SymbianStreamType aStream, sl@0: SymbianStreamCallback aObserver, sl@0: void* aData, sl@0: khronos_int32_t aScreenNumber, sl@0: SymbianStreamEventBits aEvents) sl@0: { sl@0: CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream); sl@0: if (stream && aObserver) sl@0: { sl@0: TInt ret = KErrNone; sl@0: if (!((ret = stream->AddObserver(aObserver, aEvents, aScreenNumber, aData)) == KErrNone) || aEvents != ESOWF_EventUpdated) sl@0: { sl@0: return ret; sl@0: } sl@0: if (!((ret = stream->AddObserver(NULL, ESOWF_EventAvailable, aScreenNumber, aData)) == KErrNone)) sl@0: { sl@0: return ret; sl@0: } sl@0: if (!((ret = stream->AddObserver(NULL, ESOWF_EventDisplayed, aScreenNumber, aData)) == KErrNone)) sl@0: { sl@0: return ret; sl@0: } sl@0: ret = stream->AddObserver(NULL, ESOWF_EventDisplayedX, aScreenNumber, aData); sl@0: return ret; sl@0: } sl@0: else sl@0: { sl@0: return KErrArgument; sl@0: } sl@0: } sl@0: sl@0: sl@0: sl@0: EXPORT_C void sl@0: SymbianStreamSetFlipState(SymbianStreamType aStream, SymOwfBool aFlip) sl@0: { sl@0: CSurfaceStream* stream = CSurfaceStream::FromHandle(aStream); sl@0: if (stream) sl@0: { sl@0: stream->SetFlipState(aFlip); sl@0: } sl@0: } sl@0: sl@0: EXPORT_C TErrCode sl@0: SymbianStreamGetChunkHandle(SymbianStreamType aStream, TInt* aHandle) sl@0: { sl@0: CSurfaceStream* stream = CSurfaceStream::FromHandle(aStream); sl@0: if (stream && aHandle) sl@0: { sl@0: *aHandle = stream->GetChunkHandle(); sl@0: return KErrNone; sl@0: } sl@0: return KErrArgument; sl@0: } sl@0: sl@0: } //extern "C" helps fix and verify linkage