1/* Copyright (c) 2009-2013, 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
30#define LOG_NDDEBUG 0
31#define LOG_TAG "LocSvc_eng"
32
33#include <loc_eng.h>
34#include <MsgTask.h>
35#include "log_util.h"
36#include "platform_lib_includes.h"
37
38using namespace loc_core;
39
40struct LocEngRequestXtraServer : public LocMsg {
41    LocEngAdapter* mAdapter;
42    inline LocEngRequestXtraServer(LocEngAdapter* adapter) :
43        LocMsg(), mAdapter(adapter)
44    {
45        locallog();
46    }
47    inline virtual void proc() const {
48        mAdapter->requestXtraServer();
49    }
50    inline void locallog() const {
51        LOC_LOGV("LocEngRequestXtraServer");
52    }
53    inline virtual void log() const {
54        locallog();
55    }
56};
57
58struct LocEngInjectXtraData : public LocMsg {
59    LocEngAdapter* mAdapter;
60    char* mData;
61    const int mLen;
62    inline LocEngInjectXtraData(LocEngAdapter* adapter,
63                                char* data, int len):
64        LocMsg(), mAdapter(adapter),
65        mData(new char[len]), mLen(len)
66    {
67        memcpy((void*)mData, (void*)data, len);
68        locallog();
69    }
70    inline ~LocEngInjectXtraData()
71    {
72        delete[] mData;
73    }
74    inline virtual void proc() const {
75        mAdapter->setXtraData(mData, mLen);
76    }
77    inline  void locallog() const {
78        LOC_LOGV("length: %d\n  data: %p", mLen, mData);
79    }
80    inline virtual void log() const {
81        locallog();
82    }
83};
84
85/*===========================================================================
86FUNCTION    loc_eng_xtra_init
87
88DESCRIPTION
89   Initialize XTRA module.
90
91DEPENDENCIES
92   N/A
93
94RETURN VALUE
95   0: success
96
97SIDE EFFECTS
98   N/A
99
100===========================================================================*/
101int loc_eng_xtra_init (loc_eng_data_s_type &loc_eng_data,
102                       GpsXtraExtCallbacks* callbacks)
103{
104    int ret_val = -1;
105    loc_eng_xtra_data_s_type *xtra_module_data_ptr;
106
107    if(callbacks == NULL) {
108        LOC_LOGE("loc_eng_xtra_init: failed, cb is NULL");
109    } else {
110        xtra_module_data_ptr = &loc_eng_data.xtra_module_data;
111        xtra_module_data_ptr->download_request_cb = callbacks->download_request_cb;
112        xtra_module_data_ptr->report_xtra_server_cb = callbacks->report_xtra_server_cb;
113
114        ret_val = 0;
115    }
116    return ret_val;
117}
118
119/*===========================================================================
120FUNCTION    loc_eng_xtra_inject_data
121
122DESCRIPTION
123   Injects XTRA file into the engine but buffers the data if engine is busy.
124
125DEPENDENCIES
126   N/A
127
128RETURN VALUE
129   0: success
130   >0: failure
131
132SIDE EFFECTS
133   N/A
134
135===========================================================================*/
136int loc_eng_xtra_inject_data(loc_eng_data_s_type &loc_eng_data,
137                             char* data, int length)
138{
139    LocEngAdapter* adapter = loc_eng_data.adapter;
140    adapter->sendMsg(new LocEngInjectXtraData(adapter, data, length));
141
142    return 0;
143}
144/*===========================================================================
145FUNCTION    loc_eng_xtra_request_server
146
147DESCRIPTION
148   Request the Xtra server url from the modem
149
150DEPENDENCIES
151   N/A
152
153RETURN VALUE
154   length of server string
155
156SIDE EFFECTS
157   N/A
158
159===========================================================================*/
160int loc_eng_xtra_request_server(loc_eng_data_s_type &loc_eng_data)
161{
162    LocEngAdapter* adapter = loc_eng_data.adapter;
163    adapter->sendMsg(new LocEngRequestXtraServer(adapter));
164
165    return 0;
166
167}
168