Skip to content

Instantly share code, notes, and snippets.

@yannick
Created February 8, 2016 10:00
Show Gist options
  • Select an option

  • Save yannick/2ac635497d57f67ec198 to your computer and use it in GitHub Desktop.

Select an option

Save yannick/2ac635497d57f67ec198 to your computer and use it in GitHub Desktop.
module devicedetect;
extern (C):
alias e_fiftyoneDegrees_MatchMethod fiftyoneDegreesMatchMethod;
alias e_fiftyoneDegrees_Resultset_CacheState fiftyoneDegreesResultsetCacheState;
alias e_fiftyoneDegrees_DataSetInitStatus fiftyoneDegreesDataSetInitStatus;
alias fiftyoneDegreesRange_t fiftyoneDegreesRange;
alias fiftyoneDegrees_ascii_string_t fiftyoneDegreesAsciiString;
alias fiftyoneDegrees_component_t fiftyoneDegreesComponent;
alias fiftyoneDegrees_map_t fiftyoneDegreesMap;
alias fiftyoneDegrees_node_numeric_index_t fiftyoneDegreesNodeNumericIndex;
alias fiftyoneDegrees_node_index_value_t fiftyoneDegreesNodeIndexValue;
alias fiftyoneDegrees_node_index_t fiftyoneDegreesNodeIndex;
alias fiftyoneDegrees_string_t fiftyoneDegreesString;
alias fiftyoneDegrees_strings_t fiftyoneDegreesStrings;
alias fiftyoneDegrees_node_t fiftyoneDegreesNode;
alias fiftyoneDegrees_profile_offset_t fiftyoneDegreesProfileOffset;
alias property_t fiftyoneDegreesProperty;
alias fiftyoneDegrees_value_t fiftyoneDegreesValue;
alias fiftyoneDegrees_profile_t fiftyoneDegreesProfile;
alias fiftyoneDegrees_date_t fiftyoneDegreesDate;
alias fiftyoneDegrees_entity_header_t fiftyoneDegreesEntityHeader;
alias fiftyoneDegrees_numeric_node_state fiftyoneDegreesNumericNodeState;
alias fiftyoneDegrees_dataset_header_t fiftyoneDegreesDataSetHeader;
alias fiftyoneDegrees_signature_t fiftyoneDegreesSignature;
alias fiftyoneDegrees_http_header_t fiftyoneDegreesHttpHeader;
alias fiftyoneDegrees_dataset_t fiftyoneDegreesDataSet;
alias fiftyoneDegrees_linked_signature_list_item_t fiftyoneDegreesLinkedSignatureListItem;
alias fiftyoneDegrees_linked_signature_list_t fiftyoneDegreesLinkedSignatureList;
alias fiftyoneDegrees_resultset_t fiftyoneDegreesResultset;
alias fiftyoneDegrees_resultset_cache_t fiftyoneDegreesResultsetCache;
alias fiftyoneDegrees_resultset_cache_list_t fiftyoneDegreesResultsetCacheList;
alias fiftyoneDegrees_resultset_cache_link_list_t fiftyoneDegreesResultsetCacheLinkedList;
alias fiftyoneDegrees_http_header_workset_t fiftyoneDegreesHttpHeaderWorkset;
alias fiftyoneDegrees_workset_t fiftyoneDegreesWorkset;
alias fiftyoneDegrees_workset_pool_t fiftyoneDegreesWorksetPool;
enum e_fiftyoneDegrees_MatchMethod
{
NONE = 0,
EXACT = 1,
NUMERIC = 2,
NEAREST = 3,
CLOSEST = 4
}
enum e_fiftyoneDegrees_Resultset_CacheState
{
ACTIVE_CACHE_LIST_ONLY = 0,
BOTH_CACHE_LISTS = 1
}
enum e_fiftyoneDegrees_DataSetInitStatus
{
DATA_SET_INIT_STATUS_SUCCESS = 0,
DATA_SET_INIT_STATUS_INSUFFICIENT_MEMORY = 1,
DATA_SET_INIT_STATUS_CORRUPT_DATA = 2,
DATA_SET_INIT_STATUS_INCORRECT_VERSION = 3,
DATA_SET_INIT_STATUS_FILE_NOT_FOUND = 4,
DATA_SET_INIT_STATUS_NOT_SET = 5
}
struct fiftyoneDegreesRange_t
{
const short lower;
const short upper;
}
align(1) struct fiftyoneDegrees_ascii_string_t
{
const short length;
const char firstByte;
}
align(1) struct fiftyoneDegrees_component_t
{
const byte componentId;
const int nameOffset;
const int defaultProfileOffset;
const ushort httpHeaderCount;
}
align(4) struct fiftyoneDegrees_map_t
{
const int nameOffset;
}
align(2) struct fiftyoneDegrees_node_numeric_index_t
{
const short value;
const int relatedNodeOffset;
}
align(1) struct fiftyoneDegrees_node_index_t
{
const int relatedNodeOffset;
union
{
const byte[4] characters;
const int integer;
}
}
align(2) struct fiftyoneDegrees_string_t
{
byte* value;
short length;
}
struct fiftyoneDegrees_strings_t
{
const(fiftyoneDegreesString)* firstString;
const int count;
}
align(2) struct fiftyoneDegrees_node_t
{
const short position;
const short nextCharacterPosition;
const int parentOffset;
const int characterStringOffset;
const short childrenCount;
const short numericChildrenCount;
const ushort signatureCount;
}
align(4) struct fiftyoneDegrees_profile_offset_t
{
const int profileId;
const int offset;
}
align(1) struct property_t
{
const byte componentIndex;
const byte displayOrder;
const byte isMandatory;
const byte isList;
const byte showValues;
const byte isObsolete;
const byte show;
const byte valueType;
const int defaultValueIndex;
const int nameOffset;
const int descriptionOffset;
const int categoryOffset;
const int urlOffset;
const int firstValueIndex;
const int lastValueIndex;
const int mapCount;
const int firstMapIndex;
}
align(2) struct fiftyoneDegrees_value_t
{
const short propertyIndex;
const int nameOffset;
const int descriptionOffset;
const int urlOffset;
}
align(1) struct fiftyoneDegrees_profile_t
{
const byte componentIndex;
const int profileId;
const int valueCount;
const int signatureCount;
}
align(2) struct fiftyoneDegrees_date_t
{
const short year;
const byte month;
const byte day;
}
align(4) struct fiftyoneDegrees_entity_header_t
{
const int startPosition;
const int length;
const int count;
}
align(2) struct fiftyoneDegrees_numeric_node_state
{
int target;
const(fiftyoneDegreesNode)* node;
const(fiftyoneDegreesNodeNumericIndex)* firstNodeNumericIndex;
const(fiftyoneDegreesRange)* range;
int startIndex;
int lowIndex;
int highIndex;
byte lowInRange;
byte highInRange;
}
align(1) struct fiftyoneDegrees_dataset_header_t
{
const int versionMajor;
const int versionMinor;
const int versionBuild;
const int versionRevision;
const byte[16] tag;
const byte[16] exportTag;
const int copyrightOffset;
const short age;
const int minUserAgentCount;
const int nameOffset;
const int formatOffset;
const fiftyoneDegreesDate published;
const fiftyoneDegreesDate nextUpdate;
const int deviceCombinations;
const short maxUserAgentLength;
const short minUserAgentLength;
const char lowestCharacter;
const char highestCharacter;
const int maxSignatures;
const int signatureProfilesCount;
const int signatureNodesCount;
const short maxValues;
const int csvBufferLength;
const int jsonBufferLength;
const int xmlBufferLength;
const int maxSignaturesClosest;
const int maxRank;
const fiftyoneDegreesEntityHeader strings;
const fiftyoneDegreesEntityHeader components;
const fiftyoneDegreesEntityHeader maps;
const fiftyoneDegreesEntityHeader properties;
const fiftyoneDegreesEntityHeader values;
const fiftyoneDegreesEntityHeader profiles;
const fiftyoneDegreesEntityHeader signatures;
const fiftyoneDegreesEntityHeader signatureNodeOffsets;
const fiftyoneDegreesEntityHeader nodeRankedSignatureIndexes;
const fiftyoneDegreesEntityHeader rankedSignatureIndexes;
const fiftyoneDegreesEntityHeader nodes;
const fiftyoneDegreesEntityHeader rootNodes;
const fiftyoneDegreesEntityHeader profileOffsets;
}
align(1) struct fiftyoneDegrees_signature_t
{
const byte nodeCount;
const int firstNodeOffsetIndex;
const int rank;
const byte flags;
}
align(4) struct fiftyoneDegrees_http_header_t
{
int headerNameOffset;
const(char)* headerName;
}
align(1) struct fiftyoneDegrees_dataset_t
{
const fiftyoneDegreesDataSetHeader header;
int sizeOfSignature;
int signatureStartOfStruct;
const(fiftyoneDegreesProperty*)* requiredProperties;
int requiredPropertyCount;
const(byte)* strings;
const(byte)* componentsData;
const(fiftyoneDegreesComponent*)* components;
const(fiftyoneDegreesMap)* maps;
const(fiftyoneDegreesProperty)* properties;
const(fiftyoneDegreesValue)* values;
const(byte)* profiles;
const(byte)* signatures;
const(int)* signatureNodeOffsets;
const(int)* nodeRankedSignatureIndexes;
const(int)* rankedSignatureIndexes;
const(byte)* nodes;
const(fiftyoneDegreesNode*)* rootNodes;
const(fiftyoneDegreesProfileOffset)* profileOffsets;
int httpHeadersCount;
fiftyoneDegreesHttpHeader* httpHeaders;
const(char*)* prefixedUpperHttpHeaders;
}
struct fiftyoneDegrees_linked_signature_list_item_t
{
fiftyoneDegrees_linked_signature_list_item_t* next;
fiftyoneDegrees_linked_signature_list_item_t* previous;
int rankedSignatureIndex;
int frequency;
}
struct fiftyoneDegrees_linked_signature_list_t
{
const(fiftyoneDegreesLinkedSignatureListItem)* items;
fiftyoneDegreesLinkedSignatureListItem* first;
fiftyoneDegreesLinkedSignatureListItem* last;
int count;
fiftyoneDegreesLinkedSignatureListItem* current;
}
align(1) struct fiftyoneDegrees_resultset_t
{
const(fiftyoneDegreesDataSet)* dataSet;
byte* targetUserAgentArray;
ushort targetUserAgentArrayLength;
ulong targetUserAgentHashCode;
byte hashCodeSet;
fiftyoneDegreesMatchMethod method;
int difference;
int rootNodesEvaluated;
int stringsRead;
int nodesEvaluated;
int signaturesCompared;
int signaturesRead;
int closestSignatures;
const(fiftyoneDegreesProfile)* profiles;
int profileCount;
byte* signature;
fiftyoneDegrees_resultset_t* previous;
fiftyoneDegrees_resultset_t* next;
fiftyoneDegreesResultsetCacheState state;
}
align(4) struct fiftyoneDegrees_resultset_cache_list_t
{
fiftyoneDegrees_resultset_cache_t* cache;
fiftyoneDegreesResultset** resultSets;
int allocated;
}
align(4) struct fiftyoneDegrees_resultset_cache_link_list_t
{
fiftyoneDegreesResultset* first;
fiftyoneDegreesResultset* last;
int count;
}
align(4) struct fiftyoneDegrees_resultset_cache_t
{
const(fiftyoneDegreesDataSet)* dataSet;
const(fiftyoneDegreesResultset)* resultSets;
int sizeOfResultset;
int total;
fiftyoneDegreesResultsetCacheLinkedList free;
fiftyoneDegreesResultsetCacheLinkedList allocated;
fiftyoneDegreesResultsetCacheList* active;
fiftyoneDegreesResultsetCacheList* background;
int switchLimit;
int hits;
int misses;
int switches;
// fiftyoneDegreesMutex activeLock;
// fiftyoneDegreesMutex backgroundLock;
}
align(4) struct fiftyoneDegrees_http_header_workset_t
{
fiftyoneDegreesHttpHeader* header;
const(char)* headerValue;
int headerValueLength;
}
align(1) struct fiftyoneDegrees_workset_t
{
const(fiftyoneDegreesDataSet)* dataSet;
char* targetUserAgentArray;
ushort targetUserAgentArrayLength;
ulong targetUserAgentHashCode;
byte hashCodeSet;
fiftyoneDegreesMatchMethod method;
int difference;
int rootNodesEvaluated;
int stringsRead;
int nodesEvaluated;
int signaturesCompared;
int signaturesRead;
int closestSignatures;
const(fiftyoneDegreesProfile*)* profiles;
int profileCount;
byte* signature;
const(fiftyoneDegreesValue*)* values;
int valuesCount;
char* input;
char* targetUserAgent;
char* relevantNodes;
char* closestNodes;
char* signatureAsString;
char* tempheaderlowercase;
const(fiftyoneDegreesNode*)* nodes;
const(fiftyoneDegreesNode*)* orderedNodes;
int nodeCount;
int closestNodeRankedSignatureIndex;
fiftyoneDegreesLinkedSignatureList linkedSignatureList;
short nextCharacterPositionIndex;
byte startWithInitialScore;
int function (fiftyoneDegrees_workset_t*, const(fiftyoneDegreesNode)*) functionPtrGetScore;
const(byte)* function (fiftyoneDegrees_workset_t*) functionPtrNextClosestSignature;
const(fiftyoneDegreesResultsetCache)* cache;
const(fiftyoneDegreesProfile*)* tempProfiles;
int importantHeadersCount;
fiftyoneDegreesHttpHeaderWorkset* importantHeaders;
}
struct fiftyoneDegrees_workset_pool_t
{
fiftyoneDegreesDataSet* dataSet;
fiftyoneDegreesResultsetCache* cache;
int size;
fiftyoneDegreesWorkset** worksets;
int available;
int created;
// fiftyoneDegreesMutex lock;
// fiftyoneDegreesSignal signal;
}
union fiftyoneDegrees_node_index_value_t
{
const byte[4] characters;
const int integer;
}
fiftyoneDegreesDataSetInitStatus fiftyoneDegreesInitWithPropertyArray (const(char)* fileName, fiftyoneDegreesDataSet* dataSet, const(char*)* properties, int count);
fiftyoneDegreesDataSetInitStatus fiftyoneDegreesInitWithPropertyString (const(char)* fileName, fiftyoneDegreesDataSet* dataSet, const(char)* properties);
void fiftyoneDegreesDataSetFree (const(fiftyoneDegreesDataSet)* dataSet);
fiftyoneDegreesResultsetCache* fiftyoneDegreesResultsetCacheCreate (const(fiftyoneDegreesDataSet)* dataSet, int size);
void fiftyoneDegreesResultsetCacheFree (const(fiftyoneDegreesResultsetCache)* rsc);
fiftyoneDegreesWorksetPool* fiftyoneDegreesWorksetPoolCreate (fiftyoneDegreesDataSet* dataSet, fiftyoneDegreesResultsetCache* cache, int size);
void fiftyoneDegreesWorksetPoolFree (fiftyoneDegreesWorksetPool* pool);
fiftyoneDegreesWorkset* fiftyoneDegreesWorksetPoolGet (fiftyoneDegreesWorksetPool* pool);
void fiftyoneDegreesWorksetPoolRelease (fiftyoneDegreesWorksetPool* pool, fiftyoneDegreesWorkset* ws);
fiftyoneDegreesWorkset* fiftyoneDegreesWorksetCreate (const(fiftyoneDegreesDataSet)* dataSet, const(fiftyoneDegreesResultsetCache)* cache);
void fiftyoneDegreesWorksetFree (const(fiftyoneDegreesWorkset)* ws);
char* fiftyoneDegreesJSONCreate (fiftyoneDegreesWorkset* ws);
void fiftyoneDegreesJSONFree (void* json);
char* fiftyoneDegreesCSVCreate (fiftyoneDegreesWorkset* ws);
void fiftyoneDegreesCSVFree (void* csv);
void fiftyoneDegreesMatch (fiftyoneDegreesWorkset* ws, const(char)* userAgent);
void fiftyoneDegreesMatchWithHeadersArray (fiftyoneDegreesWorkset* ws, const(char*)* httpHeaderNames, const(char*)* httpHeaderValues, int httpHeaderCount);
void fiftyoneDegreesMatchWithHeadersString (fiftyoneDegreesWorkset* ws, const(char)* httpHeaders, size_t length);
int fiftyoneDegreesSetHttpHeaders (fiftyoneDegreesWorkset* ws, const(char)* httpHeaders, size_t length);
void fiftyoneDegreesMatchForHttpHeaders (fiftyoneDegreesWorkset* ws);
int fiftyoneDegreesSetValues (fiftyoneDegreesWorkset* ws, int requiredPropertyIndex);
const(fiftyoneDegreesAsciiString)* fiftyoneDegreesGetString (const(fiftyoneDegreesDataSet)* dataSet, int offset);
int fiftyoneDegreesGetValues (fiftyoneDegreesWorkset* ws, int requiredPropertyIndex, char* values, int size);
const(char)* fiftyoneDegreesGetValueName (const(fiftyoneDegreesDataSet)* dataSet, const(fiftyoneDegreesValue)* value);
const(char)* fiftyoneDegreesGetPropertyName (const(fiftyoneDegreesDataSet)* dataSet, const(fiftyoneDegreesProperty)* property);
int fiftyoneDegreesGetRequiredPropertyName (const(fiftyoneDegreesDataSet)* dataSet, int requiredPropertyIndex, char* propertyName, int size);
int fiftyoneDegreesGetHttpHeaderName (const(fiftyoneDegreesDataSet)* dataSet, int httpHeaderIndex, char* httpHeader, int size);
const(char)* fiftyoneDegreesGetPrefixedUpperHttpHeaderName (const(fiftyoneDegreesDataSet)* dataSet, int httpHeaderIndex);
int fiftyoneDegreesGetRequiredPropertyIndex (const(fiftyoneDegreesDataSet)* dataSet, const(char)* propertyName);
int fiftyoneDegreesProcessDeviceCSV (fiftyoneDegreesWorkset* ws, char* csv);
int fiftyoneDegreesProcessDeviceJSON (fiftyoneDegreesWorkset* ws, char* json);
int fiftyoneDegreesGetSignatureRank (fiftyoneDegreesWorkset* ws);
int fiftyoneDegreesGetSignatureAsString (fiftyoneDegreesWorkset* ws, char* signatureAsString, int size);
int fiftyoneDegreesGetDeviceId (fiftyoneDegreesWorkset* ws, char* deviceId, int size);
void fiftyoneDegreesMatchForDeviceId (fiftyoneDegreesWorkset* ws, const(char)* deviceId);
fiftyoneDegreesWorkset* fiftyoneDegreesCreateWorkset (const(fiftyoneDegreesDataSet)* dataSet);
void fiftyoneDegreesFreeWorkset (const(fiftyoneDegreesWorkset)* ws);
void fiftyoneDegreesDestroy (const(fiftyoneDegreesDataSet)* dataSet);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment