-/*\r
- * libmm-wfd\r
- *\r
- * Copyright (c) 2011 - 2013 Samsung Electronics Co., Ltd. All rights reserved.\r
- *\r
- * Contact: JongHyuk Choi <jhchoi.choi@samsung.com>, ByungWook Jang <bw.jang@samsung.com>,\r
- * Manoj Kumar K <manojkumar.k@samsung.com>, Hyunil Park <hyunil46.park@samsung.com>\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- *\r
- */\r
-\r
- /*===========================================================================================\r
-| |\r
-| INCLUDE FILES |\r
-| |\r
-========================================================================================== */\r
-//#define MTRACE;\r
-#include <glib.h>\r
-#include <mm_types.h>\r
-#include <mm_error.h>\r
-#include <mm_message.h>\r
-#include <mm_wfd.h>\r
-#include <mm_debug.h>\r
-#include <mm_message.h>\r
-#include <mm_error.h>\r
-#include <mm_types.h>\r
-\r
-#include <iniparser.h>\r
-#include <mm_ta.h>\r
-#include <dlfcn.h>\r
-#include <sys/types.h>\r
-#include <sys/socket.h>\r
-#include <netinet/in.h>\r
-#include <fcntl.h>\r
-#include <signal.h>\r
-\r
-#include <netdb.h>\r
-#include <dbus/dbus.h>\r
-#include <dbus/dbus-glib-lowlevel.h>\r
-\r
-#include <vconf.h>\r
-\r
-#define PACKAGE "mm_wfd_testsuite"\r
-\r
-/*===========================================================================================\r
-| |\r
-| LOCAL DEFINITIONS AND DECLARATIONS FOR MODULE |\r
-| |\r
-========================================================================================== */\r
-\r
-#if defined(_USE_GMAINLOOP)\r
-GMainLoop *g_loop;\r
-#endif\r
-\r
-gboolean wfd_server_test_method(void *pObject, int pid, char *test_name,\r
- int *return_code)\r
-{\r
- debug_log("Received test %s\n", test_name);\r
- return TRUE;\r
-}\r
-\r
-#include "wfd-structure.h"\r
-\r
-#define WFD_PROXY_COMM_PORT 8888\r
-\r
-typedef struct WfdServerObject WfdServerObject;\r
-typedef struct WfdServerObjectClass WfdServerObjectClass;\r
-\r
-GType Daemon_Object_get_type(void);\r
-struct WfdServerObject {\r
- GObject parent;\r
-};\r
-\r
-struct WfdServerObjectClass {\r
- GObjectClass parent;\r
-};\r
-\r
-#define DBUS_NAME_FLAG_PROHIBIT_REPLACEMENT 0\r
-\r
-#define WFD_SERVER_TYPE_OBJECT (Daemon_Object_get_type())\r
-\r
-#define WFD_SERVER_OBJECT(object) (G_TYPE_CHECK_INSTANCE_CAST \\r
- ((object), WFD_SERVER_TYPE_OBJECT, WfdServerObject))\r
-\r
-G_DEFINE_TYPE(WfdServerObject, Daemon_Object, G_TYPE_OBJECT)\r
-static void Daemon_Object_init(WfdServerObject * obj)\r
-{\r
- debug_log("Daemon_Object_init\n");\r
-}\r
-\r
-static void Daemon_Object_class_init(WfdServerObjectClass * klass)\r
-{\r
- debug_log("Daemon_Object_class_init\n");\r
-}\r
-\r
-/*---------------------------------------------------------------------------\r
-| LOCAL #defines: |\r
----------------------------------------------------------------------------*/\r
-#define MAX_STRING_LEN 2048\r
-\r
-/*---------------------------------------------------------------------------\r
-| LOCAL CONSTANT DEFINITIONS: |\r
----------------------------------------------------------------------------*/\r
-enum\r
-{\r
- CURRENT_STATUS_MAINMENU,\r
- CURRENT_STATUS_SERVER_IP,\r
- CURRENT_STATUS_SERVER_PORT,\r
- CURRENT_STATUS_CONNECT,\r
-};\r
-\r
-typedef struct {\r
- int connfd;\r
- socklen_t clilen;\r
- struct sockaddr_in cli_addr;\r
- GThread *thread;\r
- char inbuff[512];\r
- gboolean inactive;\r
- GMutex *lock;\r
- GIOChannel *channel;\r
- void *parent;\r
-} WFDClient;\r
-\r
-typedef struct {\r
- int sockfd;\r
- int portno;\r
- struct sockaddr_in serv_addr;\r
- GThread *thread;\r
- GList *clients;\r
-} WFDServer;\r
-\r
-/*---------------------------------------------------------------------------\r
-| LOCAL VARIABLE DEFINITIONS: |\r
----------------------------------------------------------------------------*/\r
-\r
-int g_current_state;\r
-static MMHandleType g_wfd = 0;\r
-char *g_err_name = NULL;\r
-gboolean quit_pushing;\r
-int socket_id = 0;\r
-/*---------------------------------------------------------------------------\r
-| LOCAL FUNCTION PROTOTYPES: |\r
----------------------------------------------------------------------------*/\r
-static void wfd_connect();\r
-static void wfd_start();\r
-static void wfd_stop();\r
-\r
-void quit_program();\r
-\r
-static void wfd_set_signal();\r
-\r
-/*---------------------------------------------------------------------------\r
- | LOCAL FUNCTION DEFINITIONS: |\r
- ---------------------------------------------------------------------------*/\r
-static bool msg_callback(int message, MMMessageParamType *param, void *user_param)\r
-{\r
- /* TODO any error notification or state change should be forwarded to the active list of proxy apps */\r
- switch (message) {\r
- case MM_MESSAGE_ERROR:\r
- {\r
- WFDClient *client = (WFDClient *)user_param;\r
- if(!client) return FALSE;\r
- WFDServer *lserver = (WFDServer*) client->parent;\r
- if(!lserver) return FALSE;\r
- debug_log("msg_callback error : code = %x\n", param->code);\r
- debug_log ("DESTROY..\n\n");\r
- quit_pushing = TRUE;\r
- shutdown (lserver->sockfd, SHUT_RDWR);\r
- debug_log("msg_callback error call quit_program()");\r
- quit_program();\r
- }\r
- break;\r
- case MM_MESSAGE_WARNING:\r
- // debug_log("warning : code = %d\n", param->code);\r
- break;\r
- case MM_MESSAGE_END_OF_STREAM:\r
- debug_log("msg_callback end of stream\n");\r
- mm_wfd_stop(g_wfd);\r
- break;\r
- case MM_MESSAGE_STATE_CHANGED:\r
- g_current_state = param->state.current;\r
- switch(g_current_state)\r
- {\r
- case MM_WFD_STATE_NULL:\r
- debug_log("\n ==> [WFDApp] Player is [NULL]\n");\r
- break;\r
- case MM_WFD_STATE_READY:\r
- debug_log("\n ==> [WFDApp] Player is [READY]\n");\r
- break;\r
- case MM_WFD_STATE_PLAYING:\r
- debug_log("\n ==> [WFDApp] Player is [PLAYING]\n");\r
- break;\r
- case MM_WFD_STATE_PAUSED:\r
- debug_log("\n ==> [WFDApp] Player is [PAUSED]\n");\r
- break;\r
- }\r
- break;\r
- default:\r
- return FALSE;\r
- }\r
- return TRUE;\r
-}\r
-\r
-static gboolean proxy_write (WFDClient *client, char *wbuf)\r
-{\r
- write(client->connfd, wbuf, strlen(wbuf));\r
- return TRUE;\r
-}\r
-\r
-static void input_server_ip_and_port(char *server_ip, char* port, WFDClient *client)\r
-{\r
- int len = strlen(server_ip);\r
- int ret = MM_ERROR_NONE;\r
- if ( len < 0 || len > MAX_STRING_LEN )\r
- return;\r
-\r
- if (!g_wfd)\r
- {\r
- if ( mm_wfd_create(&g_wfd) != MM_ERROR_NONE )\r
- {\r
- debug_log("input_server_ip wfd create is failed\n");\r
- return;\r
- }\r
- ret = mm_wfd_set_message_callback(g_wfd, msg_callback, (void*)client);\r
- if (ret != MM_ERROR_NONE)\r
- {\r
- debug_log ("input_server_ip Error in setting server_port...\n");\r
- return;\r
- }\r
- }\r
- ret = mm_wfd_set_attribute(g_wfd,\r
- &g_err_name,\r
- "server_ip", server_ip, strlen(server_ip),\r
- NULL);\r
- if (ret != MM_ERROR_NONE)\r
- {\r
- debug_log ("input_server_ip Error in setting server_port...\n");\r
- return;\r
- }\r
- ret = mm_wfd_set_attribute(g_wfd,\r
- &g_err_name,\r
- "server_port", port, strlen(port),\r
- NULL);\r
- if (ret != MM_ERROR_NONE)\r
- {\r
- debug_log ("input_server_port Error in setting server_port...\n");\r
- return;\r
- }\r
- /*set wfd source status*/\r
- gboolean status = VCONFKEY_MIRACAST_WFD_SOURCE_ON;\r
- if (!vconf_set_bool(VCONFKEY_MIRACAST_WFD_SOURCE_STATUS, status)) {\r
- debug_log ("set VCONFKEY_MIRACAST_WFD_SOURCE_ON");\r
- }\r
-}\r
-static void wfd_connect()\r
-{\r
- int ret = MM_ERROR_NONE;\r
-\r
- if (!g_wfd)\r
- {\r
- debug_log ("wfd_start Creating server with default values : ");\r
- if ( mm_wfd_create(&g_wfd) != MM_ERROR_NONE )\r
- {\r
- debug_log("wfd_start wfd create is failed\n");\r
- return;\r
- }\r
-\r
- ret = mm_wfd_set_message_callback(g_wfd, msg_callback, (void*)g_wfd);\r
- if (ret != MM_ERROR_NONE)\r
- {\r
- debug_log ("wfd_start Error in setting server_port...\n");\r
- return;\r
- }\r
- }\r
- if ( mm_wfd_realize(g_wfd) != MM_ERROR_NONE )\r
- {\r
- debug_log("wfd_start wfd realize is failed\n");\r
- return;\r
- }\r
-\r
- if ( mm_wfd_connect(g_wfd) != MM_ERROR_NONE )\r
- {\r
- debug_log("wfd_start wfd connect is failed\n");\r
- return;\r
- }\r
-\r
-}\r
-\r
-static void wfd_start()\r
-{\r
- int ret = MM_ERROR_NONE;\r
-\r
- if (!g_wfd)\r
- {\r
- debug_log ("wfd_start Creating server with default values : ");\r
- if ( mm_wfd_create(&g_wfd) != MM_ERROR_NONE )\r
- {\r
- debug_log("wfd_start wfd create is failed\n");\r
- return;\r
- }\r
-\r
- ret = mm_wfd_set_message_callback(g_wfd, msg_callback, (void*)g_wfd);\r
- if (ret != MM_ERROR_NONE)\r
- {\r
- debug_log ("wfd_start Error in setting server_port...\n");\r
- return;\r
- }\r
-\r
- if ( mm_wfd_realize(g_wfd) != MM_ERROR_NONE )\r
- {\r
- debug_log("wfd_start wfd realize is failed\n");\r
- return;\r
- }\r
-\r
- if ( mm_wfd_connect(g_wfd) != MM_ERROR_NONE )\r
- {\r
- debug_log("wfd_start wfd connect is failed\n");\r
- return;\r
- }\r
- }\r
-\r
- if (mm_wfd_start(g_wfd) != MM_ERROR_NONE)\r
- {\r
- debug_log ("wfd_start Failed to start WFD");\r
- return;\r
- }\r
-}\r
-\r
-static void wfd_stop()\r
-{\r
- int ret = MM_ERROR_NONE;\r
-\r
- ret = mm_wfd_stop(g_wfd);\r
- if (ret != MM_ERROR_NONE)\r
- {\r
- debug_log ("wfd_stop Error to do stop...\n");\r
- return;\r
- }\r
-}\r
-\r
-static void wfd_pause()\r
-{\r
- int ret = MM_ERROR_NONE;\r
-\r
- ret = mm_wfd_pause(g_wfd);\r
- if (ret != MM_ERROR_NONE)\r
- {\r
- debug_log ("wfd_pause Error to do pausep...\n");\r
- return;\r
- }\r
-}\r
-\r
-static void wfd_resume()\r
-{\r
- int ret = MM_ERROR_NONE;\r
-\r
- ret = mm_wfd_resume(g_wfd);\r
- if (ret != MM_ERROR_NONE)\r
- {\r
- debug_log ("wfd_resume Error to do resume...\n");\r
- return;\r
- }\r
-}\r
-\r
-static void wfd_standby()\r
-{\r
- int ret = MM_ERROR_NONE;\r
- ret = mm_wfd_standby(g_wfd);\r
- if (ret != MM_ERROR_NONE)\r
- {\r
- debug_log ("wfd_standby Error to do standby...\n");\r
- return;\r
- }\r
-}\r
-\r
-void quit_program()\r
-{\r
- MMTA_ACUM_ITEM_SHOW_RESULT_TO(MMTA_SHOW_STDOUT);\r
- MMTA_RELEASE();\r
- debug_log ("quit_program...\n");\r
-\r
- /*set wfd source status*/\r
- gboolean status = VCONFKEY_MIRACAST_WFD_SOURCE_OFF;\r
- if (!vconf_set_bool(VCONFKEY_MIRACAST_WFD_SOURCE_STATUS, status)) {\r
- debug_log ("set VCONFKEY_MIRACAST_WFD_SOURCE_OFF");\r
- }\r
-\r
- if (g_wfd) {\r
- mm_wfd_unrealize(g_wfd);\r
- mm_wfd_destroy(g_wfd);\r
- g_wfd = 0;\r
- }\r
- g_main_loop_quit(g_loop);\r
-}\r
-\r
-gchar * convert_state_to_string(MMWfdStateType aState)\r
-{\r
- GString *cmd_replay;\r
- cmd_replay = g_string_new ("");\r
- switch(aState)\r
- {\r
- case MM_WFD_STATE_NULL:\r
- g_string_append_printf (cmd_replay, "MM_WFD_STATE_NULL");\r
- break;\r
- case MM_WFD_STATE_READY:\r
- g_string_append_printf (cmd_replay, "MM_WFD_STATE_READY");\r
- break;\r
- case MM_WFD_STATE_CONNECTION_WAIT:\r
- g_string_append_printf (cmd_replay, "MM_WFD_STATE_CONNECTION_WAIT");\r
- break;\r
- case MM_WFD_STATE_CONNECTED:\r
- g_string_append_printf (cmd_replay, "MM_WFD_STATE_CONNECTED");\r
- break;\r
- case MM_WFD_STATE_PLAYING:\r
- g_string_append_printf (cmd_replay, "MM_WFD_STATE_PLAYING");\r
- break;\r
- case MM_WFD_STATE_PAUSED:\r
- g_string_append_printf (cmd_replay, "MM_WFD_STATE_PAUSED");\r
- break;\r
- case MM_WFD_STATE_NONE:\r
- g_string_append_printf (cmd_replay, "MM_WFD_STATE_NONE");\r
- break;\r
- case MM_WFD_STATE_NUM:\r
- g_string_append_printf (cmd_replay, "MM_WFD_STATE_NUM");\r
- break;\r
- }\r
- return g_string_free (cmd_replay, FALSE);\r
-}\r
-\r
-static void interpret (WFDClient *client, char *cmd)\r
-{\r
- GString *cmd_replay;\r
- if (strstr(cmd, "WFD_PROXY_SET_IP_PORT"))\r
- {\r
- gchar **IP_port;\r
- gchar **IP;\r
- gchar **port;\r
- debug_log ("setting attributes... WFD..\n\n");\r
- IP_port = g_strsplit(cmd,"\r\n",0);\r
- IP = g_strsplit(IP_port[1]," ",0);\r
- port = g_strsplit(IP_port[2]," ",0);\r
- debug_log ("received IP %s port %s\n", IP[1], port[1]);\r
- input_server_ip_and_port(IP[1], port[1], client);\r
- cmd_replay = g_string_new ("");\r
- g_string_append_printf (cmd_replay, "REPLAY WFD_PROXY_SET_IP_PORT");\r
- g_string_append_printf (cmd_replay, "\r\n");\r
- g_string_append_printf (cmd_replay, "MM_ERROR_NONE");\r
- proxy_write(client, g_string_free (cmd_replay, FALSE));\r
- debug_log ("STATE QUERY..demon return\n\n");\r
- }\r
- else if (strstr(cmd, "WFD_PROXY_CONNECT"))\r
- {\r
- debug_log ("Starting... WFD..\n\n");\r
- cmd_replay = g_string_new ("");\r
- g_string_append_printf (cmd_replay, "REPLAY WFD_PROXY_CONNECT");\r
- g_string_append_printf (cmd_replay, "\r\n");\r
- g_string_append_printf (cmd_replay, "MM_ERROR_NONE");\r
- proxy_write(client, g_string_free (cmd_replay, FALSE));\r
- debug_log ("STATE QUERY..demon return\n\n");\r
- wfd_connect();\r
- }\r
- else if (strstr(cmd, "WFD_PROXY_START"))\r
- {\r
- debug_log ("Starting... WFD..\n\n");\r
- cmd_replay = g_string_new ("");\r
- g_string_append_printf (cmd_replay, "REPLAY WFD_PROXY_START");\r
- g_string_append_printf (cmd_replay, "\r\n");\r
- g_string_append_printf (cmd_replay, "MM_ERROR_NONE");\r
- proxy_write(client, g_string_free (cmd_replay, FALSE));\r
- debug_log ("STATE QUERY..demon return\n\n");\r
- wfd_start();\r
- }\r
- else if (strstr(cmd, "WFD_PROXY_PAUSE"))\r
- {\r
- debug_log ("PAUSING..\n\n");\r
- wfd_pause();\r
- cmd_replay = g_string_new ("");\r
- g_string_append_printf (cmd_replay, "REPLAY WFD_PROXY_PAUSE");\r
- g_string_append_printf (cmd_replay, "\r\n");\r
- g_string_append_printf (cmd_replay, "MM_ERROR_NONE");\r
- proxy_write(client, g_string_free (cmd_replay, FALSE));\r
- debug_log ("STATE QUERY..demon return\n\n");\r
- }\r
- else if (strstr(cmd, "WFD_PROXY_RESUME"))\r
- {\r
- debug_log ("RESUMING..\n\n");\r
- wfd_resume();\r
- cmd_replay = g_string_new ("");\r
- g_string_append_printf (cmd_replay, "REPLAY WFD_PROXY_RESUME");\r
- g_string_append_printf (cmd_replay, "\r\n");\r
- g_string_append_printf (cmd_replay, "MM_ERROR_NONE");\r
- proxy_write(client, g_string_free (cmd_replay, FALSE));\r
- debug_log ("STATE QUERY..demon return\n\n");\r
- }\r
- else if (strstr(cmd, "WFD_PROXY_STOP"))\r
- {\r
- debug_log ("STOPPING..\n\n");\r
- wfd_stop();\r
- cmd_replay = g_string_new ("");\r
- g_string_append_printf (cmd_replay, "REPLAY WFD_PROXY_STOP");\r
- g_string_append_printf (cmd_replay, "\r\n");\r
- g_string_append_printf (cmd_replay, "MM_ERROR_NONE");\r
- proxy_write(client, g_string_free (cmd_replay, FALSE));\r
- debug_log ("STATE QUERY..demon return\n\n");\r
- }\r
- else if (strstr(cmd, "WFD_PROXY_DESTROY"))\r
- {\r
- WFDServer *lserver = (WFDServer*) client->parent;\r
- debug_log ("DESTROY..\n\n");\r
- cmd_replay = g_string_new ("");\r
- g_string_append_printf (cmd_replay, "REPLAY WFD_PROXY_DESTROY");\r
- g_string_append_printf (cmd_replay, "\r\n");\r
- g_string_append_printf (cmd_replay, "MM_ERROR_NONE");\r
- proxy_write(client, g_string_free (cmd_replay, FALSE));\r
- debug_log ("STATE QUERY..demon return\n\n");\r
- quit_pushing = TRUE;\r
- shutdown (lserver->sockfd, SHUT_RDWR);\r
- debug_log("interpret calll quit_program()");\r
- quit_program();\r
- }\r
- else if (strstr(cmd, "WFD_PROXY_STATE_QUERY"))\r
- {\r
- debug_log ("STATE QUERY..\n\n");\r
- cmd_replay = g_string_new ("");\r
- g_string_append_printf (cmd_replay, "REPLAY WFD_PROXY_STATE_QUERY");\r
- g_string_append_printf (cmd_replay, "\r\n");\r
- g_string_append_printf (cmd_replay, convert_state_to_string(g_current_state));\r
- proxy_write(client, g_string_free (cmd_replay, FALSE));\r
- debug_log ("STATE QUERY..demon return\n\n");\r
- }\r
- else\r
- {\r
- debug_log("unknown menu \n");\r
- }\r
-}\r
-\r
-gboolean input (GIOChannel *channel, GIOCondition condition, gpointer data)\r
-{\r
- WFDClient *client = (WFDClient*)data;\r
- gsize read;\r
- GError *error = NULL;\r
- if(condition & G_IO_IN) {\r
- memset(&(client->inbuff),0,sizeof(client->inbuff));\r
- g_io_channel_read(client->channel, client->inbuff, sizeof(client->inbuff), &read);\r
- if(read)\r
- {\r
- client->inbuff[read] = '\0';\r
- g_strstrip(client->inbuff);\r
- debug_log("got command %s\n", client->inbuff);\r
- if(!g_str_has_prefix(client->inbuff,"WFD")) goto client_cleanup;\r
- interpret (client, client->inbuff);\r
- debug_log("command return \n");\r
- }\r
- else goto client_cleanup;\r
- }\r
- if (condition & G_IO_HUP) goto client_cleanup;\r
- return TRUE;\r
-client_cleanup:\r
- {\r
- WFDServer *lserver = (WFDServer *)client->parent;\r
- client->inactive = TRUE;\r
- debug_log("client connection closed \n");\r
- shutdown (client->connfd, SHUT_RDWR);\r
- g_io_channel_shutdown(client->channel, TRUE, &error);\r
- debug_log("IO channel closed \n");\r
- if(g_list_length(lserver->clients))\r
- {\r
- lserver->clients = g_list_remove(lserver->clients, client);\r
- }\r
- free(client);\r
- debug_log("client removed from list \n");\r
- }\r
- return TRUE;\r
-}\r
-\r
-static void* wfd_server_thread_function(void * asrc)\r
-{\r
- int newsockfd;\r
- int i=0;\r
- int nSockOpt = 1;\r
- WFDServer *pserver = (WFDServer *)asrc;\r
- pserver->sockfd = socket(AF_INET, SOCK_STREAM, 0);\r
- debug_log("wfd_proxy_initialize socke is %d", pserver->sockfd);\r
- if (pserver->sockfd < 0)\r
- {\r
- debug_log("ERROR opening socket");\r
- goto cleanup;\r
- }\r
- debug_log("wfd_proxy_initialize get socket created\n");\r
- bzero((char *) &pserver->serv_addr, sizeof(pserver->serv_addr));\r
- pserver->portno = WFD_PROXY_COMM_PORT;\r
- pserver->serv_addr.sin_family = AF_INET;\r
- pserver->serv_addr.sin_addr.s_addr = INADDR_ANY;\r
- pserver->serv_addr.sin_port = htons(pserver->portno);\r
- debug_log("serv_addr = %p sizeof %d ", (struct sockaddr *) &pserver->serv_addr, sizeof(pserver->serv_addr));\r
- setsockopt(pserver->sockfd, SOL_SOCKET, SO_REUSEADDR, &nSockOpt, sizeof(nSockOpt));\r
- if (bind(pserver->sockfd, (struct sockaddr *) &pserver->serv_addr, sizeof(pserver->serv_addr)) < 0)\r
- {\r
- debug_log("ERROR on binding");\r
- goto cleanup;\r
- }\r
- debug_log("wfd_proxy_initialize get socket bind\n");\r
- if (listen(pserver->sockfd,5) <0)\r
- {\r
- debug_log("ERROR on socket listen");\r
- goto cleanup;\r
- }\r
- wfd_set_signal();\r
- MMTA_INIT();\r
-\r
- while(!quit_pushing)\r
- {\r
- socklen_t clilen = {0};\r
- struct sockaddr_in cli_addr = {0};\r
- WFDClient *client = NULL;\r
- clilen = sizeof(cli_addr);\r
- debug_log("wfd_proxy_initialize waiting for accept \n");\r
- newsockfd = accept(pserver->sockfd, (struct sockaddr *) &cli_addr, &clilen);\r
- if (newsockfd < 0) {\r
- debug_log("ERROR on accept");\r
- continue;\r
- }\r
- debug_log("wfd_proxy_initialize get socket accept \n");\r
- client = g_malloc(sizeof(WFDClient));\r
- if(!client)\r
- {\r
- debug_log("client malloc failed. out of memory");\r
- continue;\r
- }\r
- client->connfd = newsockfd;\r
- socket_id = newsockfd;\r
- client->lock = g_mutex_new ();\r
- client->inactive = 0;\r
- client->parent = pserver;\r
- client->channel = g_io_channel_unix_new(client->connfd);\r
- g_io_add_watch(client->channel, G_IO_IN|G_IO_HUP|G_IO_ERR, (GIOFunc)input, client);\r
- pserver->clients = g_list_prepend(pserver->clients, client);\r
- }\r
-cleanup:\r
- debug_log("wfd_server_thread_function cleanup \n");\r
- for(i=0;i<g_list_length(pserver->clients); i++)\r
- {\r
- GError *error = NULL;\r
- WFDClient *tempclient = (WFDClient *)g_list_nth_data(pserver->clients,i);\r
- if(tempclient) {\r
- tempclient->inactive = TRUE;\r
- shutdown (tempclient->connfd, SHUT_RDWR);\r
- g_io_channel_shutdown(tempclient->channel, TRUE, &error);\r
- pserver->clients = g_list_remove(pserver->clients, tempclient);\r
- free(tempclient);\r
- }\r
- }\r
- g_list_free(pserver->clients);\r
- shutdown (pserver->sockfd, SHUT_RDWR);\r
- debug_log("wfd_server_thread_function calll quit_program()");\r
- quit_program();\r
-\r
- debug_log("wfd_server_thread_function THREAD EXIT \n");\r
-\r
- return NULL;\r
-}\r
-\r
-static gboolean __func1(void *data)\r
-{\r
- GError *error = NULL;\r
- WFDServer *server = (WFDServer *)data;\r
- debug_log("__func1 enter \n");\r
- server->thread = g_thread_create ((GThreadFunc) wfd_server_thread_function, server, TRUE, &error);\r
- server->clients = g_list_alloc ();\r
- debug_log("__func1 exit \n");\r
- return FALSE;\r
-}\r
-\r
-static bool __wfd_server_setup(void* pserver)\r
-{\r
- WFDServer *server = (WFDServer *)pserver;\r
- DBusGConnection *conn = NULL;\r
- GObject *object = NULL;\r
- DBusGObjectInfo dbus_glib_wfd_server_object_info;\r
- GError *err = NULL;\r
- DBusError derr;\r
- int ret = 0;\r
- debug_log("__wfd_server_setup start\n");\r
- dbus_g_object_type_install_info(WFD_SERVER_TYPE_OBJECT,\r
- &dbus_glib_wfd_server_object_info);\r
-\r
- conn = dbus_g_bus_get(DBUS_BUS_SYSTEM, &err);\r
- if (NULL == conn) {\r
- debug_log("Unable to get dbus!");\r
- return false;\r
- }\r
- dbus_error_init(&derr);\r
-\r
- ret = dbus_bus_request_name(dbus_g_connection_get_connection(conn),\r
- "com.samsung.wfd.server",\r
- DBUS_NAME_FLAG_PROHIBIT_REPLACEMENT, &derr);\r
-\r
- if (dbus_error_is_set(&derr)) {\r
- debug_log("dbus_bus_request_name failed with error:%s", derr.message);\r
- dbus_error_free(&derr);\r
- return false;\r
- }\r
- object = g_object_new(WFD_SERVER_TYPE_OBJECT, NULL);\r
- if (NULL == object) {\r
- debug_log("Unable to create new object");\r
- return false;\r
- }\r
- dbus_g_connection_register_g_object(conn, "/com/samsung/wfd/server", G_OBJECT(object));\r
- g_idle_add(__func1, server);\r
- debug_log("__wfd_server_setup end\n");\r
- return true;\r
-}\r
-void wfd_signal_handler(int signo) {\r
- quit_pushing = TRUE;\r
- debug_log("wfd_signal_handler calll quit_program()");\r
- shutdown (socket_id, SHUT_RDWR);\r
- quit_program();\r
- exit(1);\r
-}\r
-\r
-static void wfd_set_signal()\r
-{\r
-\r
- /*refer to signal.h*/\r
- /*SIGABRT A Process abort signal.\r
- SIGALRM T Alarm clock.\r
- SIGBUS A Access to an undefined portion of a memory object.\r
- SIGCHLD I Child process terminated, stopped,\r
- SIGCONT C Continue executing, if stopped.\r
- SIGFPE A Erroneous arithmetic operation.\r
- SIGHUP T Hangup.\r
- SIGILL A Illegal instruction.\r
- SIGINT T Terminal interrupt signal.\r
- SIGKILL T Kill (cannot be caught or ignored).\r
- SIGPIPE T Write on a pipe with no one to read it.\r
- SIGQUIT A Terminal quit signal.\r
- SIGSEGV A Invalid memory reference.\r
- SIGSTOP S Stop executing (cannot be caught or ignored).\r
- SIGTERM T Termination signal.\r
- SIGTSTP S Terminal stop signal.\r
- SIGTTIN S Background process attempting read.\r
- SIGTTOU S Background process attempting write.\r
- SIGUSR1 T User-defined signal 1.\r
- SIGUSR2 T User-defined signal 2.\r
- SIGPOLL T Pollable event.\r
- SIGPROF T Profiling timer expired.\r
- SIGSYS A Bad system call.\r
- SIGTRAP A Trace/breakpoint trap.\r
- SIGURG I High bandwidth data is available at a socket.\r
- SIGVTALRM T Virtual timer expired.\r
- SIGXCPU A CPU time limit exceeded.\r
- SIGXFSZ A File size limit exceeded.\r
-\r
-The default actions are as follows:\r
-T : Abnormal termination of the process. The process is terminated with all the consequences of _exit()\r
-A : Abnormal termination of the process.\r
-I : Ignore the signal.\r
-S : Stop the process\r
-*/\r
- struct sigaction act_new;\r
- memset (&act_new, 0, sizeof (struct sigaction));\r
-\r
- act_new.sa_handler = wfd_signal_handler;\r
-\r
- sigaction(SIGABRT, &act_new, NULL);\r
- sigaction(SIGBUS, &act_new, NULL);\r
- sigaction(SIGINT, &act_new, NULL); //\r
- sigaction(SIGKILL, &act_new, NULL);\r
- sigaction(SIGPIPE, &act_new, NULL);\r
- sigaction(SIGQUIT, &act_new, NULL); //\r
- sigaction(SIGSEGV, &act_new, NULL);\r
- sigaction(SIGTERM, &act_new, NULL); //\r
- sigaction(SIGSYS, &act_new, NULL);\r
-\r
-}\r
-\r
-\r
-\r
-static void wifi_direct_state_change_cb(keynode_t *key, void *data)\r
-{\r
- WFDServer *server = (WFDServer *)data;\r
- if(!server) return;\r
- debug_log("wifi direct state changed");\r
- int state = -1;\r
- state = vconf_keynode_get_int(key);\r
- if (state < VCONFKEY_WIFI_DIRECT_GROUP_OWNER) {\r
- debug_log("wifi disconnected");\r
- quit_pushing = TRUE;\r
- shutdown (server->sockfd, SHUT_RDWR);\r
- debug_log("wifi_direct_state_change_cb calll quit_program()");\r
- quit_program();\r
- }\r
-}\r
-\r
-static void lcd_state_change_cb(keynode_t *key, void *data)\r
-{\r
- WFDServer *server = (WFDServer *)data;\r
- if(!server)\r
- return;\r
- int state = -1;\r
- state = vconf_keynode_get_int(key);\r
- if (state == VCONFKEY_PM_STATE_NORMAL) {\r
- debug_log("source has woke up time to wake-up-sink");\r
- wfd_resume();\r
- }\r
- else if(state == VCONFKEY_PM_STATE_LCDOFF || VCONFKEY_PM_STATE_SLEEP) {\r
- debug_log("source is sleeping time to go to sleep");\r
- wfd_standby();\r
- }\r
-}\r
-\r
-int main(int argc, char *argv[])\r
-{\r
- WFDServer server;\r
- server.thread = NULL;\r
- server.clients = NULL;\r
-\r
- g_loop = g_main_loop_new(NULL, FALSE);\r
- if(NULL == g_loop) {\r
- debug_log("Unable to create gmain loop! Aborting wfd server\n");\r
- exit(-1);\r
- }\r
- g_type_init();\r
- debug_log("wfd_proxy_initialize\n");\r
- if (!__wfd_server_setup(&server)) {\r
- debug_log("Unable to initialize test server\n");\r
- exit(-1);\r
- }\r
- debug_log("set vconf_notify_key_changed about wifi direct");\r
- if (0 != vconf_notify_key_changed(VCONFKEY_WIFI_DIRECT_STATE, wifi_direct_state_change_cb, &server)) {\r
- debug_log("vconf_notify_key_changed() failed");\r
- }\r
- debug_log("set vconf_notify_key_changed about LCD state");\r
- if (0 != vconf_notify_key_changed(VCONFKEY_PM_STATE, lcd_state_change_cb, &server)) {\r
- debug_log("vconf_notify_key_changed() failed");\r
- }\r
- debug_log("wfd_proxy_initialize run loop \n");\r
- g_main_loop_run(g_loop);\r
- g_thread_join(server.thread);\r
- shutdown (server.sockfd, SHUT_RDWR);\r
- debug_log("WFD SERVER EXIT \n");\r
- exit(0);\r
-}\r
+/*
+ * libmm-wfd
+ *
+ * Copyright (c) 2011 - 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: JongHyuk Choi <jhchoi.choi@samsung.com>, ByungWook Jang <bw.jang@samsung.com>,
+ * Manoj Kumar K <manojkumar.k@samsung.com>, Hyunil Park <hyunil46.park@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+ /*===========================================================================================
+| |
+| INCLUDE FILES |
+| |
+========================================================================================== */
+//#define MTRACE;
+#include <glib.h>
+#include <mm_types.h>
+#include <mm_error.h>
+#include <mm_message.h>
+#include <mm_wfd.h>
+#include <mm_debug.h>
+#include <mm_message.h>
+#include <mm_error.h>
+#include <mm_types.h>
+
+#include <iniparser.h>
+#include <mm_ta.h>
+#include <dlfcn.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <fcntl.h>
+#include <signal.h>
+
+#include <netdb.h>
+#include <dbus/dbus.h>
+#include <dbus/dbus-glib-lowlevel.h>
+
+#include <vconf.h>
+
+#define PACKAGE "mm_wfd_testsuite"
+
+/*===========================================================================================
+| |
+| LOCAL DEFINITIONS AND DECLARATIONS FOR MODULE |
+| |
+========================================================================================== */
+
+#if defined(_USE_GMAINLOOP)
+GMainLoop *g_loop;
+#endif
+
+gboolean wfd_server_test_method(void *pObject, int pid, char *test_name,
+ int *return_code)
+{
+ debug_log("Received test %s\n", test_name);
+ return TRUE;
+}
+
+#include "wfd-structure.h"
+
+#define WFD_PROXY_COMM_PORT 8888
+
+typedef struct WfdServerObject WfdServerObject;
+typedef struct WfdServerObjectClass WfdServerObjectClass;
+
+GType Daemon_Object_get_type(void);
+struct WfdServerObject {
+ GObject parent;
+};
+
+struct WfdServerObjectClass {
+ GObjectClass parent;
+};
+
+#define DBUS_NAME_FLAG_PROHIBIT_REPLACEMENT 0
+
+#define WFD_SERVER_TYPE_OBJECT (Daemon_Object_get_type())
+
+#define WFD_SERVER_OBJECT(object) (G_TYPE_CHECK_INSTANCE_CAST \
+ ((object), WFD_SERVER_TYPE_OBJECT, WfdServerObject))
+
+G_DEFINE_TYPE(WfdServerObject, Daemon_Object, G_TYPE_OBJECT)
+static void Daemon_Object_init(WfdServerObject * obj)
+{
+ debug_log("Daemon_Object_init\n");
+}
+
+static void Daemon_Object_class_init(WfdServerObjectClass * klass)
+{
+ debug_log("Daemon_Object_class_init\n");
+}
+
+/*---------------------------------------------------------------------------
+| LOCAL #defines: |
+---------------------------------------------------------------------------*/
+#define MAX_STRING_LEN 2048
+
+/*---------------------------------------------------------------------------
+| LOCAL CONSTANT DEFINITIONS: |
+---------------------------------------------------------------------------*/
+enum
+{
+ CURRENT_STATUS_MAINMENU,
+ CURRENT_STATUS_SERVER_IP,
+ CURRENT_STATUS_SERVER_PORT,
+ CURRENT_STATUS_CONNECT,
+};
+
+typedef struct {
+ int connfd;
+ socklen_t clilen;
+ struct sockaddr_in cli_addr;
+ GThread *thread;
+ char inbuff[512];
+ gboolean inactive;
+ GMutex *lock;
+ GIOChannel *channel;
+ void *parent;
+} WFDClient;
+
+typedef struct {
+ int sockfd;
+ int portno;
+ struct sockaddr_in serv_addr;
+ GThread *thread;
+ GList *clients;
+} WFDServer;
+
+/*---------------------------------------------------------------------------
+| LOCAL VARIABLE DEFINITIONS: |
+---------------------------------------------------------------------------*/
+
+int g_current_state;
+static MMHandleType g_wfd = 0;
+char *g_err_name = NULL;
+gboolean quit_pushing;
+int socket_id = 0;
+/*---------------------------------------------------------------------------
+| LOCAL FUNCTION PROTOTYPES: |
+---------------------------------------------------------------------------*/
+static void wfd_connect();
+static void wfd_start();
+static void wfd_stop();
+
+void quit_program();
+
+static void wfd_set_signal();
+
+/*---------------------------------------------------------------------------
+ | LOCAL FUNCTION DEFINITIONS: |
+ ---------------------------------------------------------------------------*/
+static bool msg_callback(int message, MMMessageParamType *param, void *user_param)
+{
+ /* TODO any error notification or state change should be forwarded to the active list of proxy apps */
+ switch (message) {
+ case MM_MESSAGE_ERROR:
+ {
+ WFDClient *client = (WFDClient *)user_param;
+ if(!client) return FALSE;
+ WFDServer *lserver = (WFDServer*) client->parent;
+ if(!lserver) return FALSE;
+ debug_log("msg_callback error : code = %x\n", param->code);
+ debug_log ("DESTROY..\n\n");
+ quit_pushing = TRUE;
+ shutdown (lserver->sockfd, SHUT_RDWR);
+ debug_log("msg_callback error call quit_program()");
+ quit_program();
+ }
+ break;
+ case MM_MESSAGE_WARNING:
+ // debug_log("warning : code = %d\n", param->code);
+ break;
+ case MM_MESSAGE_END_OF_STREAM:
+ debug_log("msg_callback end of stream\n");
+ mm_wfd_stop(g_wfd);
+ break;
+ case MM_MESSAGE_STATE_CHANGED:
+ g_current_state = param->state.current;
+ switch(g_current_state)
+ {
+ case MM_WFD_STATE_NULL:
+ debug_log("\n ==> [WFDApp] Player is [NULL]\n");
+ break;
+ case MM_WFD_STATE_READY:
+ debug_log("\n ==> [WFDApp] Player is [READY]\n");
+ break;
+ case MM_WFD_STATE_PLAYING:
+ debug_log("\n ==> [WFDApp] Player is [PLAYING]\n");
+ break;
+ case MM_WFD_STATE_PAUSED:
+ debug_log("\n ==> [WFDApp] Player is [PAUSED]\n");
+ break;
+ }
+ break;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static gboolean proxy_write (WFDClient *client, char *wbuf)
+{
+ write(client->connfd, wbuf, strlen(wbuf));
+ return TRUE;
+}
+
+static void input_server_ip_and_port(char *server_ip, char* port, WFDClient *client)
+{
+ int len = strlen(server_ip);
+ int ret = MM_ERROR_NONE;
+ if ( len < 0 || len > MAX_STRING_LEN )
+ return;
+
+ if (!g_wfd)
+ {
+ if ( mm_wfd_create(&g_wfd) != MM_ERROR_NONE )
+ {
+ debug_log("input_server_ip wfd create is failed\n");
+ return;
+ }
+ ret = mm_wfd_set_message_callback(g_wfd, msg_callback, (void*)client);
+ if (ret != MM_ERROR_NONE)
+ {
+ debug_log ("input_server_ip Error in setting server_port...\n");
+ return;
+ }
+ }
+ ret = mm_wfd_set_attribute(g_wfd,
+ &g_err_name,
+ "server_ip", server_ip, strlen(server_ip),
+ NULL);
+ if (ret != MM_ERROR_NONE)
+ {
+ debug_log ("input_server_ip Error in setting server_port...\n");
+ return;
+ }
+ ret = mm_wfd_set_attribute(g_wfd,
+ &g_err_name,
+ "server_port", port, strlen(port),
+ NULL);
+ if (ret != MM_ERROR_NONE)
+ {
+ debug_log ("input_server_port Error in setting server_port...\n");
+ return;
+ }
+ /*set wfd source status*/
+ gboolean status = VCONFKEY_MIRACAST_WFD_SOURCE_ON;
+ if (!vconf_set_bool(VCONFKEY_MIRACAST_WFD_SOURCE_STATUS, status)) {
+ debug_log ("set VCONFKEY_MIRACAST_WFD_SOURCE_ON");
+ }
+}
+static void wfd_connect()
+{
+ int ret = MM_ERROR_NONE;
+
+ if (!g_wfd)
+ {
+ debug_log ("wfd_start Creating server with default values : ");
+ if ( mm_wfd_create(&g_wfd) != MM_ERROR_NONE )
+ {
+ debug_log("wfd_start wfd create is failed\n");
+ return;
+ }
+
+ ret = mm_wfd_set_message_callback(g_wfd, msg_callback, (void*)g_wfd);
+ if (ret != MM_ERROR_NONE)
+ {
+ debug_log ("wfd_start Error in setting server_port...\n");
+ return;
+ }
+ }
+ if ( mm_wfd_realize(g_wfd) != MM_ERROR_NONE )
+ {
+ debug_log("wfd_start wfd realize is failed\n");
+ return;
+ }
+
+ if ( mm_wfd_connect(g_wfd) != MM_ERROR_NONE )
+ {
+ debug_log("wfd_start wfd connect is failed\n");
+ return;
+ }
+
+}
+
+static void wfd_start()
+{
+ int ret = MM_ERROR_NONE;
+
+ if (!g_wfd)
+ {
+ debug_log ("wfd_start Creating server with default values : ");
+ if ( mm_wfd_create(&g_wfd) != MM_ERROR_NONE )
+ {
+ debug_log("wfd_start wfd create is failed\n");
+ return;
+ }
+
+ ret = mm_wfd_set_message_callback(g_wfd, msg_callback, (void*)g_wfd);
+ if (ret != MM_ERROR_NONE)
+ {
+ debug_log ("wfd_start Error in setting server_port...\n");
+ return;
+ }
+
+ if ( mm_wfd_realize(g_wfd) != MM_ERROR_NONE )
+ {
+ debug_log("wfd_start wfd realize is failed\n");
+ return;
+ }
+
+ if ( mm_wfd_connect(g_wfd) != MM_ERROR_NONE )
+ {
+ debug_log("wfd_start wfd connect is failed\n");
+ return;
+ }
+ }
+
+ if (mm_wfd_start(g_wfd) != MM_ERROR_NONE)
+ {
+ debug_log ("wfd_start Failed to start WFD");
+ return;
+ }
+}
+
+static void wfd_stop()
+{
+ int ret = MM_ERROR_NONE;
+
+ ret = mm_wfd_stop(g_wfd);
+ if (ret != MM_ERROR_NONE)
+ {
+ debug_log ("wfd_stop Error to do stop...\n");
+ return;
+ }
+}
+
+static void wfd_pause()
+{
+ int ret = MM_ERROR_NONE;
+
+ ret = mm_wfd_pause(g_wfd);
+ if (ret != MM_ERROR_NONE)
+ {
+ debug_log ("wfd_pause Error to do pausep...\n");
+ return;
+ }
+}
+
+static void wfd_resume()
+{
+ int ret = MM_ERROR_NONE;
+
+ ret = mm_wfd_resume(g_wfd);
+ if (ret != MM_ERROR_NONE)
+ {
+ debug_log ("wfd_resume Error to do resume...\n");
+ return;
+ }
+}
+
+static void wfd_standby()
+{
+ int ret = MM_ERROR_NONE;
+ ret = mm_wfd_standby(g_wfd);
+ if (ret != MM_ERROR_NONE)
+ {
+ debug_log ("wfd_standby Error to do standby...\n");
+ return;
+ }
+}
+
+void quit_program()
+{
+ MMTA_ACUM_ITEM_SHOW_RESULT_TO(MMTA_SHOW_STDOUT);
+ MMTA_RELEASE();
+ debug_log ("quit_program...\n");
+
+ /*set wfd source status*/
+ gboolean status = VCONFKEY_MIRACAST_WFD_SOURCE_OFF;
+ if (!vconf_set_bool(VCONFKEY_MIRACAST_WFD_SOURCE_STATUS, status)) {
+ debug_log ("set VCONFKEY_MIRACAST_WFD_SOURCE_OFF");
+ }
+
+ if (g_wfd) {
+ mm_wfd_unrealize(g_wfd);
+ mm_wfd_destroy(g_wfd);
+ g_wfd = 0;
+ }
+ g_main_loop_quit(g_loop);
+}
+
+gchar * convert_state_to_string(MMWfdStateType aState)
+{
+ GString *cmd_replay;
+ cmd_replay = g_string_new ("");
+ switch(aState)
+ {
+ case MM_WFD_STATE_NULL:
+ g_string_append_printf (cmd_replay, "MM_WFD_STATE_NULL");
+ break;
+ case MM_WFD_STATE_READY:
+ g_string_append_printf (cmd_replay, "MM_WFD_STATE_READY");
+ break;
+ case MM_WFD_STATE_CONNECTION_WAIT:
+ g_string_append_printf (cmd_replay, "MM_WFD_STATE_CONNECTION_WAIT");
+ break;
+ case MM_WFD_STATE_CONNECTED:
+ g_string_append_printf (cmd_replay, "MM_WFD_STATE_CONNECTED");
+ break;
+ case MM_WFD_STATE_PLAYING:
+ g_string_append_printf (cmd_replay, "MM_WFD_STATE_PLAYING");
+ break;
+ case MM_WFD_STATE_PAUSED:
+ g_string_append_printf (cmd_replay, "MM_WFD_STATE_PAUSED");
+ break;
+ case MM_WFD_STATE_NONE:
+ g_string_append_printf (cmd_replay, "MM_WFD_STATE_NONE");
+ break;
+ case MM_WFD_STATE_NUM:
+ g_string_append_printf (cmd_replay, "MM_WFD_STATE_NUM");
+ break;
+ }
+ return g_string_free (cmd_replay, FALSE);
+}
+
+static void interpret (WFDClient *client, char *cmd)
+{
+ GString *cmd_replay;
+ if (strstr(cmd, "WFD_PROXY_SET_IP_PORT"))
+ {
+ gchar **IP_port;
+ gchar **IP;
+ gchar **port;
+ debug_log ("setting attributes... WFD..\n\n");
+ IP_port = g_strsplit(cmd,"\r\n",0);
+ IP = g_strsplit(IP_port[1]," ",0);
+ port = g_strsplit(IP_port[2]," ",0);
+ debug_log ("received IP %s port %s\n", IP[1], port[1]);
+ input_server_ip_and_port(IP[1], port[1], client);
+ cmd_replay = g_string_new ("");
+ g_string_append_printf (cmd_replay, "REPLAY WFD_PROXY_SET_IP_PORT");
+ g_string_append_printf (cmd_replay, "\r\n");
+ g_string_append_printf (cmd_replay, "MM_ERROR_NONE");
+ proxy_write(client, g_string_free (cmd_replay, FALSE));
+ debug_log ("STATE QUERY..demon return\n\n");
+ }
+ else if (strstr(cmd, "WFD_PROXY_CONNECT"))
+ {
+ debug_log ("Starting... WFD..\n\n");
+ cmd_replay = g_string_new ("");
+ g_string_append_printf (cmd_replay, "REPLAY WFD_PROXY_CONNECT");
+ g_string_append_printf (cmd_replay, "\r\n");
+ g_string_append_printf (cmd_replay, "MM_ERROR_NONE");
+ proxy_write(client, g_string_free (cmd_replay, FALSE));
+ debug_log ("STATE QUERY..demon return\n\n");
+ wfd_connect();
+ }
+ else if (strstr(cmd, "WFD_PROXY_START"))
+ {
+ debug_log ("Starting... WFD..\n\n");
+ cmd_replay = g_string_new ("");
+ g_string_append_printf (cmd_replay, "REPLAY WFD_PROXY_START");
+ g_string_append_printf (cmd_replay, "\r\n");
+ g_string_append_printf (cmd_replay, "MM_ERROR_NONE");
+ proxy_write(client, g_string_free (cmd_replay, FALSE));
+ debug_log ("STATE QUERY..demon return\n\n");
+ wfd_start();
+ }
+ else if (strstr(cmd, "WFD_PROXY_PAUSE"))
+ {
+ debug_log ("PAUSING..\n\n");
+ wfd_pause();
+ cmd_replay = g_string_new ("");
+ g_string_append_printf (cmd_replay, "REPLAY WFD_PROXY_PAUSE");
+ g_string_append_printf (cmd_replay, "\r\n");
+ g_string_append_printf (cmd_replay, "MM_ERROR_NONE");
+ proxy_write(client, g_string_free (cmd_replay, FALSE));
+ debug_log ("STATE QUERY..demon return\n\n");
+ }
+ else if (strstr(cmd, "WFD_PROXY_RESUME"))
+ {
+ debug_log ("RESUMING..\n\n");
+ wfd_resume();
+ cmd_replay = g_string_new ("");
+ g_string_append_printf (cmd_replay, "REPLAY WFD_PROXY_RESUME");
+ g_string_append_printf (cmd_replay, "\r\n");
+ g_string_append_printf (cmd_replay, "MM_ERROR_NONE");
+ proxy_write(client, g_string_free (cmd_replay, FALSE));
+ debug_log ("STATE QUERY..demon return\n\n");
+ }
+ else if (strstr(cmd, "WFD_PROXY_STOP"))
+ {
+ debug_log ("STOPPING..\n\n");
+ wfd_stop();
+ cmd_replay = g_string_new ("");
+ g_string_append_printf (cmd_replay, "REPLAY WFD_PROXY_STOP");
+ g_string_append_printf (cmd_replay, "\r\n");
+ g_string_append_printf (cmd_replay, "MM_ERROR_NONE");
+ proxy_write(client, g_string_free (cmd_replay, FALSE));
+ debug_log ("STATE QUERY..demon return\n\n");
+ }
+ else if (strstr(cmd, "WFD_PROXY_DESTROY"))
+ {
+ WFDServer *lserver = (WFDServer*) client->parent;
+ debug_log ("DESTROY..\n\n");
+ cmd_replay = g_string_new ("");
+ g_string_append_printf (cmd_replay, "REPLAY WFD_PROXY_DESTROY");
+ g_string_append_printf (cmd_replay, "\r\n");
+ g_string_append_printf (cmd_replay, "MM_ERROR_NONE");
+ proxy_write(client, g_string_free (cmd_replay, FALSE));
+ debug_log ("STATE QUERY..demon return\n\n");
+ quit_pushing = TRUE;
+ shutdown (lserver->sockfd, SHUT_RDWR);
+ debug_log("interpret calll quit_program()");
+ quit_program();
+ }
+ else if (strstr(cmd, "WFD_PROXY_STATE_QUERY"))
+ {
+ debug_log ("STATE QUERY..\n\n");
+ cmd_replay = g_string_new ("");
+ g_string_append_printf (cmd_replay, "REPLAY WFD_PROXY_STATE_QUERY");
+ g_string_append_printf (cmd_replay, "\r\n");
+ g_string_append_printf (cmd_replay, convert_state_to_string(g_current_state));
+ proxy_write(client, g_string_free (cmd_replay, FALSE));
+ debug_log ("STATE QUERY..demon return\n\n");
+ }
+ else
+ {
+ debug_log("unknown menu \n");
+ }
+}
+
+gboolean input (GIOChannel *channel, GIOCondition condition, gpointer data)
+{
+ WFDClient *client = (WFDClient*)data;
+ gsize read;
+ GError *error = NULL;
+ if(condition & G_IO_IN) {
+ memset(&(client->inbuff),0,sizeof(client->inbuff));
+ g_io_channel_read(client->channel, client->inbuff, sizeof(client->inbuff), &read);
+ if(read)
+ {
+ client->inbuff[read] = '\0';
+ g_strstrip(client->inbuff);
+ debug_log("got command %s\n", client->inbuff);
+ if(!g_str_has_prefix(client->inbuff,"WFD")) goto client_cleanup;
+ interpret (client, client->inbuff);
+ debug_log("command return \n");
+ }
+ else goto client_cleanup;
+ }
+ if (condition & G_IO_HUP) goto client_cleanup;
+ return TRUE;
+client_cleanup:
+ {
+ WFDServer *lserver = (WFDServer *)client->parent;
+ client->inactive = TRUE;
+ debug_log("client connection closed \n");
+ shutdown (client->connfd, SHUT_RDWR);
+ g_io_channel_shutdown(client->channel, TRUE, &error);
+ debug_log("IO channel closed \n");
+ if(g_list_length(lserver->clients))
+ {
+ lserver->clients = g_list_remove(lserver->clients, client);
+ }
+ free(client);
+ debug_log("client removed from list \n");
+ }
+ return TRUE;
+}
+
+static void* wfd_server_thread_function(void * asrc)
+{
+ int newsockfd;
+ int i=0;
+ int nSockOpt = 1;
+ WFDServer *pserver = (WFDServer *)asrc;
+ pserver->sockfd = socket(AF_INET, SOCK_STREAM, 0);
+ debug_log("wfd_proxy_initialize socke is %d", pserver->sockfd);
+ if (pserver->sockfd < 0)
+ {
+ debug_log("ERROR opening socket");
+ goto cleanup;
+ }
+ debug_log("wfd_proxy_initialize get socket created\n");
+ bzero((char *) &pserver->serv_addr, sizeof(pserver->serv_addr));
+ pserver->portno = WFD_PROXY_COMM_PORT;
+ pserver->serv_addr.sin_family = AF_INET;
+ pserver->serv_addr.sin_addr.s_addr = INADDR_ANY;
+ pserver->serv_addr.sin_port = htons(pserver->portno);
+ debug_log("serv_addr = %p sizeof %d ", (struct sockaddr *) &pserver->serv_addr, sizeof(pserver->serv_addr));
+ setsockopt(pserver->sockfd, SOL_SOCKET, SO_REUSEADDR, &nSockOpt, sizeof(nSockOpt));
+ if (bind(pserver->sockfd, (struct sockaddr *) &pserver->serv_addr, sizeof(pserver->serv_addr)) < 0)
+ {
+ debug_log("ERROR on binding");
+ goto cleanup;
+ }
+ debug_log("wfd_proxy_initialize get socket bind\n");
+ if (listen(pserver->sockfd,5) <0)
+ {
+ debug_log("ERROR on socket listen");
+ goto cleanup;
+ }
+ wfd_set_signal();
+ MMTA_INIT();
+
+ while(!quit_pushing)
+ {
+ socklen_t clilen = {0};
+ struct sockaddr_in cli_addr = {0};
+ WFDClient *client = NULL;
+ clilen = sizeof(cli_addr);
+ debug_log("wfd_proxy_initialize waiting for accept \n");
+ newsockfd = accept(pserver->sockfd, (struct sockaddr *) &cli_addr, &clilen);
+ if (newsockfd < 0) {
+ debug_log("ERROR on accept");
+ continue;
+ }
+ debug_log("wfd_proxy_initialize get socket accept \n");
+ client = g_malloc(sizeof(WFDClient));
+ if(!client)
+ {
+ debug_log("client malloc failed. out of memory");
+ continue;
+ }
+ client->connfd = newsockfd;
+ socket_id = newsockfd;
+ client->lock = g_mutex_new ();
+ client->inactive = 0;
+ client->parent = pserver;
+ client->channel = g_io_channel_unix_new(client->connfd);
+ g_io_add_watch(client->channel, G_IO_IN|G_IO_HUP|G_IO_ERR, (GIOFunc)input, client);
+ pserver->clients = g_list_prepend(pserver->clients, client);
+ }
+cleanup:
+ debug_log("wfd_server_thread_function cleanup \n");
+ for(i=0;i<g_list_length(pserver->clients); i++)
+ {
+ GError *error = NULL;
+ WFDClient *tempclient = (WFDClient *)g_list_nth_data(pserver->clients,i);
+ if(tempclient) {
+ tempclient->inactive = TRUE;
+ shutdown (tempclient->connfd, SHUT_RDWR);
+ g_io_channel_shutdown(tempclient->channel, TRUE, &error);
+ pserver->clients = g_list_remove(pserver->clients, tempclient);
+ free(tempclient);
+ }
+ }
+ g_list_free(pserver->clients);
+ shutdown (pserver->sockfd, SHUT_RDWR);
+ debug_log("wfd_server_thread_function calll quit_program()");
+ quit_program();
+
+ debug_log("wfd_server_thread_function THREAD EXIT \n");
+
+ return NULL;
+}
+
+static gboolean __func1(void *data)
+{
+ GError *error = NULL;
+ WFDServer *server = (WFDServer *)data;
+ debug_log("__func1 enter \n");
+ server->thread = g_thread_create ((GThreadFunc) wfd_server_thread_function, server, TRUE, &error);
+ server->clients = g_list_alloc ();
+ debug_log("__func1 exit \n");
+ return FALSE;
+}
+
+static bool __wfd_server_setup(void* pserver)
+{
+ WFDServer *server = (WFDServer *)pserver;
+ DBusGConnection *conn = NULL;
+ GObject *object = NULL;
+ DBusGObjectInfo dbus_glib_wfd_server_object_info;
+ GError *err = NULL;
+ DBusError derr;
+ int ret = 0;
+ debug_log("__wfd_server_setup start\n");
+ dbus_g_object_type_install_info(WFD_SERVER_TYPE_OBJECT,
+ &dbus_glib_wfd_server_object_info);
+
+ conn = dbus_g_bus_get(DBUS_BUS_SYSTEM, &err);
+ if (NULL == conn) {
+ debug_log("Unable to get dbus!");
+ return false;
+ }
+ dbus_error_init(&derr);
+
+ ret = dbus_bus_request_name(dbus_g_connection_get_connection(conn),
+ "com.samsung.wfd.server",
+ DBUS_NAME_FLAG_PROHIBIT_REPLACEMENT, &derr);
+
+ if (dbus_error_is_set(&derr)) {
+ debug_log("dbus_bus_request_name failed with error:%s", derr.message);
+ dbus_error_free(&derr);
+ return false;
+ }
+ object = g_object_new(WFD_SERVER_TYPE_OBJECT, NULL);
+ if (NULL == object) {
+ debug_log("Unable to create new object");
+ return false;
+ }
+ dbus_g_connection_register_g_object(conn, "/com/samsung/wfd/server", G_OBJECT(object));
+ g_idle_add(__func1, server);
+ debug_log("__wfd_server_setup end\n");
+ return true;
+}
+void wfd_signal_handler(int signo) {
+ quit_pushing = TRUE;
+ debug_log("wfd_signal_handler calll quit_program()");
+ shutdown (socket_id, SHUT_RDWR);
+ quit_program();
+ exit(1);
+}
+
+static void wfd_set_signal()
+{
+
+ /*refer to signal.h*/
+ /*SIGABRT A Process abort signal.
+ SIGALRM T Alarm clock.
+ SIGBUS A Access to an undefined portion of a memory object.
+ SIGCHLD I Child process terminated, stopped,
+ SIGCONT C Continue executing, if stopped.
+ SIGFPE A Erroneous arithmetic operation.
+ SIGHUP T Hangup.
+ SIGILL A Illegal instruction.
+ SIGINT T Terminal interrupt signal.
+ SIGKILL T Kill (cannot be caught or ignored).
+ SIGPIPE T Write on a pipe with no one to read it.
+ SIGQUIT A Terminal quit signal.
+ SIGSEGV A Invalid memory reference.
+ SIGSTOP S Stop executing (cannot be caught or ignored).
+ SIGTERM T Termination signal.
+ SIGTSTP S Terminal stop signal.
+ SIGTTIN S Background process attempting read.
+ SIGTTOU S Background process attempting write.
+ SIGUSR1 T User-defined signal 1.
+ SIGUSR2 T User-defined signal 2.
+ SIGPOLL T Pollable event.
+ SIGPROF T Profiling timer expired.
+ SIGSYS A Bad system call.
+ SIGTRAP A Trace/breakpoint trap.
+ SIGURG I High bandwidth data is available at a socket.
+ SIGVTALRM T Virtual timer expired.
+ SIGXCPU A CPU time limit exceeded.
+ SIGXFSZ A File size limit exceeded.
+
+The default actions are as follows:
+T : Abnormal termination of the process. The process is terminated with all the consequences of _exit()
+A : Abnormal termination of the process.
+I : Ignore the signal.
+S : Stop the process
+*/
+ struct sigaction act_new;
+ memset (&act_new, 0, sizeof (struct sigaction));
+
+ act_new.sa_handler = wfd_signal_handler;
+
+ sigaction(SIGABRT, &act_new, NULL);
+ sigaction(SIGBUS, &act_new, NULL);
+ sigaction(SIGINT, &act_new, NULL); //
+ sigaction(SIGKILL, &act_new, NULL);
+ sigaction(SIGPIPE, &act_new, NULL);
+ sigaction(SIGQUIT, &act_new, NULL); //
+ sigaction(SIGSEGV, &act_new, NULL);
+ sigaction(SIGTERM, &act_new, NULL); //
+ sigaction(SIGSYS, &act_new, NULL);
+
+}
+
+
+
+static void wifi_direct_state_change_cb(keynode_t *key, void *data)
+{
+ WFDServer *server = (WFDServer *)data;
+ if(!server) return;
+ debug_log("wifi direct state changed");
+ int state = -1;
+ state = vconf_keynode_get_int(key);
+ if (state < VCONFKEY_WIFI_DIRECT_GROUP_OWNER) {
+ debug_log("wifi disconnected");
+ quit_pushing = TRUE;
+ shutdown (server->sockfd, SHUT_RDWR);
+ debug_log("wifi_direct_state_change_cb calll quit_program()");
+ quit_program();
+ }
+}
+
+static void lcd_state_change_cb(keynode_t *key, void *data)
+{
+ WFDServer *server = (WFDServer *)data;
+ if(!server)
+ return;
+ int state = -1;
+ state = vconf_keynode_get_int(key);
+ if (state == VCONFKEY_PM_STATE_NORMAL) {
+ debug_log("source has woke up time to wake-up-sink");
+ wfd_resume();
+ }
+ else if(state == VCONFKEY_PM_STATE_LCDOFF || VCONFKEY_PM_STATE_SLEEP) {
+ debug_log("source is sleeping time to go to sleep");
+ wfd_standby();
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ WFDServer server;
+ server.thread = NULL;
+ server.clients = NULL;
+
+ g_loop = g_main_loop_new(NULL, FALSE);
+ if(NULL == g_loop) {
+ debug_log("Unable to create gmain loop! Aborting wfd server\n");
+ exit(-1);
+ }
+ g_type_init();
+ debug_log("wfd_proxy_initialize\n");
+ if (!__wfd_server_setup(&server)) {
+ debug_log("Unable to initialize test server\n");
+ exit(-1);
+ }
+ debug_log("set vconf_notify_key_changed about wifi direct");
+ if (0 != vconf_notify_key_changed(VCONFKEY_WIFI_DIRECT_STATE, wifi_direct_state_change_cb, &server)) {
+ debug_log("vconf_notify_key_changed() failed");
+ }
+ debug_log("set vconf_notify_key_changed about LCD state");
+ if (0 != vconf_notify_key_changed(VCONFKEY_PM_STATE, lcd_state_change_cb, &server)) {
+ debug_log("vconf_notify_key_changed() failed");
+ }
+ debug_log("wfd_proxy_initialize run loop \n");
+ g_main_loop_run(g_loop);
+ g_thread_join(server.thread);
+ shutdown (server.sockfd, SHUT_RDWR);
+ debug_log("WFD SERVER EXIT \n");
+ exit(0);
+}
*
*/
-#ifndef __MM_WFD_ATTRS_H__\r
-#define __MM_WFD_ATTRS_H__\r
-\r
-\r
-#include <mm_attrs_private.h>\r
-#include <mm_attrs.h>\r
-#include <mm_wfd_priv.h>\r
-#include <mm_wfd.h>\r
-\r
-/* general */\r
-#ifndef ARRAY_SIZE\r
-#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))\r
-#endif\r
-#define MMWFD_MAX_INT (2147483647)\r
-\r
-MMHandleType _mmwfd_construct_attribute(MMHandleType hwfd);\r
-void _mmwfd_deconstruct_attribute( MMHandleType hwfd);\r
-int _mmwfd_set_attribute(MMHandleType hwfd, char **err_atr_name, const char *attribute_name, va_list args_list);\r
-int _mmwfd_get_attributes_info(MMHandleType handle, const char *attribute_name, MMWfdAttrsInfo *dst_info);\r
-int _mmwfd_get_attribute(MMHandleType handle, char **err_attr_name, const char *attribute_name, va_list args_list);\r
-#endif /* __MM_WFD_ATTRS_H__ */\r
-\r
-\r
-\r
-\r
+#ifndef __MM_WFD_ATTRS_H__
+#define __MM_WFD_ATTRS_H__
+
+
+#include <mm_attrs_private.h>
+#include <mm_attrs.h>
+#include <mm_wfd_priv.h>
+#include <mm_wfd.h>
+
+/* general */
+#ifndef ARRAY_SIZE
+#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
+#endif
+#define MMWFD_MAX_INT (2147483647)
+
+MMHandleType _mmwfd_construct_attribute(MMHandleType hwfd);
+void _mmwfd_deconstruct_attribute( MMHandleType hwfd);
+int _mmwfd_set_attribute(MMHandleType hwfd, char **err_atr_name, const char *attribute_name, va_list args_list);
+int _mmwfd_get_attributes_info(MMHandleType handle, const char *attribute_name, MMWfdAttrsInfo *dst_info);
+int _mmwfd_get_attribute(MMHandleType handle, char **err_attr_name, const char *attribute_name, va_list args_list);
+#endif /* __MM_WFD_ATTRS_H__ */
+
+
+
+
*
*/
-#ifndef _WFDSOURCEPROXY_H_\r
-#define _WFDSOURCEPROXY_H_\r
-\r
-/*******************\r
- * Allow for C++ users\r
- */\r
-#ifdef __cplusplus\r
-extern "C"\r
-{\r
-#endif\r
-\r
-#include <string.h>\r
-#include <glib.h>\r
-#include <mm_message.h>\r
-#include <mm_error.h>\r
-#include <mm_types.h>\r
-#include <mm_debug.h>\r
-#include <sys/types.h>\r
-#include <sys/socket.h>\r
-#include <netinet/in.h>\r
-#include <netdb.h>\r
-\r
-/**\r
- * Enumerations of wifi-display states.\r
- */\r
-typedef enum {\r
- WFDSRC_STATE_NULL = 0, /**< wifi-display is created, but not realized yet */\r
- WFDSRC_STATE_READY, /**< wifi-display is ready to play media */\r
- WFDSRC_STATE_CONNECTION_WAIT, /** < wifi-display is waiting for connection */\r
- WFDSRC_STATE_CONNECTED, /** < wifi-display is connected */\r
- WFDSRC_STATE_PLAYING, /**< wifi-display is now playing media */\r
- WFDSRC_STATE_PAUSED, /**< wifi-display is paused while playing media */\r
- WFDSRC_STATE_NONE, /**< wifi-display is not created yet */\r
- WFDSRC_STATE_NUM /**< Number of wifi-display states */\r
-} WfdSrcProxyState;\r
-\r
-typedef enum {\r
- WFDSRC_COMMAND_NONE = 0,\r
- WFDSRC_COMMAND_CREATE,\r
- WFDSRC_COMMAND_DESTROY,\r
- WFDSRC_COMMAND_REALIZE,\r
- WFDSRC_COMMAND_UNREALIZE,\r
- WFDSRC_COMMAND_CONNECT,\r
- WFDSRC_COMMAND_START,\r
- WFDSRC_COMMAND_STOP,\r
- WFDSRC_COMMAND_PAUSE,\r
- WFDSRC_COMMAND_RESUME,\r
- WFDSRC_COMMAND_NUM,\r
-}WfdSrcProxyCmd;\r
-\r
-/**\r
- * Enumerations of wifi-display source module errors and proxy errors\r
- * Note: Ensure appending of proxy errors after WFD source module errors\r
- */\r
-typedef enum {\r
- WFDSRC_ERROR_NONE = 0,\r
- WFDSRC_ERROR_UNKNOWN,\r
- WFDSRC_ERROR_WFD_INVALID_ARGUMENT,\r
- WFDSRC_ERROR_WFD_NO_FREE_SPACE,\r
- WFDSRC_ERROR_WFD_NOT_INITIALIZED,\r
- WFDSRC_ERROR_WFD_NO_OP,\r
- WFDSRC_ERROR_WFD_INVALID_STATE,\r
- WFDSRC_ERROR_WFD_INTERNAL\r
-} WfdSrcProxyRet;\r
-\r
-/**\r
- * Application callback,\r
- */\r
-typedef void (*WfdSrcProxyStateError_cb) (MMHandleType pHandle,\r
- WfdSrcProxyRet error_code,\r
- WfdSrcProxyState state,\r
- void *user_data);\r
-\r
-/*******************************************************\r
- * Function Name: WfdSrcProxyInit\r
- * =========\r
- * Description:\r
- * =======\r
- * This API does the following\r
- * - creates handle\r
- * - creates socket and connect to server address ( IPC)\r
- * - This ensures socket listen on server to be successful\r
- * - call back registration\r
- * Arguments:\r
- * =======\r
- * pHandle - pointer to WfdSrcProxyInfo\r
- * appCb - pointer to application callback\r
- *\r
- * Return : return WfdSrcProxyRet\r
- * ====\r
- *******************************************************/\r
-WfdSrcProxyRet WfdSrcProxyInit(\r
- MMHandleType *pHandle,\r
- WfdSrcProxyStateError_cb *appCb,\r
- void *user_data );\r
-\r
-\r
-/*******************************************************\r
- * Function Name: WfdSrcProxyDeInit\r
- * =========\r
- * Description:\r
- * =======\r
- * - Free the handle\r
- * - close the sockets\r
- *\r
- * Arguments:\r
- * =======\r
- * pHandle - pointer to WfdSrcProxyInfo\r
- *\r
- * Return : return WfdSrcProxyRet\r
- * ====\r
- *******************************************************/\r
-WfdSrcProxyRet WfdSrcProxyDeInit(MMHandleType pHandle );\r
-\r
-\r
-/*******************************************************\r
- * Function Name: WfdSrcProxySetIPAddrAndPort\r
- * =========\r
- * Description:\r
- * =======\r
- * This API sets IP address and port number to be used by WFD source.\r
- * Application should call this API after Initialize is called.\r
- * IP address and port number is sent to WFD source Server (daemon)\r
- * on IPC\r
- *\r
- * Arguments:\r
- * =======\r
- * pHandle - pointer to WfdSrcProxyInfo\r
- * wfdsrcIP - IP address string\r
- * wfdsrcPort : Port no string\r
- *\r
- * Return : return WfdSrcProxyRet\r
- * ====\r
- ******************************************************/\r
-WfdSrcProxyRet WfdSrcProxySetIPAddrAndPort(\r
- MMHandleType pHandle,\r
- char *wfdsrcIP,\r
- char *wfdsrcPort);\r
-\r
-/*******************************************************\r
- * Function Name: WfdSrcProxyConnect\r
- * =========\r
- * Description:\r
- * =======\r
- * This API is used to connect WiFi display source to client.\r
- * After return, display mode should be set to X\r
- * refer to utilx_scrnconf_set_dispmode()\r
- *\r
- * Arguments:\r
- * =======\r
- * pHandle - pointer to WfdSrcProxyInfo\r
- *\r
- * Return : return WfdSrcProxyRet\r
- * ====\r
- ******************************************************/\r
-WfdSrcProxyRet WfdSrcProxyConnect(MMHandleType pHandle);\r
-\r
-/*******************************************************\r
- * Function Name: WfdSrcProxyStart\r
- * =========\r
- * Description:\r
- * =======\r
- * This API is used to start WiFi display source to start sending data\r
- * to client.\r
- *\r
- * Arguments:\r
- * =======\r
- * pHandle - pointer to WfdSrcProxyInfo\r
- *\r
- * Return : return WfdSrcProxyRet\r
- * ====\r
- ******************************************************/\r
-WfdSrcProxyRet WfdSrcProxyStart(MMHandleType pHandle);\r
-\r
-/*******************************************************\r
- * Function Name: WfdSrcProxyPause\r
- * =========\r
- * Description:\r
- * =======\r
- * This API is used to pause WFD streaming between source and sink.\r
- * This pauses the streaming between WFD source and sink. So that\r
- * when user resumes back, streaming does not continue from the point\r
- * where it stopped, instead it will start from current content.\r
- *\r
- * Arguments:\r
- * =======\r
- * pHandle - pointer to WfdSrcProxyInfo\r
- *\r
- * Return : return WfdSrcProxyRet\r
- * ====\r
- ******************************************************/\r
-WfdSrcProxyRet WfdSrcProxyPause(MMHandleType pHandle);\r
-\r
-/*******************************************************\r
- * Function Name: WfdSrcProxyResume\r
- * =========\r
- * Description:\r
- * =======\r
- * This API is used to resume WFD streaming between source and sink\r
- * Resume after pause starts from current content that is viewed on source\r
- * No caching of content from the time it is paused is done.\r
- *\r
- * Arguments:\r
- * pHandle - pointer to WfdSrcProxyInfo\r
- *\r
- * Return : return WfdSrcProxyRet\r
- * ====\r
- ******************************************************/\r
-WfdSrcProxyRet WfdSrcProxyResume(MMHandleType pHandle);\r
-\r
-/*******************************************************\r
- * Function Name: WfdSrcProxyStop\r
- * =========\r
- * Description:\r
- * =======\r
- * This API stops WFD streaming between source and sink.\r
- * The Server(daemon) will be still running even after stop.\r
- *\r
- * Arguments:\r
- * =======\r
- * pHandle - pointer to WfdSrcProxyInfo\r
- *\r
- * Return : return one of WfdSrcProxyRet\r
- * ====\r
- ******************************************************/\r
-WfdSrcProxyRet WfdSrcProxyStop(MMHandleType pHandle);\r
-\r
-/*******************************************************\r
- * Function Name: WfdSrcProxyDestroyServer\r
- * =========\r
- * Description:\r
- * =======\r
- * This API destroy WFD server which is already in STOP state.\r
- * The Server(daemon) will be destroyed after this call.\r
- *\r
- * Arguments:\r
- * =======\r
- * pHandle - pointer to WfdSrcProxyInfo\r
- *\r
- * Return : return one of WfdSrcProxyRet\r
- * ====\r
- ******************************************************/\r
-WfdSrcProxyRet WfdSrcProxyDestroyServer(MMHandleType pHandle);\r
-\r
-/*******************************************************\r
- * Function Name: WfdSrcProxyGetCurrentState\r
- * =========\r
- * Description:\r
- * =======\r
- * This API is a provision given to Application, if in any case\r
- * application needs to know the status of WiFi Source server state.\r
- * This is a synchronous call.\r
- * Arguments:\r
- * =======\r
- * pHandle - pointer to WfdSrcProxyInfo\r
- *\r
- * Return : return one of the states from WfdSrcProxyState\r
- * ====\r
- ******************************************************/\r
-WfdSrcProxyState WfdSrcProxyGetCurrentState(MMHandleType pHandle);\r
-\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif //__cplusplus\r
-\r
+#ifndef _WFDSOURCEPROXY_H_
+#define _WFDSOURCEPROXY_H_
+
+/*******************
+ * Allow for C++ users
+ */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <string.h>
+#include <glib.h>
+#include <mm_message.h>
+#include <mm_error.h>
+#include <mm_types.h>
+#include <mm_debug.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+
+/**
+ * Enumerations of wifi-display states.
+ */
+typedef enum {
+ WFDSRC_STATE_NULL = 0, /**< wifi-display is created, but not realized yet */
+ WFDSRC_STATE_READY, /**< wifi-display is ready to play media */
+ WFDSRC_STATE_CONNECTION_WAIT, /** < wifi-display is waiting for connection */
+ WFDSRC_STATE_CONNECTED, /** < wifi-display is connected */
+ WFDSRC_STATE_PLAYING, /**< wifi-display is now playing media */
+ WFDSRC_STATE_PAUSED, /**< wifi-display is paused while playing media */
+ WFDSRC_STATE_NONE, /**< wifi-display is not created yet */
+ WFDSRC_STATE_NUM /**< Number of wifi-display states */
+} WfdSrcProxyState;
+
+typedef enum {
+ WFDSRC_COMMAND_NONE = 0,
+ WFDSRC_COMMAND_CREATE,
+ WFDSRC_COMMAND_DESTROY,
+ WFDSRC_COMMAND_REALIZE,
+ WFDSRC_COMMAND_UNREALIZE,
+ WFDSRC_COMMAND_CONNECT,
+ WFDSRC_COMMAND_START,
+ WFDSRC_COMMAND_STOP,
+ WFDSRC_COMMAND_PAUSE,
+ WFDSRC_COMMAND_RESUME,
+ WFDSRC_COMMAND_NUM,
+}WfdSrcProxyCmd;
+
+/**
+ * Enumerations of wifi-display source module errors and proxy errors
+ * Note: Ensure appending of proxy errors after WFD source module errors
+ */
+typedef enum {
+ WFDSRC_ERROR_NONE = 0,
+ WFDSRC_ERROR_UNKNOWN,
+ WFDSRC_ERROR_WFD_INVALID_ARGUMENT,
+ WFDSRC_ERROR_WFD_NO_FREE_SPACE,
+ WFDSRC_ERROR_WFD_NOT_INITIALIZED,
+ WFDSRC_ERROR_WFD_NO_OP,
+ WFDSRC_ERROR_WFD_INVALID_STATE,
+ WFDSRC_ERROR_WFD_INTERNAL
+} WfdSrcProxyRet;
+
+/**
+ * Application callback,
+ */
+typedef void (*WfdSrcProxyStateError_cb) (MMHandleType pHandle,
+ WfdSrcProxyRet error_code,
+ WfdSrcProxyState state,
+ void *user_data);
+
+/*******************************************************
+ * Function Name: WfdSrcProxyInit
+ * =========
+ * Description:
+ * =======
+ * This API does the following
+ * - creates handle
+ * - creates socket and connect to server address ( IPC)
+ * - This ensures socket listen on server to be successful
+ * - call back registration
+ * Arguments:
+ * =======
+ * pHandle - pointer to WfdSrcProxyInfo
+ * appCb - pointer to application callback
+ *
+ * Return : return WfdSrcProxyRet
+ * ====
+ *******************************************************/
+WfdSrcProxyRet WfdSrcProxyInit(
+ MMHandleType *pHandle,
+ WfdSrcProxyStateError_cb *appCb,
+ void *user_data );
+
+
+/*******************************************************
+ * Function Name: WfdSrcProxyDeInit
+ * =========
+ * Description:
+ * =======
+ * - Free the handle
+ * - close the sockets
+ *
+ * Arguments:
+ * =======
+ * pHandle - pointer to WfdSrcProxyInfo
+ *
+ * Return : return WfdSrcProxyRet
+ * ====
+ *******************************************************/
+WfdSrcProxyRet WfdSrcProxyDeInit(MMHandleType pHandle );
+
+
+/*******************************************************
+ * Function Name: WfdSrcProxySetIPAddrAndPort
+ * =========
+ * Description:
+ * =======
+ * This API sets IP address and port number to be used by WFD source.
+ * Application should call this API after Initialize is called.
+ * IP address and port number is sent to WFD source Server (daemon)
+ * on IPC
+ *
+ * Arguments:
+ * =======
+ * pHandle - pointer to WfdSrcProxyInfo
+ * wfdsrcIP - IP address string
+ * wfdsrcPort : Port no string
+ *
+ * Return : return WfdSrcProxyRet
+ * ====
+ ******************************************************/
+WfdSrcProxyRet WfdSrcProxySetIPAddrAndPort(
+ MMHandleType pHandle,
+ char *wfdsrcIP,
+ char *wfdsrcPort);
+
+/*******************************************************
+ * Function Name: WfdSrcProxyConnect
+ * =========
+ * Description:
+ * =======
+ * This API is used to connect WiFi display source to client.
+ * After return, display mode should be set to X
+ * refer to utilx_scrnconf_set_dispmode()
+ *
+ * Arguments:
+ * =======
+ * pHandle - pointer to WfdSrcProxyInfo
+ *
+ * Return : return WfdSrcProxyRet
+ * ====
+ ******************************************************/
+WfdSrcProxyRet WfdSrcProxyConnect(MMHandleType pHandle);
+
+/*******************************************************
+ * Function Name: WfdSrcProxyStart
+ * =========
+ * Description:
+ * =======
+ * This API is used to start WiFi display source to start sending data
+ * to client.
+ *
+ * Arguments:
+ * =======
+ * pHandle - pointer to WfdSrcProxyInfo
+ *
+ * Return : return WfdSrcProxyRet
+ * ====
+ ******************************************************/
+WfdSrcProxyRet WfdSrcProxyStart(MMHandleType pHandle);
+
+/*******************************************************
+ * Function Name: WfdSrcProxyPause
+ * =========
+ * Description:
+ * =======
+ * This API is used to pause WFD streaming between source and sink.
+ * This pauses the streaming between WFD source and sink. So that
+ * when user resumes back, streaming does not continue from the point
+ * where it stopped, instead it will start from current content.
+ *
+ * Arguments:
+ * =======
+ * pHandle - pointer to WfdSrcProxyInfo
+ *
+ * Return : return WfdSrcProxyRet
+ * ====
+ ******************************************************/
+WfdSrcProxyRet WfdSrcProxyPause(MMHandleType pHandle);
+
+/*******************************************************
+ * Function Name: WfdSrcProxyResume
+ * =========
+ * Description:
+ * =======
+ * This API is used to resume WFD streaming between source and sink
+ * Resume after pause starts from current content that is viewed on source
+ * No caching of content from the time it is paused is done.
+ *
+ * Arguments:
+ * pHandle - pointer to WfdSrcProxyInfo
+ *
+ * Return : return WfdSrcProxyRet
+ * ====
+ ******************************************************/
+WfdSrcProxyRet WfdSrcProxyResume(MMHandleType pHandle);
+
+/*******************************************************
+ * Function Name: WfdSrcProxyStop
+ * =========
+ * Description:
+ * =======
+ * This API stops WFD streaming between source and sink.
+ * The Server(daemon) will be still running even after stop.
+ *
+ * Arguments:
+ * =======
+ * pHandle - pointer to WfdSrcProxyInfo
+ *
+ * Return : return one of WfdSrcProxyRet
+ * ====
+ ******************************************************/
+WfdSrcProxyRet WfdSrcProxyStop(MMHandleType pHandle);
+
+/*******************************************************
+ * Function Name: WfdSrcProxyDestroyServer
+ * =========
+ * Description:
+ * =======
+ * This API destroy WFD server which is already in STOP state.
+ * The Server(daemon) will be destroyed after this call.
+ *
+ * Arguments:
+ * =======
+ * pHandle - pointer to WfdSrcProxyInfo
+ *
+ * Return : return one of WfdSrcProxyRet
+ * ====
+ ******************************************************/
+WfdSrcProxyRet WfdSrcProxyDestroyServer(MMHandleType pHandle);
+
+/*******************************************************
+ * Function Name: WfdSrcProxyGetCurrentState
+ * =========
+ * Description:
+ * =======
+ * This API is a provision given to Application, if in any case
+ * application needs to know the status of WiFi Source server state.
+ * This is a synchronous call.
+ * Arguments:
+ * =======
+ * pHandle - pointer to WfdSrcProxyInfo
+ *
+ * Return : return one of the states from WfdSrcProxyState
+ * ====
+ ******************************************************/
+WfdSrcProxyState WfdSrcProxyGetCurrentState(MMHandleType pHandle);
+
+
+#ifdef __cplusplus
+}
+#endif //__cplusplus
+
#endif //_WFDSOURCEPROXY_H_
* 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;
+}