1 // Copyright 2017 Lyndon Brown
2 //
3 // This file is part of the PulseAudio Rust language linking library.
4 //
5 // Licensed under the MIT license or the Apache license (version 2.0), at your option. You may not
6 // copy, modify, or distribute this file except in compliance with said license. You can find copies
7 // of these licenses either in the LICENSE-MIT and LICENSE-APACHE files, or alternatively at
8 // <http://opensource.org/licenses/MIT> and <http://www.apache.org/licenses/LICENSE-2.0>
9 // respectively.
10 //
11 // Portions of documentation are copied from the LGPL 2.1+ licensed PulseAudio C headers on a
12 // fair-use basis, as discussed in the overall project readme (available in the git repository).
13 
14 //! Error management.
15 
16 use std::os::raw::c_char;
17 use num_derive::{FromPrimitive, ToPrimitive};
18 
19 /// Error code.
20 ///
21 /// These represent the i32 error codes returned by many of the underlying PulseAudio C functions.
22 /// Beware, these enum values are positive values, whilst PA functions return them in negative form,
23 /// i.e. the `Invalid` variant here has a value of `3`, while functions returning this error code
24 /// return `-3`. (This is identical to the enum provided in the PA C API).
25 #[repr(C)]
26 #[derive(Debug, Copy, Clone, PartialEq, Eq)]
27 #[derive(FromPrimitive, ToPrimitive)]
28 #[allow(non_camel_case_types)]
29 pub enum pa_error_code_t {
30     /// No error.
31     Ok = 0,
32     /// Access failure.
33     Access,
34     /// Unknown command.
35     Command,
36     /// Invalid argument.
37     Invalid,
38     /// Entity exists.
39     Exist,
40     /// No such entity.
41     NoEntity,
42     /// Connection refused.
43     ConnectionRefused,
44     /// Protocol error.
45     Protocol,
46     Timeout,
47     /// No authentication key.
48     AuthKey,
49     Internal,
50     ConnectionTerminated,
51     /// Entity killed.
52     Killed,
53     InvalidServer,
54     ModInitFailed,
55     BadState,
56     NoData,
57     /// Incompatible protocol version.
58     Version,
59     /// Data too large.
60     TooLarge,
61     /// Operation not supported.
62     NotSupported,
63     /// The error code was unknown to the client.
64     Unknown,
65     /// Extension does not exist.
66     NoExtension,
67     /// Obsolete functionality.
68     Obsolete,
69     /// Missing implementation.
70     NotImplemented,
71     /// The caller forked without calling execve() and tried to reuse the context.
72     Forked,
73     /// An IO error happened.
74     IO,
75     /// Device or resource busy.
76     Busy,
77 }
78 
79 pub const PA_ERR_MAX: usize = 27;
80 
81 pub const PA_OK:                       pa_error_code_t = pa_error_code_t::Ok;
82 pub const PA_ERR_ACCESS:               pa_error_code_t = pa_error_code_t::Access;
83 pub const PA_ERR_COMMAND:              pa_error_code_t = pa_error_code_t::Command;
84 pub const PA_ERR_INVALID:              pa_error_code_t = pa_error_code_t::Invalid;
85 pub const PA_ERR_EXIST:                pa_error_code_t = pa_error_code_t::Exist;
86 pub const PA_ERR_NOENTITY:             pa_error_code_t = pa_error_code_t::NoEntity;
87 pub const PA_ERR_CONNECTIONREFUSED:    pa_error_code_t = pa_error_code_t::ConnectionRefused;
88 pub const PA_ERR_PROTOCOL:             pa_error_code_t = pa_error_code_t::Protocol;
89 pub const PA_ERR_TIMEOUT:              pa_error_code_t = pa_error_code_t::Timeout;
90 pub const PA_ERR_AUTHKEY:              pa_error_code_t = pa_error_code_t::AuthKey;
91 pub const PA_ERR_INTERNAL:             pa_error_code_t = pa_error_code_t::Internal;
92 pub const PA_ERR_CONNECTIONTERMINATED: pa_error_code_t = pa_error_code_t::ConnectionTerminated;
93 pub const PA_ERR_KILLED:               pa_error_code_t = pa_error_code_t::Killed;
94 pub const PA_ERR_INVALIDSERVER:        pa_error_code_t = pa_error_code_t::InvalidServer;
95 pub const PA_ERR_MODINITFAILED:        pa_error_code_t = pa_error_code_t::ModInitFailed;
96 pub const PA_ERR_BADSTATE:             pa_error_code_t = pa_error_code_t::BadState;
97 pub const PA_ERR_NODATA:               pa_error_code_t = pa_error_code_t::NoData;
98 pub const PA_ERR_VERSION:              pa_error_code_t = pa_error_code_t::Version;
99 pub const PA_ERR_TOOLARGE:             pa_error_code_t = pa_error_code_t::TooLarge;
100 pub const PA_ERR_NOTSUPPORTED:         pa_error_code_t = pa_error_code_t::NotSupported;
101 pub const PA_ERR_UNKNOWN:              pa_error_code_t = pa_error_code_t::Unknown;
102 pub const PA_ERR_NOEXTENSION:          pa_error_code_t = pa_error_code_t::NoExtension;
103 pub const PA_ERR_OBSOLETE:             pa_error_code_t = pa_error_code_t::Obsolete;
104 pub const PA_ERR_NOTIMPLEMENTED:       pa_error_code_t = pa_error_code_t::NotImplemented;
105 pub const PA_ERR_FORKED:               pa_error_code_t = pa_error_code_t::Forked;
106 pub const PA_ERR_IO:                   pa_error_code_t = pa_error_code_t::IO;
107 pub const PA_ERR_BUSY:                 pa_error_code_t = pa_error_code_t::Busy;
108 
109 #[link(name = "pulse")]
110 extern "C" {
pa_strerror(error: i32) -> *const c_char111     pub fn pa_strerror(error: i32) -> *const c_char;
112 }
113