/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim:set ts=2 sw=2 sts=2 et cindent: */ /* 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_PosixSerialPlatformService_h #define mozilla_dom_PosixSerialPlatformService_h #include "mozilla/UniquePtrExtensions.h" #include "mozilla/dom/SerialPlatformService.h" #include "nsTHashMap.h" #if defined(XP_LINUX) && defined(MOZ_ENABLE_DBUS) # include # include "mozilla/UdevLib.h" #endif #ifdef XP_MACOSX # include #endif namespace mozilla::dom { class PosixSerialPlatformService final : public SerialPlatformService { public: PosixSerialPlatformService(); nsresult Init() override; void Shutdown() override; private: nsresult EnumeratePortsImpl(SerialPortList& aPorts) override; nsresult OpenImpl(const nsString& aPortId, const IPCSerialOptions& aOptions) override; nsresult CloseImpl(const nsString& aPortId) override; nsresult ReadImpl(const nsString& aPortId, Span aBuf, uint32_t& aBytesRead) override; nsresult WriteImpl(const nsString& aPortId, Span aData) override; nsresult DrainImpl(const nsString& aPortId) override; nsresult FlushImpl(const nsString& aPortId, bool aReceive) override; nsresult SetSignalsImpl(const nsString& aPortId, const IPCSerialOutputSignals& aSignals) override; nsresult GetSignalsImpl(const nsString& aPortId, IPCSerialInputSignals& aSignals) override; ~PosixSerialPlatformService() override; int FindPortFd(const nsString& aPortId); nsresult ConfigurePort(int aFd, const IPCSerialOptions& aOptions); nsresult StartMonitoring(); void StopMonitoring(); #ifdef XP_LINUX nsresult InitializeUdev(); void ShutdownUdev(); static gboolean OnUdevMonitor(GIOChannel* source, GIOCondition condition, gpointer data); void ReadUdevChange(); void PopulatePortInfoFromUdev(mozilla::udev_device* aDev, const char* aDevnode, IPCSerialPortInfo& aPortInfo); mozilla::UniquePtr mUdevLib; mozilla::udev_monitor* mMonitor; guint mMonitorSourceID; #endif #ifdef XP_MACOSX nsresult InitializeMacOS(); static void DeviceAddedCallback(void* context, io_iterator_t iterator); static void DeviceRemovedCallback(void* context, io_iterator_t iterator); void OnDeviceAdded(io_iterator_t iterator, bool aSkipNotify); void OnDeviceRemoved(io_iterator_t iterator, bool aSkipNotify); bool ExtractDeviceInfo(io_service_t device, IPCSerialPortInfo& portInfo); IONotificationPortRef mNotificationPort; io_iterator_t mAddedIterator; io_iterator_t mRemovedIterator; #endif // Should only be accessed on SerialPlatformService's thread nsTHashMap mOpenPorts; }; } // namespace mozilla::dom #endif // mozilla_dom_PosixSerialPlatformService_h