update source code for tizen 2.1
authorHyunil Park <hyunil46.park@samsung.com>
Tue, 9 Apr 2013 06:33:07 +0000 (15:33 +0900)
committerHyunil Park <hyunil46.park@samsung.com>
Tue, 9 Apr 2013 06:33:07 +0000 (15:33 +0900)
Change-Id: Iee4ad5825153cfb822f2c7cd5ef86a3331e2e972

packaging/libmm-wfd.spec
server/Makefile.am
server/miracast_server.c
src/Makefile.am
src/include/mm_wfd_proxy.h
src/mm_wfd_priv.c
src/mm_wfd_proxy.c
test/mm_wfd_testsuite.c

index 213dbda..71a01c6 100755 (executable)
@@ -2,9 +2,9 @@
 Name:       libmm-wfd
 Summary:    Multimedia Framework Wifi-Display Library
 Version:    0.2.16
-Release:    4
+Release:    11
 Group:      System/Libraries
-License:    Apache License 2.0
+License:    LGPL
 Source0:    %{name}-%{version}.tar.gz
 Requires(post):  /sbin/ldconfig
 Requires(postun):  /sbin/ldconfig
@@ -73,9 +73,7 @@ mkdir -p %{buildroot}/%{_datadir}/license
 cp -rf %{_builddir}/%{name}-%{version}/LICENSE.APLv2.0 %{buildroot}%{_datadir}/license/%{name}
 
 mkdir -p %{buildroot}/usr/etc
-mkdir -p %{buildroot}/opt/etc
 cp -rf config/mmfw_wfd.ini %{buildroot}/usr/etc/mmfw_wfd.ini
-cp -rf config/mmfw_wfd.ini %{buildroot}/opt/etc/mmfw_wfd.ini
 
 %clean
 rm -rf %{buildroot}
@@ -92,7 +90,6 @@ rm -rf %{buildroot}
 %{_datadir}/dbus-1/services/com.samsung.wfd.server.service
 %{_datadir}/license/%{name}
 /usr/etc/mmfw_wfd.ini
-/opt/etc/mmfw_wfd.ini
 %{_libdir}/*.so.*
 %{_bindir}/*
 %manifest libmm-wfd.manifest
index 4bd125f..ed9e43e 100755 (executable)
@@ -30,3 +30,7 @@ miracast_server_LDADD = $(top_builddir)/src/libmmfwfd.la \
                            $(MMTA_LIBS) \
                            $(VCONF_LIBS)\
                            $(INIPARSER_LIBS)
+
+miracast_server_CFLAGS +=   $(MMLOG_CFLAGS) -DMMF_LOG_OWNER=0x01000000 -DMMF_DEBUG_PREFIX=\"MMF-MIRACAST\" -D_INTERNAL_SESSION_MANAGER_
+
+miracast_server_LDADD += $(MMLOG_LIBS)
index 40377c2..67d39ca 100755 (executable)
-/*
- * 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)
     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);
-}
+\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
+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
+       if(!quit)
+       {
+      quit = TRUE;
+      shutdown (server->sockfd, SHUT_RDWR);
+      debug_log("wifi_direct_state_change_cb calll quit_program()");
+      quit_program();
+       }
+  }\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("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
index f2464b2..1196bde 100755 (executable)
@@ -58,5 +58,5 @@ libmmfwfd_la_LIBADD = $(GST_LIBS) \
     -lmmfwfd_rtsp_server \
                $(INIPARSER_LIBS)
 
-libmmfwfd_la_CFLAGS += $(MMLOG_CFLAGS) -DMMF_LOG_OWNER=0x008 -DMMF_DEBUG_PREFIX=\"MMF-WFD\" -D_INTERNAL_SESSION_MANAGER_
+libmmfwfd_la_CFLAGS += $(MMLOG_CFLAGS) -DMMF_LOG_OWNER=0x02000000 -DMMF_DEBUG_PREFIX=\"MMF-WFD\" -D_INTERNAL_SESSION_MANAGER_
 libmmfwfd_la_LIBADD += $(MMLOG_LIBS)
index e1a067d..b2fb722 100755 (executable)
  * limitations under the License.
  *
  */
-
-#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
-
+#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
 #endif //_WFDSOURCEPROXY_H_
index 45f1cda..0760519 100755 (executable)
@@ -144,10 +144,10 @@ int _mmwfd_destroy (MMHandleType hwfd) // @
   /* destroy can called at anytime */
   MMWFD_CHECK_STATE_RETURN_IF_FAIL ( wfd, MMWFD_COMMAND_DESTROY );
 
+  g_object_unref (wfd->client);
+  g_object_unref (wfd->server);
   g_object_unref (wfd->mapping);
   g_object_unref (wfd->factory);
-  g_object_unref (wfd->mapping);
-  g_object_unref (wfd->server);
 
   /* release attributes */
   _mmwfd_deconstruct_attribute( wfd );
@@ -280,7 +280,7 @@ int _mmwfd_start (MMHandleType hwfd) // @
   MMWFD_CHECK_STATE_RETURN_IF_FAIL( wfd, MMWFD_COMMAND_START );
 
   /* set client params */
