From 7fe60435bce6595a9c58a9bfd8244d74b5320e96 Mon Sep 17 00:00:00 2001 From: Benjamin Franzke Date: Tue, 15 Jan 2013 08:46:13 +0100 Subject: Import DirectFB141_2k11R3_beta5 --- Source/FusionDale/src/ifusiondale.c | 228 ++++++++++++++++++++++++++++++++++++ 1 file changed, 228 insertions(+) create mode 100755 Source/FusionDale/src/ifusiondale.c (limited to 'Source/FusionDale/src/ifusiondale.c') diff --git a/Source/FusionDale/src/ifusiondale.c b/Source/FusionDale/src/ifusiondale.c new file mode 100755 index 0000000..14a688f --- /dev/null +++ b/Source/FusionDale/src/ifusiondale.c @@ -0,0 +1,228 @@ +/* + (c) Copyright 2006-2007 directfb.org + + All rights reserved. + + Written by Denis Oliver Kropp . + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include + +#include + +#include + +#include +#include + +#include +#include + +#include + +#include + +#include +#include + +#include "ifusiondale.h" + + + +static void +IFusionDale_Destruct( IFusionDale *thiz ) +{ + IFusionDale_data *data = (IFusionDale_data*)thiz->priv; + + fd_core_destroy( data->core, false ); + + DIRECT_DEALLOCATE_INTERFACE( thiz ); + + if (ifusiondale_singleton == thiz) + ifusiondale_singleton = NULL; +} + +static DirectResult +IFusionDale_AddRef( IFusionDale *thiz ) +{ + DIRECT_INTERFACE_GET_DATA (IFusionDale); + + data->ref++; + + return DR_OK; +} + +static DirectResult +IFusionDale_Release( IFusionDale *thiz ) +{ + DIRECT_INTERFACE_GET_DATA (IFusionDale) + + if (--data->ref == 0) + IFusionDale_Destruct( thiz ); + + return DR_OK; +} + +static DirectResult +IFusionDale_CreateMessenger( IFusionDale *thiz, + IFusionDaleMessenger **ret_interface ) +{ + DirectResult ret; + CoreMessenger *messenger; + IFusionDaleMessenger *interface; + + DIRECT_INTERFACE_GET_DATA(IFusionDale) + + /* Check arguments */ + if (!ret_interface) + return DR_INVARG; + + /* Create a new messenger. */ + ret = fd_messenger_create( data->core, &messenger ); + if (ret) + return ret; + + DIRECT_ALLOCATE_INTERFACE( interface, IFusionDaleMessenger ); + + ret = IFusionDaleMessenger_Construct( interface, data->core, messenger ); + + fd_messenger_unref( messenger ); + + if (ret) + return ret; + + *ret_interface = interface; + + return DR_OK; +} + +static DirectResult +IFusionDale_GetMessenger( IFusionDale *thiz, + IFusionDaleMessenger **ret_interface ) +{ + DirectResult ret; + CoreMessenger *messenger, *tmp; + IFusionDaleMessenger *interface; + + DIRECT_INTERFACE_GET_DATA(IFusionDale) + + /* Check arguments */ + if (!ret_interface) + return DR_INVARG; + + /* Try to get the messenger. */ + ret = fd_core_get_messenger( data->core, 1, &messenger ); + switch (ret) { + case DR_OK: + break; + + case DR_IDNOTFOUND: + /* Create a temporary messenger... */ + ret = fd_messenger_create( data->core, &tmp ); + if (ret) + return ret; + + /* ...but get the first messenger, to work around race conditions... */ + ret = fd_core_get_messenger( data->core, 1, &messenger ); + + /* ...and unref our temporary (most probably the same one). */ + fd_messenger_unref( tmp ); + + if (ret) + return ret; + break; + + default: + return ret; + } + + DIRECT_ALLOCATE_INTERFACE( interface, IFusionDaleMessenger ); + + ret = IFusionDaleMessenger_Construct( interface, data->core, messenger ); + + fd_messenger_unref( messenger ); + + if (ret) + return ret; + + *ret_interface = interface; + + return DR_OK; +} + +static DirectResult +IFusionDale_EnterComa( IFusionDale *thiz, + const char *name, + IComa **ret_interface ) +{ + DirectResult ret; + Coma *coma; + IComa *interface; + + DIRECT_INTERFACE_GET_DATA(IFusionDale) + + /* Check arguments */ + if (!name || !ret_interface) + return DR_INVARG; + + /* Enter the specified Coma. */ + ret = coma_enter( fd_core_world( data->core ), name, &coma ); + if (ret) + return ret; + + DIRECT_ALLOCATE_INTERFACE( interface, IComa ); + + ret = IComa_Construct( interface, coma ); + if (ret) + return ret; + + *ret_interface = interface; + + return DR_OK; +} + +DirectResult +IFusionDale_Construct( IFusionDale *thiz ) +{ + DirectResult ret; + + /* Allocate interface data. */ + DIRECT_ALLOCATE_INTERFACE_DATA( thiz, IFusionDale ); + + /* Initialize interface data. */ + data->ref = 1; + + /* Create the core instance. */ + ret = fd_core_create( &data->core ); + if (ret) { + FusionDaleError( "FusionDale: fd_core_create() failed", ret ); + + DIRECT_DEALLOCATE_INTERFACE( thiz ); + + return ret; + } + + /* Assign interface pointers. */ + thiz->AddRef = IFusionDale_AddRef; + thiz->Release = IFusionDale_Release; + thiz->CreateMessenger = IFusionDale_CreateMessenger; + thiz->GetMessenger = IFusionDale_GetMessenger; + thiz->EnterComa = IFusionDale_EnterComa; + + return DR_OK; +} -- cgit