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