libs/utils/include/celix_errno.h (47 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/*!
* \file
* \brief Error codes
* \defgroup framework Celix Framework
* \details Error code has 32bits. If the value of error code is 0,it indicates success;if no-zero,it indicates error.
* its internal structure as following,
*
* |31-30bit|29bit|28-27bit|26-16bit|15-0bit|
* |-------:|:---:|:------:|:------:|:------|
* |R |C |R |Facility|Code |
*
* - C (1bit): Customer. If set, indicates that the error code is customer-defined.
* If clear, indicates that the error code is celix-defines.
* - R : Reserved. It should be set to 0.
* - Facility (11 bits): An indicator of the source of the error.
* - Code (16bits): The remainder of error code.
*
* Errors from errno, such as ENOMEM, can be utilized as celix_status_t values and fall under to the
* CELIX_FACILITY_CERRNO (0) facility.
*/
#ifndef CELIX_ERRNO_H_
#define CELIX_ERRNO_H_
#include <stddef.h>
#include <errno.h>
#include <stdbool.h>
#include "celix_utils_export.h"
#ifdef __cplusplus
extern "C" {
#endif
/*!
* Helper macro which check the current status and executes the provided expression if the
* status is still CELIX_SUCCESS (0)
*/
#define CELIX_DO_IF(status, expr) ((status) == CELIX_SUCCESS) ? (expr) : (status)
/*!
* Helper macro which check the current status and executes a goto the provided label if the
* status is not CELIX_SUCCESS (0)
*/
#define CELIX_GOTO_IF_ERR(status, label) \
do { \
if ((status) != CELIX_SUCCESS) { \
goto label; \
} \
} while (0)
/*!
* Status type returned by all functions in Celix
*/
typedef int celix_status_t;
/**
* Return a readable string for the given status code.
*/
CELIX_UTILS_EXPORT const char* celix_strerror(celix_status_t status);
/**
* @brief Check if a provided celix_status_t is from a specific facility.
* @param[in] code The status code to check.
* @param[in] fac The facility to check against.
* @return true if the status is from the provided facility, false otherwise.
*/
CELIX_UTILS_EXPORT bool celix_utils_isStatusCodeFromFacility(celix_status_t code, int fac);
/**
* @brief Check if a provided celix_status_t is a customer error code.
* @param[in] code The status code to check.
* @return true if the status is a customer error code, false otherwise.
*/
CELIX_UTILS_EXPORT bool celix_utils_isCustomerStatusCode(celix_status_t code);
/*!
* Customer error code mask
*
*/
#define CELIX_CUSTOMER_ERR_MASK 0x20000000
/*!
* The facility of C errno,
* \note Error code 0 indicates success,it is not C errno.
*/
#define CELIX_FACILITY_CERRNO 0
/*!
* The facility of celix default error code
*
*/
#define CELIX_FACILITY_FRAMEWORK 1
/*!
* The facility of the http status error code
* @see https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
*
*/
#define CELIX_FACILITY_HTTP 2
/*!
* The facility of the libzip error code
*
*/
#define CELIX_FACILITY_ZIP 3
/*!
* The facility of the libcurl error code
*
*/
#define CELIX_FACILITY_CURL 4
/*!
* Make the error code accroding to the specification
* \param fac Facility
* \param code Code
*/
#define CELIX_ERROR_MAKE(fac,code) (((fac)<<16) | ((code)&0xFFFF))
/*!
* Make the customer error code
* \param usrFac Facility value of customer error code.It is defined by customer
* \param usrCode Code value of customer error codes.It is defined by customer
*/
#define CELIX_CUSTOMER_ERROR_MAKE(usrFac,usrCode) (CELIX_CUSTOMER_ERR_MASK | (((usrFac)&0x7FF)<<16) | ((usrCode)&0xFFFF))
/*!
* Error code indicating successful execution of the function.
*/
#define CELIX_SUCCESS 0
/*!
* Starting point for Celix errors.
*/
#define CELIX_START_ERROR 70000
/*!
* The range for Celix errors.
* \deprecated It is recommended to use facility indicate the range of error codes
*/
#define CELIX_ERRSPACE_SIZE 1000
/*!
* The start error number user application can use.
* \deprecated It is recommended to use CELIX_CUSTOMER_ERR_MASK to define user error number
*/
#define CELIX_START_USERERR (CELIX_START_ERROR + CELIX_ERRSPACE_SIZE)
/*!
* @name celix default error codes
* @{
*/
/*!
* Exception indicating a problem with a bundle
*/
#define CELIX_BUNDLE_EXCEPTION CELIX_ERROR_MAKE(CELIX_FACILITY_FRAMEWORK, 4465)
/*!
* Invalid bundle context is used
*/
#define CELIX_INVALID_BUNDLE_CONTEXT CELIX_ERROR_MAKE(CELIX_FACILITY_FRAMEWORK, 4466)
/*!
* Argument is not correct
*/
#define CELIX_ILLEGAL_ARGUMENT CELIX_ERROR_MAKE(CELIX_FACILITY_FRAMEWORK, 4467)
#define CELIX_INVALID_SYNTAX CELIX_ERROR_MAKE(CELIX_FACILITY_FRAMEWORK, 4468)
#define CELIX_FRAMEWORK_SHUTDOWN CELIX_ERROR_MAKE(CELIX_FACILITY_FRAMEWORK, 4469)
#define CELIX_ILLEGAL_STATE CELIX_ERROR_MAKE(CELIX_FACILITY_FRAMEWORK, 4470)
#define CELIX_FRAMEWORK_EXCEPTION CELIX_ERROR_MAKE(CELIX_FACILITY_FRAMEWORK, 4471)
#define CELIX_FILE_IO_EXCEPTION CELIX_ERROR_MAKE(CELIX_FACILITY_FRAMEWORK, 4472)
#define CELIX_SERVICE_EXCEPTION CELIX_ERROR_MAKE(CELIX_FACILITY_FRAMEWORK, 4473)
/*!
* Exception indicating a problem with a interceptor
*/
#define CELIX_INTERCEPTOR_EXCEPTION CELIX_ERROR_MAKE(CELIX_FACILITY_FRAMEWORK, 4474)
/*! @} *///celix default error codes
/*!
* @name C error map to celix
* @deprecated It is recommended to use the C errno errors directly (e.g. ENOMEM instead of CELIX_ENOMEM)
* @{
*/
#define CELIX_ENOMEM CELIX_ERROR_MAKE(CELIX_FACILITY_CERRNO,ENOMEM)
/*! @}*///C error map to celix
/**
* \}
*/
#ifdef __cplusplus
}
#endif
#endif /* CELIX_ERRNO_H_ */