namespace io

namespace io {

// namespaces

namespace io.lnx;
namespace io.psx;
namespace io.win;

// typedefs

typedef io.StreamOptions ChildProcessOptions;
typedef io.ReadOnlyStreamOptions MailslotOptions;
typedef io.ReadOnlyStreamEvents MailslotEvents;
typedef io.StreamOptions UsbEndpointOptions;
typedef io.ReadOnlyStreamEvents DeviceMonitorEvents;

// enums

enum {
    DeviceMonitorNotifyHdrSignature = 'nomt',
};

enum AddressFamily;
bitflag enum ChildProcessEvents;
bitflag enum ChildProcessStartFlags;
enum DeviceMonitorMiMsgCode;
bitflag enum DeviceMonitorMiStartFlags;
bitflag enum DeviceMonitorNotifyFlags;
enum FileKind;
bitflag enum FileOpenFlags;
bitflag enum FileStreamEvents;
bitflag enum FileStreamOptions;
bitflag enum HostNameResolverEvents;
bitflag enum NamedPipeEvents;
bitflag enum NetworkAdapterFlags;
enum NetworkAdapterType;
bitflag enum PcapEvents;
enum PcapLinkType;
enum Protocol;
bitflag enum ReadOnlyStreamEvents;
bitflag enum ReadOnlyStreamOptions;
bitflag enum SerialEvents;
enum SerialFlowControl;
bitflag enum SerialLineErrors;
bitflag enum SerialOptions;
enum SerialParity;
bitflag enum SerialPortDescFlags;
bitflag enum SerialStatusLines;
enum SerialStopBits;
bitflag enum SocketEvents;
bitflag enum SocketOptions;
bitflag enum SshEvents;
bitflag enum StreamEvents;
bitflag enum StreamOptions;
enum UsbClass;
enum UsbControlDirection;
enum UsbControlRecipient;
enum UsbControlStdRequest;
enum UsbControlType;
bitflag enum UsbDeviceStringId;
bitflag enum UsbEndpointEvents;
bitflag enum UsbEnumFlags;
enum UsbIsoSyncType;
enum UsbIsoUsage;
enum UsbSpeed;
enum UsbTransferType;

// structs

struct DeviceMonitorMiMsgHdr;
struct DeviceMonitorMiStartParams;
struct DeviceMonitorNotifyHdr;
struct NetworkAdapterAddress;
struct NetworkAdapterDesc;
struct PcapAddress;
struct PcapDeviceDesc;
struct PtySize;
struct SerialPortDesc;
struct SocketAddress_ip4;
struct SocketAddress_ip6;
struct SshConnectParams;
struct UsbConfigurationDescriptor;
struct UsbControlRequestType;
struct UsbControlSetup;
struct UsbDeviceDescriptor;
struct UsbDeviceEntry;
struct UsbDeviceStrings;
struct UsbEndpointDescriptor;
struct UsbInterfaceDescriptor;
struct UsbIsoHdr;
struct UsbIsoPacket;

// unions

union Address_ip4;
union Address_ip6;
union SocketAddress;

// classes

class ChildProcess;
class DeviceMonitor;
class File;
class FileStream;
class HostNameResolver;
class Mailslot;
class MappedFile;
class NamedPipe;
class Pcap;
class PcapFilter;
class Serial;
class Socket;
class SshChannel;
class UsbDevice;
class UsbEndpoint;
class UsbInterface;

// global functions

io.SerialPortDesc const* enumerateSerialPorts(
    io.SerialPortDescFlags flags,
    size_t* count = null
);

io.SerialPortDesc const* enumerateSerialPorts(size_t* count = null);

io.NetworkAdapterDesc const* enumerateNetworkAdapters(
    size_t* adapterCount = null,
    size_t* addressCount = null
);

string_t getFileStreamKindString(io.FileKind kind);
string_t getSymbolicLinkTarget(string_t name);
string_t getHomeDir();
string_t getTempDir();

string_t createTempFile(
    string_t dir = null,
    string_t prefix = null
);

bool errorcode renameFile(
    string_t srcFileName,
    string_t dstFileName
);

bool errorcode deleteFile(string_t fileName);
io.PcapDeviceDesc const* createPcapDeviceDescList(size_t* count = null);

io.UsbDeviceEntry const* enumerateUsbDevices(
    io.UsbEnumFlags flags,
    size_t* count = null
);

io.UsbDeviceEntry const* enumerateUsbDevices(size_t* count = null);
io.UsbDevice* const* errorcode enumerateUsbDevicesNoDesc(size_t* count = null);

io.UsbDevice* errorcode openUsbDevice(
    uint_t vendorId,
    uint_t productId
);

} // namespace io