run dos2unix to get rid of ^M
authorYan Yin <yan.yin@intel.com>
Thu, 28 Mar 2013 08:34:46 +0000 (16:34 +0800)
committerYan Yin <yan.yin@intel.com>
Thu, 28 Mar 2013 08:34:46 +0000 (16:34 +0800)
Change-Id: Iea419e067c8e164ea2e531f4946a83a9fb0cbacf

server/miracast_server.c
src/include/mm_wfd_attrs.h
src/include/mm_wfd_proxy.h
src/mm_wfd_proxy.c

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