8 #include <wifi-direct.h>
10 #include "wifi-direct-ipc.h"
11 #include "wifi-direct-manager.h"
12 #include "wifi-direct-oem.h"
13 #include "wifi-direct-service.h"
14 #include "wifi-direct-util.h"
15 #include "wifi-direct-log.h"
18 int wfd_service_add(int type, char *info_str, int *service_id)
20 __WDS_LOG_FUNC_ENTER__;
21 wfd_manager_s *manager = wfd_get_manager();
22 wfd_service_s *service = NULL;
29 WDS_LOGE("Invalid parameter");
33 if (type < WIFI_DIRECT_SERVICE_TYPE_BONJOUR ||
34 type > WIFI_DIRECT_SERVICE_TYPE_VENDOR) {
35 WDS_LOGE("Invalid service type");
39 service = (wfd_service_s*) g_try_malloc0(sizeof(wfd_service_s));
41 WDS_LOGE("Failed to allocate memory for service");
46 service->id = (intptr_t) service;
47 info1 = g_strndup(info_str, strlen(info_str));
49 WDS_LOGE("Failed to allocate memory for service");
53 sep = strchr(info1, '|');
55 WDS_LOGE("Failed to find delimiter");
64 switch (service->type) {
65 case WIFI_DIRECT_SERVICE_TYPE_BONJOUR:
66 service->data.bonjour.query = info1;
67 if (strstr(info2, "ptr"))
68 service->data.bonjour.rdata_type = WFD_BONJOUR_RDATA_PTR;
70 service->data.bonjour.rdata_type = WFD_BONJOUR_RDATA_TXT;
72 service->data.bonjour.rdata = info2 +3;
74 case WIFI_DIRECT_SERVICE_TYPE_UPNP:
75 service->data.upnp.version = info1;
76 service->data.upnp.service = info2;
78 case WIFI_DIRECT_SERVICE_TYPE_WS_DISCOVERY:
79 case WIFI_DIRECT_SERVICE_TYPE_WIFI_DISPLAY:
80 WDS_LOGE("Not supported yet");
85 case WIFI_DIRECT_SERVICE_TYPE_VENDOR:
86 service->data.vendor.info1 = info1;
87 service->data.vendor.info2 = info2;
90 WDS_LOGE("Invalid service type");
96 res = wfd_oem_serv_add(manager->oem_ops, (wfd_oem_new_service_s*) service);
98 WDS_LOGE("Failed to add service");
104 service->str_ptr = info1;
105 manager->local->services = g_list_prepend(manager->local->services, service);
106 *service_id = service->id;
108 __WDS_LOG_FUNC_EXIT__;
112 int wfd_service_del(int service_id)
114 __WDS_LOG_FUNC_ENTER__;
115 wfd_manager_s *manager = wfd_get_manager();
117 wfd_service_s *service = NULL;
120 if (!manager->local->services) {
121 WDS_LOGE("No services to delete");
125 temp = g_list_first(manager->local->services);
127 service = (wfd_service_s*) temp->data;
128 if (service->id == service_id) {
129 WDS_LOGD("Service found");
133 temp = g_list_next(temp);
137 WDS_LOGE("Service not found");
141 res = wfd_oem_serv_del(manager->oem_ops, (wfd_oem_new_service_s*) service);
143 WDS_LOGE("Failed to add service");
147 manager->local->services = g_list_remove(manager->local->services, service);
149 g_free(service->str_ptr);
152 __WDS_LOG_FUNC_EXIT__;
157 int wfd_service_disc_req(unsigned char *addr, int type, char *data)
159 __WDS_LOG_FUNC_ENTER__;
161 /* TODO: return identifier(handle) for the pending query */
164 WDS_LOGE("Invalid parameter");
168 if (type < WFD_SERVICE_TYPE_ALL ||
169 type > WFD_SERVICE_TYPE_VENDOR) {
170 WDS_LOGE("Invalid service type");
174 /* TODO: call oem function */
175 /* TODO: add service information into service list */
177 __WDS_LOG_FUNC_EXIT__;
181 int wfd_service_disc_cancel(int handle)