// Copyright 2014 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROMEOS_DBUS_BINDINGS_DBUS_SIGNATURE_H_
#define CHROMEOS_DBUS_BINDINGS_DBUS_SIGNATURE_H_

#include <memory>
#include <string>
#include <vector>

#include <base/macros.h>
#include <gtest/gtest_prod.h>  // for FRIEND_TEST

#include "chromeos-dbus-bindings/interface.h"

namespace chromeos_dbus_bindings {

class DBusType {
 public:
  enum class Direction {
    kExtract,
    kAppend,
  };

  enum class Receiver {
    kAdaptor,
    kProxy,
  };
  virtual ~DBusType() = default;

  // Some types might not be allowed in properties because libchrome bindings
  // don't support them, or they don't make any sense as properties. One
  // example would be file descriptors.
  virtual bool IsValidPropertyType() const = 0;

  // Methods for getting the C++ type corresponding to a D-Bus type.
  // If you are reading the argument from a message, use kExtract; otherwise,
  // use kAppend.
  virtual std::string GetBaseType(Direction direction) const = 0;

  // Use these if possible, they will give you e.g. the correct reffiness.
  // The |receiver| should be kAdaptor if you are generating an adaptor, and
  // kProxy if you are generating a proxy.
  virtual std::string GetInArgType(Receiver receiver) const = 0;
  std::string GetOutArgType(Receiver receiver) const;

  // CallbackArg types are a bit special because they are out-arguments but
  // the D-Bus bindings call a callback with them, so they have the same
  // reffiness as in-arguments.
  virtual std::string GetCallbackArgType() const = 0;
};

class DBusSignature {
 public:
  DBusSignature();
  DBusSignature(const DBusSignature&) = delete;
  DBusSignature& operator=(const DBusSignature&) = delete;

  virtual ~DBusSignature() = default;

  // Returns a DBusType corresponding to the D-Bus signature given in
  // |signature|. If the signature fails to parse, returns nullptr.
  std::unique_ptr<DBusType> Parse(const std::string& signature);

 private:
  // Returns an intermediate-representation type for the next D-Bus signature
  // in the string at |signature|, as well as the next position within the
  // string that parsing should continue |next|. Returns nullptr on failure.
  std::unique_ptr<DBusType> GetTypenameForSignature(
      std::string::const_iterator signature,
      std::string::const_iterator end,
      int nesting_depth,
      std::string::const_iterator* next);

  // Parses multiple types out of a D-Bus signature until it encounters an
  // |end_char| and places them in |children|. Returns true on success.
  bool ParseChildTypes(std::string::const_iterator signature,
                       std::string::const_iterator end,
                       std::string::value_type end_char,
                       int nesting_depth,
                       std::string::const_iterator* next,
                       std::vector<std::unique_ptr<DBusType>>* children);

  // Utility task for GetTypenameForSignature() which handles array objects
  // and decodes them into a map or vector depending on the encoded sub-elements
  // in the array. The arguments and return values are the same
  // as GetTypenameForSignature().
  std::unique_ptr<DBusType> GetArrayTypenameForSignature(
      std::string::const_iterator signature,
      std::string::const_iterator end,
      int nesting_depth,
      std::string::const_iterator* next);

  // Utility task for GetArrayTypenameForSignature() which handles dict objects.
  std::unique_ptr<DBusType> GetDictTypenameForSignature(
      std::string::const_iterator signature,
      std::string::const_iterator end,
      int nesting_depth,
      std::string::const_iterator* next);

  // Utility task for GetTypenameForSignature() which handles structs.
  // The arguments and return values are the same as GetTypenameForSignature().
  std::unique_ptr<DBusType> GetStructTypenameForSignature(
      std::string::const_iterator signature,
      std::string::const_iterator end,
      int nesting_depth,
      std::string::const_iterator* next);
};

}  // namespace chromeos_dbus_bindings

#endif  // CHROMEOS_DBUS_BINDINGS_DBUS_SIGNATURE_H_
