virtual output: Add implementation for set_available_modes, connect and disconnect.
[platform/core/uifw/libtdm.git] / client / tdm_client.c
index 8d17c94..4c05811 100644 (file)
@@ -92,6 +92,13 @@ typedef struct _tdm_private_client_output {
 typedef struct _tdm_private_client_voutput {
     tdm_private_client_output base;
        struct wl_tdm_voutput *wl_voutput;
+
+       struct
+       {
+               int count;
+               tdm_client_output_mode *modes;
+       } available_modes;
+
        uint32_t msg;
 } tdm_private_client_voutput;
 
@@ -1679,7 +1686,6 @@ tdm_client_create_voutput(tdm_client *client, const char *name, tdm_error *error
 
        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) {
@@ -1731,15 +1737,36 @@ tdm_client_voutput_destroy(tdm_client_voutput *voutput)
        if (!private_voutput)
                return;
 
+       wl_tdm_voutput_destroy(private_voutput->wl_voutput);
+
        free(private_voutput);
 }
 
 tdm_error
 tdm_client_voutput_set_available_modes(tdm_client_voutput *voutput, const tdm_client_output_mode *modes, int count)
 {
+       tdm_private_client_voutput *private_voutput;
+
        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);
+
+       if ((count > 0) && (modes == NULL))
+               return TDM_ERROR_INVALID_PARAMETER;
+
+       private_voutput = (tdm_private_client_voutput *)voutput;
+
+       if (private_voutput->base.connection == TDM_OUTPUT_CONN_STATUS_CONNECTED)
+               return TDM_ERROR_BAD_REQUEST;
+
+       if (private_voutput->available_modes.modes)
+               free(private_voutput->available_modes.modes);
+
+       private_voutput->available_modes.count = count;
+
+       if (count != 0)
+       {
+               private_voutput->available_modes.modes = calloc(count, sizeof(tdm_client_output_mode));
+               memcpy(private_voutput->available_modes.modes, modes, sizeof(tdm_client_output_mode) * count);
+       }
 
        return TDM_ERROR_NONE;
 }
@@ -1807,14 +1834,57 @@ tdm_client_output_set_mode(tdm_client_output *output, const tdm_client_output_mo
 tdm_error
 tdm_client_output_connect(tdm_client_output *output)
 {
+       tdm_private_client_output *private_output;
+       tdm_private_client_voutput *private_voutput;
+       tdm_client_output_mode *modes;
+       int i;
+
        TDM_RETURN_VAL_IF_FAIL(output != NULL, TDM_ERROR_INVALID_PARAMETER);
 
+       private_output = (tdm_private_client_output *)output;
+       private_voutput = (tdm_private_client_voutput *)output;
+
+       TDM_RETURN_VAL_IF_FAIL(private_output->connection != TDM_OUTPUT_CONN_STATUS_CONNECTED,
+                                                  TDM_ERROR_BAD_REQUEST);
+
+       private_output->connection = TDM_OUTPUT_CONN_STATUS_CONNECTED;
+
+       modes = private_voutput->available_modes.modes;
+       for (i = 0; i < private_voutput->available_modes.count; i++)
+       {
+               wl_tdm_voutput_set_available_modes(private_voutput->wl_voutput, i,
+                                                                                  modes[i].clock, modes[i].hdisplay,
+                                                                                  modes[i].hsync_start, modes[i].hsync_end,
+                                                                                  modes[i].htotal, modes[i].hskew,
+                                                                                  modes[i].vdisplay, modes[i].vsync_start,
+                                                                                  modes[i].vsync_end, modes[i].vtotal,
+                                                                                  modes[i].vscan, modes[i].vrefresh,
+                                                                                  modes[i].flags, modes[i].type,
+                                                                                  modes[i].name);
+       }
+
+       wl_tdm_voutput_connect(private_voutput->wl_voutput);
+
        return TDM_ERROR_NONE;
 }
 
 tdm_error
 tdm_client_output_disconnect(tdm_client_output *output)
 {
+       tdm_private_client_voutput *private_voutput;
+       tdm_private_client_output *private_output;
+
        TDM_RETURN_VAL_IF_FAIL(output != NULL, TDM_ERROR_INVALID_PARAMETER);
+
+       private_output = (tdm_private_client_output *)output;
+       private_voutput = (tdm_private_client_voutput *)output;
+
+       TDM_RETURN_VAL_IF_FAIL(private_output->connection != TDM_OUTPUT_CONN_STATUS_DISCONNECTED,
+                                                  TDM_ERROR_BAD_REQUEST);
+
+       private_output->connection = TDM_OUTPUT_CONN_STATUS_DISCONNECTED;
+
+       wl_tdm_voutput_disconnect(private_voutput->wl_voutput);
+
        return TDM_ERROR_NONE;
 }