virtual output: Add implementation for client and test case for virtual output.
[platform/core/uifw/libtdm.git] / client / tdm_client.c
index 4023208..8d17c94 100644 (file)
@@ -89,6 +89,12 @@ typedef struct _tdm_private_client_output {
        struct list_head link;
 } tdm_private_client_output;
 
+typedef struct _tdm_private_client_voutput {
+    tdm_private_client_output base;
+       struct wl_tdm_voutput *wl_voutput;
+       uint32_t msg;
+} tdm_private_client_voutput;
+
 struct _tdm_private_client_vblank {
        tdm_private_client_output *private_output;
 
@@ -1591,3 +1597,224 @@ tdm_client_vblank_is_waiting(tdm_client_vblank *vblank)
 
        return (LIST_LENGTH(&private_vblank->wait_list) > 0) ? 1 : 0;
 }
+
+void
+tdm_client_voutput_cb_ack_message(void *data, struct wl_tdm_voutput *wl_voutput, uint32_t msg)
+{
+       tdm_private_client_voutput *private_voutput = data;
+
+       private_voutput->msg = msg;
+}
+
+static const struct wl_tdm_voutput_listener tdm_client_voutput_lisntener = {
+       tdm_client_voutput_cb_ack_message
+};
+
+tdm_client_voutput *
+tdm_client_create_voutput(tdm_client *client, const char *name, tdm_error *error)
+{
+       tdm_private_client *private_client;
+       tdm_private_client_output *private_output;
+       tdm_private_client_voutput *private_voutput;
+       struct wl_proxy *wrapper;
+
+       if (error)
+               *error = TDM_ERROR_NONE;
+
+       if (!client) {
+               TDM_ERR("'!client' failed");
+               if (error)
+                       *error = TDM_ERROR_INVALID_PARAMETER;
+               return NULL;
+       }
+
+       if (!name) {
+               TDM_ERR("'!name' failed");
+               if (error)
+                       *error = TDM_ERROR_INVALID_PARAMETER;
+               return NULL;
+       }
+
+       private_client = (tdm_private_client *)client;
+
+       pthread_mutex_lock(&private_client->lock);
+
+       if (CHECK_WL_PROTOCOL_ERROR(private_client)) {
+               if (error)
+                       *error = TDM_ERROR_PROTOCOL_ERROR;
+               pthread_mutex_unlock(&private_client->lock);
+               return NULL;
+       }
+
+       LIST_FOR_EACH_ENTRY(private_output, &private_client->output_list, link) {
+               if (!strncmp(private_output->name, name, TDM_NAME_LEN)) {
+                       if (error)
+                               *error = TDM_ERROR_INVALID_PARAMETER; // FIXME define new error type.
+                       pthread_mutex_unlock(&private_client->lock);
+                       return NULL;
+               }
+       }
+
+       wrapper = wl_proxy_create_wrapper(private_client->tdm);
+       if (!wrapper) {
+               TDM_ERR("create virtual output wrapper failed");
+               if (error)
+                       *error = TDM_ERROR_OUT_OF_MEMORY;
+               pthread_mutex_unlock(&private_client->lock);
+               return NULL;
+       }
+
+       wl_proxy_set_queue(wrapper, private_client->queue);
+
+       private_voutput = calloc(1, sizeof *private_voutput);
+       if (!private_voutput) {
+               /* LOCV_EXCL_START */
+               wl_proxy_wrapper_destroy(wrapper);
+               TDM_ERR("alloc failed");
+               if (error)
+                       *error = TDM_ERROR_OUT_OF_MEMORY;
+               return NULL;
+               /* LOCV_EXCL_STOP */
+       }
+
+       private_voutput->base.private_client = private_client;
+
+       snprintf(private_voutput->base.name, TDM_NAME_LEN, "%s", name);
+       private_voutput->wl_voutput = wl_tdm_create_voutput((struct wl_tdm *)wrapper, private_voutput->base.name);
+       wl_proxy_wrapper_destroy(wrapper);
+       if (!private_voutput->wl_voutput) {
+               /* LCOV_EXCL_START */
+               TDM_ERR("couldn't create voutput resource");
+               free(private_voutput);
+               if (error)
+                       *error = TDM_ERROR_OUT_OF_MEMORY;
+               pthread_mutex_unlock(&private_client->lock);
+               return NULL;
+               /* LCOV_EXCL_STOP */
+       }
+
+       wl_tdm_voutput_add_listener(private_voutput->wl_voutput,
+                                                               &tdm_client_voutput_lisntener, private_voutput);
+       wl_display_roundtrip_queue(private_client->display, private_client->queue);
+
+       wl_proxy_set_queue((struct wl_proxy *)private_voutput->wl_voutput, NULL);
+
+       if (CHECK_WL_PROTOCOL_ERROR(private_client)) {
+               wl_tdm_voutput_destroy(private_voutput->wl_voutput);
+               free(private_voutput);
+               if (error)
+                       *error = TDM_ERROR_PROTOCOL_ERROR;
+               pthread_mutex_unlock(&private_client->lock);
+               return NULL;
+       }
+
+       if (private_voutput->msg != WL_TDM_VOUTPUT_MESSAGE_ADDED)
+       {
+               wl_tdm_voutput_destroy(private_voutput->wl_voutput);
+               free(private_voutput);
+               if (error)
+                       *error = TDM_ERROR_PROTOCOL_ERROR;      // FIXME add new error type.
+               pthread_mutex_unlock(&private_client->lock);
+               return NULL;
+       }
+
+       pthread_mutex_unlock(&private_client->lock);
+
+       return (tdm_client_voutput *)private_voutput;
+}
+
+void
+tdm_client_voutput_destroy(tdm_client_voutput *voutput)
+{
+       tdm_private_client_voutput *private_voutput = (tdm_private_client_voutput *)voutput;
+
+       if (!private_voutput)
+               return;
+
+       free(private_voutput);
+}
+
+tdm_error
+tdm_client_voutput_set_available_modes(tdm_client_voutput *voutput, const tdm_client_output_mode *modes, int count)
+{
+       TDM_RETURN_VAL_IF_FAIL(voutput != NULL, TDM_ERROR_INVALID_PARAMETER);
+       TDM_RETURN_VAL_IF_FAIL(modes != NULL, TDM_ERROR_INVALID_PARAMETER);
+       TDM_RETURN_VAL_IF_FAIL(count > 0, TDM_ERROR_INVALID_PARAMETER);
+
+       return TDM_ERROR_NONE;
+}
+
+tdm_error
+tdm_client_voutput_set_physical_size(tdm_client_voutput *voutput, int mmWidth, int mmHeight)
+{
+       TDM_RETURN_VAL_IF_FAIL(voutput != NULL, TDM_ERROR_INVALID_PARAMETER);
+       TDM_RETURN_VAL_IF_FAIL(mmWidth > 0, TDM_ERROR_INVALID_PARAMETER);
+       TDM_RETURN_VAL_IF_FAIL(mmHeight > 0, TDM_ERROR_INVALID_PARAMETER);
+
+       return TDM_ERROR_NONE;
+}
+
+tdm_client_output *
+tdm_client_voutput_get_client_output(tdm_client_voutput *voutput, tdm_error *error)
+{
+       tdm_private_client_voutput *private_voutput;
+
+       if (error)
+               *error = TDM_ERROR_NONE;
+
+       if (!voutput)
+       {
+               TDM_ERR("'!voutput' failed");
+               if (error)
+                       *error = TDM_ERROR_INVALID_PARAMETER;
+               return NULL;
+       }
+
+       private_voutput = (tdm_private_client_voutput *)voutput;
+
+       return &private_voutput->base;
+}
+
+tdm_error
+tdm_client_output_set_buffer_queue(tdm_client_output *output, void *queue, void *func)
+{
+       TDM_RETURN_VAL_IF_FAIL(output != NULL, TDM_ERROR_INVALID_PARAMETER);
+       TDM_RETURN_VAL_IF_FAIL(queue != NULL, TDM_ERROR_INVALID_PARAMETER);
+       TDM_RETURN_VAL_IF_FAIL(func != NULL, TDM_ERROR_INVALID_PARAMETER);
+
+       return TDM_ERROR_NONE;
+}
+
+tdm_error
+tdm_client_output_get_available_modes(tdm_client_output *output, tdm_client_output_mode **modes, int *count)
+{
+       TDM_RETURN_VAL_IF_FAIL(output != NULL, TDM_ERROR_INVALID_PARAMETER);
+       TDM_RETURN_VAL_IF_FAIL(modes != NULL, TDM_ERROR_INVALID_PARAMETER);
+       TDM_RETURN_VAL_IF_FAIL(count != NULL, TDM_ERROR_INVALID_PARAMETER);
+
+       return TDM_ERROR_NONE;
+}
+
+tdm_error
+tdm_client_output_set_mode(tdm_client_output *output, const tdm_client_output_mode *mode)
+{
+       TDM_RETURN_VAL_IF_FAIL(output != NULL, TDM_ERROR_INVALID_PARAMETER);
+       TDM_RETURN_VAL_IF_FAIL(mode != NULL, TDM_ERROR_INVALID_PARAMETER);
+
+       return TDM_ERROR_NONE;
+}
+
+tdm_error
+tdm_client_output_connect(tdm_client_output *output)
+{
+       TDM_RETURN_VAL_IF_FAIL(output != NULL, TDM_ERROR_INVALID_PARAMETER);
+
+       return TDM_ERROR_NONE;
+}
+
+tdm_error
+tdm_client_output_disconnect(tdm_client_output *output)
+{
+       TDM_RETURN_VAL_IF_FAIL(output != NULL, TDM_ERROR_INVALID_PARAMETER);
+       return TDM_ERROR_NONE;
+}