* limitations under the License.
*
*/
-\r
-#include "mm_wfd_proxy.h"\r
-#include <gst/gst.h>\r
-#include <fcntl.h>\r
-\r
-#include <dbus/dbus.h>\r
-#include <dbus/dbus-shared.h>\r
-#include <dbus/dbus-glib-lowlevel.h>\r
-\r
-#include "wfd-stub.h"\r
-#include <dlog.h>\r
-\r
-#define DEST_HOST "127.0.0.1"\r
-#define WFD_PROXY_COMM_PORT 8888\r
-#define WFD_TIME_SPAN_100_MILLISECOND (100 * G_TIME_SPAN_MILLISECOND)\r
+
+#include "mm_wfd_proxy.h"
+#include <gst/gst.h>
+#include <fcntl.h>
+
+#include <dbus/dbus.h>
+#include <dbus/dbus-shared.h>
+#include <dbus/dbus-glib-lowlevel.h>
+
+#include "wfd-stub.h"
+#include <dlog.h>
+
+#define DEST_HOST "127.0.0.1"
+#define WFD_PROXY_COMM_PORT 8888
+#define WFD_TIME_SPAN_100_MILLISECOND (100 * G_TIME_SPAN_MILLISECOND)
#define LIMIT_TIME 50 /* 5 sec */
-\r
-/*WFD_PROXY_SET_IP_PORT\r
-IP 192.168.16.1\r
-PORT 2022\r
-*/\r
-/* REPLAY WFD_PROXY_SET_IP_PORT\r
-MM_ERROR_NONE\r
-*/\r
-// WFD_PROXY_START\r
-/* REPLAY WFD_PROXY_START\r
-MM_ERROR_NONE\r
-*/\r
-// WFD_PROXY_STOP\r
-/* REPLAY WFD_PROXY_STOP\r
-MM_ERROR_NONE\r
-*/\r
-// WFD_PROXY_PAUSE\r
-/* REPLAY WFD_PROXY_PAUSE\r
-MM_ERROR_NONE\r
-*/\r
-// WFD_PROXY_RESUME\r
-/* REPLAY WFD_PROXY_RESUME\r
-MM_ERROR_NONE\r
-*/\r
-//WFD_PROXY_DESTROY\r
-/* REPLAY WFD_PROXY_DESTROY\r
-MM_ERROR_NONE\r
-*/\r
-// WFD_PROXY_STATE_QUERY\r
-/* REPLAY WFD_PROXY_STATE_QUERY\r
-MM_WFD_STATE_NULL\r
-MM_WFD_STATE_READY\r
-MM_WFD_STATE_PLAYING\r
-MM_WFD_STATE_NONE\r
-*/\r
-\r
-/* NOTIFY\r
-MM_WFD_STATE_READY\r
-WFDSRC_ERROR_UNKNOWN\r
-*/\r
-\r
-/**\r
- * Data structure to hold call back info for proxy to send asynchronous\r
- * info received from WFD daemon\r
- */\r
-typedef struct{\r
- WfdSrcProxyStateError_cb applicationCb;\r
- void *user_data;\r
- GCond *cond;\r
- GMutex *cond_lock;\r
- char outbuff[512];\r
- char inbuff[512];\r
- int sockfd;\r
- gboolean quitloop;\r
- GThread *thread;\r
- gboolean response;\r
-} WfdSrcProxy;\r
-\r
-static int wfd_proxy_initialize(WfdSrcProxy *wfd);\r
-static WfdSrcProxyState wfd_proxy_message_parse_state (const char * data, guint size);\r
-static WfdSrcProxyRet wfd_proxy_message_parse_status (const char * data, guint size);\r
-static gboolean is_cmd_valid_in_current_state(WfdSrcProxyState aState, WfdSrcProxyCmd acmd);\r
-static gboolean proxy_write (WfdSrcProxy *wfd, char *wbuf);\r
-WfdSrcProxyState convert_string_to_state(gchar *buffer);\r
-WfdSrcProxyRet convert_string_to_status(gchar *buffer);\r
-\r
-WfdSrcProxyRet WfdSrcProxyInit(\r
- MMHandleType *pHandle,\r
- WfdSrcProxyStateError_cb *appCb,\r
- void *user_data )\r
-{\r
- WfdSrcProxy *temp = NULL;\r
-\r
- debug_fenter();\r
- debug_log("mm_wfd_proxy_create \n");\r
-\r
- return_val_if_fail(pHandle, WFDSRC_ERROR_WFD_INVALID_ARGUMENT);\r
+
+/*WFD_PROXY_SET_IP_PORT
+IP 192.168.16.1
+PORT 2022
+*/
+/* REPLAY WFD_PROXY_SET_IP_PORT
+MM_ERROR_NONE
+*/
+// WFD_PROXY_START
+/* REPLAY WFD_PROXY_START
+MM_ERROR_NONE
+*/
+// WFD_PROXY_STOP
+/* REPLAY WFD_PROXY_STOP
+MM_ERROR_NONE
+*/
+// WFD_PROXY_PAUSE
+/* REPLAY WFD_PROXY_PAUSE
+MM_ERROR_NONE
+*/
+// WFD_PROXY_RESUME
+/* REPLAY WFD_PROXY_RESUME
+MM_ERROR_NONE
+*/
+//WFD_PROXY_DESTROY
+/* REPLAY WFD_PROXY_DESTROY
+MM_ERROR_NONE
+*/
+// WFD_PROXY_STATE_QUERY
+/* REPLAY WFD_PROXY_STATE_QUERY
+MM_WFD_STATE_NULL
+MM_WFD_STATE_READY
+MM_WFD_STATE_PLAYING
+MM_WFD_STATE_NONE
+*/
+
+/* NOTIFY
+MM_WFD_STATE_READY
+WFDSRC_ERROR_UNKNOWN
+*/
+
+/**
+ * Data structure to hold call back info for proxy to send asynchronous
+ * info received from WFD daemon
+ */
+typedef struct{
+ WfdSrcProxyStateError_cb applicationCb;
+ void *user_data;
+ GCond *cond;
+ GMutex *cond_lock;
+ char outbuff[512];
+ char inbuff[512];
+ int sockfd;
+ gboolean quitloop;
+ GThread *thread;
+ gboolean response;
+} WfdSrcProxy;
+
+static int wfd_proxy_initialize(WfdSrcProxy *wfd);
+static WfdSrcProxyState wfd_proxy_message_parse_state (const char * data, guint size);
+static WfdSrcProxyRet wfd_proxy_message_parse_status (const char * data, guint size);
+static gboolean is_cmd_valid_in_current_state(WfdSrcProxyState aState, WfdSrcProxyCmd acmd);
+static gboolean proxy_write (WfdSrcProxy *wfd, char *wbuf);
+WfdSrcProxyState convert_string_to_state(gchar *buffer);
+WfdSrcProxyRet convert_string_to_status(gchar *buffer);
+
+WfdSrcProxyRet WfdSrcProxyInit(
+ MMHandleType *pHandle,
+ WfdSrcProxyStateError_cb *appCb,
+ void *user_data )
+{
+ WfdSrcProxy *temp = NULL;
+
+ debug_fenter();
+ debug_log("mm_wfd_proxy_create \n");
+
+ return_val_if_fail(pHandle, WFDSRC_ERROR_WFD_INVALID_ARGUMENT);
int ret = 0;
- temp = g_malloc(sizeof(WfdSrcProxy));\r
- if(!temp)\r
- {\r
- debug_log("WfdSrcProxy malloc failed. out of memory");\r
- return WFDSRC_ERROR_WFD_NO_FREE_SPACE;\r
- }\r
- temp->cond = g_cond_new ();\r
- temp->cond_lock = g_mutex_new ();\r
- temp->applicationCb = appCb;\r
- temp->user_data = user_data;\r
- temp->quitloop = FALSE;\r
- temp->response = FALSE;\r
+ temp = g_malloc(sizeof(WfdSrcProxy));
+ if(!temp)
+ {
+ debug_log("WfdSrcProxy malloc failed. out of memory");
+ return WFDSRC_ERROR_WFD_NO_FREE_SPACE;
+ }
+ temp->cond = g_cond_new ();
+ temp->cond_lock = g_mutex_new ();
+ temp->applicationCb = appCb;
+ temp->user_data = user_data;
+ temp->quitloop = FALSE;
+ temp->response = FALSE;
ret = wfd_proxy_initialize(temp);
if(ret < 0)
return WFDSRC_ERROR_WFD_NOT_INITIALIZED;
- *pHandle = (MMHandleType)temp;\r
- debug_fleave ();\r
- return WFDSRC_ERROR_NONE;\r
-}\r
-\r
-WfdSrcProxyRet WfdSrcProxyDeInit(MMHandleType pHandle )\r
-{\r
- WfdSrcProxy *lwfd;\r
- debug_fenter();\r
-\r
- return_val_if_fail(pHandle, WFDSRC_ERROR_WFD_NOT_INITIALIZED);\r
- lwfd = (WfdSrcProxy *)pHandle;\r
- lwfd->quitloop = TRUE;\r
- debug_log("client close socket\n");\r
- shutdown (lwfd->sockfd, SHUT_RDWR);\r
- g_thread_join(lwfd->thread);\r
- if(lwfd->cond_lock) g_mutex_free(lwfd->cond_lock);\r
- if(lwfd->cond) g_cond_free(lwfd->cond);\r
- debug_log("client after thread join\n");\r
- g_free(lwfd);\r
- debug_leave();\r
- return WFDSRC_ERROR_NONE;\r
-}\r
-\r
-WfdSrcProxyRet WfdSrcProxySetIPAddrAndPort(\r
- MMHandleType pHandle,\r
- char *wfdsrcIP,\r
- char *wfdsrcPort)\r
-{\r
- WfdSrcProxyState lstate;\r
- WfdSrcProxy *lwfd;\r
- GString *proxy_cmd;\r
- gchar *cmd_string;\r
- gint64 end_time;\r
+ *pHandle = (MMHandleType)temp;
+ debug_fleave ();
+ return WFDSRC_ERROR_NONE;
+}
+
+WfdSrcProxyRet WfdSrcProxyDeInit(MMHandleType pHandle )
+{
+ WfdSrcProxy *lwfd;
+ debug_fenter();
+
+ return_val_if_fail(pHandle, WFDSRC_ERROR_WFD_NOT_INITIALIZED);
+ lwfd = (WfdSrcProxy *)pHandle;
+ lwfd->quitloop = TRUE;
+ debug_log("client close socket\n");
+ shutdown (lwfd->sockfd, SHUT_RDWR);
+ g_thread_join(lwfd->thread);
+ if(lwfd->cond_lock) g_mutex_free(lwfd->cond_lock);
+ if(lwfd->cond) g_cond_free(lwfd->cond);
+ debug_log("client after thread join\n");
+ g_free(lwfd);
+ debug_leave();
+ return WFDSRC_ERROR_NONE;
+}
+
+WfdSrcProxyRet WfdSrcProxySetIPAddrAndPort(
+ MMHandleType pHandle,
+ char *wfdsrcIP,
+ char *wfdsrcPort)
+{
+ WfdSrcProxyState lstate;
+ WfdSrcProxy *lwfd;
+ GString *proxy_cmd;
+ gchar *cmd_string;
+ gint64 end_time;
int limit = 0;
- debug_fenter();\r
-\r
- return_val_if_fail(pHandle, WFDSRC_ERROR_WFD_NOT_INITIALIZED);\r
- return_val_if_fail(wfdsrcIP, WFDSRC_ERROR_WFD_NOT_INITIALIZED);\r
- return_val_if_fail(wfdsrcPort, WFDSRC_ERROR_WFD_NOT_INITIALIZED);\r
-\r
- lwfd = (WfdSrcProxy *)pHandle;\r
- lstate = WfdSrcProxyGetCurrentState(pHandle);\r
- if(!is_cmd_valid_in_current_state(lstate, WFDSRC_COMMAND_STOP))\r
- return WFDSRC_ERROR_WFD_INVALID_STATE;\r
- proxy_cmd = g_string_new ("");\r
- g_string_append_printf (proxy_cmd, "WFD_PROXY_SET_IP_PORT");\r
- g_string_append_printf (proxy_cmd, "\r\nIP ");\r
- g_string_append_printf (proxy_cmd, wfdsrcIP);\r
- g_string_append_printf (proxy_cmd, "\r\nPORT ");\r
- g_string_append_printf (proxy_cmd, wfdsrcPort);\r
- g_string_append_printf (proxy_cmd, "\r\n");\r
- cmd_string = g_string_free (proxy_cmd, FALSE);\r
- debug_log("WfdSrcProxySetIPAddrAndPort command sent: %s \n", cmd_string);\r
- lwfd->response = FALSE;\r
- proxy_write(lwfd, cmd_string);\r
-retry:\r
- debug_log("try timed wait...\n");\r
- end_time = g_get_monotonic_time () + WFD_TIME_SPAN_100_MILLISECOND;\r
- if (!g_cond_wait_until(lwfd->cond, lwfd->cond_lock, end_time))\r
- {\r
- debug_log("Out of timed wait but due to timeout...\n");\r
+ debug_fenter();
+
+ return_val_if_fail(pHandle, WFDSRC_ERROR_WFD_NOT_INITIALIZED);
+ return_val_if_fail(wfdsrcIP, WFDSRC_ERROR_WFD_NOT_INITIALIZED);
+ return_val_if_fail(wfdsrcPort, WFDSRC_ERROR_WFD_NOT_INITIALIZED);
+
+ lwfd = (WfdSrcProxy *)pHandle;
+ lstate = WfdSrcProxyGetCurrentState(pHandle);
+ if(!is_cmd_valid_in_current_state(lstate, WFDSRC_COMMAND_STOP))
+ return WFDSRC_ERROR_WFD_INVALID_STATE;
+ proxy_cmd = g_string_new ("");
+ g_string_append_printf (proxy_cmd, "WFD_PROXY_SET_IP_PORT");
+ g_string_append_printf (proxy_cmd, "\r\nIP ");
+ g_string_append_printf (proxy_cmd, wfdsrcIP);
+ g_string_append_printf (proxy_cmd, "\r\nPORT ");
+ g_string_append_printf (proxy_cmd, wfdsrcPort);
+ g_string_append_printf (proxy_cmd, "\r\n");
+ cmd_string = g_string_free (proxy_cmd, FALSE);
+ debug_log("WfdSrcProxySetIPAddrAndPort command sent: %s \n", cmd_string);
+ lwfd->response = FALSE;
+ proxy_write(lwfd, cmd_string);
+retry:
+ debug_log("try timed wait...\n");
+ end_time = g_get_monotonic_time () + WFD_TIME_SPAN_100_MILLISECOND;
+ if (!g_cond_wait_until(lwfd->cond, lwfd->cond_lock, end_time))
+ {
+ debug_log("Out of timed wait but due to timeout...\n");
limit ++;
if(limit > LIMIT_TIME) return WFDSRC_ERROR_WFD_INTERNAL;
- if(!lwfd->response) goto retry;\r
- }\r
-\r
- debug_log("WfdSrcProxySetIPAddrAndPort replay for command: %s \n", lwfd->inbuff);\r
- debug_leave();\r
- return wfd_proxy_message_parse_status(lwfd->inbuff, strlen(lwfd->inbuff));\r
-}\r
-\r
-WfdSrcProxyRet WfdSrcProxyConnect(MMHandleType pHandle)\r
-{\r
- WfdSrcProxyState lstate;\r
- WfdSrcProxy *lwfd;\r
- GString *proxy_cmd;\r
- gchar *cmd_string;\r
- gint64 end_time;\r
+ if(!lwfd->response) goto retry;
+ }
+
+ debug_log("WfdSrcProxySetIPAddrAndPort replay for command: %s \n", lwfd->inbuff);
+ debug_leave();
+ return wfd_proxy_message_parse_status(lwfd->inbuff, strlen(lwfd->inbuff));
+}
+
+WfdSrcProxyRet WfdSrcProxyConnect(MMHandleType pHandle)
+{
+ WfdSrcProxyState lstate;
+ WfdSrcProxy *lwfd;
+ GString *proxy_cmd;
+ gchar *cmd_string;
+ gint64 end_time;
int limit = 0;
- debug_fenter();\r
-\r
- return_val_if_fail(pHandle, WFDSRC_ERROR_WFD_NOT_INITIALIZED);\r
- lwfd = (WfdSrcProxy *)pHandle;\r
- lstate = WfdSrcProxyGetCurrentState(pHandle);\r
- if(!is_cmd_valid_in_current_state(lstate, WFDSRC_COMMAND_CONNECT))\r
- return WFDSRC_ERROR_WFD_INVALID_STATE;\r
- proxy_cmd = g_string_new ("");\r
- g_string_append_printf (proxy_cmd, "WFD_PROXY_CONNECT");\r
- g_string_append_printf (proxy_cmd, "\r\n");\r
- cmd_string = g_string_free (proxy_cmd, FALSE);\r
- debug_log("WfdSrcProxyConnect command sent: %s \n", cmd_string);\r
- lwfd->response = FALSE;\r
- proxy_write(lwfd, cmd_string);\r
-retry:\r
- debug_log("try timed wait...\n");\r
- end_time = g_get_monotonic_time () + WFD_TIME_SPAN_100_MILLISECOND;\r
- if (!g_cond_wait_until(lwfd->cond, lwfd->cond_lock, end_time))\r
- {\r
- debug_log("Out of timed wait but due to timeout...\n");\r
+ debug_fenter();
+
+ return_val_if_fail(pHandle, WFDSRC_ERROR_WFD_NOT_INITIALIZED);
+ lwfd = (WfdSrcProxy *)pHandle;
+ lstate = WfdSrcProxyGetCurrentState(pHandle);
+ if(!is_cmd_valid_in_current_state(lstate, WFDSRC_COMMAND_CONNECT))
+ return WFDSRC_ERROR_WFD_INVALID_STATE;
+ proxy_cmd = g_string_new ("");
+ g_string_append_printf (proxy_cmd, "WFD_PROXY_CONNECT");
+ g_string_append_printf (proxy_cmd, "\r\n");
+ cmd_string = g_string_free (proxy_cmd, FALSE);
+ debug_log("WfdSrcProxyConnect command sent: %s \n", cmd_string);
+ lwfd->response = FALSE;
+ proxy_write(lwfd, cmd_string);
+retry:
+ debug_log("try timed wait...\n");
+ end_time = g_get_monotonic_time () + WFD_TIME_SPAN_100_MILLISECOND;
+ if (!g_cond_wait_until(lwfd->cond, lwfd->cond_lock, end_time))
+ {
+ debug_log("Out of timed wait but due to timeout...\n");
limit ++;
if(limit > LIMIT_TIME) return WFDSRC_ERROR_WFD_INTERNAL;
- if(!lwfd->response) goto retry;\r
- }\r
-\r
- debug_log("WfdSrcProxyConnect inbuff for command: %s \n", lwfd->inbuff);\r
- debug_leave();\r
- return wfd_proxy_message_parse_status(lwfd->inbuff, strlen(lwfd->inbuff));\r
-}\r
-\r
-WfdSrcProxyRet WfdSrcProxyStart(MMHandleType pHandle)\r
-{\r
- WfdSrcProxyState lstate;\r
- WfdSrcProxy *lwfd;\r
- GString *proxy_cmd;\r
- gchar *cmd_string;\r
- gint64 end_time;\r
+ if(!lwfd->response) goto retry;
+ }
+
+ debug_log("WfdSrcProxyConnect inbuff for command: %s \n", lwfd->inbuff);
+ debug_leave();
+ return wfd_proxy_message_parse_status(lwfd->inbuff, strlen(lwfd->inbuff));
+}
+
+WfdSrcProxyRet WfdSrcProxyStart(MMHandleType pHandle)
+{
+ WfdSrcProxyState lstate;
+ WfdSrcProxy *lwfd;
+ GString *proxy_cmd;
+ gchar *cmd_string;
+ gint64 end_time;
int limit = 0;
- debug_fenter();\r
-\r
- return_val_if_fail(pHandle, WFDSRC_ERROR_WFD_NOT_INITIALIZED);\r
- lwfd = (WfdSrcProxy *)pHandle;\r
- lstate = WfdSrcProxyGetCurrentState(pHandle);\r
- if(!is_cmd_valid_in_current_state(lstate, WFDSRC_COMMAND_START))\r
- return WFDSRC_ERROR_WFD_INVALID_STATE;\r
- proxy_cmd = g_string_new ("");\r
- g_string_append_printf (proxy_cmd, "WFD_PROXY_START");\r
- g_string_append_printf (proxy_cmd, "\r\n");\r
- cmd_string = g_string_free (proxy_cmd, FALSE);\r
- debug_log("WfdSrcProxyStart command sent: %s \n", cmd_string);\r
- lwfd->response = FALSE;\r
- proxy_write(lwfd, cmd_string);\r
-retry:\r
- debug_log("try timed wait...\n");\r
- end_time = g_get_monotonic_time () + WFD_TIME_SPAN_100_MILLISECOND;\r
- if (!g_cond_wait_until(lwfd->cond, lwfd->cond_lock, end_time))\r
- {\r
- debug_log("Out of timed wait but due to timeout...\n");\r
+ debug_fenter();
+
+ return_val_if_fail(pHandle, WFDSRC_ERROR_WFD_NOT_INITIALIZED);
+ lwfd = (WfdSrcProxy *)pHandle;
+ lstate = WfdSrcProxyGetCurrentState(pHandle);
+ if(!is_cmd_valid_in_current_state(lstate, WFDSRC_COMMAND_START))
+ return WFDSRC_ERROR_WFD_INVALID_STATE;
+ proxy_cmd = g_string_new ("");
+ g_string_append_printf (proxy_cmd, "WFD_PROXY_START");
+ g_string_append_printf (proxy_cmd, "\r\n");
+ cmd_string = g_string_free (proxy_cmd, FALSE);
+ debug_log("WfdSrcProxyStart command sent: %s \n", cmd_string);
+ lwfd->response = FALSE;
+ proxy_write(lwfd, cmd_string);
+retry:
+ debug_log("try timed wait...\n");
+ end_time = g_get_monotonic_time () + WFD_TIME_SPAN_100_MILLISECOND;
+ if (!g_cond_wait_until(lwfd->cond, lwfd->cond_lock, end_time))
+ {
+ debug_log("Out of timed wait but due to timeout...\n");
limit ++;
if(limit > LIMIT_TIME) return WFDSRC_ERROR_WFD_INTERNAL;
- if(!lwfd->response) goto retry;\r
- }\r
-\r
- debug_log("WfdSrcProxyStart inbuff for command: %s \n", lwfd->inbuff);\r
- debug_leave();\r
- return wfd_proxy_message_parse_status(lwfd->inbuff, strlen(lwfd->inbuff));\r
-}\r
-\r
-WfdSrcProxyRet WfdSrcProxyPause(MMHandleType pHandle)\r
-{\r
- WfdSrcProxyState lstate;\r
- WfdSrcProxy *lwfd;\r
- GString *proxy_cmd;\r
- gchar *cmd_string;\r
- gint64 end_time;\r
+ if(!lwfd->response) goto retry;
+ }
+
+ debug_log("WfdSrcProxyStart inbuff for command: %s \n", lwfd->inbuff);
+ debug_leave();
+ return wfd_proxy_message_parse_status(lwfd->inbuff, strlen(lwfd->inbuff));
+}
+
+WfdSrcProxyRet WfdSrcProxyPause(MMHandleType pHandle)
+{
+ WfdSrcProxyState lstate;
+ WfdSrcProxy *lwfd;
+ GString *proxy_cmd;
+ gchar *cmd_string;
+ gint64 end_time;
int limit = 0;
- debug_fenter();\r
-\r
- return_val_if_fail(pHandle, WFDSRC_ERROR_WFD_NOT_INITIALIZED);\r
- lwfd = (WfdSrcProxy *)pHandle;\r
- lstate = WfdSrcProxyGetCurrentState(pHandle);\r
- if(!is_cmd_valid_in_current_state(lstate, WFDSRC_COMMAND_PAUSE))\r
- return WFDSRC_ERROR_WFD_INVALID_STATE;\r
- proxy_cmd = g_string_new ("");\r
- g_string_append_printf (proxy_cmd, "WFD_PROXY_PAUSE");\r
- g_string_append_printf (proxy_cmd, "\r\n");\r
- cmd_string = g_string_free (proxy_cmd, FALSE);\r
- debug_log("WfdSrcProxyPause command sent: %s \n", cmd_string);\r
- lwfd->response = FALSE;\r
- proxy_write(lwfd, cmd_string);\r
-retry:\r
- debug_log("try timed wait...\n");\r
- end_time = g_get_monotonic_time () + WFD_TIME_SPAN_100_MILLISECOND;\r
- if (!g_cond_wait_until(lwfd->cond, lwfd->cond_lock, end_time))\r
- {\r
- debug_log("Out of timed wait but due to timeout...\n");\r
+ debug_fenter();
+
+ return_val_if_fail(pHandle, WFDSRC_ERROR_WFD_NOT_INITIALIZED);
+ lwfd = (WfdSrcProxy *)pHandle;
+ lstate = WfdSrcProxyGetCurrentState(pHandle);
+ if(!is_cmd_valid_in_current_state(lstate, WFDSRC_COMMAND_PAUSE))
+ return WFDSRC_ERROR_WFD_INVALID_STATE;
+ proxy_cmd = g_string_new ("");
+ g_string_append_printf (proxy_cmd, "WFD_PROXY_PAUSE");
+ g_string_append_printf (proxy_cmd, "\r\n");
+ cmd_string = g_string_free (proxy_cmd, FALSE);
+ debug_log("WfdSrcProxyPause command sent: %s \n", cmd_string);
+ lwfd->response = FALSE;
+ proxy_write(lwfd, cmd_string);
+retry:
+ debug_log("try timed wait...\n");
+ end_time = g_get_monotonic_time () + WFD_TIME_SPAN_100_MILLISECOND;
+ if (!g_cond_wait_until(lwfd->cond, lwfd->cond_lock, end_time))
+ {
+ debug_log("Out of timed wait but due to timeout...\n");
limit ++;
if(limit > LIMIT_TIME) return WFDSRC_ERROR_WFD_INTERNAL;
- if(!lwfd->response) goto retry;\r
- }\r
-\r
- debug_log("WfdSrcProxyPause inbuff for command: %s \n", lwfd->inbuff);\r
- debug_leave();\r
- return wfd_proxy_message_parse_status(lwfd->inbuff, strlen(lwfd->inbuff));\r
-}\r
-\r
-WfdSrcProxyRet WfdSrcProxyResume(MMHandleType pHandle)\r
-{\r
- WfdSrcProxyState lstate;\r
- WfdSrcProxy *lwfd;\r
- GString *proxy_cmd;\r
- gchar *cmd_string;\r
- gint64 end_time;\r
+ if(!lwfd->response) goto retry;
+ }
+
+ debug_log("WfdSrcProxyPause inbuff for command: %s \n", lwfd->inbuff);
+ debug_leave();
+ return wfd_proxy_message_parse_status(lwfd->inbuff, strlen(lwfd->inbuff));
+}
+
+WfdSrcProxyRet WfdSrcProxyResume(MMHandleType pHandle)
+{
+ WfdSrcProxyState lstate;
+ WfdSrcProxy *lwfd;
+ GString *proxy_cmd;
+ gchar *cmd_string;
+ gint64 end_time;
int limit = 0;
- debug_fenter();\r
-\r
- return_val_if_fail(pHandle, WFDSRC_ERROR_WFD_NOT_INITIALIZED);\r
- lwfd = (WfdSrcProxy *)pHandle;\r
- lstate = WfdSrcProxyGetCurrentState(pHandle);\r
- if(!is_cmd_valid_in_current_state(lstate, WFDSRC_COMMAND_RESUME))\r
- return WFDSRC_ERROR_WFD_INVALID_STATE;\r
- proxy_cmd = g_string_new ("");\r
- g_string_append_printf (proxy_cmd, "WFD_PROXY_RESUME");\r
- g_string_append_printf (proxy_cmd, "\r\n");\r
- cmd_string = g_string_free (proxy_cmd, FALSE);\r
- debug_log("WfdSrcProxyResume command sent: %s \n", cmd_string);\r
- lwfd->response = FALSE;\r
- proxy_write(lwfd, cmd_string);\r
-retry:\r
- debug_log("try timed wait...\n");\r
- end_time = g_get_monotonic_time () + WFD_TIME_SPAN_100_MILLISECOND;\r
- if (!g_cond_wait_until(lwfd->cond, lwfd->cond_lock, end_time))\r
- {\r
- debug_log("Out of timed wait but due to timeout...\n");\r
+ debug_fenter();
+
+ return_val_if_fail(pHandle, WFDSRC_ERROR_WFD_NOT_INITIALIZED);
+ lwfd = (WfdSrcProxy *)pHandle;
+ lstate = WfdSrcProxyGetCurrentState(pHandle);
+ if(!is_cmd_valid_in_current_state(lstate, WFDSRC_COMMAND_RESUME))
+ return WFDSRC_ERROR_WFD_INVALID_STATE;
+ proxy_cmd = g_string_new ("");
+ g_string_append_printf (proxy_cmd, "WFD_PROXY_RESUME");
+ g_string_append_printf (proxy_cmd, "\r\n");
+ cmd_string = g_string_free (proxy_cmd, FALSE);
+ debug_log("WfdSrcProxyResume command sent: %s \n", cmd_string);
+ lwfd->response = FALSE;
+ proxy_write(lwfd, cmd_string);
+retry:
+ debug_log("try timed wait...\n");
+ end_time = g_get_monotonic_time () + WFD_TIME_SPAN_100_MILLISECOND;
+ if (!g_cond_wait_until(lwfd->cond, lwfd->cond_lock, end_time))
+ {
+ debug_log("Out of timed wait but due to timeout...\n");
limit ++;
if(limit > LIMIT_TIME) return WFDSRC_ERROR_WFD_INTERNAL;
- if(!lwfd->response) goto retry;\r
- }\r
-\r
- debug_log("WfdSrcProxyResume inbuff for command: %s \n", lwfd->inbuff);\r
- debug_leave();\r
- return wfd_proxy_message_parse_status(lwfd->inbuff, strlen(lwfd->inbuff));\r
-}\r
-\r
-WfdSrcProxyRet WfdSrcProxyStop(MMHandleType pHandle)\r
-{\r
- WfdSrcProxyState lstate;\r
- WfdSrcProxy *lwfd;\r
- GString *proxy_cmd;\r
- gchar *cmd_string;\r
- gint64 end_time;\r
+ if(!lwfd->response) goto retry;
+ }
+
+ debug_log("WfdSrcProxyResume inbuff for command: %s \n", lwfd->inbuff);
+ debug_leave();
+ return wfd_proxy_message_parse_status(lwfd->inbuff, strlen(lwfd->inbuff));
+}
+
+WfdSrcProxyRet WfdSrcProxyStop(MMHandleType pHandle)
+{
+ WfdSrcProxyState lstate;
+ WfdSrcProxy *lwfd;
+ GString *proxy_cmd;
+ gchar *cmd_string;
+ gint64 end_time;
int limit = 0;
- debug_fenter();\r
-\r
- return_val_if_fail(pHandle, WFDSRC_ERROR_WFD_NOT_INITIALIZED);\r
- lwfd = (WfdSrcProxy *)pHandle;\r
- lstate = WfdSrcProxyGetCurrentState(pHandle);\r
- if(!is_cmd_valid_in_current_state(lstate, WFDSRC_COMMAND_STOP))\r
- return WFDSRC_ERROR_WFD_INVALID_STATE;\r
- proxy_cmd = g_string_new ("");\r
- g_string_append_printf (proxy_cmd, "WFD_PROXY_STOP");\r
- g_string_append_printf (proxy_cmd, "\r\n");\r
- cmd_string = g_string_free (proxy_cmd, FALSE);\r
- debug_log("WfdSrcProxyStop command sent: %s \n", cmd_string);\r
- lwfd->response = FALSE;\r
- proxy_write(lwfd, cmd_string);\r
-retry:\r
- debug_log("try timed wait...\n");\r
- end_time = g_get_monotonic_time () + WFD_TIME_SPAN_100_MILLISECOND;\r
- if (!g_cond_wait_until(lwfd->cond, lwfd->cond_lock, end_time))\r
- {\r
- debug_log("Out of timed wait but due to timeout...\n");\r
+ debug_fenter();
+
+ return_val_if_fail(pHandle, WFDSRC_ERROR_WFD_NOT_INITIALIZED);
+ lwfd = (WfdSrcProxy *)pHandle;
+ lstate = WfdSrcProxyGetCurrentState(pHandle);
+ if(!is_cmd_valid_in_current_state(lstate, WFDSRC_COMMAND_STOP))
+ return WFDSRC_ERROR_WFD_INVALID_STATE;
+ proxy_cmd = g_string_new ("");
+ g_string_append_printf (proxy_cmd, "WFD_PROXY_STOP");
+ g_string_append_printf (proxy_cmd, "\r\n");
+ cmd_string = g_string_free (proxy_cmd, FALSE);
+ debug_log("WfdSrcProxyStop command sent: %s \n", cmd_string);
+ lwfd->response = FALSE;
+ proxy_write(lwfd, cmd_string);
+retry:
+ debug_log("try timed wait...\n");
+ end_time = g_get_monotonic_time () + WFD_TIME_SPAN_100_MILLISECOND;
+ if (!g_cond_wait_until(lwfd->cond, lwfd->cond_lock, end_time))
+ {
+ debug_log("Out of timed wait but due to timeout...\n");
limit ++;
if(limit > LIMIT_TIME) return WFDSRC_ERROR_WFD_INTERNAL;
- if(!lwfd->response) goto retry;\r
- }\r
-\r
- debug_log("WfdSrcProxyStop inbuff for command: %s \n", lwfd->inbuff);\r
- debug_leave();\r
- return wfd_proxy_message_parse_status(lwfd->inbuff, strlen(lwfd->inbuff));\r
-}\r
-\r
-WfdSrcProxyRet WfdSrcProxyDestroyServer(MMHandleType pHandle)\r
-{\r
- WfdSrcProxyState lstate;\r
- WfdSrcProxy *lwfd;\r
- GString *proxy_cmd;\r
- gchar *cmd_string;\r
- gint64 end_time;\r
+ if(!lwfd->response) goto retry;
+ }
+
+ debug_log("WfdSrcProxyStop inbuff for command: %s \n", lwfd->inbuff);
+ debug_leave();
+ return wfd_proxy_message_parse_status(lwfd->inbuff, strlen(lwfd->inbuff));
+}
+
+WfdSrcProxyRet WfdSrcProxyDestroyServer(MMHandleType pHandle)
+{
+ WfdSrcProxyState lstate;
+ WfdSrcProxy *lwfd;
+ GString *proxy_cmd;
+ gchar *cmd_string;
+ gint64 end_time;
int limit = 0;
- debug_fenter();\r
-\r
- return_val_if_fail(pHandle, WFDSRC_ERROR_WFD_NOT_INITIALIZED);\r
- lwfd = (WfdSrcProxy *)pHandle;\r
- lstate = WfdSrcProxyGetCurrentState(pHandle);\r
- if(!is_cmd_valid_in_current_state(lstate, WFDSRC_COMMAND_STOP))\r
- return WFDSRC_ERROR_WFD_INVALID_STATE;\r
- proxy_cmd = g_string_new ("");\r
- g_string_append_printf (proxy_cmd, "WFD_PROXY_DESTROY");\r
- g_string_append_printf (proxy_cmd, "\r\n");\r
- cmd_string = g_string_free (proxy_cmd, FALSE);\r
- debug_log("WfdSrcProxyDestroyServer command sent: %s \n", cmd_string);\r
- lwfd->response = FALSE;\r
- proxy_write(lwfd, cmd_string);\r
-retry:\r
- debug_log("try timed wait...\n");\r
- end_time = g_get_monotonic_time () + WFD_TIME_SPAN_100_MILLISECOND;\r
- if (!g_cond_wait_until(lwfd->cond, lwfd->cond_lock, end_time))\r
- {\r
- debug_log("Out of timed wait but due to timeout...\n");\r
+ debug_fenter();
+
+ return_val_if_fail(pHandle, WFDSRC_ERROR_WFD_NOT_INITIALIZED);
+ lwfd = (WfdSrcProxy *)pHandle;
+ lstate = WfdSrcProxyGetCurrentState(pHandle);
+ if(!is_cmd_valid_in_current_state(lstate, WFDSRC_COMMAND_STOP))
+ return WFDSRC_ERROR_WFD_INVALID_STATE;
+ proxy_cmd = g_string_new ("");
+ g_string_append_printf (proxy_cmd, "WFD_PROXY_DESTROY");
+ g_string_append_printf (proxy_cmd, "\r\n");
+ cmd_string = g_string_free (proxy_cmd, FALSE);
+ debug_log("WfdSrcProxyDestroyServer command sent: %s \n", cmd_string);
+ lwfd->response = FALSE;
+ proxy_write(lwfd, cmd_string);
+retry:
+ debug_log("try timed wait...\n");
+ end_time = g_get_monotonic_time () + WFD_TIME_SPAN_100_MILLISECOND;
+ if (!g_cond_wait_until(lwfd->cond, lwfd->cond_lock, end_time))
+ {
+ debug_log("Out of timed wait but due to timeout...\n");
limit ++;
if(limit > LIMIT_TIME) return WFDSRC_ERROR_WFD_INTERNAL;
- if(!lwfd->response) goto retry;\r
- }\r
-\r
- debug_log("WfdSrcProxyDestroyServer inbuff for command: %s \n", lwfd->inbuff);\r
- debug_leave();\r
- return wfd_proxy_message_parse_status(lwfd->inbuff, strlen(lwfd->inbuff));\r
-}\r
-\r
-WfdSrcProxyState WfdSrcProxyGetCurrentState(MMHandleType pHandle)\r
-{\r
- WfdSrcProxy *lwfd;\r
- GString *proxy_cmd;\r
- gchar *cmd_string;\r
- gint64 end_time;\r
+ if(!lwfd->response) goto retry;
+ }
+
+ debug_log("WfdSrcProxyDestroyServer inbuff for command: %s \n", lwfd->inbuff);
+ debug_leave();
+ return wfd_proxy_message_parse_status(lwfd->inbuff, strlen(lwfd->inbuff));
+}
+
+WfdSrcProxyState WfdSrcProxyGetCurrentState(MMHandleType pHandle)
+{
+ WfdSrcProxy *lwfd;
+ GString *proxy_cmd;
+ gchar *cmd_string;
+ gint64 end_time;
int limit = 0;
- debug_fenter();\r
-\r
- return_val_if_fail(pHandle, WFDSRC_ERROR_WFD_NOT_INITIALIZED);\r
- lwfd = (WfdSrcProxy *)pHandle;\r
- proxy_cmd = g_string_new ("");\r
- g_string_append_printf (proxy_cmd, "WFD_PROXY_STATE_QUERY");\r
- g_string_append_printf (proxy_cmd, "\r\n");\r
- cmd_string = g_string_free (proxy_cmd, FALSE);\r
- debug_log("WfdSrcProxyGetCurrentState command sent: %s \n", cmd_string);\r
- lwfd->response = FALSE;\r
- proxy_write(lwfd, cmd_string);\r
-retry:\r
- debug_log("try timed wait...\n");\r
- end_time = g_get_monotonic_time () + WFD_TIME_SPAN_100_MILLISECOND;\r
- if (!g_cond_wait_until(lwfd->cond, lwfd->cond_lock, end_time))\r
- {\r
- debug_log("Out of timed wait but due to timeout...\n");\r
+ debug_fenter();
+
+ return_val_if_fail(pHandle, WFDSRC_ERROR_WFD_NOT_INITIALIZED);
+ lwfd = (WfdSrcProxy *)pHandle;
+ proxy_cmd = g_string_new ("");
+ g_string_append_printf (proxy_cmd, "WFD_PROXY_STATE_QUERY");
+ g_string_append_printf (proxy_cmd, "\r\n");
+ cmd_string = g_string_free (proxy_cmd, FALSE);
+ debug_log("WfdSrcProxyGetCurrentState command sent: %s \n", cmd_string);
+ lwfd->response = FALSE;
+ proxy_write(lwfd, cmd_string);
+retry:
+ debug_log("try timed wait...\n");
+ end_time = g_get_monotonic_time () + WFD_TIME_SPAN_100_MILLISECOND;
+ if (!g_cond_wait_until(lwfd->cond, lwfd->cond_lock, end_time))
+ {
+ debug_log("Out of timed wait but due to timeout...\n");
limit ++;
if(limit > LIMIT_TIME) return WFDSRC_ERROR_WFD_INTERNAL;
- if(!lwfd->response) goto retry;\r
- }\r
- debug_log("WfdSrcProxyGetCurrentState inbuff for command: %s \n", lwfd->inbuff);\r
- debug_leave();\r
- return wfd_proxy_message_parse_state(lwfd->inbuff, strlen(lwfd->inbuff));\r
-}\r
-\r
-static gboolean proxy_write (WfdSrcProxy *wfd, char *wbuf)\r
-{\r
- write(wfd->sockfd, wbuf, strlen(wbuf));\r
- return TRUE;\r
-}\r
-\r
-static void* wfd_proxy_thread_function(void * asrc)\r
-{\r
- fd_set read_flags,write_flags;\r
- WfdSrcProxy *wfd = (WfdSrcProxy *)asrc;\r
- int rc;\r
- while(!wfd->quitloop)\r
- {\r
- FD_ZERO(&read_flags);\r
- FD_ZERO(&write_flags);\r
- FD_SET(wfd->sockfd, &read_flags);\r
- debug_log("Waiting on select()...\n");\r
- rc = select(wfd->sockfd+1, &read_flags, NULL, NULL, NULL);\r
- if(rc < 0)\r
- continue;\r
- if(FD_ISSET(wfd->sockfd, &read_flags))\r
- { //Socket ready for reading\r
- FD_CLR(wfd->sockfd, &read_flags);\r
- memset(&(wfd->inbuff),0,sizeof(wfd->inbuff));\r
- debug_log("socket ready for reading...\n");\r
- rc = read(wfd->sockfd, wfd->inbuff, sizeof(wfd->inbuff)-1);\r
- if (rc <= 0)\r
- {\r
- debug_log("socket connection closed\n");\r
- goto cleanup;\r
- }\r
- debug_log("wfd_proxy replay for command: %s \n", wfd->inbuff);\r
- if(g_strrstr(wfd->inbuff, "NOTIFY"))\r
- {\r
- if(wfd->applicationCb)\r
- {\r
- gchar **notify;\r
- notify = g_strsplit(wfd->inbuff,"\r\n",0);\r
- wfd->applicationCb(asrc, convert_string_to_status(notify[2]), convert_string_to_state(notify[1]), wfd->user_data);\r
- }\r
- }\r
- else \r
- {\r
- debug_log("wfd_proxy signalling \n");\r
- wfd->response = TRUE;\r
- g_cond_signal(wfd->cond);\r
- debug_log("wfd_proxy signal emitted \n");\r
- }\r
- }\r
- }\r
-cleanup:\r
- close (wfd->sockfd);\r
- FD_CLR (wfd->sockfd, &read_flags);\r
- debug_log("thread function signal\n");\r
- g_cond_signal(wfd->cond);\r
- debug_log("thread function quit\n");\r
- return NULL;\r
-}\r
-\r
-static int wfd_proxy_initialize(WfdSrcProxy *wfd)\r
-{\r
- DBusGConnection *bus = NULL;\r
- DBusGProxy *proxy = NULL;\r
- g_type_init();\r
- debug_log("wfd_proxy_initialize init \n");\r
- int portno;\r
- struct sockaddr_in serv_addr;\r
- struct hostent *server;\r
- GError *error = NULL;\r
- debug_log("wfd_proxy_initialize get before socket\n");\r
- wfd->sockfd = socket(AF_INET, SOCK_STREAM, 0);\r
- if (wfd->sockfd < 0)\r
- {\r
- debug_log("ERROR opening socket\n");\r
- return -1;\r
- }\r
-\r
- debug_log("wfd_proxy_initialize get socket created\n");\r
- server = gethostbyname(DEST_HOST);\r
- if (server == NULL) {\r
- debug_log("ERROR, no such host\n");\r
- return -1;\r
- }\r
- portno = WFD_PROXY_COMM_PORT;\r
- bzero((char *) &serv_addr, sizeof(serv_addr));\r
- serv_addr.sin_family = AF_INET;\r
- debug_log("wfd_proxy_initialize bcopy\n");\r
- bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);\r
- serv_addr.sin_port = htons(portno);\r
- debug_log("wfd_proxy_initialize get socket before connect\n");\r
- if (connect(wfd->sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)\r
- {\r
- int return_code = 0;\r
- int pid = getpid();\r
- debug_log("----------- wfd_proxy_initialize socket connect failed it means server is not yet started ------------\n");\r
- debug_log("going to start WFD server \n");\r
- bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error);\r
- if (bus == NULL) {\r
- debug_log("dbus bus get failed\n");\r
- return -1;\r
- }\r
- proxy = dbus_g_proxy_new_for_name(bus,\r
- "com.samsung.wfd.server",\r
- "/com/samsung/wfd/server",\r
- "com.samsung.wfd.server");\r
- if (proxy == NULL) {\r
- debug_log("dbus bus proxy get failed\n");\r
- return -1;\r
- }\r
- if (!com_samsung_wfd_server_test_method(proxy, pid, "miracast_server", &return_code, &error)) {\r
- debug_log(\r
- "com_samsung_wfd_server_test_method()failed.test_name[%s], "\r
- "return_code[%d]\n", "miracast_server", return_code);\r
- debug_log("error->message is %s\n", error->message);\r
- }\r
- sleep(1);\r
- debug_log("wfd_proxy_initialize trying for connect\n");\r
- if (connect(wfd->sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) {\r
- debug_log("wfd_proxy_initialize trying to connect failed\n");\r
- return -1;\r
- }\r
- }\r
- debug_log("WFD server initiated and connected\n");\r
- wfd->thread = g_thread_create ((GThreadFunc) wfd_proxy_thread_function, wfd, TRUE, &error);\r
- return 0;\r
-}\r
-\r
-static gboolean is_cmd_valid_in_current_state(WfdSrcProxyState aState, WfdSrcProxyCmd acmd)\r
-{\r
- //TODO state checking needs to be implemented\r
- return TRUE;\r
-}\r
-\r
-WfdSrcProxyState convert_string_to_state(gchar *buffer)\r
-{\r
- g_return_val_if_fail (buffer != NULL, WFDSRC_STATE_NUM);\r
- if(!strcmp(buffer, "MM_WFD_STATE_NULL")) return WFDSRC_STATE_NULL;\r
- if(!strcmp(buffer, "MM_WFD_STATE_READY")) return WFDSRC_STATE_READY;\r
- if(!strcmp(buffer, "MM_WFD_STATE_CONNECTION_WAIT")) return WFDSRC_STATE_CONNECTION_WAIT;\r
- if(!strcmp(buffer, "MM_WFD_STATE_CONNECTED")) return WFDSRC_STATE_CONNECTED;\r
- if(!strcmp(buffer, "MM_WFD_STATE_PLAYING")) return WFDSRC_STATE_PLAYING;\r
- if(!strcmp(buffer, "MM_WFD_STATE_PAUSED")) return WFDSRC_STATE_PAUSED;\r
- if(!strcmp(buffer, "MM_WFD_STATE_NONE")) return WFDSRC_STATE_NONE;\r
- return WFDSRC_STATE_NULL;\r
-}\r
-\r
-WfdSrcProxyRet convert_string_to_status(gchar *buffer)\r
-{\r
- g_return_val_if_fail (buffer != NULL, WFDSRC_ERROR_UNKNOWN);\r
- if(!strcmp(buffer, "MM_ERROR_NONE")) return WFDSRC_ERROR_NONE;\r
- if(!strcmp(buffer, "MM_ERROR_UNKNOWN")) return WFDSRC_ERROR_UNKNOWN;\r
- if(!strcmp(buffer, "MM_ERROR_WFD_INVALID_ARGUMENT")) return WFDSRC_ERROR_WFD_INVALID_ARGUMENT;\r
- if(!strcmp(buffer, "MM_ERROR_WFD_NO_FREE_SPACE")) return WFDSRC_ERROR_WFD_NO_FREE_SPACE;\r
- if(!strcmp(buffer, "MM_ERROR_WFD_NOT_INITIALIZED")) return WFDSRC_ERROR_WFD_NOT_INITIALIZED;\r
- if(!strcmp(buffer, "MM_ERROR_WFD_NO_OP")) return WFDSRC_ERROR_WFD_NO_OP;\r
- if(!strcmp(buffer, "MM_ERROR_WFD_INVALID_STATE")) return WFDSRC_ERROR_WFD_INVALID_STATE;\r
- if(!strcmp(buffer, "MM_ERROR_WFD_INTERNAL")) return WFDSRC_ERROR_WFD_INTERNAL;\r
- return WFDSRC_ERROR_UNKNOWN;\r
-}\r
-\r
-static WfdSrcProxyState wfd_proxy_message_parse_state (const char * data, guint size)\r
-{\r
- gchar *p;\r
- gchar buffer[128];\r
- guint idx = 0;\r
- gboolean statequery = false;\r
- g_return_val_if_fail (data != NULL, WFDSRC_STATE_NUM);\r
- g_return_val_if_fail (size != 0, WFDSRC_STATE_NUM);\r
-\r
- p = (gchar *) data;\r
- while (TRUE) {\r
- if (*p == '\0')\r
- break;\r
- idx = 0;\r
- while (*p != '\n' && *p != '\r' && *p != '\0') {\r
- if (idx < sizeof (buffer) - 1)\r
- buffer[idx++] = *p;\r
- p++;\r
- }\r
- buffer[idx] = '\0';\r
- if(g_strrstr(buffer, "REPLAY WFD_PROXY_STATE_QUERY")) statequery = TRUE;\r
- else if(statequery) return convert_string_to_state(buffer);\r
- if (*p == '\0')\r
- break;\r
- p+=2;\r
- }\r
- return WFDSRC_STATE_NUM;\r
-}\r
-\r
-WfdSrcProxyRet wfd_proxy_message_parse_status (const char * data, guint size)\r
-{\r
- gchar *p;\r
- gchar buffer[128];\r
- guint idx = 0;\r
- gboolean replay = false;\r
- g_return_val_if_fail (data != NULL, WFDSRC_ERROR_UNKNOWN);\r
- g_return_val_if_fail (size != 0, WFDSRC_ERROR_UNKNOWN);\r
-\r
- p = (gchar *) data;\r
- while (TRUE) {\r
- if (*p == '\0')\r
- break;\r
- idx = 0;\r
- while (*p != '\n' && *p != '\r' && *p != '\0') {\r
- if (idx < sizeof (buffer) - 1)\r
- buffer[idx++] = *p;\r
- p++;\r
- }\r
- buffer[idx] = '\0';\r
- if(g_strrstr(buffer, "REPLAY")) replay = TRUE;\r
- else if(replay) return convert_string_to_status(buffer);\r
- if (*p == '\0')\r
- break;\r
- p+=2;\r
- }\r
- return WFDSRC_ERROR_UNKNOWN;\r
-}\r
+ if(!lwfd->response) goto retry;
+ }
+ debug_log("WfdSrcProxyGetCurrentState inbuff for command: %s \n", lwfd->inbuff);
+ debug_leave();
+ return wfd_proxy_message_parse_state(lwfd->inbuff, strlen(lwfd->inbuff));
+}
+
+static gboolean proxy_write (WfdSrcProxy *wfd, char *wbuf)
+{
+ write(wfd->sockfd, wbuf, strlen(wbuf));
+ return TRUE;
+}
+
+static void* wfd_proxy_thread_function(void * asrc)
+{
+ fd_set read_flags,write_flags;
+ WfdSrcProxy *wfd = (WfdSrcProxy *)asrc;
+ int rc;
+ while(!wfd->quitloop)
+ {
+ FD_ZERO(&read_flags);
+ FD_ZERO(&write_flags);
+ FD_SET(wfd->sockfd, &read_flags);
+ debug_log("Waiting on select()...\n");
+ rc = select(wfd->sockfd+1, &read_flags, NULL, NULL, NULL);
+ if(rc < 0)
+ continue;
+ if(FD_ISSET(wfd->sockfd, &read_flags))
+ { //Socket ready for reading
+ FD_CLR(wfd->sockfd, &read_flags);
+ memset(&(wfd->inbuff),0,sizeof(wfd->inbuff));
+ debug_log("socket ready for reading...\n");
+ rc = read(wfd->sockfd, wfd->inbuff, sizeof(wfd->inbuff)-1);
+ if (rc <= 0)
+ {
+ debug_log("socket connection closed\n");
+ goto cleanup;
+ }
+ debug_log("wfd_proxy replay for command: %s \n", wfd->inbuff);
+ if(g_strrstr(wfd->inbuff, "NOTIFY"))
+ {
+ if(wfd->applicationCb)
+ {
+ gchar **notify;
+ notify = g_strsplit(wfd->inbuff,"\r\n",0);
+ wfd->applicationCb(asrc, convert_string_to_status(notify[2]), convert_string_to_state(notify[1]), wfd->user_data);
+ }
+ }
+ else
+ {
+ debug_log("wfd_proxy signalling \n");
+ wfd->response = TRUE;
+ g_cond_signal(wfd->cond);
+ debug_log("wfd_proxy signal emitted \n");
+ }
+ }
+ }
+cleanup:
+ close (wfd->sockfd);
+ FD_CLR (wfd->sockfd, &read_flags);
+ debug_log("thread function signal\n");
+ g_cond_signal(wfd->cond);
+ debug_log("thread function quit\n");
+ return NULL;
+}
+
+static int wfd_proxy_initialize(WfdSrcProxy *wfd)
+{
+ DBusGConnection *bus = NULL;
+ DBusGProxy *proxy = NULL;
+ g_type_init();
+ debug_log("wfd_proxy_initialize init \n");
+ int portno;
+ struct sockaddr_in serv_addr;
+ struct hostent *server;
+ GError *error = NULL;
+ debug_log("wfd_proxy_initialize get before socket\n");
+ wfd->sockfd = socket(AF_INET, SOCK_STREAM, 0);
+ if (wfd->sockfd < 0)
+ {
+ debug_log("ERROR opening socket\n");
+ return -1;
+ }
+
+ debug_log("wfd_proxy_initialize get socket created\n");
+ server = gethostbyname(DEST_HOST);
+ if (server == NULL) {
+ debug_log("ERROR, no such host\n");
+ return -1;
+ }
+ portno = WFD_PROXY_COMM_PORT;
+ bzero((char *) &serv_addr, sizeof(serv_addr));
+ serv_addr.sin_family = AF_INET;
+ debug_log("wfd_proxy_initialize bcopy\n");
+ bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
+ serv_addr.sin_port = htons(portno);
+ debug_log("wfd_proxy_initialize get socket before connect\n");
+ if (connect(wfd->sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
+ {
+ int return_code = 0;
+ int pid = getpid();
+ debug_log("----------- wfd_proxy_initialize socket connect failed it means server is not yet started ------------\n");
+ debug_log("going to start WFD server \n");
+ bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error);
+ if (bus == NULL) {
+ debug_log("dbus bus get failed\n");
+ return -1;
+ }
+ proxy = dbus_g_proxy_new_for_name(bus,
+ "com.samsung.wfd.server",
+ "/com/samsung/wfd/server",
+ "com.samsung.wfd.server");
+ if (proxy == NULL) {
+ debug_log("dbus bus proxy get failed\n");
+ return -1;
+ }
+ if (!com_samsung_wfd_server_test_method(proxy, pid, "miracast_server", &return_code, &error)) {
+ debug_log(
+ "com_samsung_wfd_server_test_method()failed.test_name[%s], "
+ "return_code[%d]\n", "miracast_server", return_code);
+ debug_log("error->message is %s\n", error->message);
+ }
+ sleep(1);
+ debug_log("wfd_proxy_initialize trying for connect\n");
+ if (connect(wfd->sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) {
+ debug_log("wfd_proxy_initialize trying to connect failed\n");
+ return -1;
+ }
+ }
+ debug_log("WFD server initiated and connected\n");
+ wfd->thread = g_thread_create ((GThreadFunc) wfd_proxy_thread_function, wfd, TRUE, &error);
+ return 0;
+}
+
+static gboolean is_cmd_valid_in_current_state(WfdSrcProxyState aState, WfdSrcProxyCmd acmd)
+{
+ //TODO state checking needs to be implemented
+ return TRUE;
+}
+
+WfdSrcProxyState convert_string_to_state(gchar *buffer)
+{
+ g_return_val_if_fail (buffer != NULL, WFDSRC_STATE_NUM);
+ if(!strcmp(buffer, "MM_WFD_STATE_NULL")) return WFDSRC_STATE_NULL;
+ if(!strcmp(buffer, "MM_WFD_STATE_READY")) return WFDSRC_STATE_READY;
+ if(!strcmp(buffer, "MM_WFD_STATE_CONNECTION_WAIT")) return WFDSRC_STATE_CONNECTION_WAIT;
+ if(!strcmp(buffer, "MM_WFD_STATE_CONNECTED")) return WFDSRC_STATE_CONNECTED;
+ if(!strcmp(buffer, "MM_WFD_STATE_PLAYING")) return WFDSRC_STATE_PLAYING;
+ if(!strcmp(buffer, "MM_WFD_STATE_PAUSED")) return WFDSRC_STATE_PAUSED;
+ if(!strcmp(buffer, "MM_WFD_STATE_NONE")) return WFDSRC_STATE_NONE;
+ return WFDSRC_STATE_NULL;
+}
+
+WfdSrcProxyRet convert_string_to_status(gchar *buffer)
+{
+ g_return_val_if_fail (buffer != NULL, WFDSRC_ERROR_UNKNOWN);
+ if(!strcmp(buffer, "MM_ERROR_NONE")) return WFDSRC_ERROR_NONE;
+ if(!strcmp(buffer, "MM_ERROR_UNKNOWN")) return WFDSRC_ERROR_UNKNOWN;
+ if(!strcmp(buffer, "MM_ERROR_WFD_INVALID_ARGUMENT")) return WFDSRC_ERROR_WFD_INVALID_ARGUMENT;
+ if(!strcmp(buffer, "MM_ERROR_WFD_NO_FREE_SPACE")) return WFDSRC_ERROR_WFD_NO_FREE_SPACE;
+ if(!strcmp(buffer, "MM_ERROR_WFD_NOT_INITIALIZED")) return WFDSRC_ERROR_WFD_NOT_INITIALIZED;
+ if(!strcmp(buffer, "MM_ERROR_WFD_NO_OP")) return WFDSRC_ERROR_WFD_NO_OP;
+ if(!strcmp(buffer, "MM_ERROR_WFD_INVALID_STATE")) return WFDSRC_ERROR_WFD_INVALID_STATE;
+ if(!strcmp(buffer, "MM_ERROR_WFD_INTERNAL")) return WFDSRC_ERROR_WFD_INTERNAL;
+ return WFDSRC_ERROR_UNKNOWN;
+}
+
+static WfdSrcProxyState wfd_proxy_message_parse_state (const char * data, guint size)
+{
+ gchar *p;
+ gchar buffer[128];
+ guint idx = 0;
+ gboolean statequery = false;
+ g_return_val_if_fail (data != NULL, WFDSRC_STATE_NUM);
+ g_return_val_if_fail (size != 0, WFDSRC_STATE_NUM);
+
+ p = (gchar *) data;
+ while (TRUE) {
+ if (*p == '\0')
+ break;
+ idx = 0;
+ while (*p != '\n' && *p != '\r' && *p != '\0') {
+ if (idx < sizeof (buffer) - 1)
+ buffer[idx++] = *p;
+ p++;
+ }
+ buffer[idx] = '\0';
+ if(g_strrstr(buffer, "REPLAY WFD_PROXY_STATE_QUERY")) statequery = TRUE;
+ else if(statequery) return convert_string_to_state(buffer);
+ if (*p == '\0')
+ break;
+ p+=2;
+ }
+ return WFDSRC_STATE_NUM;
+}
+
+WfdSrcProxyRet wfd_proxy_message_parse_status (const char * data, guint size)
+{
+ gchar *p;
+ gchar buffer[128];
+ guint idx = 0;
+ gboolean replay = false;
+ g_return_val_if_fail (data != NULL, WFDSRC_ERROR_UNKNOWN);
+ g_return_val_if_fail (size != 0, WFDSRC_ERROR_UNKNOWN);
+
+ p = (gchar *) data;
+ while (TRUE) {
+ if (*p == '\0')
+ break;
+ idx = 0;
+ while (*p != '\n' && *p != '\r' && *p != '\0') {
+ if (idx < sizeof (buffer) - 1)
+ buffer[idx++] = *p;
+ p++;
+ }
+ buffer[idx] = '\0';
+ if(g_strrstr(buffer, "REPLAY")) replay = TRUE;
+ else if(replay) return convert_string_to_status(buffer);
+ if (*p == '\0')
+ break;
+ p+=2;
+ }
+ return WFDSRC_ERROR_UNKNOWN;
+}