diff options
Diffstat (limited to 'location/loc_net_iface/le/LocNetIface.h')
-rw-r--r-- | location/loc_net_iface/le/LocNetIface.h | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/location/loc_net_iface/le/LocNetIface.h b/location/loc_net_iface/le/LocNetIface.h new file mode 100644 index 0000000..ce402fb --- /dev/null +++ b/location/loc_net_iface/le/LocNetIface.h @@ -0,0 +1,125 @@ +/* Copyright (c) 2017, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation, nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef LOC_NET_IFACE_H +#define LOC_NET_IFACE_H + +#include <LocNetIfaceBase.h> +#include <dsi_netctrl.h> +#include <QCMAP_Client.h> + +/*-------------------------------------------------------------------- + * LE platform specific implementation for LocNetIface + *-------------------------------------------------------------------*/ +class LocNetIface : public LocNetIfaceBase { + +public: + /* Constructor */ + LocNetIface(LocNetConnType connType) : + LocNetIfaceBase(connType), + mQcmapClientPtr(NULL), mConnectBackhaulSent(false), + mIsConnectBackhaulPending(false), mIsDisconnectBackhaulPending(false), + mIsDsiInitDone(false), mDsiHandle(NULL), mIsDsiCallUp(false), + mIsDsiStartCallPending(false), mIsDsiStopCallPending(false) {} + LocNetIface() : LocNetIface(LOC_NET_CONN_TYPE_WWAN_INTERNET) {} + + /* Override base class pure virtual methods */ + bool setupWwanCall(); + bool stopWwanCall(); + void subscribe(const std::list<DataItemId>& itemListToSubscribe); + void unsubscribe(const std::list<DataItemId>& itemListToUnsubscribe); + void unsubscribeAll(); + void requestData(const std::list<DataItemId>& itemListToRequestData); + + /* Setup WWAN backhaul via QCMAP + * This sets up IP routes as well for any AP socket */ + bool connectBackhaul(); + /* Disconnects the WWANbackhaul, only if it was setup by us */ + bool disconnectBackhaul(); + + /* APIs to fetch current WLAN/WWAN status */ + bool isWlanConnected(); + bool isWwanConnected(); + +private: + /* QCMAP client handle + * This will be set only for static sQcmapInstance. */ + QCMAP_Client* mQcmapClientPtr; + + /* Flag to track whether we've setup QCMAP backhaul */ + bool mConnectBackhaulSent; + bool mIsConnectBackhaulPending; + bool mIsDisconnectBackhaulPending; + + /* Maintain an exclusive instance for QCMAP interaction. + * QCMAP does NOT support passing in/out a void user data pointer, + * Hence we need to track the instance used internally. */ + static LocNetIface* sLocNetIfaceInstance; + + /* Private APIs to interact with QCMAP module */ + void subscribeWithQcmap(); + void unsubscribeWithQcmap(); + void handleQcmapCallback( + qcmap_msgr_wlan_status_ind_msg_v01 &wlanStatusIndData); + void handleQcmapCallback( + qcmap_msgr_station_mode_status_ind_msg_v01 &stationModeIndData); + void handleQcmapCallback( + qcmap_msgr_wwan_status_ind_msg_v01 &wwanStatusIndData); + void handleQcmapCallback( + qcmap_msgr_bring_up_wwan_ind_msg_v01 &bringUpWwanIndData); + void handleQcmapCallback( + qcmap_msgr_tear_down_wwan_ind_msg_v01 &teardownWwanIndData); + void notifyObserverForWlanStatus(bool isWlanEnabled); + void notifyObserverForNetworkInfo(boolean isConnected, LocNetConnType connType); + void notifyCurrentNetworkInfo(); + void notifyCurrentWifiHardwareState(); + + /* Callback registered with QCMAP */ + static void qcmapClientCallback + ( + qmi_client_type user_handle, /* QMI user handle. */ + unsigned int msg_id, /* Indicator message ID. */ + void *ind_buf, /* Raw indication data. */ + unsigned int ind_buf_len, /* Raw data length. */ + void *ind_cb_data /* User callback handle. */ + ); + + /* Data call setup specific members */ + bool mIsDsiInitDone; + dsi_hndl_t mDsiHandle; + bool mIsDsiCallUp; + bool mIsDsiStartCallPending; + bool mIsDsiStopCallPending; + + /* Callback registered with DSI */ + static void dsiNetEventCallback( + dsi_hndl_t dsiHandle, void* userDataPtr, dsi_net_evt_t event, + dsi_evt_payload_t* eventPayloadPtr); + void handleDSCallback(dsi_hndl_t dsiHandle, bool isNetConnected); +}; + +#endif /* #ifndef LOC_NET_IFACE_H */ |