Exemple #1
0
        /// <summary>
        /// Method that handles syncing the offline and online maps
        /// </summary>
        private async Task SyncMap(Map map)
        {
            var syncTask = await OfflineMapSyncTask.CreateAsync(map);

            // set parameters for sync
            var taskParams = new OfflineMapSyncParameters()
            {
                SyncDirection     = SyncDirection.Bidirectional,
                RollbackOnFailure = true
            };

            try
            {
                // set the job to perform the sync
                OfflineMapSyncJob = syncTask.SyncOfflineMap(taskParams);

                // update the progress property when progress changes
                OfflineMapSyncJob.ProgressChanged +=
                    (s, e) =>
                {
                    Progress = OfflineMapSyncJob.Progress;
                };

                // listen for job changed events
                OfflineMapSyncJob.JobChanged += (s, e) =>
                {
                    // if sync succeeds, raise success message
                    if (OfflineMapSyncJob.Status == JobStatus.Succeeded)
                    {
                        BroadcastMessenger.Instance.RaiseBroadcastMessengerValueChanged(true, Models.BroadcastMessageKey.SyncSucceeded);
                    }
                    else if (OfflineMapSyncJob.Status == JobStatus.Failed)
                    {
                        // if the job failed display the error, unless the user has cancelled it on purpose
                        if (OfflineMapSyncJob.Error != null && OfflineMapSyncJob.Error.Message != "User canceled: Job canceled.")
                        {
                            UserPromptMessenger.Instance.RaiseMessageValueChanged(
                                null, OfflineMapSyncJob.Error.Message, true, OfflineMapSyncJob.Error.StackTrace);
                        }

                        BroadcastMessenger.Instance.RaiseBroadcastMessengerValueChanged(false, Models.BroadcastMessageKey.SyncSucceeded);
                    }
                };

                // begin sync job
                OfflineMapSyncJob.Start();
            }
            catch (Exception ex)
            {
                UserPromptMessenger.Instance.RaiseMessageValueChanged(
                    null, ex.Message, true, ex.StackTrace);

                BroadcastMessenger.Instance.RaiseBroadcastMessengerValueChanged(false, Models.BroadcastMessageKey.SyncSucceeded);
            }
        }
        private async void SyncMapArea(string parameter)
        {
            try
            {
                _windowService.SetBusy(true);
                SyncDirection synchronizationMode;
                switch (parameter)
                {
                case "Download":
                    synchronizationMode = SyncDirection.Download;
                    _windowService.SetBusyMessage("Getting latest updates...");
                    break;

                case "Upload":
                    synchronizationMode = SyncDirection.Upload;
                    _windowService.SetBusyMessage("Pushing local changes...");
                    break;

                default:
                    synchronizationMode = SyncDirection.Bidirectional;
                    _windowService.SetBusyMessage("Synchronizing features...");
                    break;
                }

                // Create task that is used to synchronize the offline map
                var task = await OfflineMapSyncTask.CreateAsync(Map);

                // Create parameters
                var parameters = new OfflineMapSyncParameters
                {
                    SyncDirection = synchronizationMode
                };

                // Create job that does the work asynchronously
                var job = task.SyncOfflineMap(parameters);
                job.ProgressChanged += async(s, e) =>
                {
                    await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                    {
                        var offlineMapSyncJob = s as OfflineMapSyncJob;
                        _windowService.SetBusyMessage($"Syncing map area...{offlineMapSyncJob.Progress}%");
                    });
                };

                // Run the job and wait the results
                var results = await job.GetResultAsync();

                if (results.HasErrors)
                {
                    // handle nicely
                }

                foreach (string message in job.Messages.Select(x => x.Message))
                {
                    Debug.WriteLine(message);
                }
            }
            catch (Exception ex)
            {
                await _windowService.ShowAlertAsync(ex.Message, "Couldn't sync map area");
            }
            finally
            {
                RefreshCommands();
                _windowService.SetBusy(false);
            }
        }
Exemple #3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="map"></param>
        /// <param name="jobHandler"></param>
        /// <param name="progressHandler"></param>
        ///
        /// <returns></returns>
        public async Task <SynchronizeReplicaResult> SynchronizeReplicaAsync(Map map, EventHandler <JobChangedEventArgs> jobHandler,
                                                                             EventHandler <ProgressChangedEventArgs> progressHandler)
        {
            var errors = new List <SyncReplicaErrorResult>();
            var task   = await OfflineMapSyncTask.CreateAsync(map);

            var param = new OfflineMapSyncParameters()
            {
                RollbackOnFailure = true,
                SyncDirection     = SyncDirection.Bidirectional
            };

            var job = task.SyncOfflineMap(param);

            if (jobHandler != null)
            {
                JobChangedEventHandler += jobHandler;
                job.JobChanged         += (o, e) =>
                {
                    if (JobChangedEventHandler != null)
                    {
                        JobChangedEventHandler.Invoke(job, new JobChangedEventArgs()
                        {
                            Messages = job.Messages, Status = job.Status
                        });
                    }
                };
            }
            if (progressHandler != null)
            {
                ProgressChangedEventHandler += progressHandler;
                job.ProgressChanged         += (o, e) =>
                {
                    ProgressChangedEventHandler?.Invoke(job, new ProgressChangedEventArgs()
                    {
                        Progress = job.Progress
                    });
                };
            }

            var result = await job.GetResultAsync();

            if (result.HasErrors)
            {
                errors.AddRange(result.LayerResults
                                .Select(l => new SyncReplicaErrorResult()
                {
                    Name = l.Key.Name, Error = l.Value.Error
                }));
                errors.AddRange(result.TableResults
                                .Select(t => new SyncReplicaErrorResult()
                {
                    Name = t.Key.TableName, Error = t.Value.Error
                }));

                return(new SynchronizeReplicaResult {
                    Synchronized = false, ResultErrors = errors
                });
            }
            else
            {
                return(new SynchronizeReplicaResult {
                    Synchronized = true
                });
            }
        }