1ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
2ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo *
3ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * Redistribution and use in source and binary forms, with or without
4ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * modification, are permitted provided that the following conditions are
5ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * met:
6ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo *     * Redistributions of source code must retain the above copyright
7ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo *       notice, this list of conditions and the following disclaimer.
8ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo *     * Redistributions in binary form must reproduce the above
9ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo *       copyright notice, this list of conditions and the following
10ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo *       disclaimer in the documentation and/or other materials provided
11ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo *       with the distribution.
12ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo *     * Neither the name of The Linux Foundation, nor the names of its
13ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo *       contributors may be used to endorse or promote products derived
14ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo *       from this software without specific prior written permission.
15ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo *
16ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo *
28ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo */
29ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#define LOG_NDDEBUG 0
30ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#define LOG_TAG "LocSvc_DualCtx"
31ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
32ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#include <cutils/sched_policy.h>
33ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#include <unistd.h>
34ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#include <LocDualContext.h>
35ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#include <msg_q.h>
36ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#include <log_util.h>
37ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo#include <loc_log.h>
38ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
39ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russonamespace loc_core {
40ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
41ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo// nothing exclude for foreground
42ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoconst LOC_API_ADAPTER_EVENT_MASK_T
43ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante RussoLocDualContext::mFgExclMask = 0;
44ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo// excluded events for background clients
45ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoconst LOC_API_ADAPTER_EVENT_MASK_T
46ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante RussoLocDualContext::mBgExclMask =
47ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    (LOC_API_ADAPTER_BIT_SATELLITE_REPORT |
48ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo     LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT |
49ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo     LOC_API_ADAPTER_BIT_NMEA_POSITION_REPORT |
50ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo     LOC_API_ADAPTER_BIT_IOCTL_REPORT |
51ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo     LOC_API_ADAPTER_BIT_STATUS_REPORT |
52ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo     LOC_API_ADAPTER_BIT_GEOFENCE_GEN_ALERT);
53ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
54ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoconst MsgTask* LocDualContext::mMsgTask = NULL;
55ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante RussoContextBase* LocDualContext::mFgContext = NULL;
56ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante RussoContextBase* LocDualContext::mBgContext = NULL;
57ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
58ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo// the name must be shorter than 15 chars
59ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoconst char* LocDualContext::mLocationHalName = "Loc_hal_worker";
60ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoconst char* LocDualContext::mIzatLibName = "libizat_core.so";
61ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
62ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoconst MsgTask* LocDualContext::getMsgTask(MsgTask::tCreate tCreator,
63ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo                                          const char* name)
64ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo{
65ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    if (NULL == mMsgTask) {
66ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo        mMsgTask = new MsgTask(tCreator, name);
67ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    }
68ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    return mMsgTask;
69ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}
70ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
71ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russoconst MsgTask* LocDualContext::getMsgTask(MsgTask::tAssociate tAssociate,
72ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo                                          const char* name)
73ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo{
74ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    if (NULL == mMsgTask) {
75ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo        mMsgTask = new MsgTask(tAssociate, name);
76ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    }
77ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    return mMsgTask;
78ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}
79ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
80ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante RussoContextBase* LocDualContext::getLocFgContext(MsgTask::tCreate tCreator,
81ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo                                             const char* name)
82ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo{
83ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    if (NULL == mFgContext) {
84ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo        const MsgTask* msgTask = getMsgTask(tCreator, name);
85ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo        mFgContext = new LocDualContext(msgTask,
86ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo                                        mFgExclMask);
87ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    }
88ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    return mFgContext;
89ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}
90ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
91ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante RussoContextBase* LocDualContext::getLocFgContext(MsgTask::tAssociate tAssociate,
92ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo                                        const char* name)
93ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo{
94ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    if (NULL == mFgContext) {
95ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo        const MsgTask* msgTask = getMsgTask(tAssociate, name);
96ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo        mFgContext = new LocDualContext(msgTask,
97ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo                                        mFgExclMask);
98ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    }
99ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    return mFgContext;
100ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
101ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}
102ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
103ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante RussoContextBase* LocDualContext::getLocBgContext(MsgTask::tCreate tCreator,
104ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo                                             const char* name)
105ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo{
106ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    if (NULL == mBgContext) {
107ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo        const MsgTask* msgTask = getMsgTask(tCreator, name);
108ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo        mBgContext = new LocDualContext(msgTask,
109ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo                                        mBgExclMask);
110ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    }
111ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    return mBgContext;
112ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}
113ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
114ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante RussoContextBase* LocDualContext::getLocBgContext(MsgTask::tAssociate tAssociate,
115ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo                                             const char* name)
116ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo{
117ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    if (NULL == mBgContext) {
118ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo        const MsgTask* msgTask = getMsgTask(tAssociate, name);
119ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo        mBgContext = new LocDualContext(msgTask,
120ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo                                        mBgExclMask);
121ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    }
122ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    return mBgContext;
123ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}
124ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
125ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante RussoLocDualContext::LocDualContext(const MsgTask* msgTask,
126ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo                               LOC_API_ADAPTER_EVENT_MASK_T exMask) :
127ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo    ContextBase(msgTask, exMask, mIzatLibName)
128ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo{
129ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}
130ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo
131ec6e5d3a2597d37d5b1d98911cb06218cdf19bf1Dante Russo}
132