protected virtual void OnAddressesChunkGeocoded(AddressesChunkGeocodedArgs e) { EventHandler <AddressesChunkGeocodedArgs> handler = AddressesChunkGeocoded; if (handler != null) { handler(this, e); } }
/// <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(); }