-  gst_rtsp_server_set_client_params (wfd->server, wfd->client, WFD_INI()->videosrc_element, WFD_INI()->session_mode, WFD_INI()->videobitrate,
+  gst_rtsp_server_set_client_params (wfd->server, wfd->client, WFD_INI()->videosrc_element, WFD_INI()->session_mode, WFD_INI()->videobitrate, WFD_INI()->mtu_size,
       WFD_INI()->infile);
 
   if (!gst_rtsp_server_start_client (wfd->server, wfd->client))
index 23a76d3..9b1b6a6 100755 (executable)
  * limitations under the License.
  *
  */
-
-#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)
+\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
 #define LIMIT_TIME 50 /* 5 sec */
-
-/*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);
+\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
+  gboolean server_destroyed;\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
   int ret = 0;
-  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;
+  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->server_destroyed = FALSE;\r
   ret = wfd_proxy_initialize(temp);
   if(ret < 0)
     return WFDSRC_ERROR_WFD_NOT_INITIALIZED;
-  *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;
+  *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
+  if(!lwfd->server_destroyed)\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
   int limit = 0;
-  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");
+  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
+  return_val_if_fail(!lwfd->server_destroyed, WFDSRC_ERROR_WFD_NOT_INITIALIZED);\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
     limit ++;
     if(limit > LIMIT_TIME) return WFDSRC_ERROR_WFD_INTERNAL;
-    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;
+    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
   int limit = 0;
-  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");
+  debug_fenter();\r
+\r
+  return_val_if_fail(pHandle, WFDSRC_ERROR_WFD_NOT_INITIALIZED);\r
+  lwfd = (WfdSrcProxy *)pHandle;\r
+  return_val_if_fail(!lwfd->server_destroyed, WFDSRC_ERROR_WFD_NOT_INITIALIZED);\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
     limit ++;
     if(limit > LIMIT_TIME) return WFDSRC_ERROR_WFD_INTERNAL;
-    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;
+    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
   int limit = 0;
-  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");
+  debug_fenter();\r
+\r
+  return_val_if_fail(pHandle, WFDSRC_ERROR_WFD_NOT_INITIALIZED);\r
+  lwfd = (WfdSrcProxy *)pHandle;\r
+  return_val_if_fail(!lwfd->server_destroyed, WFDSRC_ERROR_WFD_NOT_INITIALIZED);\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
     limit ++;
     if(limit > LIMIT_TIME) return WFDSRC_ERROR_WFD_INTERNAL;
-    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;
+    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
   int limit = 0;
-  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");
+  debug_fenter();\r
+\r
+  return_val_if_fail(pHandle, WFDSRC_ERROR_WFD_NOT_INITIALIZED);\r
+  lwfd = (WfdSrcProxy *)pHandle;\r
+  return_val_if_fail(!lwfd->server_destroyed, WFDSRC_ERROR_WFD_NOT_INITIALIZED);\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
     limit ++;
     if(limit > LIMIT_TIME) return WFDSRC_ERROR_WFD_INTERNAL;
-    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;
+    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
   int limit = 0;
-  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");
+  debug_fenter();\r
+\r
+  return_val_if_fail(pHandle, WFDSRC_ERROR_WFD_NOT_INITIALIZED);\r
+  lwfd = (WfdSrcProxy *)pHandle;\r
+  return_val_if_fail(!lwfd->server_destroyed, WFDSRC_ERROR_WFD_NOT_INITIALIZED);\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
     limit ++;
     if(limit > LIMIT_TIME) return WFDSRC_ERROR_WFD_INTERNAL;
-    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;
+    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
   int limit = 0;
-  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");
+  debug_fenter();\r
+\r
+  return_val_if_fail(pHandle, WFDSRC_ERROR_WFD_NOT_INITIALIZED);\r
+  lwfd = (WfdSrcProxy *)pHandle;\r
+  return_val_if_fail(!lwfd->server_destroyed, WFDSRC_ERROR_WFD_NOT_INITIALIZED);\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
     limit ++;
     if(limit > LIMIT_TIME) return WFDSRC_ERROR_WFD_INTERNAL;
-    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;
+    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
   int limit = 0;
-  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");
+  debug_fenter();\r
+\r
+  return_val_if_fail(pHandle, WFDSRC_ERROR_WFD_NOT_INITIALIZED);\r
+  lwfd = (WfdSrcProxy *)pHandle;\r
+  return_val_if_fail(!lwfd->server_destroyed, WFDSRC_ERROR_WFD_NOT_INITIALIZED);\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
     limit ++;
     if(limit > LIMIT_TIME) return WFDSRC_ERROR_WFD_INTERNAL;
-    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;
+    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
   int limit = 0;
-  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");
+  debug_fenter();\r
+\r
+  return_val_if_fail(pHandle, WFDSRC_ERROR_WFD_NOT_INITIALIZED);\r
+  lwfd = (WfdSrcProxy *)pHandle;\r
+  return_val_if_fail(!lwfd->server_destroyed, WFDSRC_ERROR_WFD_NOT_INITIALIZED);\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
     limit ++;
     if(limit > LIMIT_TIME) return WFDSRC_ERROR_WFD_INTERNAL;
-    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;
-}
+    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
+        wfd->server_destroyed = TRUE;\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
+  if((!wfd->quitloop) && wfd->applicationCb)\r
+  {\r
+    debug_log("sending notification to proxytest");\r
+    wfd->applicationCb(asrc, WFDSRC_ERROR_WFD_INVALID_STATE, WFDSRC_STATE_NULL, wfd->user_data);\r
+  }\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
index 5b3b680..280f9ae 100755 (executable)
@@ -515,7 +515,7 @@ void display_sub_basic()
        g_print("a : server IP\t");
        g_print("b : server port  \t");
        g_print("c : connect  \t");
-       g_print("d : display mode\t");
+    g_print("d : display mode\t");
        g_print("s : start  \t");
        g_print("p : pause \t");
        g_print("r : resume \t");