internal Update(ServerSyncUpdateData serverSyncUpdateData)
 {
     Identity = new Identity(serverSyncUpdateData.Id);
 }
Exemplo n.º 2
0
        /// <summary>
        /// Return metadata for updates
        /// </summary>
        /// <param name="request">The request; contains IDs for updates to retrieve metadata for</param>
        /// <returns>Update metadata for requested updates</returns>
        public Task <ServerUpdateData> GetUpdateDataAsync(GetUpdateDataRequest request)
        {
            var response = new ServerUpdateData();

            // Make sure the request is not larger than the config says
            var updateRequestCount = request.GetUpdateData.updateIds.Count();

            if (updateRequestCount > ServiceConfiguration.MaxNumberOfUpdatesPerRequest)
            {
                return(null);
            }

            var returnUpdatesList = new List <ServerSyncUpdateData>();
            var returnFilesList   = new List <ServerSyncUrlData>();

            foreach (var rawIdentity in request.GetUpdateData.updateIds)
            {
                var updateIdentity = new Identity(rawIdentity);

                // Find the update; it can be either category or update
                Update update;
                if (!FilteredUpdates.TryGetValue(updateIdentity, out update))
                {
                    if ((update = Categories.First(c => c.Identity.Equals(updateIdentity))) == null)
                    {
                        throw new Exception("Update not found");
                    }
                }

                if (update.HasFiles)
                {
                    // if update contains files, we must also gather file information
                    foreach (var updateFile in update.Files)
                    {
                        returnFilesList.Add(
                            new ServerSyncUrlData()
                        {
                            FileDigest = Convert.FromBase64String(updateFile.Digests[0].DigestBase64),
                            MUUrl      = updateFile.Urls[0].MuUrl,
                            UssUrl     = $"Content/{updateFile.GetContentDirectoryName()}/{updateFile.FileName}"
                        });
                    }
                }

                var rawUpdateData = new ServerSyncUpdateData();
                rawUpdateData.Id = rawIdentity;

                using (var metadataReader = new StreamReader(MetadataSource.GetUpdateMetadataStream(update.Identity)))
                {
                    rawUpdateData.XmlUpdateBlob = metadataReader.ReadToEnd();
                }

                returnUpdatesList.Add(rawUpdateData);
            }

            response.updates = returnUpdatesList.ToArray();

            // Deduplicate list of files
            response.fileUrls = returnFilesList.GroupBy(f => f.MUUrl).Select(k => k.First()).ToArray();

            return(Task.FromResult(response));
        }