Пример #1
0
        protected virtual void OnAddressesChunkGeocoded(AddressesChunkGeocodedArgs e)
        {
            EventHandler <AddressesChunkGeocodedArgs> handler = AddressesChunkGeocoded;

            if (handler != null)
            {
                handler(this, e);
            }
        }
Пример #2
0
        /// <summary>
        /// Geocode and download the addresses from the temporary storage.
        /// </summary>
        /// <param name="temporarryAddressesStorageID">ID of the temporary storage</param>
        /// <param name="addressesInFile">Chunk size of the addresses to be geocoded</param>
        public async void downloadGeocodedAddresses(string temporarryAddressesStorageID, int addressesInFile)
        {
            //bool done = false;
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
                                                   | SecurityProtocolType.Tls11
                                                   | SecurityProtocolType.Tls12
                                                   | SecurityProtocolType.Ssl3;

            geocodedAddressesDownloadingIsDone = false;

            savedAddresses = new List <AddressGeocoded>();

            TEMPORARY_ADDRESSES_STORAGE_ID = temporarryAddressesStorageID;
            if (addressesInFile != null)
            {
                requestedAddresses = addressesInFile;
            }

            manualResetEvent = new ManualResetEvent(false);
            Flag             = false;

            var options = CreateOptions();

            options.Path        = "/socket.io";
            options.Host        = "validator.route4me.com/";
            options.AutoConnect = true;
            options.IgnoreServerCertificateValidation = true;
            options.Timeout    = 60000;
            options.Upgrade    = true;
            options.ForceJsonp = true;
            options.Transports = ImmutableList.Create <string>(new string[] { Polling.NAME, WebSocket.NAME });


            var uri = CreateUri();

            socket = IO.Socket(uri, options);


            socket.On("error", (message) =>
            {
                Debug.Print("Error -> " + message);
                //await Task.Delay(500);
                Thread.Sleep(500);
                manualResetEvent.Set();
                socket.Disconnect();
                //manualResetEvent.Set();
            });

            socket.On(Socket.EVENT_ERROR, (e) =>
            {
                var exception = (Quobject.SocketIoClientDotNet.EngineIoClientDotNet.Client.EngineIOException)e;
                Console.WriteLine("EVENT_ERROR. " + exception.Message);
                Console.WriteLine("BASE EXCEPTION. " + exception.GetBaseException());
                Console.WriteLine("DATA COUNT. " + exception.Data.Count);
                //events.Enqueue(exception.code);
                socket.Disconnect();
                //manager.Close();
                manualResetEvent.Set();;
            });

            socket.On(Socket.EVENT_MESSAGE, (message) =>
            {
                //Debug.Print("Error -> " + message);
                //await Task.Delay(500);
                Thread.Sleep(500);
                //manualResetEvent.Set();
            });

            socket.On("data", (d) =>
            {
                //Debug.Print("data -> " + d.ToString());
                //await Task.Delay(1000);
                Thread.Sleep(1000);
                //manualResetEvent.Set();
            });

            socket.On(Socket.EVENT_CONNECT, () =>
            {
                //Debug.Print("Socket opened");
                //socket.Close();
                //await Task.Delay(500);
                Thread.Sleep(500);

                //manualResetEvent.Set();
            });

            socket.On(Socket.EVENT_DISCONNECT, () =>
            {
                //Debug.Print("Socket disconnected");
                //socket.Close();
                //await Task.Delay(500);
                Thread.Sleep(700);

                //manualResetEvent.Set();
            });

            socket.On(Socket.EVENT_RECONNECT_ATTEMPT, () =>
            {
                //Debug.Print("Socket reconnect attempt");
                //socket.Close();
                //await Task.Delay(1000);
                Thread.Sleep(1500);

                //manualResetEvent.Set();
            });

            socket.On("addresses_bulk", (addresses_chunk) =>
            {
                //Debug.Print("addresses_chunk received");

                //await Task.Delay(500);

                string jsonChunkText = addresses_chunk.ToString();

                List <string> errors = new List <string>();

                JsonSerializerSettings jsonSettings = new JsonSerializerSettings()
                {
                    Error = delegate(object sender, ErrorEventArgs args)
                    {
                        errors.Add(args.ErrorContext.Error.Message);
                        args.ErrorContext.Handled = true;
                    },
                    NullValueHandling = NullValueHandling.Ignore
                };

                var addressesChunk = JsonConvert.DeserializeObject <AddressGeocoded[]>(jsonChunkText, jsonSettings);

                if (errors.Count > 0)
                {
                    Debug.Print("Json serializer errors:");
                    foreach (string errMessage in errors)
                    {
                        Debug.Print(errMessage);
                    }
                }

                savedAddresses = savedAddresses.Concat(addressesChunk).ToList();

                loadedAddressesCount += addressesChunk.Length;

                //Debug.Print(addressesChunk.Length.ToString());

                //Debug.Print("Got chunks from websocket %s / %s", loadedAddressesCount, requestedAddresses);
                if (loadedAddressesCount == nextDownloadStage)
                {
                    //Debug.Print("Downloading");
                    download(loadedAddressesCount);
                }

                if (loadedAddressesCount == requestedAddresses)
                {
                    //Debug.Print("First address:", savedAddresses[0].geocodedAddress);
                    //Debug.Print("Done, saved addresses %s", savedAddresses.Count);

                    socket.Emit("disconnect", TEMPORARY_ADDRESSES_STORAGE_ID);
                    loadedAddressesCount            = 0;
                    AddressesChunkGeocodedArgs args = new AddressesChunkGeocodedArgs()
                    {
                        lsAddressesChunkGeocoded = savedAddresses
                    };
                    OnAddressesChunkGeocoded(args);

                    manualResetEvent.Set();

                    geocodedAddressesDownloadingIsDone = true;

                    if (largeJsonFileProcessingIsDone)
                    {
                        OnGeocodingIsFinished(new GeocodingIsFinishedArgs()
                        {
                            isFinished = true
                        });
                    }

                    socket.Close();
                }
            });

            socket.On("geocode_progress", (message) =>
            {
                //Debug.Print("Progress from websocket:", message.ToString());

                var progressMessage = JsonConvert.DeserializeObject <clsProgress>(message.ToString());

                if (progressMessage.total == progressMessage.done)
                {
                    //Debug.Print("Geocoding Done, Downloading...");
                    if (requestedAddresses == null)
                    {
                        requestedAddresses = progressMessage.total;
                    }
                    download(0);
                }
            });

            var jobj = new JObject();

            jobj.Add("temporary_addresses_storage_id", TEMPORARY_ADDRESSES_STORAGE_ID);
            jobj.Add("force_restart", true);

            var _args = new List <object> {
            };

            _args.Add(jobj);

            try
            {
                socket.Emit("geocode", _args);
            }
            catch (Exception ex)
            {
                Debug.Print("Socket connection failed. " + ex.Message);
            }

            manualResetEvent.WaitOne();
        }