1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/graphics/graphicscomposition/openwfsupport/src/openwfcstream.cpp Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,423 @@
1.4 +// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
1.5 +// All rights reserved.
1.6 +// This component and the accompanying materials are made available
1.7 +// under the terms of "Eclipse Public License v1.0"
1.8 +// which accompanies this distribution, and is available
1.9 +// at the URL "http://www.eclipse.org/legal/epl-v10.html".
1.10 +//
1.11 +// Initial Contributors:
1.12 +// Nokia Corporation - initial contribution.
1.13 +//
1.14 +// Contributors:
1.15 +//
1.16 +// Description:
1.17 +// openwfcstream.cpp
1.18 +// C API for surface stream implementation of OpenWF-C NativeStream
1.19 +//
1.20 +
1.21 +
1.22 +// Include Files
1.23 +#include <e32def.h>
1.24 +#include <pixelformats.h>
1.25 +#include <graphics/suerror.h>
1.26 +#include "symbianstream.h"
1.27 +#include "surfacestream.h"
1.28 +#include "streammap.h"
1.29 +#include "openwfcpanic.h"
1.30 +
1.31 +
1.32 +extern "C"{
1.33 +
1.34 +EXPORT_C TErrCode SymbianStreamAcquire( const TSurfaceId* aId, SymbianStreamType* aReturnStream)
1.35 + {
1.36 + if (aId && !aId->IsNull())
1.37 + {
1.38 + CSurfaceStream* stream = NULL;
1.39 + if (aId->Type()==TSurfaceId::EStreamHandle)
1.40 + {
1.41 + stream=CSurfaceStream::FromHandle(aId);
1.42 + __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamUnexpectedError));
1.43 + stream->AddReference();
1.44 + *aReturnStream= stream->ToHandle();
1.45 + return KErrNone;
1.46 + }
1.47 + else
1.48 + {
1.49 + TRAPD(err,stream = COpenWfcStreamMap::InstanceL().AcquireL(*aId));
1.50 + if (stream)
1.51 + {
1.52 + *aReturnStream = stream->ToHandle();
1.53 + return KErrNone;
1.54 + }
1.55 + else
1.56 + {
1.57 + return err;
1.58 + }
1.59 + }
1.60 + }
1.61 + else
1.62 + {
1.63 + *aReturnStream = NULL;
1.64 + return KErrBadHandle;
1.65 + }
1.66 + }
1.67 +
1.68 +EXPORT_C TErrCode SymbianStreamFind( const TSurfaceId* aId, SymbianStreamType* aReturnStream)
1.69 + {
1.70 + if (aId && !aId->IsNull())
1.71 + {
1.72 + CSurfaceStream* stream=NULL;
1.73 + if (aId->Type()==TSurfaceId::EStreamHandle)
1.74 + {
1.75 + stream=CSurfaceStream::FromHandle(aId);
1.76 + __ASSERT_DEBUG(stream, Panic(EOwfSymbianStreamBadArgument));
1.77 + stream->AddReference();
1.78 + *aReturnStream= stream->ToHandle();
1.79 + return KErrNone;
1.80 + }
1.81 + else
1.82 + {
1.83 + TRAPD(err,stream = COpenWfcStreamMap::InstanceL().Find(*aId));
1.84 + if (stream)
1.85 + {
1.86 + *aReturnStream = stream->ToHandle();
1.87 + return KErrNone;
1.88 + }
1.89 + else
1.90 + {
1.91 + *aReturnStream = NULL;
1.92 + if (err==KErrNone)
1.93 + {
1.94 + return KErrNotFound;
1.95 + }
1.96 + else
1.97 + {
1.98 + return err;
1.99 + }
1.100 + }
1.101 + }
1.102 + }
1.103 + else
1.104 + {
1.105 + *aReturnStream = NULL;
1.106 + return KErrBadHandle;
1.107 + }
1.108 + }
1.109 +
1.110 +EXPORT_C void SymbianStreamAddReference(SymbianStreamType aStream)
1.111 + {
1.112 + CSurfaceStream* sstream=CSurfaceStream::FromHandle(aStream);
1.113 + if (sstream)
1.114 + {
1.115 + sstream->AddReference();
1.116 + }
1.117 + }
1.118 +
1.119 +EXPORT_C TErrCode SymbianStreamGetBufferId( SymbianStreamType aStream,
1.120 + SymbianStreamBuffer aBufferHandle,
1.121 + khronos_int32_t* aReturnIndex,
1.122 + const TSurfaceId** aReturnSurface)
1.123 + {
1.124 + CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream);
1.125 + __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument));
1.126 + if (aReturnIndex)
1.127 + {
1.128 + *aReturnIndex=stream->BufferHandleToIndex(aBufferHandle);
1.129 + *aReturnSurface = &stream->SurfaceId();
1.130 + }
1.131 + return KErrNone;
1.132 + }
1.133 +
1.134 +EXPORT_C void SymbianStreamRemoveReference(SymbianStreamType aStream)
1.135 + {
1.136 + CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream);
1.137 + __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument));
1.138 + stream->ReleaseReference();
1.139 + }
1.140 +EXPORT_C void SymbianStreamGetHeader( SymbianStreamType aStream,
1.141 + khronos_int32_t* aWidth,
1.142 + khronos_int32_t* aHeight,
1.143 + khronos_int32_t* aStride,
1.144 + khronos_int32_t* aFormat,
1.145 + khronos_int32_t* aPixelSize)
1.146 + {
1.147 + CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream);
1.148 + __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument));
1.149 + stream->GetHeader(aWidth,aHeight,aStride,aFormat,aPixelSize);
1.150 + }
1.151 +
1.152 +EXPORT_C TErrCode SymbianStreamAcquireReadBuffer( SymbianStreamType aStream, SymbianStreamBuffer* aReturnBuffer)
1.153 + {
1.154 + CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream);
1.155 + __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument));
1.156 + *aReturnBuffer = stream->AcquireReadBuffer();
1.157 + return KErrNone;
1.158 + }
1.159 +EXPORT_C TErrCode SymbianStreamReleaseReadBuffer( SymbianStreamType aStream,
1.160 + SymbianStreamBuffer aBuffer)
1.161 + {
1.162 + CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream);
1.163 + __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument));
1.164 + return stream->ReleaseReadBuffer(aBuffer);
1.165 + }
1.166 +
1.167 +EXPORT_C TErrCode SymbianStreamAcquireWriteBuffer( SymbianStreamType aStream, SymbianStreamBuffer* aReturnBuffer)
1.168 + {
1.169 + CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream);
1.170 + __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument));
1.171 + *aReturnBuffer = stream->AcquireWriteBuffer();
1.172 + if (*aReturnBuffer != NULL)
1.173 + {
1.174 + return KErrNone;
1.175 + }
1.176 + else
1.177 + {
1.178 + return KErrInUse;
1.179 + }
1.180 + }
1.181 +
1.182 +EXPORT_C TErrCode SymbianStreamReleaseWriteBuffer( SymbianStreamType aStream,
1.183 + SymbianStreamBuffer aBuffer)
1.184 + {
1.185 + CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream);
1.186 + __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument));
1.187 + stream->ReleaseWriteBuffer(aBuffer);
1.188 + return KErrNone;
1.189 + }
1.190 +
1.191 +EXPORT_C TErrCode SymbianStreamAddObserver( SymbianStreamType aStream,
1.192 + SymbianStreamCallback aObserver,
1.193 + void* aData)
1.194 + {
1.195 + CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream);
1.196 + if (stream && aObserver)
1.197 + {
1.198 + SYMOWF_DEFAULT_EVENT_PARAM eventPar;
1.199 + eventPar.length = sizeof(eventPar);
1.200 + eventPar.event = ESOWF_NoEvent;
1.201 + aObserver(SYMBIAN_INVALID_HANDLE, ESOWF_ObserverReturnDefaultEvent, NULL, &eventPar);
1.202 + return stream->AddObserver(aObserver, eventPar.event, KNoAssociatedScreenNumber, aData);
1.203 + }
1.204 + return KErrBadHandle;
1.205 + }
1.206 +
1.207 +EXPORT_C TErrCode SymbianStreamRemoveObserver( SymbianStreamType aStream,
1.208 + void* aData,
1.209 + SymbianStreamEventBits aEvents)
1.210 + {
1.211 + CSurfaceStream* stream = CSurfaceStream::FromHandle(aStream);
1.212 + if (stream)
1.213 + {
1.214 + return stream->RemoveObserver(aEvents, aData);
1.215 + }
1.216 + return KErrBadHandle;
1.217 + }
1.218 +
1.219 +
1.220 +EXPORT_C TErrCode SymbianStreamGetBufferPointer( SymbianStreamType aStream,
1.221 + SymbianStreamBuffer aBuffer,
1.222 + void** aReturnPointer)
1.223 + {
1.224 + CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream);
1.225 + __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument));
1.226 + *aReturnPointer = NULL;
1.227 + TRAPD(err,*aReturnPointer = stream->GetBufferPtrL(aBuffer));
1.228 + return err;
1.229 + }
1.230 +
1.231 +EXPORT_C void
1.232 +SymbianStreamSetProtectionFlag( SymbianStreamType aStream, khronos_bool aFlag)
1.233 + {
1.234 + CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream);
1.235 + if (stream)
1.236 + {
1.237 + stream->SetProtectionFlag(aFlag);
1.238 + }
1.239 + }
1.240 +
1.241 +/*!
1.242 + * \brief Register a screen number for surface update notifications.
1.243 + *
1.244 + * \param aScreenNum Screen number.
1.245 + *
1.246 + *
1.247 + * \return Standard error code or KErrNone
1.248 + */
1.249 +EXPORT_C TErrCode SymbianStreamRegisterScreenNotifications( khronos_int32_t aScreenNumber,
1.250 + khronos_int32_t aPriority,
1.251 + khronos_int32_t aInternalVersion)
1.252 + {
1.253 + khronos_int32_t err2=KErrUnknown;
1.254 + TRAPD(err,err2=COpenWfcStreamMap::InstanceL().RegisterScreenNotifications(aScreenNumber,aPriority,aInternalVersion));
1.255 + if (err)
1.256 + {
1.257 + return err;
1.258 + }
1.259 + else
1.260 + {
1.261 + return err2;
1.262 + }
1.263 + }
1.264 +/*!
1.265 + * \brief Get handle to registration of a screen number for surface update notifications.
1.266 + *
1.267 + * \param aScreenNum Screen number.
1.268 + *
1.269 + *
1.270 + * \return Handle to internal object (currently a CBase), or NULL if not registered
1.271 + */
1.272 +EXPORT_C TErrCode
1.273 +SymbianStreamHasRegisteredScreenNotifications( khronos_int32_t aScreenNumber,void** aReturnState)
1.274 + {
1.275 + TRAPD(err,*aReturnState=(COpenWfcStreamMap::InstanceL().RegisteredScreenNotifications(aScreenNumber)));
1.276 + return err;
1.277 + }
1.278 +
1.279 +
1.280 +/*!
1.281 + * \brief Unregister a screen number for surface update notifications.
1.282 + *
1.283 + * \param aScreenNum Screen number.
1.284 + *
1.285 + *
1.286 + * \return Standard error code or KErrNone
1.287 + */
1.288 +EXPORT_C TErrCode
1.289 +SymbianStreamUnregisterScreenNotifications(khronos_int32_t aScreenNumber)
1.290 + {
1.291 + khronos_int32_t err2=KErrUnknown;
1.292 + TRAPD(err,err2=COpenWfcStreamMap::InstanceL().UnregisterScreenNotifications(aScreenNumber));
1.293 + if (err)
1.294 + {
1.295 + return err;
1.296 + }
1.297 + else
1.298 + {
1.299 + return err2;
1.300 + }
1.301 + }
1.302 +
1.303 +/*!
1.304 + * \brief Check if two stream objects are the same surface.
1.305 + *
1.306 + * \param aStream compare these two streams.
1.307 + * \param aStream2 compare these two streams.
1.308 + *
1.309 + * \return TRUE if they are the same object.
1.310 + */
1.311 +EXPORT_C khronos_bool SymbianStreamSame(SymbianStreamType aStream, SymbianStreamType aStream2)
1.312 + {
1.313 + if (aStream==aStream2)
1.314 + return KHR_BOOLEAN_TRUE;
1.315 + if (!aStream || !aStream2)
1.316 + return KHR_BOOLEAN_FALSE;
1.317 + if (*aStream==*aStream2)
1.318 + return KHR_BOOLEAN_TRUE;
1.319 + SymbianStreamType found;
1.320 + if ( aStream->Type()!=aStream->EStreamHandle
1.321 + && aStream2->Type()==aStream2->EStreamHandle)
1.322 + {
1.323 + if(KErrNone==SymbianStreamFind(aStream,&found))
1.324 + {
1.325 + if (found==aStream2)
1.326 + return KHR_BOOLEAN_TRUE;
1.327 + }
1.328 + return KHR_BOOLEAN_FALSE;
1.329 + }
1.330 + if ( aStream2->Type()!=aStream2->EStreamHandle
1.331 + && aStream->Type()==aStream->EStreamHandle)
1.332 + {
1.333 + if(KErrNone==SymbianStreamFind(aStream2,&found))
1.334 + {
1.335 + if (aStream==found)
1.336 + return KHR_BOOLEAN_TRUE;
1.337 + }
1.338 + return KHR_BOOLEAN_FALSE;
1.339 + }
1.340 + return KHR_BOOLEAN_FALSE;
1.341 + }
1.342 +
1.343 +EXPORT_C void
1.344 +SymbianStreamProcessNotifications(SymbianStreamType aStream,
1.345 + khronos_int32_t aEvent,
1.346 + khronos_int32_t aScreenNumber,
1.347 + khronos_int32_t aSerialNumber,
1.348 + khronos_int32_t* aReturnMask)
1.349 + {
1.350 + CSurfaceStream* stream = CSurfaceStream::FromHandle(aStream);
1.351 + if (stream)
1.352 + {
1.353 + stream->ProcessNotifications(aEvent, aScreenNumber, CSurfaceStream::EDefaultOperation, aSerialNumber, aReturnMask);
1.354 + }
1.355 + }
1.356 +
1.357 +EXPORT_C void
1.358 +SymbianStreamCheckVisible(SymbianStreamType aStream,
1.359 + khronos_int32_t aEvent,
1.360 + khronos_int32_t aScreenNumber,
1.361 + khronos_int32_t aSerialNumber)
1.362 + {
1.363 + CSurfaceStream* stream = CSurfaceStream::FromHandle(aStream);
1.364 + if (stream)
1.365 + {
1.366 + stream->ProcessNotifications(aEvent, aScreenNumber, CSurfaceStream::ECheckVisibleOperation, aSerialNumber, NULL);
1.367 + }
1.368 + }
1.369 +
1.370 +EXPORT_C TErrCode
1.371 +SymbianStreamAddExtendedObserver(SymbianStreamType aStream,
1.372 + SymbianStreamCallback aObserver,
1.373 + void* aData,
1.374 + khronos_int32_t aScreenNumber,
1.375 + SymbianStreamEventBits aEvents)
1.376 + {
1.377 + CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream);
1.378 + if (stream && aObserver)
1.379 + {
1.380 + TInt ret = KErrNone;
1.381 + if (!((ret = stream->AddObserver(aObserver, aEvents, aScreenNumber, aData)) == KErrNone) || aEvents != ESOWF_EventUpdated)
1.382 + {
1.383 + return ret;
1.384 + }
1.385 + if (!((ret = stream->AddObserver(NULL, ESOWF_EventAvailable, aScreenNumber, aData)) == KErrNone))
1.386 + {
1.387 + return ret;
1.388 + }
1.389 + if (!((ret = stream->AddObserver(NULL, ESOWF_EventDisplayed, aScreenNumber, aData)) == KErrNone))
1.390 + {
1.391 + return ret;
1.392 + }
1.393 + ret = stream->AddObserver(NULL, ESOWF_EventDisplayedX, aScreenNumber, aData);
1.394 + return ret;
1.395 + }
1.396 + else
1.397 + {
1.398 + return KErrArgument;
1.399 + }
1.400 + }
1.401 +
1.402 +
1.403 +
1.404 +EXPORT_C void
1.405 +SymbianStreamSetFlipState(SymbianStreamType aStream, SymOwfBool aFlip)
1.406 + {
1.407 + CSurfaceStream* stream = CSurfaceStream::FromHandle(aStream);
1.408 + if (stream)
1.409 + {
1.410 + stream->SetFlipState(aFlip);
1.411 + }
1.412 + }
1.413 +
1.414 +EXPORT_C TErrCode
1.415 +SymbianStreamGetChunkHandle(SymbianStreamType aStream, TInt* aHandle)
1.416 + {
1.417 + CSurfaceStream* stream = CSurfaceStream::FromHandle(aStream);
1.418 + if (stream && aHandle)
1.419 + {
1.420 + *aHandle = stream->GetChunkHandle();
1.421 + return KErrNone;
1.422 + }
1.423 + return KErrArgument;
1.424 + }
1.425 +
1.426 +} //extern "C" helps fix and verify linkage