public static List <Resource> GetResources(Catalog catalog, Filter filter, string serverUri, string proxyUrl)
 {
     return(GetResources(catalog, filter, serverUri, proxyUrl, null));
 }
Example #2
0
        private void processResult(ArcGISWebClient.DownloadStringCompletedEventArgs e)
        {
            if (e.Cancelled)
            {
                return;
            }

            if (e.Error != null)
            {
                OnGetServicesInFolderFailed(new ExceptionEventArgs(e.Error, e.UserState));
                return;
            }
            if (string.IsNullOrEmpty(e.Result))
            {
                OnGetServicesInFolderFailed(new ExceptionEventArgs(new Exception(Resources.Strings.ExceptionEmptyResponse), e.UserState));
                return;
            }

            Catalog catalog = null;

            try
            {
                string json  = e.Result;
                byte[] bytes = Encoding.Unicode.GetBytes(json);
                using (System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(bytes))
                {
                    DataContractJsonSerializer dataContractJsonSerializer = new DataContractJsonSerializer(typeof(Catalog));
                    catalog = dataContractJsonSerializer.ReadObject(memoryStream) as Catalog;
                    memoryStream.Close();
                }

                if (catalog == null)
                {
                    OnGetServicesInFolderFailed(new ExceptionEventArgs(new Exception(Resources.Strings.ExceptionUnableToDeserializeResponse), e.UserState));
                    return;
                }

                bool            retrieveChildServices = (Filter & Filter.CachedResources) == Filter.CachedResources;
                List <Resource> resources             = Utility.GetResources(catalog, Filter, Uri, ProxyUrl);
                if (retrieveChildServices && resources.Count > 0)
                {
                    int             childCount     = 0;
                    List <Resource> childResources = new List <Resource>();
                    foreach (Resource childResource in resources)
                    {
                        IService service = ServiceFactory.CreateService(childResource.ResourceType, childResource.Url, childResource.ProxyUrl);
                        if (service != null)
                        {
                            service.ServiceDetailsDownloadFailed += (o, args) =>
                            {
                                // Remove service
                                childResources.Remove(args.UserState as Resource);

                                childCount++;
                                if (childCount >= resources.Count)
                                {
                                    OnGetServicesInFolderCompleted(new GetServicesInFolderCompletedEventArgs()
                                    {
                                        ChildResources = childResources, UserState = e.UserState
                                    });
                                }
                            };
                            service.ServiceDetailsDownloadCompleted += (o, args) =>
                            {
                                childCount++;
                                IService ser = o as IService;
                                if (ser == null || !ser.IsFilteredIn(Filter))
                                {
                                    // Remove service
                                    childResources.Remove(args.UserState as Resource);
                                }
                                if (childCount >= resources.Count)
                                {
                                    OnGetServicesInFolderCompleted(new GetServicesInFolderCompletedEventArgs()
                                    {
                                        ChildResources = childResources, UserState = e.UserState
                                    });
                                }
                            };

                            // Add the service before validation so that the catalog order is preserved.  Service will be
                            // removed if found to be invalid.
                            Resource child = new Resource()
                            {
                                DisplayName  = childResource.DisplayName,
                                Url          = service.Uri,
                                ProxyUrl     = ProxyUrl,
                                ResourceType = service.Type,
                            };
                            childResources.Add(child);

                            service.GetServiceDetails(child);
                        }
                    }
                }
                else
                {
                    OnGetServicesInFolderCompleted(new GetServicesInFolderCompletedEventArgs()
                    {
                        ChildResources = resources, UserState = e.UserState
                    });
                }
            }
            catch (Exception ex)
            {
                OnGetServicesInFolderFailed(new ExceptionEventArgs(ex, e.UserState));
            }
        }