--- /dev/null
+#include "e_tizen_embedded_compositor_intern.h"
+
+#include <tizen-extension-server-protocol.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+
+
+struct _E_Tizen_Embedded_Compositor
+{
+ struct wl_global *global;
+};
+
+static E_Tizen_Embedded_Compositor *g_tizen_embedded_compositor = NULL;
+
+static void
+_e_tizen_embedded_compositor_cb_get_socket(struct wl_client *client,
+ struct wl_resource *resource)
+{
+ int sock_fd = -1;
+ pid_t pid = 0;
+
+ wl_client_get_credentials(client, &pid, NULL, NULL);
+
+ sock_fd = socket(PF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0);
+ if (sock_fd < 0)
+ {
+ ERR("Could not create socket: %m, (client:%p, pid:%d)", client, pid);
+ return;
+ }
+
+ tizen_embedded_compositor_send_socket(resource, sock_fd);
+
+ ELOGF("WTZ_EMBEDDED_COMP", "sock_fd(%d) sent! (client:%p, pid:%d)",
+ NULL, sock_fd, client, pid);
+
+ close(sock_fd);
+}
+
+static void
+_e_tizen_embedded_compositor_cb_destroy(struct wl_client *client,
+ struct wl_resource *resource)
+{
+ wl_resource_destroy(resource);
+}
+
+// --------------------------------------------------------
+// tizen_embedded_compositor_interface
+// --------------------------------------------------------
+static const struct tizen_embedded_compositor_interface _e_tizen_embedded_compositor_interface =
+{
+ _e_tizen_embedded_compositor_cb_get_socket,
+ _e_tizen_embedded_compositor_cb_destroy
+};
+
+static void
+_embedded_compositor_client_cb_unbind(struct wl_resource *embedded_compositor_res)
+{
+ // Nothing to do here.
+}
+
+static void
+_e_tizen_embedded_compositor_cb_bind(struct wl_client *client, void *data,
+ uint32_t ver, uint32_t id)
+{
+ struct wl_resource *embedded_compositor_res;
+
+ embedded_compositor_res = wl_resource_create(client,
+ &tizen_embedded_compositor_interface,
+ ver,
+ id);
+ EINA_SAFETY_ON_NULL_GOTO(embedded_compositor_res, err);
+
+ wl_resource_set_implementation(embedded_compositor_res,
+ &_e_tizen_embedded_compositor_interface,
+ NULL,
+ _embedded_compositor_client_cb_unbind);
+ return;
+
+err:
+ ERR("Could not create tizen_embedded_compositor_interface res: %m");
+ wl_client_post_no_memory(client);
+}
+
+EINTERN E_Tizen_Embedded_Compositor *
+e_tizen_embedded_compositor_init(struct wl_display *display)
+{
+ EINA_SAFETY_ON_NULL_RETURN_VAL(display, NULL);
+
+ if (g_tizen_embedded_compositor) return g_tizen_embedded_compositor;
+
+ g_tizen_embedded_compositor = E_NEW(E_Tizen_Embedded_Compositor, 1);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(g_tizen_embedded_compositor, NULL);
+
+ g_tizen_embedded_compositor->global = wl_global_create(display,
+ &tizen_embedded_compositor_interface,
+ 1,
+ NULL,
+ _e_tizen_embedded_compositor_cb_bind);
+
+ if (!g_tizen_embedded_compositor->global)
+ {
+ ERR("Failed to create tizen_embedded_compositor global");
+ E_FREE(g_tizen_embedded_compositor);
+ g_tizen_embedded_compositor = NULL;
+
+ return NULL;
+ }
+
+ return g_tizen_embedded_compositor;
+}
+
+EINTERN void
+e_tizen_embedded_compositor_shutdown(void)
+{
+ if (!g_tizen_embedded_compositor) return;
+
+ wl_global_destroy(g_tizen_embedded_compositor->global);
+
+ E_FREE(g_tizen_embedded_compositor);
+ g_tizen_embedded_compositor = NULL;
+}