51Degrees Device Detection C/C++  4.1

A device detection library that is used natively or by 51Degrees products

hash.h

1 /* *********************************************************************
2  * This Original Work is copyright of 51 Degrees Mobile Experts Limited.
3  * Copyright 2019 51 Degrees Mobile Experts Limited, 5 Charlotte Close,
4  * Caversham, Reading, Berkshire, United Kingdom RG4 7BY.
5  *
6  * This Original Work is the subject of the following patents and patent
7  * applications, owned by 51 Degrees Mobile Experts Limited of 5 Charlotte
8  * Close, Caversham, Reading, Berkshire, United Kingdom RG4 7BY:
9  * European Patent No. 3438848; and
10  * United States Patent No. 10,482,175.
11  *
12  * This Original Work is licensed under the European Union Public Licence (EUPL)
13  * v.1.2 and is subject to its terms as set out below.
14  *
15  * If a copy of the EUPL was not distributed with this file, You can obtain
16  * one at https://opensource.org/licenses/EUPL-1.2.
17  *
18  * The 'Compatible Licences' set out in the Appendix to the EUPL (as may be
19  * amended by the European Commission) shall be deemed incompatible for
20  * the purposes of the Work and the provisions of the compatibility
21  * clause in Article 5 of the EUPL shall not apply.
22  *
23  * If using the Work as, or as part of, a network application, by
24  * including the attribution notice(s) required under Article 5 of the EUPL
25  * in the end user terms of the application under an appropriate heading,
26  * such notice(s) shall fulfill the requirements of that article.
27  * ********************************************************************* */
28 
29 #ifndef FIFTYONE_DEGREES_HASH_INCLUDED
30 #define FIFTYONE_DEGREES_HASH_INCLUDED
31 
40 #if !defined(DEBUG) && !defined(_DEBUG) && !defined(NDEBUG)
41 #define NDEBUG
42 #endif
43 
44 #include <stdlib.h>
45 #include <stdio.h>
46 #include <string.h>
47 #include <limits.h>
48 #include <math.h>
49 #include <time.h>
50 #include <ctype.h>
51 #include <assert.h>
52 #ifdef _MSC_VER
53 #include <windows.h>
54 #endif
55 #include "../common-cxx/data.h"
56 #include "../common-cxx/exceptions.h"
57 #include "../common-cxx/threading.h"
58 #include "../common-cxx/file.h"
59 #include "../common-cxx/collection.h"
60 #include "../common-cxx/evidence.h"
61 #include "../common-cxx/list.h"
62 #include "../common-cxx/resource.h"
63 #include "../common-cxx/properties.h"
64 #include "../common-cxx/status.h"
65 #include "../common-cxx/date.h"
66 #include "../common-cxx/pool.h"
67 #include "../common-cxx/component.h"
68 #include "../common-cxx/property.h"
69 #include "../common-cxx/value.h"
70 #include "../common-cxx/profile.h"
71 #include "../common-cxx/overrides.h"
72 #include "../config-dd.h"
73 #include "../dataset-dd.h"
74 #include "../results-dd.h"
75 #include "graph.h"
76 
78 #ifndef FIFTYONE_DEGREES_CACHE_CONCURRENCY
79 #ifndef FIFTYONE_DEGREES_NO_THREADING
80 #define FIFTYONE_DEGREES_CACHE_CONCURRENCY 10
81 #else
82 #define FIFTYONE_DEGREES_CACHE_CONCURRENCY 1
83 #endif
84 #endif
85 
89 #ifndef FIFTYONE_DEGREES_HASH_DIFFERENCE
90 #define FIFTYONE_DEGREES_HASH_DIFFERENCE 0
91 #endif
92 
96 #ifndef FIFTYONE_DEGREES_HASH_DRIFT
97 #define FIFTYONE_DEGREES_HASH_DRIFT 0
98 #endif
99 
104 #ifndef FIFTYONE_DEGREES_STRING_CACHE_SIZE
105 #define FIFTYONE_DEGREES_STRING_CACHE_SIZE 10000
106 #endif
107 
111 #ifndef FIFTYONE_DEGREES_STRING_LOADED
112 #define FIFTYONE_DEGREES_STRING_LOADED 100
113 #endif
114 
118 #ifndef FIFTYONE_DEGREES_NODE_CACHE_SIZE
119 #define FIFTYONE_DEGREES_NODE_CACHE_SIZE 50000
120 #endif
121 
125 #ifndef FIFTYONE_DEGREES_NODE_LOADED
126 #define FIFTYONE_DEGREES_NODE_LOADED 100
127 #endif
128 
132 #ifndef FIFTYONE_DEGREES_PROFILE_CACHE_SIZE
133 #define FIFTYONE_DEGREES_PROFILE_CACHE_SIZE 10000
134 #endif
135 
139 #ifndef FIFTYONE_DEGREES_PROFILE_LOADED
140 #define FIFTYONE_DEGREES_PROFILE_LOADED 100
141 #endif
142 
146 #ifndef FIFTYONE_DEGREES_VALUE_CACHE_SIZE
147 #define FIFTYONE_DEGREES_VALUE_CACHE_SIZE 500
148 #endif
149 
153 #ifndef FIFTYONE_DEGREES_VALUE_LOADED
154 #define FIFTYONE_DEGREES_VALUE_LOADED 0
155 #endif
156 
160 #ifndef FIFTYONE_DEGREES_PROPERTY_CACHE_SIZE
161 #define FIFTYONE_DEGREES_PROPERTY_CACHE_SIZE 0
162 #endif
163 
167 #ifndef FIFTYONE_DEGREES_PROPERTY_LOADED
168 #define FIFTYONE_DEGREES_PROPERTY_LOADED INT_MAX
169 #endif
170 
179 typedef enum e_fiftyone_degrees_hash_match_method {
180  FIFTYONE_DEGREES_HASH_MATCH_METHOD_NONE,
181  FIFTYONE_DEGREES_HASH_MATCH_METHOD_PERFORMANCE,
182  FIFTYONE_DEGREES_HASH_MATCH_METHOD_COMBINED,
183  FIFTYONE_DEGREES_HASH_MATCH_METHOD_PREDICTIVE,
186 
188 #pragma pack(push, 1)
189 typedef struct fiftyoneDegrees_hash_dataset_header_t {
190  const int32_t versionMajor;
191  const int32_t versionMinor;
192  const int32_t versionBuild;
193  const int32_t versionRevision;
195  const byte tag[16];
196  const byte exportTag[16];
197  const int32_t copyrightOffset;
199  const int16_t age;
200  const int32_t minUserAgentCount;
202  const int32_t nameOffset;
204  const int32_t formatOffset;
232 #pragma pack(pop)
233 
239 typedef struct fiftyone_degrees_config_hash_t {
254  int32_t difference;
258  int32_t drift;
265  bool traceRoute;
270 
275 typedef struct fiftyone_degrees_hash_rootnodes_t {
281 
291 typedef struct fiftyone_degrees_dataset_hash_t {
312 
314 typedef struct fiftyone_degrees_result_hash_t fiftyoneDegreesResultHash;
322 typedef struct fiftyone_degrees_result_hash_t {
324  uint32_t *profileOffsets;
331  int32_t iterations;
333  int32_t difference;
335  int32_t drift;
337  int32_t matchedNodes;
345 
349 #define FIFTYONE_DEGREES_RESULTS_HASH_MEMBERS \
350  fiftyoneDegreesResultsDeviceDetection b; \
351  fiftyoneDegreesCollectionItem propertyItem; \
353  fiftyoneDegreesList values;
356 FIFTYONE_DEGREES_ARRAY_TYPE(
469  const char *fileName,
470  fiftyoneDegreesException *exception);
471 
496  const char *fileName,
497  fiftyoneDegreesException *exception);
498 
519  void *memory,
520  long size,
521  fiftyoneDegreesException *exception);
522 
546 471 
496  const char *fileName,
497  fiftyoneDegreesException *exception);
498 
519  void *memory,
520  long size,
521  fiftyoneDegreesException *exception);
522 
546  void *memory,
547  long size,
548  fiftyoneDegreesException *exception);
549 
566  fiftyoneDegreesException *exception);
567 
579  const char* userAgent,
580  size_t userAgentLength,
581  fiftyoneDegreesException *exception);
582 
594  const char* deviceId,
595  size_t deviceIdLength,
596  fiftyoneDegreesException *exception);
597 
611  uint32_t userAgentCapacity,
612  uint32_t overridesCapacity);
613 
620 EXTERNAL void fiftyoneDegreesResultsHashFree(
621  fiftyoneDegreesResultsHash* results);
622 
636  int requiredPropertyIndex,
637  fiftyoneDegreesException *exception);
638 
652  int requiredPropertyIndex,
653  fiftyoneDegreesException *exception);
654 
662 
678  int requiredPropertyIndex,
679  fiftyoneDegreesException *exception);
680 
695  const char *propertyName,
696  char *buffer,
697  size_t bufferLength,
698  const char *separator,
699  fiftyoneDegreesException *exception);
700 
713 EXTERNAL size_t
716  const int requiredPropertyIndex,
717  char *buffer,
718  size_t bufferLength,
719  const char *separator,
720  fiftyoneDegreesException *exception);
721 
742  fiftyoneDegreesException *exception);
743 
765  const char *fileName,
766  fiftyoneDegreesException *exception);
767 
791  void *source,
792  long length,
793  fiftyoneDegreesException *exception);
794 
807 
815  fiftyoneDegreesDataSetHash *dataSet);
816 
817 
833  const char *propertyName,
834  const char *valueName,
835  void *state,
837  fiftyoneDegreesException *exception);
838 
854  char *destination,
855  size_t size,
856  fiftyoneDegreesException *exception);
857 
870  char *destination,
871  size_t size,
872  fiftyoneDegreesException *exception);
873 
878 #endif
uint32_t predictiveNodeOffset
Offset in the nodes collection of the root node for the predictive graph.
Definition: hash.h:278
const fiftyoneDegreesCollectionHeader nodes
Size and location of the nodes collection.
Definition: hash.h:225
int32_t drift
The maximum drift to allow when matching hashes.
Definition: hash.h:258
Device detection data set structure which contains the 'must have's for all device detection data set...
Definition: dataset-dd.h:51
fiftyoneDegreesConfigHash fiftyoneDegreesHashBalancedConfig
Uses caching to balance memory usage and performance.
Definition: hash.h:415
fiftyoneDegreesCollectionConfig components
Components collection config.
Definition: hash.h:242
fiftyoneDegreesCollection * rootNodes
Collection of all root nodes.
Definition: hash.h:306
uint32_t performanceNodeOffset
Offset in the nodes collection of the root node for the performance graph.
Definition: hash.h:276
Data structure containing the root nodes for the combination of an evidence item and a component.
Definition: hash.h:275
Singular User-Agent result returned by a Hash process method.
Definition: hash.h:322
Collection header structure which defines the size and location of the collection data.
Definition: collection.h:277
fiftyoneDegreesStatusCode
Status returned from the initialisation of a resource.
Definition: status.h:82
fiftyoneDegreesCollectionConfig properties
Properties collection config.
Definition: hash.h:245
const int32_t versionMinor
Minor version of the data file loaded.
Definition: hash.h:191
fiftyoneDegreesCollection * maps
Collection data file maps.
Definition: hash.h:302
fiftyoneDegreesStatusCode fiftyoneDegreesHashInitManagerFromFile(fiftyoneDegreesResourceManager *manager, fiftyoneDegreesConfigHash *config, fiftyoneDegreesPropertiesRequired *properties, const char *fileName, fiftyoneDegreesException *exception)
Initialises the resource manager with a Hash data set resource populated from the Hash data file refe...
fiftyoneDegreesStatusCode fiftyoneDegreesHashReloadManagerFromMemory(fiftyoneDegreesResourceManager *manager, void *source, long length, fiftyoneDegreesException *exception)
Reload the data set being used by the resource manager using a data file loaded into contiguous memor...
const char * fiftyoneDegreesResultsHashGetNoValueReasonMessage(fiftyoneDegreesResultsNoValueReason reason)
Gets a fuller description of the reason why a value is missing.
char * fiftyoneDegreesHashGetDeviceIdFromResult(fiftyoneDegreesDataSetHash *dataSet, fiftyoneDegreesResultHash *result, char *destination, size_t size, fiftyoneDegreesException *exception)
Get the device id string from the single result provided.
fiftyoneDegreesResultUserAgent b
Base User-Agent result.
Definition: hash.h:323
uint32_t * profileOffsets
Array of profile offsets where the index is the component index.
Definition: hash.h:324
void fiftyoneDegreesResultsHashFree(fiftyoneDegreesResultsHash *results)
Frees the results structure created by the fiftyoneDegreesResultsHashCreate method.
fiftyoneDegreesCollectionConfig nodes
Nodes collection config.
Definition: hash.h:251
fiftyoneDegreesResultsNoValueReason fiftyoneDegreesResultsHashGetNoValueReason(fiftyoneDegreesResultsHash *results, int requiredPropertyIndex, fiftyoneDegreesException *exception)
Gets the reason why a results does not contain valid values for a given property.
uint32_t fiftyoneDegreesHashIterateProfilesForPropertyAndValue(fiftyoneDegreesResourceManager *manager, const char *propertyName, const char *valueName, void *state, fiftyoneDegreesProfileIterateMethod callback, fiftyoneDegreesException *exception)
Iterates over the profiles in the data set calling the callback method for any profiles that contain ...
size_t fiftyoneDegreesHashSizeManagerFromMemory(fiftyoneDegreesConfigHash *config, fiftyoneDegreesPropertiesRequired *properties, void *memory, long size, fiftyoneDegreesException *exception)
Gets the total size in bytes which will be allocated when intialising a Hash resource and associated ...
Used to store a handle to the underlying item that could be used to release the item when it's finish...
Definition: collection.h:309
size_t fiftyoneDegreesHashSizeManagerFromFile(fiftyoneDegreesConfigHash *config, fiftyoneDegreesPropertiesRequired *properties, const char *fileName, fiftyoneDegreesException *exception)
EXTERNAL METHODS.
fiftyoneDegreesCollectionItem * fiftyoneDegreesResultsHashGetValues(fiftyoneDegreesResultsHash *results, int requiredPropertyIndex, fiftyoneDegreesException *exception)
Populates the list of values in the results instance with value structure instances associated with t...
const fiftyoneDegreesDataSetHashHeader header
Dataset header.
Definition: hash.h:293
fiftyoneDegreesCollection * strings
Collection of all strings.
Definition: hash.h:295
void fiftyoneDegreesResultsHashFromEvidence(fiftyoneDegreesResultsHash *results, fiftyoneDegreesEvidenceKeyValuePairArray *evidence, fiftyoneDegreesException *exception)
Processes the evidence value pairs in the evidence collection and populates the result in the results...
fiftyoneDegreesConfigHash fiftyoneDegreesHashDefaultConfig
Default detection configuration.
Definition: hash.h:436
bool usePerformanceGraph
True if the performance optimized graph should be used for processing.
Definition: hash.h:261
bool * profileIsOverriden
Array of boolean flags indicating whether the result profile offset at the same index is one which ha...
Definition: hash.h:326
const int32_t versionMajor
Major version of the data file loaded.
Definition: hash.h:190
Used to store the date when the dataset was produced and next date 51Degrees expect to provide a new ...
Definition: date.h:54
const fiftyoneDegreesDate nextUpdate
Date when the next data file will be available.
Definition: hash.h:208
size_t fiftyoneDegreesResultsHashGetValuesString(fiftyoneDegreesResultsHash *results, const char *propertyName, char *buffer, size_t bufferLength, const char *separator, fiftyoneDegreesException *exception)
Sets the buffer the values associated in the results for the property name.
bool usePredictiveGraph
True if the predictive optimized graph should be used for processing.
Definition: hash.h:263
const fiftyoneDegreesCollectionHeader rootNodes
Root nodes which point to the start of each graph used in detection.
Definition: hash.h:222
const int32_t versionBuild
Build version of the data file loaded.
Definition: hash.h:192
fiftyoneDegreesCollection * components
Collection of all components.
Definition: hash.h:296
Array of items of type fiftyoneDegreesResultHash used to easily access and track the size of the arra...
Definition: hash.h:359
bool fiftyoneDegreesResultsHashGetHasValues(fiftyoneDegreesResultsHash *results, int requiredPropertyIndex, fiftyoneDegreesException *exception)
Gets whether or not the results provided contain valid values for the property index provided.
fiftyoneDegreesCollection * values
Collection of all values.
Definition: hash.h:304
const int16_t age
Age of the data set format.
Definition: hash.h:199
const fiftyoneDegreesConfigHash config
Copy of the configuration.
Definition: hash.h:294
const fiftyoneDegreesCollectionHeader profiles
Size and location of the profiles collection.
Definition: hash.h:220
fiftyoneDegreesCollectionConfig profiles
Profiles collection config.
Definition: hash.h:248
int32_t matchedNodes
The number of hashes matched in the User-Agent.
Definition: hash.h:337
fiftyoneDegreesCollection * nodes
Collection of all hash nodes.
Definition: hash.h:307
Data set structure containing all the components used for detections.
Definition: hash.h:291
char * fiftyoneDegreesHashGetDeviceIdFromResults(fiftyoneDegreesResultsHash *results, char *destination, size_t size, fiftyoneDegreesException *exception)
Get the device id string from the results provided.
fiftyoneDegreesConfigHash fiftyoneDegreesHashLowMemoryConfig
Low memory configuration.
Definition: hash.h:401
fiftyoneDegreesHashMatchMethod
DATA STRUCTURES.
Definition: hash.h:179
void fiftyoneDegreesResultsHashFromDeviceId(fiftyoneDegreesResultsHash *results, const char *deviceId, size_t deviceIdLength, fiftyoneDegreesException *exception)
Process a single Device Id and populate the device offsets in the results structure.
const fiftyoneDegreesCollectionHeader properties
Size and location of the properties collection.
Definition: hash.h:216
fiftyoneDegreesConfigHash fiftyoneDegreesHashSingleLoadedConfig
Configuration designed only for testing.
Definition: hash.h:444
const fiftyoneDegreesCollectionHeader components
Size and location of the components collection.
Definition: hash.h:212
fiftyoneDegreesDataSetDeviceDetection b
Base data set.
Definition: hash.h:292
fiftyoneDegreesCollectionConfig values
Values collection config.
Definition: hash.h:247
const fiftyoneDegreesCollectionHeader profileOffsets
Size and location of the profile offsets collection.
Definition: hash.h:227
void fiftyoneDegreesDataSetHashRelease(fiftyoneDegreesDataSetHash *dataSet)
Release the reference to a data set returned by the fiftyoneDegreesDataSetHashGet method.
fiftyoneDegreesConfigHash fiftyoneDegreesHashHighPerformanceConfig
Highest performance configuration.
Definition: hash.h:388
fiftyoneDegreesStatusCode fiftyoneDegreesHashInitManagerFromMemory(fiftyoneDegreesResourceManager *manager, fiftyoneDegreesConfigHash *config, fiftyoneDegreesPropertiesRequired *properties, void *memory, long size, fiftyoneDegreesException *exception)
Initialises the resource manager with a Hash data set resource populated from the Hash data set point...
fiftyoneDegreesResultsNoValueReason
Enum containing reasons which cause a value to not be present or valid.
Definition: results.h:61
fiftyoneDegreesStatusCode fiftyoneDegreesHashReloadManagerFromFile(fiftyoneDegreesResourceManager *manager, const char *fileName, fiftyoneDegreesException *exception)
Reload the data set being used by the resource manager using the data file location specified.
fiftyoneDegreesCollection * profiles
Collection of all profiles.
Definition: hash.h:305
const fiftyoneDegreesDate published
Date when the data file was published.
Definition: hash.h:206
const fiftyoneDegreesCollectionHeader maps
Size and location of the maps collection.
Definition: hash.h:214
Singular User-Agent result returned by a device detection process method.
Definition: results-dd.h:49
fiftyoneDegreesCollectionConfig maps
Maps collection config.
Definition: hash.h:244
List structure which contains a list of collection items.
Definition: list.h:117
fiftyoneDegreesCollectionConfig strings
Strings collection config.
Definition: hash.h:241
Defines a set of properties which are required by a caller.
Definition: properties.h:180
fiftyoneDegreesDataSetHash * fiftyoneDegreesDataSetHashGet(fiftyoneDegreesResourceManager *manager)
Gets a safe reference to the Hash data set from the resource manager.
Array of items of type fiftyoneDegreesEvidenceKeyValuePair used to easily access and track the size o...
Definition: evidence.h:172
const int32_t formatOffset
Offset of the data file format in the strings collection.
Definition: hash.h:204
Manager structure used to provide access to a shared and changing resource.
Definition: resource.h:188
Collection configuration structure which defines how the collection should be created by the create m...
Definition: collection.h:288
int32_t iterations
Number of iterations required to get the device offset.
Definition: hash.h:331
const fiftyoneDegreesCollectionHeader strings
Size and location of the strings collection.
Definition: hash.h:210
int32_t difference
The maximum difference to allow when matching hashes.
Definition: hash.h:254
void fiftyoneDegreesResultsHashFromUserAgent(fiftyoneDegreesResultsHash *results, const char *userAgent, size_t userAgentLength, fiftyoneDegreesException *exception)
Process a single User-Agent and populate the device offsets in the results structure.
fiftyoneDegreesCollection * profileOffsets
Collection of all offsets to profiles in the profiles collection.
Definition: hash.h:308
Dataset header containing information about the dataset.
Definition: hash.h:189
Structure used to represent a 51Degrees exception and passed into methods that might generate excepti...
Definition: exceptions.h:116
fiftyoneDegreesConfigHash fiftyoneDegreesHashInMemoryConfig
DETECTION CONFIGURATIONS.
Definition: hash.h:378
fiftyoneDegreesConfigDeviceDetection b
Base configuration.
Definition: hash.h:240
Hash specific configuration structure.
Definition: hash.h:239
fiftyoneDegreesCollectionConfig rootNodes
Root nodes collection config.
Definition: hash.h:249
const int32_t copyrightOffset
Offset of the copyright string in the strings collection.
Definition: hash.h:197
const int32_t minUserAgentCount
Minimum count for a User-Agent to be included in the data file export.
Definition: hash.h:200
fiftyoneDegreesHashMatchMethod method
The method used to provide the match result.
Definition: hash.h:329
const fiftyoneDegreesCollectionHeader values
Size and location of the values collection.
Definition: hash.h:218
Trace node structure used to trace the route taken when evaluating a graph.
Definition: graph.h:140
fiftyoneDegreesList componentsList
List of component items from the components collection.
Definition: hash.h:297
fiftyoneDegreesCollectionConfig profileOffsets
Profile offsets collection config.
Definition: hash.h:252
Device detection configuration structure containing device detection specific configuration options,...
Definition: config-dd.h:52
bool traceRoute
True if the route through each graph should be traced during processing.
Definition: hash.h:265
fiftyoneDegreesConfigHash fiftyoneDegreesHashBalancedTempConfig
Balanced configuration modified to create a temporary file copy of the source data file to avoid lock...
Definition: hash.h:425
int32_t drift
The maximum drift for a matched substring from the character position where it was expected to be fou...
Definition: hash.h:335
bool * componentsAvailable
Array of flags indicating if there are any properties available for the component with the matching i...
Definition: hash.h:299
bool(* fiftyoneDegreesProfileIterateMethod)(void *state, fiftyoneDegreesCollectionItem *item)
Definition of a callback function which is passed an item of a type determined by the iteration metho...
Definition: profile.h:117
fiftyoneDegreesStatusCode fiftyoneDegreesHashReloadManagerFromOriginalFile(fiftyoneDegreesResourceManager *manager, fiftyoneDegreesException *exception)
Reload the data set being used by the resource manager using the data file location which was used wh...
const int32_t versionRevision
Revision version of the data file loaded.
Definition: hash.h:193
const int32_t nameOffset
Offset of the data file name in the strings collection.
Definition: hash.h:202
size_t fiftyoneDegreesResultsHashGetValuesStringByRequiredPropertyIndex(fiftyoneDegreesResultsHash *results, const int requiredPropertyIndex, char *buffer, size_t bufferLength, const char *separator, fiftyoneDegreesException *exception)
Sets the buffer the values associated in the results for the property name.
All the shared methods and fields required by file, memory and cached collections.
Definition: collection.h:407
fiftyoneDegreesResultsHash * fiftyoneDegreesResultsHashCreate(fiftyoneDegreesResourceManager *manager, uint32_t userAgentCapacity, uint32_t overridesCapacity)
Allocates a results structure containing a reference to the Hash data set managed by the resource man...
fiftyoneDegreesGraphTraceNode * trace
The graph trace constructed during processing if the option was enabled (and the executable was compi...
Definition: hash.h:338
int32_t difference
The total difference in hash code values between the matched substring and the actual substring.
Definition: hash.h:333
The length of the enum.
Definition: hash.h:184
#define FIFTYONE_DEGREES_RESULTS_HASH_MEMBERS
Macro defining the common members of a Hash result.
Definition: hash.h:349
fiftyoneDegreesCollection * properties
Collection of all properties.
Definition: hash.h:303