/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "nsISupports.idl"

interface nsISimpleEnumerator;

/*
 * Status reporters show Firefox's service status.
 */

[scriptable, uuid(ffcb716c-deeb-44ea-9d9d-ab25dc6980a8)]
interface nsIStatusReporter : nsISupports
{
  readonly attribute ACString name;
  /*
   * The name of the process containing this reporter.  Each reporter initially
   * has "" in this field, indicating that it applies to the current process.
   */
  readonly attribute ACString process;
  /*
   * A human-readable status description.
   */
  readonly attribute AUTF8String description;
};

[scriptable, uuid(fd531273-3319-4fcd-90f2-9f53876c3828)]
interface nsIStatusReporterManager : nsISupports
{

  /*
   * Return an enumerator of nsIStatusReporters that are currently registered.
   */
  nsISimpleEnumerator enumerateReporters();

  /*
   * Register the given nsIStatusReporter.  After a reporter is registered,
   * it will be available via enumerateReporters().  The Manager service
   * will hold a strong reference to the given reporter.
   */
  void registerReporter(in nsIStatusReporter reporter);

  /*
   * Unregister the given status reporter.
   */
  void unregisterReporter(in nsIStatusReporter reporter);

 /*
  * Initialize.
  */
  void init();

  /*
   * Dump service status as a json file
   */
  void dumpReports();
};

%{C++

/*
 * Note that this defaults 'process' to "", which is usually what's desired.
 */
#define NS_STATUS_REPORTER_IMPLEMENT(_classname, _name, _desc_Function)       \
    class StatusReporter_##_classname final : public nsIStatusReporter {  \
      ~StatusReporter_##_classname() {}                                       \
    public:                                                                   \
      NS_DECL_ISUPPORTS                                                       \
      NS_IMETHOD GetName(nsACString &name) override                       \
        { name.AssignLiteral(_name); return NS_OK; }                          \
      NS_IMETHOD GetProcess(nsACString &process) override                 \
        { process.Truncate(); return NS_OK; }                                 \
      NS_IMETHOD GetDescription(nsACString &desc) override                \
        { _desc_Function(desc); return NS_OK; }                               \
    };                                                                        \
    NS_IMPL_ISUPPORTS(StatusReporter_##_classname, nsIStatusReporter)

#define NS_STATUS_REPORTER_NAME(_classname)  StatusReporter_##_classname

nsresult NS_RegisterStatusReporter(nsIStatusReporter *reporter);
nsresult NS_UnregisterStatusReporter(nsIStatusReporter *reporter);
nsresult NS_DumpStatusReporter();

#define NS_STATUS_REPORTER_MANAGER_CID \
{ 0xe8eb4e7e, 0xf2cf, 0x45e5, \
{ 0xb8, 0xa4, 0x6a, 0x0f, 0x50, 0x18, 0x84, 0x63 } }
%}
