/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 *  Import and export general routing data using a XML file.
 */
#pragma once
#include "NfcJniUtil.h"
#include "nfa_api.h"
#include <libxml/parser.h>
#include <vector>
#include <string>


/*****************************************************************************
**
**  Name:           RouteData
**
**  Description:    Base class for every kind of route data.
**
*****************************************************************************/
class RouteData
{
public:
    enum RouteType {ProtocolRoute, TechnologyRoute};
    RouteType mRouteType;

protected:
    RouteData (RouteType routeType) : mRouteType (routeType)
    {}
};




/*****************************************************************************
**
**  Name:           RouteDataForProtocol
**
**  Description:    Data for protocol routes.
**
*****************************************************************************/
class RouteDataForProtocol : public RouteData
{
public:
    int mNfaEeHandle; //for example 0x4f3, 0x4f4
    bool mSwitchOn;
    bool mSwitchOff;
    bool mBatteryOff;
    tNFA_PROTOCOL_MASK mProtocol;

    RouteDataForProtocol () : RouteData (ProtocolRoute), mNfaEeHandle (NFA_HANDLE_INVALID),
            mSwitchOn (false), mSwitchOff (false), mBatteryOff (false),
            mProtocol (0)
    {}
};


/*****************************************************************************
**
**  Name:           RouteDataForTechnology
**
**  Description:    Data for technology routes.
**
*****************************************************************************/
class RouteDataForTechnology : public RouteData
{
public:
    int mNfaEeHandle; //for example 0x4f3, 0x4f4
    bool mSwitchOn;
    bool mSwitchOff;
    bool mBatteryOff;
    tNFA_TECHNOLOGY_MASK mTechnology;

    RouteDataForTechnology () : RouteData (TechnologyRoute), mNfaEeHandle (NFA_HANDLE_INVALID),
            mSwitchOn (false), mSwitchOff (false), mBatteryOff (false),
            mTechnology (0)
    {}
};


/*****************************************************************************/
/*****************************************************************************/


/*****************************************************************************
**
**  Name:           AidBuffer
**
**  Description:    Buffer to store AID after converting a string of hex
**                  values to bytes.
**
*****************************************************************************/
class AidBuffer
{
public:

    /*******************************************************************************
    **
    ** Function:        AidBuffer
    **
    ** Description:     Parse a string of hex numbers.  Store result in an array of
    **                  bytes.
    **                  aid: string of hex numbers.
    **
    ** Returns:         None.
    **
    *******************************************************************************/
    AidBuffer (std::string& aid);


    /*******************************************************************************
    **
    ** Function:        ~AidBuffer
    **
    ** Description:     Release all resources.
    **
    ** Returns:         None.
    **
    *******************************************************************************/
    ~AidBuffer ();


    UINT8* buffer () {return mBuffer;};
    int length () {return mBufferLen;};

private:
    UINT8* mBuffer;
    UINT32 mBufferLen;
};


/*****************************************************************************/
/*****************************************************************************/


/*****************************************************************************
**
**  Name:           RouteDataSet
**
**  Description:    Import and export general routing data using a XML file.
**                  See /data/bcm/param/route.xml
**
*****************************************************************************/
class RouteDataSet
{
public:
    typedef std::vector<RouteData*> Database;
    enum DatabaseSelection {DefaultRouteDatabase, SecElemRouteDatabase};


    /*******************************************************************************
    **
    ** Function:        ~RouteDataSet
    **
    ** Description:     Release all resources.
    **
    ** Returns:         None.
    **
    *******************************************************************************/
    ~RouteDataSet ();


    /*******************************************************************************
    **
    ** Function:        initialize
    **
    ** Description:     Initialize resources.
    **
    ** Returns:         True if ok.
    **
    *******************************************************************************/
    bool initialize ();


    /*******************************************************************************
    **
    ** Function:        import
    **
    ** Description:     Import data from an XML file.  Fill the database.
    **
    ** Returns:         True if ok.
    **
    *******************************************************************************/
    bool import ();


    /*******************************************************************************
    **
    ** Function:        getDatabase
    **
    ** Description:     Obtain a database of routing data.
    **                  selection: which database.
    **
    ** Returns:         Pointer to database.
    **
    *******************************************************************************/
    Database* getDatabase (DatabaseSelection selection);


    /*******************************************************************************
    **
    ** Function:        saveToFile
    **
    ** Description:     Save XML data from a string into a file.
    **                  routesXml: XML that represents routes.
    **
    ** Returns:         True if ok.
    **
    *******************************************************************************/
    static bool saveToFile (const char* routesXml);


    /*******************************************************************************
    **
    ** Function:        loadFromFile
    **
    ** Description:     Load XML data from file into a string.
    **                  routesXml: string to receive XML data.
    **
    ** Returns:         True if ok.
    **
    *******************************************************************************/
    static bool loadFromFile (std::string& routesXml);


    /*******************************************************************************
    **
    ** Function:        deleteFile
    **
    ** Description:     Delete route data XML file.
    **
    ** Returns:         True if ok.
    **
    *******************************************************************************/
    static bool deleteFile ();

    /*******************************************************************************
    **
    ** Function:        printDiagnostic
    **
    ** Description:     Print some diagnostic output.
    **
    ** Returns:         None.
    **
    *******************************************************************************/
    void printDiagnostic ();

private:
    Database mSecElemRouteDatabase; //routes when NFC service selects sec elem
    Database mDefaultRouteDatabase; //routes when NFC service deselects sec elem
    static const char* sConfigFile;
    static const bool sDebug = false;


    /*******************************************************************************
    **
    ** Function:        deleteDatabase
    **
    ** Description:     Delete all routes stored in all databases.
    **
    ** Returns:         None.
    **
    *******************************************************************************/
    void deleteDatabase ();


    /*******************************************************************************
    **
    ** Function:        importProtocolRoute
    **
    ** Description:     Parse data for protocol routes.
    **                  element: XML node for one protocol route.
    **                  database: store data in this database.
    **
    ** Returns:         None.
    **
    *******************************************************************************/
    void importProtocolRoute (xmlNodePtr& element, Database& database);


    /*******************************************************************************
    **
    ** Function:        importTechnologyRoute
    **
    ** Description:     Parse data for technology routes.
    **                  element: XML node for one technology route.
    **                  database: store data in this database.
    **
    ** Returns:         None.
    **
    *******************************************************************************/
    void importTechnologyRoute (xmlNodePtr& element, Database& database);
};