/*
 * 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 <string>
#include <vector>

/*****************************************************************************
**
**  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_t* buffer() { return mBuffer; };
  int length() { return mBufferLen; };

 private:
  uint8_t* mBuffer;
  uint32_t 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);
};