Blame dom/midi/MIDIPort.h

Packit f0b94e
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
Packit f0b94e
/* vim:set ts=2 sw=2 sts=2 et cindent: */
Packit f0b94e
/* This Source Code Form is subject to the terms of the Mozilla Public
Packit f0b94e
 * License, v. 2.0. If a copy of the MPL was not distributed with this
Packit f0b94e
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
Packit f0b94e
Packit f0b94e
#ifndef mozilla_dom_MIDIPort_h
Packit f0b94e
#define mozilla_dom_MIDIPort_h
Packit f0b94e
Packit f0b94e
#include "nsWrapperCache.h"
Packit f0b94e
#include "mozilla/Attributes.h"
Packit f0b94e
#include "mozilla/Observer.h"
Packit f0b94e
#include "mozilla/DOMEventTargetHelper.h"
Packit f0b94e
#include "mozilla/ErrorResult.h"
Packit f0b94e
#include "mozilla/dom/MIDIAccess.h"
Packit f0b94e
#include "mozilla/dom/MIDIPortBinding.h"
Packit f0b94e
#include "mozilla/dom/MIDIPortInterface.h"
Packit f0b94e
Packit f0b94e
struct JSContext;
Packit f0b94e
Packit f0b94e
namespace mozilla {
Packit f0b94e
namespace dom {
Packit f0b94e
Packit f0b94e
class Promise;
Packit f0b94e
class MIDIPortInfo;
Packit f0b94e
class MIDIAccess;
Packit f0b94e
class MIDIPortChangeEvent;
Packit f0b94e
class MIDIPortChild;
Packit f0b94e
class MIDIMessage;
Packit f0b94e
Packit f0b94e
/**
Packit f0b94e
 * Implementation of WebIDL DOM MIDIPort class. Handles all port representation
Packit f0b94e
 * and communication.
Packit f0b94e
 *
Packit f0b94e
 */
Packit f0b94e
class MIDIPort : public DOMEventTargetHelper,
Packit f0b94e
                 public MIDIAccessDestructionObserver {
Packit f0b94e
 public:
Packit f0b94e
  NS_DECL_ISUPPORTS_INHERITED
Packit f0b94e
  NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(MIDIPort,
Packit f0b94e
                                                         DOMEventTargetHelper)
Packit f0b94e
 protected:
Packit f0b94e
  MIDIPort(nsPIDOMWindowInner* aWindow, MIDIAccess* aMIDIAccessParent);
Packit f0b94e
  bool Initialize(const MIDIPortInfo& aPortInfo, bool aSysexEnabled);
Packit f0b94e
  virtual ~MIDIPort();
Packit f0b94e
Packit f0b94e
 public:
Packit f0b94e
  nsPIDOMWindowInner* GetParentObject() const { return GetOwner(); }
Packit f0b94e
Packit f0b94e
  virtual JSObject* WrapObject(JSContext* aCx,
Packit f0b94e
                               JS::Handle<JSObject*> aGivenProto) override;
Packit f0b94e
Packit f0b94e
  // Getters
Packit f0b94e
  void GetId(nsString& aRetVal) const;
Packit f0b94e
  void GetManufacturer(nsString& aRetVal) const;
Packit f0b94e
  void GetName(nsString& aRetVal) const;
Packit f0b94e
  void GetVersion(nsString& aRetVal) const;
Packit f0b94e
  MIDIPortType Type() const;
Packit f0b94e
  MIDIPortConnectionState Connection() const;
Packit f0b94e
  MIDIPortDeviceState State() const;
Packit f0b94e
  bool SysexEnabled() const;
Packit f0b94e
Packit f0b94e
  already_AddRefed<Promise> Open();
Packit f0b94e
  already_AddRefed<Promise> Close();
Packit f0b94e
Packit f0b94e
  // MIDIPorts observe the death of their parent MIDIAccess object, and delete
Packit f0b94e
  // their reference accordingly.
Packit f0b94e
  virtual void Notify(const void_t& aVoid) override;
Packit f0b94e
Packit f0b94e
  void FireStateChangeEvent();
Packit f0b94e
Packit f0b94e
  virtual void Receive(const nsTArray<MIDIMessage>& aMsg);
Packit f0b94e
Packit f0b94e
  // This object holds a pointer to its corresponding IPC MIDIPortChild actor.
Packit f0b94e
  // If the IPC actor is deleted, it cleans itself up via this method.
Packit f0b94e
  void UnsetIPCPort();
Packit f0b94e
Packit f0b94e
  IMPL_EVENT_HANDLER(statechange)
Packit f0b94e
 protected:
Packit f0b94e
  // IPC Actor corresponding to this class
Packit f0b94e
  RefPtr<MIDIPortChild> mPort;
Packit f0b94e
Packit f0b94e
 private:
Packit f0b94e
  // MIDIAccess object that created this MIDIPort object, which we need for
Packit f0b94e
  // firing port connection events. There is a chance this MIDIPort object can
Packit f0b94e
  // outlive its parent MIDIAccess object, so this is a weak reference that must
Packit f0b94e
  // be handled properly. It is set on construction of the MIDIPort object, and
Packit f0b94e
  // set to null when the parent MIDIAccess object is destroyed, which fires an
Packit f0b94e
  // notification we observe.
Packit f0b94e
  MIDIAccess* mMIDIAccessParent;
Packit f0b94e
  // Promise object generated on Open() call, that needs to be resolved once the
Packit f0b94e
  // platform specific Open() function has completed.
Packit f0b94e
  RefPtr<Promise> mOpeningPromise;
Packit f0b94e
  // Promise object generated on Close() call, that needs to be resolved once
Packit f0b94e
  // the platform specific Close() function has completed.
Packit f0b94e
  RefPtr<Promise> mClosingPromise;
Packit f0b94e
};
Packit f0b94e
Packit f0b94e
}  // namespace dom
Packit f0b94e
}  // namespace mozilla
Packit f0b94e
Packit f0b94e
#endif  // mozilla_dom_MIDIPort_h