/* Copyright (c) 2011-2013, 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_ENG_MSG_H
#define LOC_ENG_MSG_H


#include <hardware/gps.h>
#include <gps_extended.h>
#include <stdlib.h>
#include <string.h>
#include <log_util.h>
#include <loc_eng_log.h>
#include <loc_eng.h>
#include <MsgTask.h>
#include <LocEngAdapter.h>

#ifndef SSID_BUF_SIZE
    #define SSID_BUF_SIZE (32+1)
#endif
#ifdef USE_GLIB

#include <glib.h>

#endif /* USE_GLIB */
#include "platform_lib_includes.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

using namespace loc_core;

struct LocEngPositionMode : public LocMsg {
    LocEngAdapter* mAdapter;
    const LocPosMode mPosMode;
    LocEngPositionMode(LocEngAdapter* adapter, LocPosMode &mode);
    virtual void proc() const;
    virtual void log() const;
    void send() const;
};


struct LocEngStartFix : public LocMsg {
    LocEngAdapter* mAdapter;
    LocEngStartFix(LocEngAdapter* adapter);
    virtual void proc() const;
    void locallog() const;
    virtual void log() const;
    void send() const;
};

struct LocEngStopFix : public LocMsg {
    LocEngAdapter* mAdapter;
    LocEngStopFix(LocEngAdapter* adapter);
    virtual void proc() const;
    void locallog() const;
    virtual void log() const;
    void send() const;
};

struct LocEngReportPosition : public LocMsg {
    LocAdapterBase* mAdapter;
    const UlpLocation mLocation;
    const GpsLocationExtended mLocationExtended;
    const void* mLocationExt;
    const enum loc_sess_status mStatus;
    const LocPosTechMask mTechMask;
    LocEngReportPosition(LocAdapterBase* adapter,
                         UlpLocation &loc,
                         GpsLocationExtended &locExtended,
                         void* locExt,
                         enum loc_sess_status st,
                         LocPosTechMask technology);
    virtual void proc() const;
    void locallog() const;
    virtual void log() const;
    void send() const;
};

struct LocEngReportSv : public LocMsg {
    LocAdapterBase* mAdapter;
    const GnssSvStatus mSvStatus;
    const GpsLocationExtended mLocationExtended;
    const void* mSvExt;
    LocEngReportSv(LocAdapterBase* adapter,
                   GnssSvStatus &sv,
                   GpsLocationExtended &locExtended,
                   void* svExtended);
    virtual void proc() const;
    void locallog() const;
    virtual void log() const;
    void send() const;
};

struct LocEngReportStatus : public LocMsg {
    LocAdapterBase* mAdapter;
    const GpsStatusValue mStatus;
    LocEngReportStatus(LocAdapterBase* adapter,
                       GpsStatusValue engineStatus);
    virtual void proc() const;
    void locallog() const;
    virtual void log() const;
};

struct LocEngReportNmea : public LocMsg {
    void* mLocEng;
    char* const mNmea;
    const int mLen;
    LocEngReportNmea(void* locEng,
                     const char* data, int len);
    inline virtual ~LocEngReportNmea()
    {
        delete[] mNmea;
    }
    virtual void proc() const;
    void locallog() const;
    virtual void log() const;
};

struct LocEngReportXtraServer : public LocMsg {
    void* mLocEng;
    int mMaxLen;
    char *mServers;
    LocEngReportXtraServer(void* locEng,
                           const char *url1, const char *url2,
                           const char *url3, const int maxlength);
    inline virtual ~LocEngReportXtraServer()
    {
        delete[] mServers;
    }
    virtual void proc() const;
    void locallog() const;
    virtual void log() const;
};

struct LocEngSuplEsOpened : public LocMsg {
    void* mLocEng;
    LocEngSuplEsOpened(void* locEng);
    virtual void proc() const;
    void locallog() const;
    virtual void log() const;
};

struct LocEngSuplEsClosed : public LocMsg {
    void* mLocEng;
    LocEngSuplEsClosed(void* locEng);
    virtual void proc() const;
    void locallog() const;
    virtual void log() const;
};

struct LocEngRequestSuplEs : public LocMsg {
    void* mLocEng;
    const int mID;
    LocEngRequestSuplEs(void* locEng, int id);
    virtual void proc() const;
    void locallog() const;
    virtual void log() const;
};

struct LocEngRequestATL : public LocMsg {
    void* mLocEng;
    const int mID;
    const AGpsExtType mType;
    LocEngRequestATL(void* locEng, int id,
                     AGpsExtType agps_type);
    virtual void proc() const;
    void locallog() const;
    virtual void log() const;
};

struct LocEngReleaseATL : public LocMsg {
    void* mLocEng;
    const int mID;
    LocEngReleaseATL(void* locEng, int id);
    virtual void proc() const;
    void locallog() const;
    virtual void log() const;
};

struct LocEngReqRelBIT : public LocMsg {
    void* mLocEng;
    const AGpsExtType mType;
    const int mIPv4Addr;
    char* const mIPv6Addr;
    const bool mIsReq;
    LocEngReqRelBIT(void* instance, AGpsExtType type,
                    int ipv4, char* ipv6, bool isReq);
    virtual ~LocEngReqRelBIT();
    virtual void proc() const;
    void locallog() const;
    virtual void log() const;
    void send() const;
};

struct LocEngReqRelWifi : public LocMsg {
    void* mLocEng;
    const AGpsExtType mType;
    const loc_if_req_sender_id_e_type mSenderId;
    char* const mSSID;
    char* const mPassword;
    const bool mIsReq;
    LocEngReqRelWifi(void* locEng, AGpsExtType type,
                     loc_if_req_sender_id_e_type sender_id,
                     char* s, char* p, bool isReq);
    virtual ~LocEngReqRelWifi();
    virtual void proc() const;
    void locallog() const;
    virtual void log() const;
    void send() const;
};

struct LocEngRequestXtra : public LocMsg {
    void* mLocEng;
    LocEngRequestXtra(void* locEng);
    virtual void proc() const;
    void locallog() const;
    virtual void log() const;
};

struct LocEngRequestTime : public LocMsg {
    void* mLocEng;
    LocEngRequestTime(void* locEng);
    virtual void proc() const;
    void locallog() const;
    virtual void log() const;
};

struct LocEngRequestNi : public LocMsg {
    void* mLocEng;
    const GpsNiNotification mNotify;
    const void *mPayload;
    LocEngRequestNi(void* locEng,
                    GpsNiNotification &notif,
                    const void* data);
    virtual void proc() const;
    void locallog() const;
    virtual void log() const;
};

struct LocEngDown : public LocMsg {
    void* mLocEng;
    LocEngDown(void* locEng);
    virtual void proc() const;
    void locallog() const;
    virtual void log() const;
};

struct LocEngUp : public LocMsg {
    void* mLocEng;
    LocEngUp(void* locEng);
    virtual void proc() const;
    void locallog() const;
    virtual void log() const;
};

struct LocEngGetZpp : public LocMsg {
    LocEngAdapter* mAdapter;
    LocEngGetZpp(LocEngAdapter* adapter);
    virtual void proc() const;
    void locallog() const;
    virtual void log() const;
    void send() const;
};

struct LocEngReportGpsMeasurement : public LocMsg {
    void* mLocEng;
    const GpsData mGpsData;
    LocEngReportGpsMeasurement(void* locEng,
                               GpsData &gpsData);
    virtual void proc() const;
    void locallog() const;
    virtual void log() const;
};

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* LOC_ENG_MSG_H */
