Twitch SDK (Internal)
errortypes.h
Go to the documentation of this file.
1 /********************************************************************************************
2 * Twitch Broadcasting SDK
3 *
4 * This software is supplied under the terms of a license agreement with Twitch Interactive, Inc. and
5 * may not be copied or used except in accordance with the terms of that agreement
6 * Copyright (c) 2012-2016 Twitch Interactive, Inc.
7 *********************************************************************************************/
8 
9 #pragma once
10 
13 #include <functional>
14 #include <vector>
15 
19 const uint32_t TTV_MODULE_ID_TWITCH_CORE = 0;
20 
30 typedef uint32_t TTV_ErrorCode;
31 
32 const uint32_t kErrorModuleIdMask = 0x7FFF;
33 const uint32_t kErrorIdMask = 0xFFFF;
34 const uint32_t kErrorFlagMask = 0x80000000;
35 
39 #define CONSTRUCT_ERROR_ID_VALUE(MODULE_ID, ERROR_ID) ( (1U << 31) | ( (MODULE_ID & kErrorModuleIdMask) << 16) | (ERROR_ID & kErrorIdMask) )
40 
44 #define CONSTRUCT_WARNING_ID_VALUE(MODULE_ID, ERROR_ID) ( (0U << 31) | ( (MODULE_ID & kErrorModuleIdMask) << 16) | (ERROR_ID & kErrorIdMask) )
45 
49 #define GET_MODULE_ID(ec) ( (ec >> 16) & kErrorModuleIdMask )
50 
54 #define GET_ERROR_ID(ec) ( ec & kErrorIdMask )
55 
56 
57 namespace ttv
58 {
59  struct EnumValue;
60 
64  typedef const char* (*ErrorToStringFunction) (TTV_ErrorCode ec);
68  typedef void (*ErrorCodeValueFunction) (std::vector<EnumValue>& result);
85 }
86 
87 
88 #define TTV_CORE_ERROR_IDS\
89  /* Warnings */\
90  BEGIN_WARNING_IDS(TTV_WRN_BEGIN_WARNINGS)\
91  USE_TTV_WARNING_ID(TTV_WRN_MUTEX_LOCKED)\
92  USE_TTV_WARNING_ID(TTV_WRN_NOTENOUGHDATA)\
93  USE_TTV_WARNING_ID(TTV_WRN_MUTEX_NOT_ACQUIRED)\
94  USE_TTV_WARNING_ID(TTV_WRN_CONDITION_WAIT_FAILED)\
95  USE_TTV_WARNING_ID(TTV_WRN_DEPRECATED)\
96  USE_TTV_WARNING_ID(TTV_WRN_WAIT_TIMEOUT) \
97  USE_TTV_WARNING_ID(TTV_WRN_OAUTH_SCOPES_MISSING)\
98  END_WARNING_IDS(TTV_WRN_END_WARNINGS)\
99  \
100  /* Success */\
101  USE_TTV_SUCCESS_ID(TTV_EC_SUCCESS)\
102  \
103  /* Errors */\
104  BEGIN_ERROR_IDS(TTV_EC_BEGIN_ERRORS)\
105  USE_TTV_ERROR_ID(TTV_EC_UNKNOWN_ERROR)\
106  USE_TTV_ERROR_ID(TTV_EC_CANNOT_OPEN_FILE)\
107  USE_TTV_ERROR_ID(TTV_EC_ALREADY_INITIALIZED)\
108  USE_TTV_ERROR_ID(TTV_EC_CANNOT_WRITE_TO_FILE)\
109  USE_TTV_ERROR_ID(TTV_EC_CANNOT_CREATE_MUTEX)\
110  USE_TTV_ERROR_ID(TTV_EC_CANNOT_DESTROY_MUTEX)\
111  USE_TTV_ERROR_ID(TTV_EC_COULD_NOT_TAKE_MUTEX)\
112  USE_TTV_ERROR_ID(TTV_EC_COULD_NOT_RELEASE_MUTEX)\
113  USE_TTV_ERROR_ID(TTV_EC_INVALID_MUTEX)\
114  USE_TTV_ERROR_ID(TTV_EC_WAIT_TIMED_OUT)\
115  USE_TTV_ERROR_ID(TTV_EC_INVALID_ARG)\
116  USE_TTV_ERROR_ID(TTV_EC_INVALID_FORMAT)\
117  USE_TTV_ERROR_ID(TTV_EC_NOT_INITIALIZED)\
118  USE_TTV_ERROR_ID(TTV_EC_AUTHENTICATION)\
119  USE_TTV_ERROR_ID(TTV_EC_FORBIDDEN)\
120  USE_TTV_ERROR_ID(TTV_EC_OAUTHTOKEN_MISSING_SCOPES)\
121  USE_TTV_ERROR_ID(TTV_EC_INVALID_OAUTHTOKEN)\
122  USE_TTV_ERROR_ID(TTV_EC_USERINFO_NOT_AVAILABLE)\
123  USE_TTV_ERROR_ID(TTV_EC_NOT_AVAILABLE)\
124  USE_TTV_ERROR_ID(TTV_EC_PARAMETERS_CHANGED)\
125  USE_TTV_ERROR_ID(TTV_EC_MEMORY)\
126  USE_TTV_ERROR_ID(TTV_EC_ALIGN16_REQUIRED)\
127  USE_TTV_ERROR_ID(TTV_EC_HTTPREQUEST_ERROR)\
128  USE_TTV_ERROR_ID(TTV_EC_RATE_LIMITED)\
129  USE_TTV_ERROR_ID(TTV_EC_NO_FACTORIES_REGISTERED)\
130  USE_TTV_ERROR_ID(TTV_EC_INVALID_CLIENTID)\
131  USE_TTV_ERROR_ID(TTV_EC_INVALID_CHANNEL_ID)\
132  USE_TTV_ERROR_ID(TTV_EC_API_REQUEST_FAILED)\
133  USE_TTV_ERROR_ID(TTV_EC_API_REQUEST_TIMEDOUT)\
134  USE_TTV_ERROR_ID(TTV_EC_INVALID_HTTP_REQUEST_PARAMS)\
135  USE_TTV_ERROR_ID(TTV_EC_COINITIALIZE_FAIED)\
136  USE_TTV_ERROR_ID(TTV_EC_WEBAPI_RESULT_INVALID_JSON)\
137  USE_TTV_ERROR_ID(TTV_EC_WEBAPI_RESULT_NO_AUTHTOKEN)\
138  USE_TTV_ERROR_ID(TTV_EC_WEBAPI_RESULT_NO_STREAMKEY)\
139  USE_TTV_ERROR_ID(TTV_EC_WEBAPI_RESULT_NO_CHANNELNAME)\
140  USE_TTV_ERROR_ID(TTV_EC_WEBAPI_RESULT_NO_INGESTS)\
141  USE_TTV_ERROR_ID(TTV_EC_WEBAPI_RESULT_NO_RECORDING_STATUS)\
142  USE_TTV_ERROR_ID(TTV_EC_WEBAPI_RESULT_NO_STREAMINFO)\
143  USE_TTV_ERROR_ID(TTV_EC_WEBAPI_RESULT_INVALID_VIEWERS)\
144  USE_TTV_ERROR_ID(TTV_EC_WEBAPI_RESULT_NO_USERNAME)\
145  USE_TTV_ERROR_ID(TTV_EC_WEBAPI_RESULT_NO_USER_DISPLAY_NAME)\
146  USE_TTV_ERROR_ID(TTV_EC_NEED_TO_LOGIN)\
147  USE_TTV_ERROR_ID(TTV_EC_INVALID_LOGIN) \
148  USE_TTV_ERROR_ID(TTV_EC_INVALID_USERID) \
149  USE_TTV_ERROR_ID(TTV_EC_INVALID_BUFFER)\
150  USE_TTV_ERROR_ID(TTV_EC_INVALID_CALLBACK)\
151  USE_TTV_ERROR_ID(TTV_EC_INVALID_JSON)\
152  USE_TTV_ERROR_ID(TTV_EC_INVALID_STATE)\
153  USE_TTV_ERROR_ID(TTV_EC_CANNOT_SUSPEND_THREADSYNC)\
154  USE_TTV_ERROR_ID(TTV_EC_CANNOT_SIGNAL_THREADSYNC)\
155  USE_TTV_ERROR_ID(TTV_EC_REQUEST_TIMEDOUT)\
156  USE_TTV_ERROR_ID(TTV_EC_REQUEST_PENDING)\
157  /*****************************/\
158  USE_TTV_ERROR_ID(TTV_EC_OS_TOO_OLD)\
159  USE_TTV_ERROR_ID(TTV_EC_SHUTTING_DOWN)\
160  USE_TTV_ERROR_ID(TTV_EC_SHUT_DOWN)\
161  USE_TTV_ERROR_ID(TTV_EC_UNIMPLEMENTED)\
162  USE_TTV_ERROR_ID(TTV_EC_ALREADY_LOGGED_IN)\
163  USE_TTV_ERROR_ID(TTV_EC_ALREADY_CACHED)\
164  USE_TTV_ERROR_ID(TTV_EC_FEATURE_DISABLED)\
165  USE_TTV_ERROR_ID(TTV_EC_UNSUPPORTED)\
166  USE_TTV_ERROR_ID(TTV_EC_INVALID_INSTANCE)\
167  /* Socket errors */\
168  USE_TTV_ERROR_ID(TTV_EC_SOCKET_EWOULDBLOCK)\
169  USE_TTV_ERROR_ID(TTV_EC_SOCKET_ENOTCONN)\
170  USE_TTV_ERROR_ID(TTV_EC_SOCKET_TRY_AGAIN)\
171  USE_TTV_ERROR_ID(TTV_EC_SOCKET_CONNECT_FAILED)\
172  USE_TTV_ERROR_ID(TTV_EC_SOCKET_ECONNABORTED)\
173  USE_TTV_ERROR_ID(TTV_EC_SOCKET_EALREADY)\
174  USE_TTV_ERROR_ID(TTV_EC_SOCKET_CREATE_FAILED)\
175  USE_TTV_ERROR_ID(TTV_EC_SOCKET_GETADDRINFO_FAILED)\
176  USE_TTV_ERROR_ID(TTV_EC_SOCKET_HOST_NOT_FOUND)\
177  USE_TTV_ERROR_ID(TTV_EC_SOCKET_RECV_ERROR)\
178  USE_TTV_ERROR_ID(TTV_EC_SOCKET_SEND_ERROR)\
179  USE_TTV_ERROR_ID(TTV_EC_SOCKET_IOCTL_ERROR)\
180  USE_TTV_ERROR_ID(TTV_EC_SOCKET_ETIMEDOUT)\
181  USE_TTV_ERROR_ID(TTV_EC_SOCKET_ECONNRESET)\
182  USE_TTV_ERROR_ID(TTV_EC_SOCKET_ERR)\
183  /*****************************/\
184  USE_TTV_ERROR_ID(TTV_EC_PUBSUB_BAD_TOPIC)\
185  USE_TTV_ERROR_ID(TTV_EC_PUBSUB_BAD_MESSAGE)\
186  USE_TTV_ERROR_ID(TTV_EC_PUBSUB_SERVER_INTERNAL_ERROR)\
187  USE_TTV_ERROR_ID(TTV_EC_PUBSUB_RESPONSE_ERROR)\
188  /*****************************/\
189  USE_TTV_ERROR_ID(TTV_EC_PROFILEIMAGE_IMAGE_VALIDATION_FAILED)\
190  USE_TTV_ERROR_ID(TTV_EC_PROFILEIMAGE_FORMAT_VALIDATION_FAILED)\
191  USE_TTV_ERROR_ID(TTV_EC_PROFILEIMAGE_SIZE_VALIDATION_FAILED)\
192  USE_TTV_ERROR_ID(TTV_EC_PROFILEIMAGE_BACKEND_FAILURE)\
193  /*****************************/\
194  USE_TTV_ERROR_ID(TTV_EC_GRAPHQL_ERROR)\
195  \
196  USE_TTV_ERROR_ID(TTV_EC_INVALID_STRUCT_SIZE) \
197  USE_TTV_ERROR_ID(TTV_EC_REQUEST_ABORTED) \
198  USE_TTV_ERROR_ID(TTV_EC_STILL_IN_USE) \
199  END_ERROR_IDS(TTV_EC_END_ERRORS)\
200 
201 #define USE_TTV_ERROR_ID(ec) ec,
202 #define USE_TTV_WARNING_ID(ec) ec,
203 #define USE_TTV_SUCCESS_ID(ec) ec = 0,
204 #define BEGIN_WARNING_IDS(ec) ec = CONSTRUCT_WARNING_ID_VALUE(TTV_MODULE_ID_TWITCH_CORE, (1 << 12)),
205 #define END_WARNING_IDS(ec) ec,
206 #define BEGIN_ERROR_IDS(ec) ec = CONSTRUCT_ERROR_ID_VALUE(TTV_MODULE_ID_TWITCH_CORE, 1),
207 #define END_ERROR_IDS(ec) ec
208 
212 typedef enum
213 {
215 
217 
218 #undef BEGIN_ERROR_IDS
219 #undef END_ERROR_IDS
220 #undef BEGIN_WARNING_IDS
221 #undef END_WARNING_IDS
222 #undef USE_TTV_SUCCESS_ID
223 #undef USE_TTV_WARNING_ID
224 #undef USE_TTV_ERROR_ID
225 
226 
230 #define TTV_SUCCEEDED(ec) ( (ec & kErrorFlagMask) == 0 )
231 
234 #define TTV_FAILED(ec) ( (ec & kErrorFlagMask) != 0 )
235 
238 #define ASSERT_ON_ERROR(ec) { assert ( TTV_SUCCEEDED(ec) ); }
239 #define RETURN_CLIENT_ERROR(ec) { return ec; }
240 #define TTV_RETURN_ON_NULL(ptr, ec) { if ( (ptr) == nullptr) RETURN_CLIENT_ERROR(ec); }
241 #define TTV_RETURN_ON_NOT_NULL(ptr, ec) { if ( (ptr) != nullptr) RETURN_CLIENT_ERROR(ec); }
242 #define TTV_RETURN_ON_EMPTY_STRING(str, ec) { if (str == nullptr || str[0] == '\0') RETURN_CLIENT_ERROR(ec); }
243 #define TTV_RETURN_ON_EMPTY_STDSTRING(str, ec) { if (str.size() == 0) RETURN_CLIENT_ERROR(ec); }
244 #define TTV_RETURN_ON_ERROR(err) { if (TTV_FAILED(ec)) RETURN_CLIENT_ERROR(ec); }
245 #define TTV_RETURN_ON_DIFFERENT(a, b, ec) { if ( (a) != (b) ) RETURN_CLIENT_ERROR(ec); }
246 #define TTV_RETURN_ON_SAME(a, b, ec) { if ( (a) == (b) ) RETURN_CLIENT_ERROR(ec); }
247 
248 
249 namespace ttv
250 {
254  const char* ErrorToString(TTV_ErrorCode ec);
255 
259  const char* CoreErrorToString(TTV_ErrorCode ec);
260 
261  void GetCoreErrorCodeValues(std::vector<EnumValue>& result);
262 
263  void GetAllErrorCodes(std::vector<EnumValue>& result);
264 }
265 
266 
268 {
269  std::string name;
270  uint32_t value;
271 
272  EnumValue(const char* name, uint32_t value);
273 };
274 
#define TTV_CORE_ERROR_IDS
Definition: errortypes.h:88
void UnregisterErrorToStringFunction(ErrorToStringFunction func)
void GetAllErrorCodes(std::vector< EnumValue > &result)
void RegisterErrorCodeValueFunction(ErrorCodeValueFunction func)
EnumValue(const char *name, uint32_t value)
Definition: errortypes.h:267
uint32_t value
Definition: errortypes.h:270
const char * CoreErrorToString(TTV_ErrorCode ec)
void GetCoreErrorCodeValues(std::vector< EnumValue > &result)
JSON (JavaScript Object Notation).
Definition: adsapi.h:16
const uint32_t kErrorModuleIdMask
Definition: errortypes.h:32
const char * ErrorToString(TTV_ErrorCode ec)
uint32_t TTV_ErrorCode
Definition: errortypes.h:30
const uint32_t TTV_MODULE_ID_TWITCH_CORE
Definition: errortypes.h:19
void RegisterErrorToStringFunction(ErrorToStringFunction func)
TTV_CoreErrorId
Definition: errortypes.h:212
void UnregisterErrorCodeValueFunction(ErrorCodeValueFunction func)
void(* ErrorCodeValueFunction)(std::vector< EnumValue > &result)
Definition: errortypes.h:68
const uint32_t kErrorIdMask
Definition: errortypes.h:33
const char *(* ErrorToStringFunction)(TTV_ErrorCode ec)
Definition: errortypes.h:64
const uint32_t kErrorFlagMask
Definition: errortypes.h:34
std::string name
Definition: errortypes.h:269