Provides an example of processing a YAML file containing evidence for device detection.
Provides an example of processing a YAML file containing evidence for device detection.There are 20,000 examples in the supplied file of evidence representing HTTP Headers. For example:
We create a resource manager and results hash to read the data and find out about the associated device, we write this data to a YAML formatted output stream.
As well as explaining the basic operation of offline processing using the defaults, for advanced operation this example can be used to experiment with tuning device detection for performance and predictive power using Performance Profile, Graph and Difference and Drift settings.
#include "ExampleBase.h"
#include "../../../../src/dd/hash/hash.h"
#include "../../../../src/common/textfile.h"
#include "../../../../src/dd/hash/fiftyone.h"
static const char *dataDir = "data/device-detection";
static const char *dataFileName = "51Degrees-LiteV4.1.hash";
static const char *evidenceFileName = "20000 Evidence Records.yml";
static int exitCode = 0;
static char valueBuffer[1024] = "";
static const size_t valueBufferLength = sizeof(valueBuffer) / sizeof(valueBuffer[0]);
#define CONFIG fiftyoneDegreesHashLowMemoryConfig
typedef struct t_offline_processing_state {
FILE *outputFile;
FILE *outputLog;
static void outputDeviceId(
const char *name,
FILE *output) {
char buffer[50];
fprintf(output, "%s: %s\n", name, buffer);
}
static void outputValue(
const char *name,
const char* propertyName,
FILE *output) {
dataset->b.b.available,
propertyName);
results, requiredIndex, exception)) {
results,
propertyName,
valueBuffer,
valueBufferLength,
(char* const)",",
exception);
}
else {
}
fprintf(output, "%s: %s\n", name, valueBuffer);
}
static void analyse(
FILE* outputFile) {
fprintf(outputFile, "---\n");
for (uint32_t i = 0; i <
evidence->
count; i++) {
fprintf(outputFile,
"%s%s: %s\n",
}
outputValue(results, "device.ismobile", "IsMobile", outputFile);
outputValue(results, "device.platformname", "PlatformName", outputFile);
outputValue(results, "device.platformversion", "PlatformVersion", outputFile);
outputValue(results, "device.browsername", "BrowserName", outputFile);
outputValue(results, "device.browserversion", "BrowserVersion", outputFile);
outputDeviceId(results, "device.deviceid", outputFile);
}
static void process(
KeyValuePair *pairs, uint16_t size,
void *state) {
for (uint32_t i = 0; i < size; i++) {
if (prefixMap) {
evidenceArray,
pairs[i].value);
}
}
analyse(
evidenceArray,
}
void run(
const char *evidenceFilePath,
const char *outputFilePath,
FILE *output) {
char buffer[1000];
fprintf(output, "Could not open file %s for write\n", outputFilePath);
return;
}
char key[10][500];
char value[10][1000];
for (int i = 0; i < 10; i++) {
pair[i].
value = value[i];
}
evidenceFilePath,
buffer,
sizeof(buffer),
pair,
10,
&state,
process
);
fprintf(output, "Output Written to %s\n", outputFilePath);
fiftyoneDegreesExampleCheckDataFile(dataset);
}
static void reportStatus(
const char* fileName) {
printf("%s\n", message);
}
void fiftyoneDegreesOfflineProcessingRun(
const char *dataFilePath,
const char *evidenceFilePath,
const char *outputFilePath,
const char *requiredProperties,
FILE* output) {
properties.
string = requiredProperties;
&manager,
&config,
&properties,
dataFilePath,
exception);
printf("%s\n", dataFilePath);
reportStatus(status, dataFilePath);
exitCode = 1;
}
else {
run(&manager, evidenceFilePath, outputFilePath, output);
fprintf(output, "Processing complete. See results in: '%s'", outputFilePath);
}
}
void fiftyoneDegreesExampleCOfflineProcessingRun(ExampleParameters *params) {
fiftyoneDegreesOfflineProcessingRun(
params->dataFilePath,
params->evidenceFilePath,
params->outputFilePath,
params->propertiesString,
*params->config,
params->output);
}
#ifndef TEST
static const char* getBaseName(const char* path) {
for (size_t i = strlen(path) - 1; i >= 0; i--) {
if (path[i] == '\\' || path[i] == '/') {
if (i == (strlen(path) - 1)) {
return NULL;
}
return path + i + 1;
}
}
return path;
}
int main(int argc, char* argv[]) {
if (argc > 1) {
strcpy(dataFilePath, argv[1]);
}
else {
status = fiftyoneDegreesExampleGetFilePath(
dataDir,
dataFileName,
dataFilePath,
sizeof(dataFilePath));
printf(("Failed to find a device detection "
"data file. Make sure the data submodule is there, "
"by running `git submodule update --init data`, and "
"run this example again to download the file."));
fgetc(stdin);
return 1;
}
}
if (argc > 2) {
strcpy(evidenceFilePath, argv[2]);
}
else {
status = fiftyoneDegreesExampleGetFilePath(
dataDir,
evidenceFileName,
evidenceFilePath,
sizeof(evidenceFilePath));
reportStatus(status, evidenceFilePath);
fgetc(stdin);
return 1;
}
}
if (argc > 3) {
strcpy(outputFilePath, argv[3]);
}
else {
const char* baseName = getBaseName(evidenceFilePath);
if (baseName == NULL) {
printf("Invalid evidence file path.\n");
fgetc(stdin);
return 1;
}
size_t cpySize = baseName - evidenceFilePath;
strncpy(outputFilePath, evidenceFilePath, cpySize);
strcpy(outputFilePath + cpySize, "offline-processing-output.yml");
}
ExampleParameters params;
params.dataFilePath = dataFilePath;
params.evidenceFilePath = evidenceFilePath;
params.outputFilePath = outputFilePath;
params.propertiesString = argc > 4 ? argv[4] : "";
params.config = &config;
params.output = stdout;
fiftyoneDegreesExampleMemCheck(
¶ms,
fiftyoneDegreesExampleCOfflineProcessingRun);
fgetc(stdin);
return exitCode;
}
#endif
#define ResultsHashGetValuesString
Synonym for fiftyoneDegreesResultsHashGetValuesString function.
Definition dd/hash/fiftyone.h:62
#define ResultsHashFromEvidence
Synonym for fiftyoneDegreesResultsHashFromEvidence function.
Definition dd/hash/fiftyone.h:70
fiftyoneDegreesConfigHash ConfigHash
Synonym for fiftyoneDegreesConfigHash type.
Definition dd/hash/fiftyone.h:51
fiftyoneDegreesResultsHash ResultsHash
Synonym for fiftyoneDegreesResultsHash type.
Definition dd/hash/fiftyone.h:50
#define ResultsHashGetNoValueReason
Synonym for fiftyoneDegreesResultsHashGetNoValueReason function.
Definition dd/hash/fiftyone.h:60
fiftyoneDegreesDataSetHash DataSetHash
Synonym for fiftyoneDegreesDataSetHash type.
Definition dd/hash/fiftyone.h:48
#define ResultsHashCreate(manager, overridesCapacity)
Two argument convenience form of fiftyoneDegreesResultsHashCreate that injects the deprecated userAge...
Definition dd/hash/fiftyone.h:66
#define ResultsHashGetHasValues
Synonym for fiftyoneDegreesResultsHashGetHasValues function.
Definition dd/hash/fiftyone.h:59
#define ResultsHashGetNoValueReasonMessage
Synonym for fiftyoneDegreesResultsHashGetNoValueReasonMessage function.
Definition dd/hash/fiftyone.h:61
#define ResultsHashFree
Synonym for fiftyoneDegreesResultsHashFree function.
Definition dd/hash/fiftyone.h:67
#define HashGetDeviceIdFromResults
Synonym for fiftyoneDegreesHashGetDeviceIdFromResults function.
Definition dd/hash/fiftyone.h:65
#define HashInitManagerFromFile
Synonym for fiftyoneDegreesHashInitManagerFromFile function.
Definition dd/hash/fiftyone.h:75
fiftyoneDegreesResultsNoValueReason
Enum containing reasons which cause a value to not be present or valid.
Definition results.h:95
#define EXCEPTION_THROW
Synonym for FIFTYONE_DEGREES_EXCEPTION_THROW macro.
Definition common/fiftyone.h:446
fiftyoneDegreesEvidenceKeyValuePairArray EvidenceKeyValuePairArray
Synonym for fiftyoneDegreesEvidenceKeyValuePairArray type.
Definition common/fiftyone.h:172
#define PropertiesDefault
Synonym for fiftyoneDegreesPropertiesDefault function.
Definition common/fiftyone.h:268
#define EXCEPTION_CREATE
Synonym for FIFTYONE_DEGREES_EXCEPTION_CREATE macro.
Definition common/fiftyone.h:443
fiftyoneDegreesEvidenceKeyValuePair EvidenceKeyValuePair
Synonym for fiftyoneDegreesEvidenceKeyValuePair type.
Definition common/fiftyone.h:138
#define StatusGetMessage
Synonym for fiftyoneDegreesStatusGetMessage function.
Definition common/fiftyone.h:293
#define EvidenceCreate
Synonym for fiftyoneDegreesEvidenceCreate function.
Definition common/fiftyone.h:240
#define PropertiesGetRequiredPropertyIndexFromName
Synonym for fiftyoneDegreesPropertiesGetRequiredPropertyIndexFromName function.
Definition common/fiftyone.h:325
#define YamlFileIterate
Synonym for fiftyoneDegreesYamlFileIterate.
Definition common/fiftyone.h:395
fiftyoneDegreesStatusCode StatusCode
Synonym for fiftyoneDegreesStatusCode type.
Definition common/fiftyone.h:134
#define EvidenceAddString
Synonym for fiftyoneDegreesEvidenceAddString function.
Definition common/fiftyone.h:324
fiftyoneDegreesKeyValuePair KeyValuePair
Synonym for fiftyoneDegreesKeyValuePair type.
Definition common/fiftyone.h:193
fiftyoneDegreesEvidencePrefixMap EvidencePrefixMap
Synonym for fiftyoneDegreesEvidencePrefixMap type.
Definition common/fiftyone.h:139
#define SUCCESS
Synonym for FIFTYONE_DEGREES_STATUS_SUCCESS status code.
Definition common/fiftyone.h:478
#define EvidenceFree
Synonym for fiftyoneDegreesEvidenceFree function.
Definition common/fiftyone.h:241
#define ResourceManagerFree
Synonym for fiftyoneDegreesResourceManagerFree function.
Definition common/fiftyone.h:310
fiftyoneDegreesResourceManager ResourceManager
Synonym for fiftyoneDegreesResourceManager type.
Definition common/fiftyone.h:137
#define FileDelete
Synonym for fiftyoneDegreesFileDelete function.
Definition common/fiftyone.h:282
fiftyoneDegreesPropertiesRequired PropertiesRequired
Synonym for fiftyoneDegreesPropertiesRequired type.
Definition common/fiftyone.h:135
#define Free
Synonym for fiftyoneDegreesFree function.
Definition common/fiftyone.h:265
#define EvidenceMapPrefix
Synonym for fiftyoneDegreesEvidenceMapPrefix function.
Definition common/fiftyone.h:321
#define EvidencePrefixString
Synonym for fiftyoneDegreesEvidencePrefixString function.
Definition common/fiftyone.h:322
#define FILE_MAX_PATH
Synonym for FIFTYONE_DEGREES_FILE_MAX_PATH macro.
Definition common/fiftyone.h:450
Definition GettingStarted.c:67
uint16_t concurrency
Expected number of concurrent requests, 1 or greater.
Definition collection.h:299
bool updateMatchedUserAgent
True if the detection should record the matched characters from the target User-Agent.
Definition config-dd.h:54
fiftyoneDegreesCollectionConfig rootNodes
Root nodes collection config.
Definition hash.h:197
fiftyoneDegreesCollectionConfig nodes
Nodes collection config.
Definition hash.h:199
fiftyoneDegreesCollectionConfig values
Values collection config.
Definition hash.h:195
fiftyoneDegreesConfigDeviceDetection b
Base configuration.
Definition hash.h:188
fiftyoneDegreesCollectionConfig strings
Strings collection config.
Definition hash.h:189
fiftyoneDegreesCollectionConfig profiles
Profiles collection config.
Definition hash.h:196
fiftyoneDegreesCollectionConfig profileOffsets
Profile offsets collection config.
Definition hash.h:200
fiftyoneDegreesKeyValuePair item
the field key and original value
Definition evidence.h:167
fiftyoneDegreesEvidencePrefix prefix
e.g.
Definition evidence.h:166
fiftyoneDegreesEvidencePrefix prefixEnum
Enum value of prefix name.
Definition evidence.h:159
size_t prefixLength
Length of the prefix string.
Definition evidence.h:158
size_t keyLength
number of characters in key
Definition pair.h:35
const char * key
pointer to the key string
Definition pair.h:34
const char * value
pointer to the value string
Definition pair.h:36
size_t valueLength
number of characters in value
Definition pair.h:37
const char * string
Separated list of required properties or NULL if all properties are required.
Definition properties.h:234
State used for the offline processing operation.
Definition OfflineProcessing.c:99
FILE * outputFile
Output stream for the results.
Definition OfflineProcessing.c:100
ResultsHash * results
The results used by the thread.
Definition OfflineProcessing.c:102
FILE * outputLog
Output stream for log.
Definition OfflineProcessing.c:101