Пример #1
0
        public static async Task SyncDataServer()
        {
            var SyncData = DBLocalDataStore.GetInstance().getSyncRequests().Where(s => !s.isSent).ToList();
            var user     = DBLocalDataStore.GetInstance().GetLocalUserInfo();
            List <CustomerType> receivedContacts = new List <CustomerType>();

            if (user.invalidPassword)
            {
                return;
            }

            if (SyncData.Count > 0 && NetworkRequests.onBeginSync != null)
            {
                NetworkRequests.onBeginSync();
            }

            var           appInfo     = DBLocalDataStore.GetInstance().GetAppInfo();
            DBAppSettings appSettings = DBLocalDataStore.GetInstance().GetAppSettings();

            for (int i = 0; i < SyncData.Count; i++)
            {
                string jsonUser = SyncData[i].serializedSyncContext;
                var    data     = JsonConvert.DeserializeObject <SyncContext>(jsonUser);

                data.context = new RequestData();
                var context = data.context;
                context.password = user.password;
                //context.password = "******";
                context.username          = user.username;
                context.profile           = DBLocalDataStore.GetInstance().GetSelectProfile().shortName;
                context.tags              = new string[] { user.tags };
                context.campaignReference = appInfo.campaignReference;

                JsonSerializerSettings serializationSettings = new JsonSerializerSettings();
                serializationSettings.DefaultValueHandling = DefaultValueHandling.Ignore;

                jsonUser = JsonConvert.SerializeObject(data, Formatting.Indented, serializationSettings);

                Console.WriteLine("Sending to sync server:\n{0}", jsonUser);

                var httpWebRequest = (HttpWebRequest)WebRequest.Create(ServerURLs.contactsURLNew);
                try
                {
                    //throw new Exception("TEST EXCEPTION");
                    httpWebRequest.ContentType     = "application/json";
                    httpWebRequest.Method          = "POST";
                    httpWebRequest.Timeout         = 30000;
                    httpWebRequest.KeepAlive       = false;
                    httpWebRequest.PreAuthenticate = false;

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

                    var response = await httpWebRequest.GetResponseAsync();

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

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

                        var receivedData = JsonConvert.DeserializeObject <CustomerSyncResult>(result);
                        if (receivedData.success)
                        {
                            SyncData[i].isSent = true;
                            DBLocalDataStore.GetInstance().updateSyncReqest(SyncData[i]);
                            if (appSettings.getSharedContacts)
                            {
                                receivedContacts.AddRange(receivedData.contacts);
                            }
                        }
                        else
                        {
                            user.invalidPassword = true;
                            DBLocalDataStore.GetInstance().AddUserInfo(user);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Sync exception: {0}", ex.Message);
                    if (NetworkRequests.onFailSync != null)
                    {
                        onFailSync();
                    }
                    throw;
                }
                finally
                {
                    httpWebRequest.Abort();
                }
            }

            if (receivedContacts.Count > 0)
            {
                //CustomerTypeComparer comparer = new CustomerTypeComparer();
                //receivedContacts = receivedContacts.Distinct(comparer).ToList();

                NetworkRequests.UpdateContactsFromResponse(receivedContacts);

                if (NetworkRequests.onFinishSync != null)
                {
                    onFinishSync();
                }
            }
            else
            {
                if (NetworkRequests.onFailSync != null)
                {
                    onFailSync();
                }
            }
        }
Пример #2
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);
        }