// 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_HEADER_GENERATOR_H_
#define CHROMEOS_DBUS_BINDINGS_HEADER_GENERATOR_H_

#include <string>
#include <vector>

#include <base/macros.h>

namespace base {

class FilePath;

};

namespace chromeos_dbus_bindings {

struct Interface;
class  IndentedText;

class HeaderGenerator {
 protected:
  // Create a unique header guard string to protect multiple includes of header.
  static std::string GenerateHeaderGuard(const base::FilePath& output_file);

  // Returns a vector of nesting namespaces.
  static bool GetNamespacesAndClassName(const std::string& interface_name,
                                        std::vector<std::string>* namespaces,
                                        std::string* class_name);

  // Returns a fully-qualified class name like "ns1::ns2::class_name".
  static std::string GetFullClassName(
      const std::vector<std::string>& namespaces,
      const std::string& class_name);

  // Used to decide whether the argument should be a const reference.
  static bool IsIntegralType(const std::string& type);

  // Writes indented text to a file.
  static bool WriteTextToFile(const base::FilePath& output_file,
                              const IndentedText& text);

  // Generate a name of a method/signal argument based on the name provided in
  // the XML file. If |arg_name| is empty, it generates a name using
  // the |arg_index| counter.
  static std::string GetArgName(const char* prefix,
                                const std::string& arg_name,
                                int arg_index);

  static const int kScopeOffset = 1;
  static const int kBlockOffset = 2;
  static const int kLineContinuationOffset = 4;

 private:
  DISALLOW_COPY_AND_ASSIGN(HeaderGenerator);
};

}  // namespace chromeos_dbus_bindings

#endif  // CHROMEOS_DBUS_BINDINGS_HEADER_GENERATOR_H_
