dom/voicemail/Voicemail.h
author Mike Hommey <mh+mozilla@glandium.org>
Fri, 15 Apr 2016 06:43:35 +0900
changeset 331180 334804a9afacc402b16c172a97bb85919510a8e8
parent 319078 75dfe10ec44a88bda2d9721d269ddf2429ac5426
permissions -rw-r--r--
Bug 1257448 - Don't emit an error on unknown implied options when their resolved value is None. r=nalexander imply_option has no effect when the resolved value is None, so the same logic can be applied when checking for unknown implied options. This allows to imply options that may not always exist (because they are in a configure file that is optionally included). Ideally, it would be better not to do this, but until we have something better than optionally included configure files for --disable-compile-environment, this is a necessary evil.

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

#ifndef mozilla_dom_voicemail_voicemail_h__
#define mozilla_dom_voicemail_voicemail_h__

#include "mozilla/Attributes.h"
#include "mozilla/DOMEventTargetHelper.h"
#include "mozilla/ErrorResult.h"
#include "nsIVoicemailService.h"

class JSObject;
struct JSContext;

class nsPIDOMWindowInner;

namespace mozilla {
namespace dom {

class VoicemailStatus;

class Voicemail final : public DOMEventTargetHelper,
                        private nsIVoicemailListener
{
  /**
   * Class Voicemail doesn't actually expose nsIVoicemailListener. Instead, it
   * owns an nsIVoicemailListener derived instance mListener and passes it to
   * nsIVoicemailService. The onreceived events are first delivered to
   * mListener and then forwarded to its owner, Voicemail. See also bug 775997
   * comment #51.
   */
  class Listener;

public:
  NS_DECL_ISUPPORTS_INHERITED
  NS_DECL_NSIVOICEMAILLISTENER

  NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(Voicemail,
                                           DOMEventTargetHelper)

  static already_AddRefed<Voicemail>
  Create(nsPIDOMWindowInner* aOwner,
         ErrorResult& aRv);

  void
  Shutdown();

  nsPIDOMWindowInner*
  GetParentObject() const
  {
    return GetOwner();
  }

  virtual JSObject*
  WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;

  already_AddRefed<VoicemailStatus>
  GetStatus(const Optional<uint32_t>& aServiceId,
            ErrorResult& aRv);

  void
  GetNumber(const Optional<uint32_t>& aServiceId,
            nsString& aNumber,
            ErrorResult& aRv) const;

  void
  GetDisplayName(const Optional<uint32_t>& aServiceId,
                 nsString& aDisplayName,
                 ErrorResult& aRv) const;

  IMPL_EVENT_HANDLER(statuschanged)

private:
  Voicemail(nsPIDOMWindowInner* aWindow,
            nsIVoicemailService* aService);

  // final suppresses -Werror,-Wdelete-non-virtual-dtor
  ~Voicemail();

private:
  nsCOMPtr<nsIVoicemailService> mService;
  RefPtr<Listener> mListener;

  // |mStatuses| keeps all instantiated VoicemailStatus objects as well as the
  // empty slots for not interested ones. The length of |mStatuses| is decided
  // in the constructor and is never changed ever since.
  AutoTArray<RefPtr<VoicemailStatus>, 1> mStatuses;

  // Return a nsIVoicemailProvider instance based on the requests from external
  // components. Return nullptr if aOptionalServiceId contains an invalid
  // service id or the default one is just not available.
  already_AddRefed<nsIVoicemailProvider>
  GetItemByServiceId(const Optional<uint32_t>& aOptionalServiceId,
                     uint32_t& aActualServiceId) const;

  // Request for a valid VoicemailStatus object based on given service id and
  // provider. It's the callee's responsibility to ensure the validity of the
  // two parameters.
  already_AddRefed<VoicemailStatus>
  GetOrCreateStatus(uint32_t aServiceId,
                    nsIVoicemailProvider* aProvider);
};

} // namespace dom
} // namespace mozilla

#endif // mozilla_dom_voicemail_voicemail_h__