Beispiel #1
0
        private static void GetContactsFromResponse(WebResponse response, StatusDownload loghandler)
        {
            var httpResponse = response.GetResponseStream();

            using (var streamReader = new StreamReader(httpResponse))
            {
                var result = streamReader.ReadToEnd();

                var receivedData = JsonConvert.DeserializeObject <CustomerSyncResult>(result);
                if (receivedData.success)
                {
                    var contacts = receivedData.contacts;
                    DBLocalDataStore.GetInstance().ClearAllContacts();
                    foreach (var contact in contacts)
                    {
                        if (string.IsNullOrEmpty(contact.uid))
                        {
                            Console.WriteLine("Received contact {0} has no UID, ignoring", JsonConvert.SerializeObject(contact, Formatting.Indented));
                            continue;
                        }
                        var localContact = new DBlocalContact(contact);
                        localContact.source = ContactSource.Server;
                        DBLocalDataStore.GetInstance().AddLocalContact(localContact);
                        Console.Error.WriteLine("Contact with UID {0} added", contact.uid);
                    }
                    loghandler(true, "Contacts updated from server");
                }
                else
                {
                    loghandler(false, receivedData.error);
                }
            }
        }
Beispiel #2
0
        public static bool validateContact(DBlocalContact contact, bool isNewContact)
        {
            if (contact == null)
            {
                throw new ArgumentNullException(nameof(contact), "Contact must not be null");
            }
            if (string.IsNullOrEmpty(contact.firstname))
            {
                throw new ArgumentException("First name is missing");
            }
            if (string.IsNullOrEmpty(contact.lastname))
            {
                throw new ArgumentException("Last name is missing");
            }
            if (string.IsNullOrEmpty(contact.email) && isNewContact)
            {
                throw new ArgumentException("Email is missing");
            }

            if (!OfflineLogic.isEmail(contact.email) && isNewContact)
            {
                throw new ArgumentException("Email is incorrect");
            }

            return(true);
        }
Beispiel #3
0
        private static void UpdateContactsFromResponse(List <CustomerType> contactsList)
        {
            var localContacts = DBLocalDataStore.GetInstance().GetLocalContacts();

            localContacts.RemoveAll((c) => string.IsNullOrWhiteSpace(c.uid));
            var serverContacts = contactsList;

            if (serverContacts != null)
            {
                foreach (var contact in serverContacts)
                {
                    if (string.IsNullOrWhiteSpace(contact.uid))
                    {
                        Console.WriteLine("Received contact {0} has no UID, ignoring", JsonConvert.SerializeObject(contact, Formatting.Indented));
                        continue;
                    }
                    var existingLocalContact = localContacts.Find(c => c.uid.Equals(contact.uid));
                    var newContact           = new DBlocalContact(contact);
                    if (existingLocalContact != null)
                    {
                        existingLocalContact       += newContact;
                        existingLocalContact.source = ContactSource.Server;
                        DBLocalDataStore.GetInstance().UpdateLocalContact(existingLocalContact);
                        Console.Error.WriteLine("Contact with UID {0} updated from server", contact.uid);
                    }
                    else
                    {
                        newContact.source = ContactSource.Server;
                        DBLocalDataStore.GetInstance().AddLocalContact(newContact);
                        Console.Error.WriteLine("Contact with UID {0} added", contact.uid);
                    }
                }
            }
        }
