1/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
2 *
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions are
5 * met:
6 *     * Redistributions of source code must retain the above copyright
7 *       notice, this list of conditions and the following disclaimer.
8 *     * Redistributions in binary form must reproduce the above
9 *       copyright notice, this list of conditions and the following
10 *       disclaimer in the documentation and/or other materials provided
11 *       with the distribution.
12 *     * Neither the name of The Linux Foundation, nor the names of its
13 *       contributors may be used to endorse or promote products derived
14 *       from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 */
29#include <stdio.h>
30#include <stdlib.h>
31#include <string.h>
32#include <unistd.h>
33
34#include "log_util.h"
35#include "platform_lib_includes.h"
36#include "loc_eng_msg.h"
37#include "loc_eng_dmn_conn.h"
38#include "loc_eng_dmn_conn_handler.h"
39
40void* loc_api_handle = NULL;
41
42int loc_eng_dmn_conn_loc_api_server_if_request_handler(struct ctrl_msgbuf *pmsg, int len)
43{
44    LOC_LOGD("%s:%d]\n", __func__, __LINE__);
45#ifndef DEBUG_DMN_LOC_API
46    if (NULL == loc_api_handle) {
47        LOC_LOGE("%s:%d] NO agps data handle\n", __func__, __LINE__);
48        return 1;
49    }
50
51    if (NULL != loc_api_handle) {
52        AGpsExtType type;
53        switch (pmsg->cmsg.cmsg_if_request.type) {
54          case IF_REQUEST_TYPE_SUPL:
55          {
56            LOC_LOGD("IF_REQUEST_TYPE_SUPL");
57            type = AGPS_TYPE_SUPL;
58            break;
59          }
60          case IF_REQUEST_TYPE_WIFI:
61          {
62            LOC_LOGD("IF_REQUEST_TYPE_WIFI");
63            type = AGPS_TYPE_WIFI;
64            break;
65          }
66          case IF_REQUEST_TYPE_ANY:
67          {
68            LOC_LOGD("IF_REQUEST_TYPE_ANY");
69            type = AGPS_TYPE_ANY;
70            break;
71          }
72          default:
73          {
74            LOC_LOGD("invalid IF_REQUEST_TYPE!");
75            return -1;
76          }
77        }
78        switch (pmsg->cmsg.cmsg_if_request.sender_id) {
79          case IF_REQUEST_SENDER_ID_QUIPC:
80          {
81            LOC_LOGD("IF_REQUEST_SENDER_ID_QUIPC");
82            LocEngReqRelWifi* msg =
83                new LocEngReqRelWifi(loc_api_handle,
84                                     type,
85                                     LOC_ENG_IF_REQUEST_SENDER_ID_QUIPC,
86                                     (char*)pmsg->cmsg.cmsg_if_request.ssid,
87                                     (char*)pmsg->cmsg.cmsg_if_request.password,
88                                     true);
89            msg->send();
90            break;
91          }
92          case IF_REQUEST_SENDER_ID_MSAPM:
93          {
94            LOC_LOGD("IF_REQUEST_SENDER_ID_MSAPM");
95            LocEngReqRelWifi* msg =
96                new LocEngReqRelWifi(loc_api_handle,
97                                     type,
98                                     LOC_ENG_IF_REQUEST_SENDER_ID_MSAPM,
99                                     (char*)pmsg->cmsg.cmsg_if_request.ssid,
100                                     (char*)pmsg->cmsg.cmsg_if_request.password,
101                                     true);
102            msg->send();
103            break;
104          }
105          case IF_REQUEST_SENDER_ID_MSAPU:
106          {
107            LOC_LOGD("IF_REQUEST_SENDER_ID_MSAPU");
108            LocEngReqRelWifi* msg =
109                new LocEngReqRelWifi(loc_api_handle,
110                                     type,
111                                     LOC_ENG_IF_REQUEST_SENDER_ID_MSAPU,
112                                     (char*)pmsg->cmsg.cmsg_if_request.ssid,
113                                     (char*)pmsg->cmsg.cmsg_if_request.password,
114                                     true);
115            msg->send();
116            break;
117          }
118          case IF_REQUEST_SENDER_ID_GPSONE_DAEMON:
119          {
120            LOC_LOGD("IF_REQUEST_SENDER_ID_GPSONE_DAEMON");
121            LocEngReqRelBIT* msg =
122                new LocEngReqRelBIT(loc_api_handle,
123                                    type,
124                                    pmsg->cmsg.cmsg_if_request.ipv4_addr,
125                                    (char*)pmsg->cmsg.cmsg_if_request.ipv6_addr,
126                                    true);
127            msg->send();
128            break;
129          }
130          default:
131          {
132            LOC_LOGD("invalid IF_REQUEST_SENDER_ID!");
133            return -1;
134          }
135        }
136    }
137
138#else
139   loc_eng_dmn_conn_loc_api_server_data_conn(LOC_ENG_IF_REQUEST_SENDER_ID_GPSONE_DAEMON, GPSONE_LOC_API_IF_REQUEST_SUCCESS);
140#endif
141    return 0;
142}
143
144int loc_eng_dmn_conn_loc_api_server_if_release_handler(struct ctrl_msgbuf *pmsg, int len)
145{
146    LOC_LOGD("%s:%d]\n", __func__, __LINE__);
147#ifndef DEBUG_DMN_LOC_API
148    AGpsExtType type;
149    switch (pmsg->cmsg.cmsg_if_request.type) {
150      case IF_REQUEST_TYPE_SUPL:
151      {
152        LOC_LOGD("IF_REQUEST_TYPE_SUPL");
153        type = AGPS_TYPE_SUPL;
154        break;
155      }
156      case IF_REQUEST_TYPE_WIFI:
157      {
158        LOC_LOGD("IF_REQUEST_TYPE_WIFI");
159        type = AGPS_TYPE_WIFI;
160        break;
161      }
162      case IF_REQUEST_TYPE_ANY:
163      {
164        LOC_LOGD("IF_REQUEST_TYPE_ANY");
165        type = AGPS_TYPE_ANY;
166        break;
167      }
168      default:
169      {
170        LOC_LOGD("invalid IF_REQUEST_TYPE!");
171        return -1;
172      }
173    }
174    switch (pmsg->cmsg.cmsg_if_request.sender_id) {
175      case IF_REQUEST_SENDER_ID_QUIPC:
176      {
177        LOC_LOGD("IF_REQUEST_SENDER_ID_QUIPC");
178        LocEngReqRelWifi* msg =
179            new LocEngReqRelWifi(loc_api_handle,
180                                 type,
181                                 LOC_ENG_IF_REQUEST_SENDER_ID_QUIPC,
182                                 (char*)pmsg->cmsg.cmsg_if_request.ssid,
183                                 (char*)pmsg->cmsg.cmsg_if_request.password,
184                                 false);
185        msg->send();
186        break;
187      }
188      case IF_REQUEST_SENDER_ID_MSAPM:
189      {
190        LOC_LOGD("IF_REQUEST_SENDER_ID_MSAPM");
191        LocEngReqRelWifi* msg =
192            new LocEngReqRelWifi(loc_api_handle,
193                                 type,
194                                 LOC_ENG_IF_REQUEST_SENDER_ID_MSAPM,
195                                 (char*)pmsg->cmsg.cmsg_if_request.ssid,
196                                 (char*)pmsg->cmsg.cmsg_if_request.password,
197                                 false);
198        msg->send();
199        break;
200      }
201      case IF_REQUEST_SENDER_ID_MSAPU:
202      {
203        LOC_LOGD("IF_REQUEST_SENDER_ID_MSAPU");
204        LocEngReqRelWifi* msg =
205            new LocEngReqRelWifi(loc_api_handle,
206                                 type,
207                                 LOC_ENG_IF_REQUEST_SENDER_ID_MSAPU,
208                                 (char*)pmsg->cmsg.cmsg_if_request.ssid,
209                                 (char*)pmsg->cmsg.cmsg_if_request.password,
210                                 false);
211        msg->send();
212        break;
213      }
214      case IF_REQUEST_SENDER_ID_GPSONE_DAEMON:
215      {
216        LOC_LOGD("IF_REQUEST_SENDER_ID_GPSONE_DAEMON");
217        LocEngReqRelBIT* msg =
218            new LocEngReqRelBIT(loc_api_handle,
219                                type,
220                                pmsg->cmsg.cmsg_if_request.ipv4_addr,
221                                (char*)pmsg->cmsg.cmsg_if_request.ipv6_addr,
222                                false);
223        msg->send();
224        break;
225      }
226      default:
227      {
228        LOC_LOGD("invalid IF_REQUEST_SENDER_ID!");
229        return -1;
230      }
231    }
232#else
233   loc_eng_dmn_conn_loc_api_server_data_conn(LOC_ENG_IF_REQUEST_SENDER_ID_GPSONE_DAEMON, GPSONE_LOC_API_IF_RELEASE_SUCCESS);
234#endif
235    return 0;
236}
237
238