haproxy/addons/51degrees/dummy/v4hash/hash/hash.h

278 lines
8.6 KiB
C

/* *********************************************************************
* This Original Work is copyright of 51 Degrees Mobile Experts Limited.
* Copyright 2022 51 Degrees Mobile Experts Limited, Davidson House,
* Forbury Square, Reading, Berkshire, United Kingdom RG1 3EU.
*
* This Original Work is the subject of the following patents and patent
* applications, owned by 51 Degrees Mobile Experts Limited of 5 Charlotte
* Close, Caversham, Reading, Berkshire, United Kingdom RG4 7BY:
* European Patent No. 3438848; and
* United States Patent No. 10,482,175.
*
* This Original Work is licensed under the European Union Public Licence
* (EUPL) v.1.2 and is subject to its terms as set out below.
*
* If a copy of the EUPL was not distributed with this file, You can obtain
* one at https://opensource.org/licenses/EUPL-1.2.
*
* The 'Compatible Licences' set out in the Appendix to the EUPL (as may be
* amended by the European Commission) shall be deemed incompatible for
* the purposes of the Work and the provisions of the compatibility
* clause in Article 5 of the EUPL shall not apply.
*
* If using the Work as, or as part of, a network application, by
* including the attribution notice(s) required under Article 5 of the EUPL
* in the end user terms of the application under an appropriate heading,
* such notice(s) shall fulfill the requirements of that article.
* ********************************************************************* */
/* *********************************************************************
* Dummy library for HAProxy. This does not function, and is designed
* solely for HAProxy testing purposes.
* *********************************************************************/
#ifndef FIFTYONE_DEGREES_HASH_INCLUDED
#define FIFTYONE_DEGREES_HASH_INCLUDED
#ifndef FIFTYONEDEGREES_DUMMY_LIB
#define FIFTYONEDEGREES_DUMMY_LIB
#endif
#include <stdlib.h>
#include <inttypes.h>
typedef int bool;
enum { false, true };
typedef unsigned char byte;
typedef enum e_fiftyone_degrees_status_code {
FIFTYONE_DEGREES_STATUS_SUCCESS,
FIFTYONE_DEGREES_STATUS_NOT_SET,
} fiftyoneDegreesStatusCode;
typedef struct fiftyone_degrees_exception_t {
unsigned int status;
} fiftyoneDegreesException;
#define FIFTYONE_DEGREES_EXCEPTION_CLEAR \
exception->status = FIFTYONE_DEGREES_STATUS_NOT_SET;
#define FIFTYONE_DEGREES_EXCEPTION_OKAY \
(exception == NULL || exception->status == FIFTYONE_DEGREES_STATUS_NOT_SET)
#define FIFTYONE_DEGREES_EXCEPTION_FAILED \
(!FIFTYONE_DEGREES_EXCEPTION_OKAY)
#define FIFTYONE_DEGREES_EXCEPTION_CREATE \
fiftyoneDegreesException exceptionValue; \
fiftyoneDegreesException *exception = &exceptionValue; \
FIFTYONE_DEGREES_EXCEPTION_CLEAR
#define FIFTYONE_DEGREES_ARRAY_TYPE(t, m) \
typedef struct fiftyone_degrees_array_##t##_t { \
uint32_t count; \
uint32_t capacity; \
t *items; \
m \
} t##Array;
typedef struct fiftyone_degrees_results_base_t {
void *dataSet;
} fiftyoneDegreesResultsBase;
typedef struct fiftyone_degrees_results_device_detection_t {
fiftyoneDegreesResultsBase b;
} fiftyoneDegreesResultsDeviceDetection;
typedef struct fiftyone_degrees_collection_item_t {
} fiftyoneDegreesCollectionItem;
typedef struct fiftyone_degrees_list_t {
} fiftyoneDegreesList;
typedef struct fiftyone_degrees_evidence_key_value_pair_t {
} fiftyoneDegreesEvidenceKeyValuePair;
#define EVIDENCE_KEY_VALUE_MEMBERS \
struct fiftyone_degrees_array_fiftyoneDegreesEvidenceKeyValuePair_t* pseudoEvidence;
FIFTYONE_DEGREES_ARRAY_TYPE(
fiftyoneDegreesEvidenceKeyValuePair,
EVIDENCE_KEY_VALUE_MEMBERS)
#define FIFTYONE_DEGREES_RESULTS_HASH_MEMBERS \
fiftyoneDegreesResultsDeviceDetection b; \
fiftyoneDegreesCollectionItem propertyItem; \
fiftyoneDegreesList values; \
fiftyoneDegreesEvidenceKeyValuePairArray* pseudoEvidence;
typedef struct fiftyone_degrees_result_hash_t {
} fiftyoneDegreesResultHash;
FIFTYONE_DEGREES_ARRAY_TYPE(
fiftyoneDegreesResultHash,
FIFTYONE_DEGREES_RESULTS_HASH_MEMBERS)
typedef fiftyoneDegreesResultHashArray fiftyoneDegreesResultsHash;
typedef struct fiftyone_degrees_resource_manager_t {
} fiftyoneDegreesResourceManager;
typedef struct fiftyone_degrees_header_t {
const char* name;
size_t nameLength;
} fiftyoneDegreesHeader;
#define FIFTYONE_DEGREES_HEADERS_MEMBERS \
bool expectUpperPrefixedHeaders; \
uint32_t pseudoHeadersCount;
FIFTYONE_DEGREES_ARRAY_TYPE(
fiftyoneDegreesHeader,
FIFTYONE_DEGREES_HEADERS_MEMBERS);
typedef fiftyoneDegreesHeaderArray fiftyoneDegreesHeaders;
typedef struct fiftyone_degrees_dataset_base_t {
fiftyoneDegreesHeaders *uniqueHeaders;
} fiftyoneDegreesDataSetBase;
typedef struct fiftyone_degrees_dataset_device_detection_t {
fiftyoneDegreesDataSetBase b;
} fiftyoneDegreesDataSetDeviceDetection;
typedef struct fiftyone_degrees_dataset_hash_t {
fiftyoneDegreesDataSetDeviceDetection b;
} fiftyoneDegreesDataSetHash;
typedef enum e_fiftyone_degrees_evidence_prefix {
FIFTYONE_DEGREES_EVIDENCE_HTTP_HEADER_STRING = 1 << 0,
FIFTYONE_DEGREES_EVIDENCE_HTTP_HEADER_IP_ADDRESSES = 1 << 1,
FIFTYONE_DEGREES_EVIDENCE_SERVER = 1 << 2,
FIFTYONE_DEGREES_EVIDENCE_QUERY = 1 << 3,
FIFTYONE_DEGREES_EVIDENCE_COOKIE = 1 << 4,
FIFTYONE_DEGREES_EVIDENCE_IGNORE = 1 << 7,
} fiftyoneDegreesEvidencePrefix;
typedef struct fiftyone_degrees_config_base_t {
bool freeData;
} fiftyoneDegreesConfigBase;
typedef struct fiftyone_degrees_config_device_detecton_t {
fiftyoneDegreesConfigBase b;
bool allowUnmatched;
} fiftyoneDegreesConfigDeviceDetection;
typedef struct fiftyone_degrees_collection_config_t {
uint16_t concurrency;
} fiftyoneDegreesCollectionConfig;
typedef struct fiftyone_degrees_config_hash_t {
fiftyoneDegreesConfigDeviceDetection b;
fiftyoneDegreesCollectionConfig strings;
fiftyoneDegreesCollectionConfig components;
fiftyoneDegreesCollectionConfig maps;
fiftyoneDegreesCollectionConfig properties;
fiftyoneDegreesCollectionConfig values;
fiftyoneDegreesCollectionConfig profiles;
fiftyoneDegreesCollectionConfig rootNodes;
fiftyoneDegreesCollectionConfig nodes;
fiftyoneDegreesCollectionConfig profileOffsets;
int32_t difference;
int32_t drift;
bool usePerformanceGraph;
bool usePredictiveGraph;
} fiftyoneDegreesConfigHash;
extern fiftyoneDegreesConfigHash fiftyoneDegreesHashInMemoryConfig;
typedef struct fiftyone_degrees_property_available_t {
} fiftyoneDegreesPropertyAvailable;
FIFTYONE_DEGREES_ARRAY_TYPE(fiftyoneDegreesPropertyAvailable,)
typedef fiftyoneDegreesPropertyAvailableArray fiftyoneDegreesPropertiesAvailable;
typedef struct fiftyone_degrees_properties_required_t {
const char **array;
int count;
const char *string;
fiftyoneDegreesPropertiesAvailable *existing;
} fiftyoneDegreesPropertiesRequired;
extern fiftyoneDegreesPropertiesRequired fiftyoneDegreesPropertiesDefault;
typedef struct fiftyone_degrees_memory_reader_t {
byte *startByte;
byte *current;
byte *lastByte;
long length;
} fiftyoneDegreesMemoryReader;
fiftyoneDegreesDataSetBase* fiftyoneDegreesDataSetGet(
fiftyoneDegreesResourceManager *manager);
void fiftyoneDegreesResultsHashFree(
fiftyoneDegreesResultsHash* results);
fiftyoneDegreesResultsHash* fiftyoneDegreesResultsHashCreate(
fiftyoneDegreesResourceManager *manager,
uint32_t userAgentCapacity,
uint32_t overridesCapacity);
void fiftyoneDegreesDataSetRelease(fiftyoneDegreesDataSetBase *dataSet);
fiftyoneDegreesEvidenceKeyValuePairArray* fiftyoneDegreesEvidenceCreate(uint32_t capacity);
fiftyoneDegreesEvidenceKeyValuePair* fiftyoneDegreesEvidenceAddString(
fiftyoneDegreesEvidenceKeyValuePairArray *evidence,
fiftyoneDegreesEvidencePrefix prefix,
const char *field,
const char *originalValue);
size_t fiftyoneDegreesResultsHashGetValuesString(
fiftyoneDegreesResultsHash* results,
const char *propertyName,
char *buffer,
size_t bufferLength,
const char *separator,
fiftyoneDegreesException *exception);
void fiftyoneDegreesResultsHashFromEvidence(
fiftyoneDegreesResultsHash *results,
fiftyoneDegreesEvidenceKeyValuePairArray *evidence,
fiftyoneDegreesException *exception);
void fiftyoneDegreesEvidenceFree(fiftyoneDegreesEvidenceKeyValuePairArray *evidence);
void fiftyoneDegreesResultsHashFromUserAgent(
fiftyoneDegreesResultsHash *results,
const char* userAgent,
size_t userAgentLength,
fiftyoneDegreesException *exception);
fiftyoneDegreesStatusCode fiftyoneDegreesFileReadToByteArray(
const char *fileName,
fiftyoneDegreesMemoryReader *reader);
fiftyoneDegreesStatusCode
fiftyoneDegreesHashInitManagerFromMemory(
fiftyoneDegreesResourceManager *manager,
fiftyoneDegreesConfigHash *config,
fiftyoneDegreesPropertiesRequired *properties,
void *memory,
long size,
fiftyoneDegreesException *exception);
const char* fiftyoneDegreesStatusGetMessage(
fiftyoneDegreesStatusCode status,
const char *fileName);
#endif