Beispiel #4
0
        private static DBlocalContact parseAsArtexis(string barcodeString)
        {
            //format example: "[["barcode","5160017139930041470033",0],["Name","Gert Stalmans",1]]"

            var parts = barcodeString.Trim('[', ']').Split(new string[] { "],[" }, StringSplitOptions.RemoveEmptyEntries);

            string barcode   = string.Empty;
            string firstName = string.Empty;
            string lastName  = string.Empty;

            foreach (var part in parts)
            {
                string partCopy = new string(part.ToCharArray());
                partCopy = partCopy.Replace("\"", null);
                var subParts = partCopy.Split(',');
                if (subParts[0].ToLower().Equals("barcode"))
                {
                    barcode = subParts[1];
                    continue;
                }
                if (subParts[0].ToLower().Equals("name"))
                {
                    string namePart = subParts[1];

                    if (namePart.Contains(" "))
                    {
                        var nameSplit = namePart.Split(' ').ToList();
                        firstName = nameSplit.ElementAt(0);
                        nameSplit.RemoveAt(0);
                        lastName = string.Join(" ", nameSplit);
                    }
                    else
                    {
                        firstName = namePart;
                    }

                    continue;
                }
            }

            if (string.IsNullOrWhiteSpace(barcode) || string.IsNullOrWhiteSpace(string.Format("{0} {1}", firstName, lastName)))
            {
                throw new InvalidOperationException("The QR code contains invalid information and can't be used.");
            }
            else
            {
                DBlocalContact contact = new DBlocalContact();
                contact.firstname = firstName;
                contact.lastname  = string.IsNullOrWhiteSpace(lastName) ? null : lastName;
                contact.uid       = barcode;
                return(contact);
            }
        }
Beispiel #5
0
        public static void createOrUpdateContact(DBlocalContact newContact)
        {
            DBlocalContact    oldLocalContact = DBLocalDataStore.GetInstance().GetLocalContactsByUID(newContact.uid);
            DBContactToServer existingChanges = DBLocalDataStore.GetInstance().GetContactsToServerByUID(newContact.uid);

            if (oldLocalContact != null)
            {
                if (existingChanges == null)
                {
                    existingChanges  = new DBContactToServer(oldLocalContact);
                    existingChanges -= newContact;
                    DBLocalDataStore.GetInstance().AddContactToServer(existingChanges);
                }
                else
                {
                    DBContactToServer lastChanges = new DBContactToServer(oldLocalContact);
                    lastChanges     -= newContact;
                    existingChanges &= lastChanges;
                    DBLocalDataStore.GetInstance().UpdateContactToServer(existingChanges);
                }
                newContact.Id            = oldLocalContact.Id;
                newContact.activeContact = true;

                DBLocalDataStore.GetInstance().UpdateLocalContact(newContact);
                Console.WriteLine("updated contact: \n{0}", JsonConvert.SerializeObject(newContact));
            }
            else
            {
                existingChanges = new DBContactToServer(newContact, true);
                //existingChanges = existingChanges.newContact(existingChanges);
                DBLocalDataStore.GetInstance().AddContactToServer(existingChanges);
                newContact.activeContact = true;
                if (newContact.Id == 0)
                {
                    DBLocalDataStore.GetInstance().AddLocalContact(newContact);
                }
                else
                {
                    DBLocalDataStore.GetInstance().UpdateLocalContact(newContact);
                }
                Console.WriteLine("created contact: \n{0}", JsonConvert.SerializeObject(newContact));
            }
        }
