-/*
- * 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()");
+/*\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
+gboolean quit = FALSE;
+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
+ if(!quit)