First public contribution.
1 // Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
2 // All rights reserved.
3 // This component and the accompanying materials are made available
4 // under the terms of "Eclipse Public License v1.0"
5 // which accompanies this distribution, and is available
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
15 // C API for surface stream implementation of OpenWF-C NativeStream
21 #include <pixelformats.h>
22 #include <graphics/suerror.h>
23 #include "symbianstream.h"
24 #include "surfacestream.h"
25 #include "streammap.h"
26 #include "openwfcpanic.h"
31 EXPORT_C TErrCode SymbianStreamAcquire( const TSurfaceId* aId, SymbianStreamType* aReturnStream)
33 if (aId && !aId->IsNull())
35 CSurfaceStream* stream = NULL;
36 if (aId->Type()==TSurfaceId::EStreamHandle)
38 stream=CSurfaceStream::FromHandle(aId);
39 __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamUnexpectedError));
40 stream->AddReference();
41 *aReturnStream= stream->ToHandle();
46 TRAPD(err,stream = COpenWfcStreamMap::InstanceL().AcquireL(*aId));
49 *aReturnStream = stream->ToHandle();
60 *aReturnStream = NULL;
65 EXPORT_C TErrCode SymbianStreamFind( const TSurfaceId* aId, SymbianStreamType* aReturnStream)
67 if (aId && !aId->IsNull())
69 CSurfaceStream* stream=NULL;
70 if (aId->Type()==TSurfaceId::EStreamHandle)
72 stream=CSurfaceStream::FromHandle(aId);
73 __ASSERT_DEBUG(stream, Panic(EOwfSymbianStreamBadArgument));
74 stream->AddReference();
75 *aReturnStream= stream->ToHandle();
80 TRAPD(err,stream = COpenWfcStreamMap::InstanceL().Find(*aId));
83 *aReturnStream = stream->ToHandle();
88 *aReturnStream = NULL;
102 *aReturnStream = NULL;
103 return KErrBadHandle;
107 EXPORT_C void SymbianStreamAddReference(SymbianStreamType aStream)
109 CSurfaceStream* sstream=CSurfaceStream::FromHandle(aStream);
112 sstream->AddReference();
116 EXPORT_C TErrCode SymbianStreamGetBufferId( SymbianStreamType aStream,
117 SymbianStreamBuffer aBufferHandle,
118 khronos_int32_t* aReturnIndex,
119 const TSurfaceId** aReturnSurface)
121 CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream);
122 __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument));
125 *aReturnIndex=stream->BufferHandleToIndex(aBufferHandle);
126 *aReturnSurface = &stream->SurfaceId();
131 EXPORT_C void SymbianStreamRemoveReference(SymbianStreamType aStream)
133 CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream);
134 __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument));
135 stream->ReleaseReference();
137 EXPORT_C void SymbianStreamGetHeader( SymbianStreamType aStream,
138 khronos_int32_t* aWidth,
139 khronos_int32_t* aHeight,
140 khronos_int32_t* aStride,
141 khronos_int32_t* aFormat,
142 khronos_int32_t* aPixelSize)
144 CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream);
145 __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument));
146 stream->GetHeader(aWidth,aHeight,aStride,aFormat,aPixelSize);
149 EXPORT_C TErrCode SymbianStreamAcquireReadBuffer( SymbianStreamType aStream, SymbianStreamBuffer* aReturnBuffer)
151 CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream);
152 __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument));
153 *aReturnBuffer = stream->AcquireReadBuffer();
156 EXPORT_C TErrCode SymbianStreamReleaseReadBuffer( SymbianStreamType aStream,
157 SymbianStreamBuffer aBuffer)
159 CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream);
160 __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument));
161 return stream->ReleaseReadBuffer(aBuffer);
164 EXPORT_C TErrCode SymbianStreamAcquireWriteBuffer( SymbianStreamType aStream, SymbianStreamBuffer* aReturnBuffer)
166 CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream);
167 __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument));
168 *aReturnBuffer = stream->AcquireWriteBuffer();
169 if (*aReturnBuffer != NULL)
179 EXPORT_C TErrCode SymbianStreamReleaseWriteBuffer( SymbianStreamType aStream,
180 SymbianStreamBuffer aBuffer)
182 CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream);
183 __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument));
184 stream->ReleaseWriteBuffer(aBuffer);
188 EXPORT_C TErrCode SymbianStreamAddObserver( SymbianStreamType aStream,
189 SymbianStreamCallback aObserver,
192 CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream);
193 if (stream && aObserver)
195 SYMOWF_DEFAULT_EVENT_PARAM eventPar;
196 eventPar.length = sizeof(eventPar);
197 eventPar.event = ESOWF_NoEvent;
198 aObserver(SYMBIAN_INVALID_HANDLE, ESOWF_ObserverReturnDefaultEvent, NULL, &eventPar);
199 return stream->AddObserver(aObserver, eventPar.event, KNoAssociatedScreenNumber, aData);
201 return KErrBadHandle;
204 EXPORT_C TErrCode SymbianStreamRemoveObserver( SymbianStreamType aStream,
206 SymbianStreamEventBits aEvents)
208 CSurfaceStream* stream = CSurfaceStream::FromHandle(aStream);
211 return stream->RemoveObserver(aEvents, aData);
213 return KErrBadHandle;
217 EXPORT_C TErrCode SymbianStreamGetBufferPointer( SymbianStreamType aStream,
218 SymbianStreamBuffer aBuffer,
219 void** aReturnPointer)
221 CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream);
222 __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument));
223 *aReturnPointer = NULL;
224 TRAPD(err,*aReturnPointer = stream->GetBufferPtrL(aBuffer));
229 SymbianStreamSetProtectionFlag( SymbianStreamType aStream, khronos_bool aFlag)
231 CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream);
234 stream->SetProtectionFlag(aFlag);
239 * \brief Register a screen number for surface update notifications.
241 * \param aScreenNum Screen number.
244 * \return Standard error code or KErrNone
246 EXPORT_C TErrCode SymbianStreamRegisterScreenNotifications( khronos_int32_t aScreenNumber,
247 khronos_int32_t aPriority,
248 khronos_int32_t aInternalVersion)
250 khronos_int32_t err2=KErrUnknown;
251 TRAPD(err,err2=COpenWfcStreamMap::InstanceL().RegisterScreenNotifications(aScreenNumber,aPriority,aInternalVersion));
262 * \brief Get handle to registration of a screen number for surface update notifications.
264 * \param aScreenNum Screen number.
267 * \return Handle to internal object (currently a CBase), or NULL if not registered
270 SymbianStreamHasRegisteredScreenNotifications( khronos_int32_t aScreenNumber,void** aReturnState)
272 TRAPD(err,*aReturnState=(COpenWfcStreamMap::InstanceL().RegisteredScreenNotifications(aScreenNumber)));
278 * \brief Unregister a screen number for surface update notifications.
280 * \param aScreenNum Screen number.
283 * \return Standard error code or KErrNone
286 SymbianStreamUnregisterScreenNotifications(khronos_int32_t aScreenNumber)
288 khronos_int32_t err2=KErrUnknown;
289 TRAPD(err,err2=COpenWfcStreamMap::InstanceL().UnregisterScreenNotifications(aScreenNumber));
301 * \brief Check if two stream objects are the same surface.
303 * \param aStream compare these two streams.
304 * \param aStream2 compare these two streams.
306 * \return TRUE if they are the same object.
308 EXPORT_C khronos_bool SymbianStreamSame(SymbianStreamType aStream, SymbianStreamType aStream2)
310 if (aStream==aStream2)
311 return KHR_BOOLEAN_TRUE;
312 if (!aStream || !aStream2)
313 return KHR_BOOLEAN_FALSE;
314 if (*aStream==*aStream2)
315 return KHR_BOOLEAN_TRUE;
316 SymbianStreamType found;
317 if ( aStream->Type()!=aStream->EStreamHandle
318 && aStream2->Type()==aStream2->EStreamHandle)
320 if(KErrNone==SymbianStreamFind(aStream,&found))
323 return KHR_BOOLEAN_TRUE;
325 return KHR_BOOLEAN_FALSE;
327 if ( aStream2->Type()!=aStream2->EStreamHandle
328 && aStream->Type()==aStream->EStreamHandle)
330 if(KErrNone==SymbianStreamFind(aStream2,&found))
333 return KHR_BOOLEAN_TRUE;
335 return KHR_BOOLEAN_FALSE;
337 return KHR_BOOLEAN_FALSE;
341 SymbianStreamProcessNotifications(SymbianStreamType aStream,
342 khronos_int32_t aEvent,
343 khronos_int32_t aScreenNumber,
344 khronos_int32_t aSerialNumber,
345 khronos_int32_t* aReturnMask)
347 CSurfaceStream* stream = CSurfaceStream::FromHandle(aStream);
350 stream->ProcessNotifications(aEvent, aScreenNumber, CSurfaceStream::EDefaultOperation, aSerialNumber, aReturnMask);
355 SymbianStreamCheckVisible(SymbianStreamType aStream,
356 khronos_int32_t aEvent,
357 khronos_int32_t aScreenNumber,
358 khronos_int32_t aSerialNumber)
360 CSurfaceStream* stream = CSurfaceStream::FromHandle(aStream);
363 stream->ProcessNotifications(aEvent, aScreenNumber, CSurfaceStream::ECheckVisibleOperation, aSerialNumber, NULL);
368 SymbianStreamAddExtendedObserver(SymbianStreamType aStream,
369 SymbianStreamCallback aObserver,
371 khronos_int32_t aScreenNumber,
372 SymbianStreamEventBits aEvents)
374 CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream);
375 if (stream && aObserver)
378 if (!((ret = stream->AddObserver(aObserver, aEvents, aScreenNumber, aData)) == KErrNone) || aEvents != ESOWF_EventUpdated)
382 if (!((ret = stream->AddObserver(NULL, ESOWF_EventAvailable, aScreenNumber, aData)) == KErrNone))
386 if (!((ret = stream->AddObserver(NULL, ESOWF_EventDisplayed, aScreenNumber, aData)) == KErrNone))
390 ret = stream->AddObserver(NULL, ESOWF_EventDisplayedX, aScreenNumber, aData);
402 SymbianStreamSetFlipState(SymbianStreamType aStream, SymOwfBool aFlip)
404 CSurfaceStream* stream = CSurfaceStream::FromHandle(aStream);
407 stream->SetFlipState(aFlip);
412 SymbianStreamGetChunkHandle(SymbianStreamType aStream, TInt* aHandle)
414 CSurfaceStream* stream = CSurfaceStream::FromHandle(aStream);
415 if (stream && aHandle)
417 *aHandle = stream->GetChunkHandle();
423 } //extern "C" helps fix and verify linkage