Beispiel #6
0
        public static async Task sendBadge(DBlocalContact contact, string URL)
        {
            try
            {
                var uri = new Uri(URL);
                uri.ToString();
            }
            catch
            {
                throw new ArgumentException("Invalid webhook URL");
            }
            SyncContext scr = new SyncContext();

            scr.context  = new RequestData();
            scr.contacts = new List <CustomerType>();
            scr.contacts.Add(new CustomerType(contact));

            var appInfo = DBLocalDataStore.GetInstance().GetAppInfo();
            var user    = DBLocalDataStore.GetInstance().GetLocalUserInfo();
            var context = scr.context;

            context.password          = user.password;
            context.username          = user.username;
            context.profile           = DBLocalDataStore.GetInstance().GetSelectProfile().shortName;
            context.tags              = new string[] { user.tags };
            context.campaignReference = appInfo.campaignReference;

            string json = JsonConvert.SerializeObject(scr, Formatting.Indented);

            Console.WriteLine("Trying to send to webhook:\n{0}", json);

            //var httpWebRequest = (HttpWebRequest)WebRequest.Create(URL);
            var httpWebRequest = WebRequest.CreateHttp(URL);

            try
            {
                //throw new Exception("TEST EXCEPTION");
                httpWebRequest.ContentType = "application/json";
                httpWebRequest.Method      = "POST";
                httpWebRequest.Timeout     = 30000;
                httpWebRequest.ServicePoint.ConnectionLimit = 3;
                httpWebRequest.KeepAlive = false;

                using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
                {
                    streamWriter.Write(json);
                }

                var response = await httpWebRequest.GetResponseAsync();

                using (var streamReader = new StreamReader(response.GetResponseStream()))
                {
                    var result = streamReader.ReadToEnd();

                    Console.WriteLine("Received from webhook:\n{0}", result);

                    var settings = new JsonSerializerSettings();
                    settings.MissingMemberHandling = MissingMemberHandling.Ignore;
                    var receivedData = JsonConvert.DeserializeObject <CustomerSyncResult>(result, settings);
                    if (NetworkRequests._onFinishPrint != null)
                    {
                        NetworkRequests._onFinishPrint(receivedData.success);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Webhook exception: {0}", ex.Message);
                if (NetworkRequests._onFinishPrint != null)
                {
                    NetworkRequests._onFinishPrint(false);
                }
                //throw;
            }
            finally
            {
                httpWebRequest.Abort();
            }
        }
Beispiel #7
0
        public static async Task <DBlocalContact> didScanBarcode(string barcode_, string symbology, StatusLookup callback)
        {
            if (callback == null)
            {
                throw new ArgumentNullException("Callback must not be null to handle result");
            }

            var barcode = barcode_.Trim();

            DBlocalContact temporaryContact = null;

            if (symbology == "QR")
            {
                if (!OfflineLogic.isBarcodeValid(barcode))
                {
                    throw new InvalidOperationException("The QR code cannot be used by BoaBee because it is not a contact or an ID.");
                }
                else if (barcode.Contains("BEGIN:VCARD"))
                {
                    //VCard
                    temporaryContact = OfflineLogic.parseAsVCard(barcode);
                }
                else if (barcode.StartsWith("[[") && barcode.EndsWith("]]"))
                {
                    //Artexis
                    temporaryContact = OfflineLogic.parseAsArtexis(barcode);
                }
                else
                {
                    //unknown format
                    temporaryContact     = new DBlocalContact();
                    temporaryContact.uid = barcode;
                }
            }
            else
            {
                //unknown format
                temporaryContact     = new DBlocalContact();
                temporaryContact.uid = barcode;
            }
            DBAppSettings appSettings = DBLocalDataStore.GetInstance().GetAppSettings();

            if (appSettings == null)
            {
                appSettings = new DBAppSettings();
                appSettings.instantContactCheck = true;
                DBLocalDataStore.GetInstance().SetAppSettings(appSettings);
            }

            string message = string.Empty;

            if (appSettings.instantContactCheck)
            {
                var localContact = DBLocalDataStore.GetInstance().GetLocalContactsByUID(temporaryContact.uid);
                if (localContact != null)
                {
                    temporaryContact   &= localContact;
                    temporaryContact.Id = localContact.Id;
                }

                if (await Reachability.isConnected())
                {
                    try
                    {
                        int timeout = 10000;
                        var timeoutCancellationTokenSource = new CancellationTokenSource();
                        var timeoutTask = Task.Delay(timeout, timeoutCancellationTokenSource.Token);

                        var task = NetworkRequests.contactLookup(temporaryContact.uid);

                        DBlocalContact serverContact = null;
                        if (await Task.WhenAny(task, timeoutTask) == task)
                        {
                            // Task completed within timeout.
                            // Consider that the task may have faulted or been canceled.
                            // We re-await the task so that any exceptions/cancellation is rethrown.

                            timeoutCancellationTokenSource.Cancel();

                            serverContact = await task;
                            if (serverContact != null)
                            {
                                if (serverContact.hasOnlyUID() || serverContact.hasOnlyUIDAndName())
                                {
                                    message = "Check for additional contact details can't be executed at this moment. More details will be added to your report if available.";
                                }
                                else
                                {
                                    message = "These are the details we have found for you. Feel free to complete the rest below.";
                                }
                            }
                            else
                            {
                                message = "Check for additional contact details can't be executed at this moment. More details will be added to your report if available.";
                            }
                            Console.Error.WriteLine("Server has contact: {0}", serverContact != null);
                        }
                        else
                        {
                            // timeout/cancellation logic
                            message = "Check for additional contact details can't be executed at this moment. More details will be added to your report if available.";
                            Console.Error.WriteLine("Timed out");
                        }

                        temporaryContact *= serverContact;
                    }
                    catch (Exception e)
                    {
                        message = "Check for additional contact details can't be executed at this moment. More details will be added to your report if available.";
                        Console.Error.WriteLine("contactLookup exception: {0}", e.Message);
                    }
                }
                else
                {
                    message = "Check for additional contact details can't be executed at this moment. More details will be added to your report if available.";
                }
            }
            else
            {
                message = "Instant contact checking is turned off";
            }
            callback(message);
            return(temporaryContact);
        }
Beispiel #8
0
        private static DBlocalContact parseAsVCard(string barcode)
        {
            var QRContent = barcode.Split("\r\n".ToCharArray());

            DBlocalContact contact = new DBlocalContact();

            foreach (var _part in QRContent)
            {
                var part = string.Copy(_part);

                part = part.Replace("\r\n", "").Replace("\r", "").Replace("\n", "");

                if (part.Contains("N:") && part.IndexOf("N:") == 0)
                {
                    var t = part.Substring(part.IndexOf(":") + 1).Split(";".ToCharArray());

                    List <string> firstLastName = new List <string>();
                    foreach (var st in t)
                    {
                        if (!st.Contains(";") && !string.IsNullOrEmpty(st))
                        {
                            firstLastName.Add(st);
                        }
                    }
                    contact.lastname  = firstLastName[0].Trim();
                    contact.firstname = firstLastName[1].Trim();
                    continue;
                }

                if (part.Contains("ORG") && part.IndexOf("ORG") == 0)
                {
                    contact.company = part.Substring(part.IndexOf(":") + 1);
                    continue;
                }
                if (part.Contains("EMAIL") && part.IndexOf("EMAIL") == 0)
                {
                    if (string.IsNullOrEmpty(contact.email))
                    {
                        contact.email = part.Substring(part.IndexOf(":") + 1);
                        contact.uid   = contact.email;
                    }
                    continue;
                }
                if (part.Contains("TEL") && part.IndexOf("TEL") == 0)
                {
                    if (string.IsNullOrEmpty(contact.phone))
                    {
                        contact.phone = part.Substring(part.IndexOf(":") + 1);
                    }
                    continue;
                }
                if (part.Contains("ADR") && part.IndexOf("ADR") == 0)
                {
                    part = part.Substring(part.IndexOf(":") + 1);
                    List <string> adr_parts = part.Split(";".ToCharArray(), StringSplitOptions.None).ToList();
                    contact.city    = adr_parts[3];
                    contact.street  = adr_parts[2];
                    contact.zip     = adr_parts[5];
                    contact.country = adr_parts[6];
                    continue;
                }
            }
            //contact.email = contact.email.Replace(" ", string.Empty);
            if (contact.email != null)
            {
                contact.email = contact.email.Trim();
            }
            if (contact.lastname != null)
            {
                contact.lastname = contact.lastname.Trim();
            }
            if (contact.firstname != null)
            {
                contact.firstname = contact.firstname.Trim();
            }

            if (!isEmail(contact.email))
            {
                throw new InvalidOperationException("The QR code contains invalid information and can't be used.");
            }
            if (string.IsNullOrWhiteSpace(contact.lastname))
            {
                throw new InvalidOperationException("The QR code contains invalid information and can't be used.");
            }
            if (string.IsNullOrWhiteSpace(contact.firstname))
            {
                throw new InvalidOperationException("The QR code contains invalid information and can't be used.");
            }

            return(contact);
        }