245 lines
6.8 KiB
C
245 lines
6.8 KiB
C
/******************************************************************************
|
|
* Universal Analytics for C
|
|
* Copyright (c) 2013, Analytics Pros
|
|
*
|
|
* This project is free software, distributed under the BSD license.
|
|
* Analytics Pros offers consulting and integration services if your firm needs
|
|
* assistance in strategy, implementation, or auditing existing work.
|
|
******************************************************************************/
|
|
|
|
/* Header guard, prevent multiple definition */
|
|
#ifndef UNIVERSALANALYTICS_HEADER_GUARD
|
|
#define UNIVERSALANALYTICS_HEADER_GUARD 1
|
|
|
|
#include "http.h"
|
|
#include "string/encode.h"
|
|
|
|
/* These definitions are primarily for planning memory allocation and loop sentinels;
|
|
* eventually they'll be converted to enums... */
|
|
#define UA_MAX_TYPES 8
|
|
#define UA_MAX_FIELD_INDEX 69
|
|
#define UA_MAX_CUSTOM_DIMENSION 200
|
|
#define UA_MAX_CUSTOM_METRIC 200
|
|
#define UA_START_CDIMENSIONS 57
|
|
#define UA_START_CMETRICS 257
|
|
#define UA_MAX_PARAMETERS (UA_MAX_FIELD_INDEX + UA_MAX_CUSTOM_DIMENSION + UA_MAX_CUSTOM_METRIC)
|
|
#define UA_CUSTOM_PARAM_LEN 6
|
|
#define UA_CUSTOM_PARAM_BUFFER ((UA_MAX_CUSTOM_DIMENSION + UA_MAX_CUSTOM_METRIC) * UA_CUSTOM_PARAM_LEN)
|
|
#define UA_MAX_TRACKER_OPTION 1
|
|
|
|
|
|
/* Boolean aliases for precise evaluation */
|
|
typedef enum {
|
|
UA_FALSE = 0,
|
|
UA_TRUE = 1
|
|
} UABoolean_t;
|
|
|
|
|
|
/* Tracking types
|
|
* These signify pageviews, events, transactions, etc.
|
|
* Some behaviors (e.g. required parameters) may be altered by
|
|
* this option (in future versions).
|
|
*/
|
|
typedef enum trackingType {
|
|
UA_PAGEVIEW = 0,
|
|
UA_APPVIEW,
|
|
UA_SCREENVIEW,
|
|
UA_EVENT,
|
|
UA_TRANSACTION,
|
|
UA_TRANSACTION_ITEM,
|
|
UA_TIMING,
|
|
UA_SOCIAL,
|
|
UA_EXCEPTION
|
|
} trackingType_t;
|
|
|
|
/* Tracking fields
|
|
* These represent named parameters on the resulting URL query
|
|
* sent to Google Analytics servers. They act as indices into
|
|
* the array of parameter nodes for URL composition.
|
|
*/
|
|
typedef enum trackingField {
|
|
UA_TRACKING_TYPE = 0,
|
|
UA_VERSION_NUMBER,
|
|
UA_TRACKING_ID, /* string like UA-XXXXX-Y */
|
|
UA_CLIENT_ID,
|
|
UA_USER_ID,
|
|
UA_ANONYMIZE_IP,
|
|
UA_DOCUMENT_PATH,
|
|
UA_DOCUMENT_TITLE,
|
|
UA_DOCUMENT_LOCATION,
|
|
UA_DOCUMENT_HOSTNAME,
|
|
UA_DOCUMENT_REFERRER,
|
|
UA_DOCUMENT_ENCODING,
|
|
UA_QUEUE_TIME_MS,
|
|
UA_CACHE_BUSTER,
|
|
UA_SESSION_CONTROL,
|
|
UA_CAMPAIGN_NAME,
|
|
UA_CAMPAIGN_SOURCE,
|
|
UA_CAMPAIGN_MEDIUM,
|
|
UA_CAMPAIGN_KEYWORD,
|
|
UA_CAMPAIGN_CONTENT,
|
|
UA_CAMPAIGN_ID,
|
|
UA_SCREEN_RESOLUTION,
|
|
UA_VIEWPORT_SIZE,
|
|
UA_SCREEN_COLORS,
|
|
UA_USER_LANGUAGE,
|
|
UA_USER_AGENT,
|
|
UA_APP_NAME,
|
|
UA_APP_VERSION,
|
|
UA_APP_ID,
|
|
UA_APP_INSTALLER_ID,
|
|
UA_CONTENT_DESCRIPTION,
|
|
UA_SCREEN_NAME,
|
|
UA_EVENT_CATEGORY,
|
|
UA_EVENT_ACTION,
|
|
UA_EVENT_LABEL,
|
|
UA_EVENT_VALUE,
|
|
UA_NON_INTERACTIVE,
|
|
UA_SOCIAL_ACTION,
|
|
UA_SOCIAL_NETWORK,
|
|
UA_SOCIAL_TARGET,
|
|
UA_EXCEPTION_DESCRIPTION,
|
|
UA_EXCEPTION_FATAL,
|
|
UA_TRANSACTION_ID,
|
|
UA_TRANSACTION_AFFILIATION,
|
|
UA_TRANSACTION_REVENUE,
|
|
UA_TRANSACTION_SHIPPING,
|
|
UA_TRANSACTION_TAX,
|
|
UA_TRANSACTION_CURRENCY,
|
|
UA_CURRENCY_CODE,
|
|
UA_ITEM_CODE,
|
|
UA_ITEM_NAME,
|
|
UA_ITEM_VARIATION,
|
|
UA_ITEM_CATEGORY,
|
|
UA_ITEM_PRICE,
|
|
UA_ITEM_QUANTITY,
|
|
UA_TIMING_CATEGORY,
|
|
UA_TIMING_VARIABLE,
|
|
UA_TIMING_LABEL,
|
|
UA_TIMING_TIME,
|
|
UA_TIMING_DNS,
|
|
UA_TIMING_PAGE_LOAD,
|
|
UA_TIMING_REDIRECT,
|
|
UA_TIMING_TCP_CONNECT,
|
|
UA_TIMING_SERVER_RESPONSE,
|
|
UA_ADWORDS_ID,
|
|
UA_DISPLAY_AD_ID,
|
|
UA_LINK_ID,
|
|
UA_JAVA_ENABLED,
|
|
UA_FLASH_VERSION,
|
|
UA_CUSTOM_DIMENSION,
|
|
UA_CUSTOM_METRIC
|
|
} trackingField_t;
|
|
|
|
|
|
/* Name/Value pair with slot ID for URL composition */
|
|
typedef struct UAParameter_t {
|
|
trackingField_t field;
|
|
unsigned int slot_id;
|
|
const char* name;
|
|
const char* value;
|
|
} UAParameter_t;
|
|
|
|
/* Flag to specify which level of tracker state to update */
|
|
typedef enum stateScopeFlag_t {
|
|
UA_PERMANENT = 0,
|
|
UA_EPHEMERAL = 1
|
|
} stateScopeFlag_t;
|
|
|
|
/* Configuration flags */
|
|
typedef enum UATrackerOption_t {
|
|
UA_OPTION_QUEUE = 0
|
|
} UATrackerOption_t;
|
|
|
|
|
|
/* Tracker layout intended to maximize stack allocation and
|
|
* minimize heap/dynamic allocation */
|
|
typedef struct UATracker_t {
|
|
int __configured__;
|
|
|
|
/* Configuration flags */
|
|
int options[ UA_MAX_TRACKER_OPTION ];
|
|
|
|
/* State maps for the tracker's resulting parameter values */
|
|
struct UAParameter_t lifetime_parameters[ UA_MAX_PARAMETERS ];
|
|
struct UAParameter_t ephemeral_parameters[ UA_MAX_PARAMETERS ];
|
|
|
|
/* Custom parameter names (e.g. cm1, cm199, cd1, cd199).
|
|
* These are dynamically populated during tracker initialization
|
|
* and linked in pointer-arrays below; this merely allocates
|
|
* space (statically) as a component of the tracker */
|
|
char map_custom[ UA_CUSTOM_PARAM_BUFFER ];
|
|
|
|
/* Standard parameter names (e.g. cid, tid, ea, ec...)
|
|
* These are populated in stack space by |populateParameterNames|
|
|
* during tracker initialization */
|
|
const char* map_parameters[ UA_MAX_PARAMETERS ];
|
|
|
|
/* Standard tracking type names (e.g. pageview, event, etc)
|
|
* These are populated in stack space by |populateTypeNames|
|
|
* during tracker initialization */
|
|
const char* map_types[ UA_MAX_TYPES ];
|
|
|
|
/* Placeholder for HTTP "User-Agent" header */
|
|
const char* user_agent;
|
|
|
|
/* Stash space for the query strings generated through |sendTracking| */
|
|
char query[ UA_MAX_QUERY_LEN ];
|
|
int query_len;
|
|
|
|
/* HTTP handler (from http.h) */
|
|
struct HTTPQueue_t queue;
|
|
|
|
} UATracker_t;
|
|
|
|
|
|
/* Field/Value pairs with slot ID for convenient static specification */
|
|
typedef struct UAOptionNode_t {
|
|
trackingField_t field;
|
|
unsigned int slot_id;
|
|
const char* value;
|
|
} UAOptionNode_t;
|
|
|
|
/* List of options (field/value pairs with slot ID */
|
|
typedef struct UAOptions_t {
|
|
struct UAOptionNode_t options[ UA_MAX_PARAMETERS ];
|
|
} UAOptions_t;
|
|
|
|
|
|
|
|
/* Other shortcuts for external interfaces */
|
|
typedef UATracker_t* UATracker;
|
|
typedef UAParameter_t UAParameter;
|
|
typedef UAOptions_t UASettings;
|
|
typedef UAOptions_t UAOptions;
|
|
|
|
|
|
/* Creates Google Analytics tracker state objects */
|
|
UATracker createTracker(const char* trackingId, const char* clientId, const char* userId);
|
|
|
|
/* Initialize tracker state */
|
|
void initTracker(UATracker tracker, const char* trackingId, const char* clientId, const char* userId);
|
|
|
|
/* Set flags to tune the funcionality of the tracker */
|
|
void setTrackerOption(UATracker tracker, UATrackerOption_t option, int value);
|
|
|
|
/* Stores option-values for the life of the tracker */
|
|
void setParameters(UATracker tracker, UAOptions_t* opts);
|
|
|
|
/* Store a single option-value pair */
|
|
void setParameter(UATracker tracker, trackingField_t type, unsigned int slot_id, const char* value);
|
|
|
|
/* Processes tracker state with a tracking type and ephemeral options
|
|
* Dispatches resulting query to Google Analytics */
|
|
void sendTracking(UATracker state, trackingType_t type, UAOptions_t* opts);
|
|
|
|
/* Safely wipe tracker state without free() */
|
|
void cleanTracker(UATracker);
|
|
|
|
/* Clears tracker memory & free()s all allocated heap space */
|
|
void removeTracker(UATracker);
|
|
|
|
|
|
|
|
#endif /* UNIVERSALANALYTICS_HEADER_GUARD */
|