public Parameters Copy()
        {
            Parameters copy = new Parameters();

            copy.advertiserId = this.advertiserId;
            copy.advertiserKey = this.advertiserKey;
            copy.culture = this.culture;
            copy.matRequest = this.matRequest; //Make this a hard copy
            copy.urlEncrypter = this.urlEncrypter;

            copy.Age = this.Age;
            copy.AllowDuplicates = this.AllowDuplicates;
            copy.Altitude = this.Altitude;
            copy.AppAdTracking = this.AppAdTracking;
            copy.AppName = this.AppName;
            copy.AppVersion = this.AppVersion;
            copy.ASHWID = this.ASHWID;
            copy.DebugMode = this.DebugMode;
            copy.DeviceBrand = this.DeviceBrand;
            copy.DeviceModel = this.DeviceModel;
            copy.DeviceType = this.DeviceType;
            copy.EventContentType = this.EventContentType;
            copy.EventContentId = this.EventContentId;
            copy.EventLevel = this.EventLevel;
            copy.EventQuantity = this.EventQuantity;
            copy.EventSearchString = this.EventSearchString;
            copy.EventRating = this.EventRating;
            copy.EventDate1 = this.EventDate1;
            copy.EventDate2 = this.EventDate2;
            copy.EventAttribute1 = this.EventAttribute1;
            copy.EventAttribute2 = this.EventAttribute2;
            copy.EventAttribute3 = this.EventAttribute3;
            copy.EventAttribute4 = this.EventAttribute4;
            copy.EventAttribute5 = this.EventAttribute5;
            copy.ExistingUser = this.ExistingUser;
            copy.FacebookUserId = this.FacebookUserId;
            copy.Gender = this.Gender;
            copy.GoogleUserId = this.GoogleUserId;
            copy.IsPayingUser = this.IsPayingUser;
            copy.LastOpenLogId = this.LastOpenLogId;
            copy.Latitude = this.Latitude;
            copy.Longitude = this.Longitude;
            copy.MatId = this.MatId;
            copy.OpenLogId = this.OpenLogId;
            copy.PackageName = this.PackageName;
            copy.TwitterUserId = this.TwitterUserId;
            copy.UserAgent = this.UserAgent;
            copy.UserEmail = this.UserEmail;
            copy.UserId = this.UserId;
            copy.UserName = this.UserName;
            copy.WindowsAid = this.WindowsAid;

            return copy;
        }
 protected internal MATEventQueue(Parameters parameters)
 {
     this.parameters = parameters;
     syncLock = new Object();
 }
 internal MATUrlRequester(Parameters parameters, MATEventQueue eventQueue)
 {
     this.parameters = parameters;
     this.eventQueue = eventQueue;
 }
        //TODO: Look into using JSON rather than strings
        public static string BuildUrl(string action, string eventName, double revenue, string currency, string refId, List<MATEventItem> eventItems, Parameters parameters)
        {
            StringBuilder url = new StringBuilder("https://");
            url.Append(Uri.EscapeUriString(parameters.advertiserId)).Append(".");

            if (parameters.DebugMode)
                url.Append("debug.");
            url.Append(DOMAIN).Append("/serve?sdk=").Append(SDK_TYPE).Append("&ver=").Append(SDK_VERSION);
            url.Append("&advertiser_id=").Append(Uri.EscapeUriString(parameters.advertiserId));
            url.Append("&mat_id=").Append(Uri.EscapeUriString(parameters.MatId));
            url.Append("&action=").Append(Uri.EscapeUriString(action));
            url.Append("&package_name=").Append(Uri.EscapeUriString(parameters.PackageName));
            url.Append("&transaction_id=").Append(Guid.NewGuid().ToString().ToUpper());
            // Append event name/ID for events
            if (action.Equals("conversion"))
            {
                long value;
                if (long.TryParse(eventName, out value))
                    url.Append("&site_event_id=").Append(eventName);
                else
                    url.Append("&site_event_name=").Append(Uri.EscapeUriString(eventName));
            }

            // Append open log id
            if (parameters.OpenLogId != null)
                url.Append("&open_log_id=").Append(Uri.EscapeUriString(parameters.OpenLogId));
            if (parameters.LastOpenLogId != null)
                url.Append("&last_open_log_id=").Append(Uri.EscapeUriString(parameters.LastOpenLogId));

            if (parameters.AllowDuplicates)
                url.Append("&skip_dup=1");
            if (parameters.DebugMode)
                url.Append("&debug=1");
            if (parameters.ExistingUser)
                url.Append("&existing_user=1");

            // Construct encrypted data params and append to url
            StringBuilder data = new StringBuilder();
            // Add UNIX timestamp as system date
            long timestamp = UnixTimestamp();
            data.Append("&system_date=").Append(timestamp.ToString());

            data.Append("&windows_aid=").Append(Uri.EscapeUriString(parameters.WindowsAid));
            data.Append("&app_name=").Append(Uri.EscapeUriString(parameters.AppName));
            data.Append("&app_version=").Append(Uri.EscapeUriString(parameters.AppVersion));
            data.Append("&os_id=").Append(Uri.EscapeUriString(parameters.ASHWID));
            if (parameters.UserAgent != null)
                data.Append("&user_agent=").Append(Uri.EscapeUriString(parameters.UserAgent));
            if (parameters.AppAdTracking)
                data.Append("&app_ad_tracking=1");
            else
                data.Append("&app_ad_tracking=0");

            if (revenue > 0)
                data.Append("&revenue=").Append(Uri.EscapeUriString(revenue.ToString(parameters.culture)));
            if (currency != null)
                data.Append("&currency_code=").Append(Uri.EscapeUriString(currency));
            if (refId != null)
                data.Append("&advertiser_ref_id=").Append(Uri.EscapeUriString(refId));

            if (parameters.Age > 0)
                data.Append("&age=").Append(Uri.EscapeUriString(parameters.Age.ToString(parameters.culture)));
            data.Append("&altitude=").Append(Uri.EscapeUriString(parameters.Altitude.ToString()));
            if (parameters.EventContentType != null)
                data.Append("&content_type=").Append(Uri.EscapeUriString(parameters.EventContentType));
            if (parameters.EventContentId != null)
                data.Append("&content_id=").Append(Uri.EscapeUriString(parameters.EventContentId));
            data.Append("&level=").Append(parameters.EventLevel.ToString());
            data.Append("&quantity=").Append(parameters.EventQuantity.ToString());
            if (parameters.EventSearchString != null)
                data.Append("&search_string=").Append(Uri.EscapeUriString(parameters.EventSearchString));
            data.Append("&rating=").Append(Uri.EscapeUriString(parameters.EventRating.ToString()));
            if (parameters.EventDate1 != null)
                data.Append("&date1=").Append(Uri.EscapeUriString(UnixTimestamp(parameters.EventDate1).ToString()));
            if (parameters.EventDate2 != null)
                data.Append("&date2=").Append(Uri.EscapeUriString(UnixTimestamp(parameters.EventDate2).ToString()));
            if (parameters.EventAttribute1 != null)
                data.Append("&attribute_sub1=").Append(Uri.EscapeUriString(parameters.EventAttribute1));
            if (parameters.EventAttribute2 != null)
                data.Append("&attribute_sub2=").Append(Uri.EscapeUriString(parameters.EventAttribute2));
            if (parameters.EventAttribute3 != null)
                data.Append("&attribute_sub3=").Append(Uri.EscapeUriString(parameters.EventAttribute3));
            if (parameters.EventAttribute4 != null)
                data.Append("&attribute_sub4=").Append(Uri.EscapeUriString(parameters.EventAttribute4));
            if (parameters.EventAttribute5 != null)
                data.Append("&attribute_sub5=").Append(Uri.EscapeUriString(parameters.EventAttribute5));
            if (parameters.DeviceBrand != null)
                data.Append("&device_brand=").Append(Uri.EscapeUriString(parameters.DeviceBrand));
            if (parameters.DeviceModel != null)
                data.Append("&device_model=").Append(Uri.EscapeUriString(parameters.DeviceModel));
            if (parameters.DeviceType != null)
                data.Append("&device_type=").Append(Uri.EscapeUriString(parameters.DeviceType));
            if (parameters.FacebookUserId != null)
                data.Append("&facebook_user_id=").Append(Uri.EscapeUriString(parameters.FacebookUserId));
            if (parameters.Gender != MATGender.NONE)
                data.Append("&gender=").Append(Uri.EscapeUriString(((int)parameters.Gender).ToString(parameters.culture)));
            if (parameters.GoogleUserId != null)
                data.Append("&google_user_id=").Append(Uri.EscapeUriString(parameters.GoogleUserId));
            if (parameters.IsPayingUser != false)
                data.Append("&is_paying_user=1");
            if (parameters.Latitude != 0)
                data.Append("&latitude=").Append(Uri.EscapeUriString(parameters.Latitude.ToString(parameters.culture)));
            if (parameters.Longitude != 0)
                data.Append("&longitude=").Append(Uri.EscapeUriString(parameters.Longitude.ToString(parameters.culture)));
            if (parameters.TwitterUserId != null)
                data.Append("&twitter_user_id=").Append(Uri.EscapeUriString(parameters.TwitterUserId));
            if (parameters.UserEmail != null)
                data.Append("&user_email=").Append(Uri.EscapeUriString(parameters.UserEmail));
            if (parameters.UserId != null)
                data.Append("&user_id=").Append(Uri.EscapeUriString(parameters.UserId));
            if (parameters.UserName != null)
                data.Append("&user_name=").Append(Uri.EscapeUriString(parameters.UserName));

            // Add event items to url as json string
            if (eventItems != null)
                data.Append("&site_event_items=").Append(Uri.EscapeUriString(JsonConvert.SerializeObject(eventItems)));

            if (parameters.matRequest != null)
                parameters.matRequest.ParamsToBeEncrypted(data.ToString());

            // Encrypt data string
            string dataStr = parameters.urlEncrypter.Encrypt(data.ToString());
            url.Append("&data=").Append(dataStr);

            url.Append("&response_format=json");

            if (parameters.matRequest != null)
                parameters.matRequest.ConstructedRequest(url.ToString());

            return url.ToString();
        }
 // Add a url to event queue to send later
 internal void ProcessTrackingRequest(string action, string eventName, double revenue, string currency, string refId, List<MATEventItem> eventItems, Parameters paramCopy)
 {
     Debug.WriteLine("Processing tracking request");
     lock (syncLock)
     {
         Task.Factory.StartNew(() =>
         {
             DumpQueue();
             string url = MATUrlBuilder.BuildUrl(action, eventName, revenue, currency, refId, eventItems, paramCopy);
             AddToQueue(url, 0);
             DumpQueue();
         });
        }
 }
 internal MATEventQueue(Parameters parameters)
 {
     syncLock = new object();
     this.parameters = parameters;
 }
        internal void ProcessTrackingRequest(string action, string eventName, double revenue, string currency, string refId, List<MATEventItem> eventItems, Parameters copy)
        {
            lock (syncLock)
            {
                if (queueThread == null || !queueThread.IsAlive)
                {
                    queueThread = new Thread(delegate() //Start on separate thread to avoid slowdown
                    {
                        DumpQueue(); //Clear anything from the last dump
                        List<MATUrlBuilder.URLInfo> eventQueue;
                        // Get existing event queue or create new one
                        if (IsolatedStorageSettings.ApplicationSettings.Contains(SETTINGS_MATEVENTQUEUE_KEY) &&
                            IsolatedStorageSettings.ApplicationSettings[SETTINGS_MATEVENTQUEUE_KEY].GetType() == typeof(List<MATUrlBuilder.URLInfo>))
                        {
                            eventQueue = (List<MATUrlBuilder.URLInfo>)IsolatedStorageSettings.ApplicationSettings[SETTINGS_MATEVENTQUEUE_KEY];
                        }
                        else // No existing queue, create
                        {
                            IsolatedStorageSettings.ApplicationSettings.Remove(SETTINGS_MATEVENTQUEUE_KEY);
                            eventQueue = new List<MATUrlBuilder.URLInfo>();
                        }

                        MATUrlBuilder.URLInfo url = MATUrlBuilder.BuildUrl(action, eventName, revenue, currency, refId, eventItems, copy);
                        eventQueue.Add(url);
                        SaveLocalSetting(SETTINGS_MATEVENTQUEUE_KEY, eventQueue);

                        if (parameters.matResponse != null)
                            parameters.matResponse.EnqueuedActionWithRefId(refId);

                        DumpQueue();
                    });
                    queueThread.Start();
                }
            }
        }
        public void InitializeValues(string advId, string advKey)
        {
            var hardwareId = HardwareIdentification.GetPackageSpecificToken(null).Id;
            var dataReader = DataReader.FromBuffer(hardwareId);
            byte[] bytes = new byte[hardwareId.Length];
            dataReader.ReadBytes(bytes);

            this.parameters = new Parameters(advId, advKey, bytes);

            eventQueue = new MATEventQueue(parameters);

            GetUserAgent();

            // Handles the OnNetworkStatusChange event
            NetworkStatusChangedEventHandler networkStatusCallback = null;

            // Indicates if the connection profile is registered for network status change events. Set the default value to FALSE.
            bool registeredNetworkStatusNotif = false;

            networkStatusCallback = new NetworkStatusChangedEventHandler(OnNetworkStatusChange);

            // Register for network status change notifications
            if (!registeredNetworkStatusNotif)
            {
                NetworkInformation.NetworkStatusChanged += networkStatusCallback;
                registeredNetworkStatusNotif = true;
            }

            // Send queued requests
            eventQueue.DumpQueue();
        }
 public MATEventQueueWrapper(Parameters parameters)
 {
     this.parameters = parameters;
 }
        public void InitializeValues(string advId, string advKey)
        {
            urlEncrypter = new Encryption(advKey, IV);

            // Attached objects for attributes, queue functionality, and more
            this.parameters = new Parameters(advId, advKey);
            eventQueue = new MATEventQueue(parameters);

            // Add listener for network availability
            DeviceNetworkInformation.NetworkAvailabilityChanged += DeviceNetworkInformation_NetworkAvailabilityChanged;

            // Check for Internet connectivity and send queued requests
            if (DeviceNetworkInformation.IsNetworkAvailable)
            {
                eventQueue.DumpQueue();
            }
        }