// 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

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();
  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,
      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,
                       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,
      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,
      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,
      std::string::const_iterator* next);

  DISALLOW_COPY_AND_ASSIGN(DBusSignature);
};

}  // namespace chromeos_dbus_bindings

#endif  // CHROMEOS_DBUS_BINDINGS_DBUS_SIGNATURE_H_
