private void DoPartialRead(string cleanUrl, ResourceRequestUIGT request,
                                   ResourceResponseUIGT response)
        {
            string rangeValue = request.GetHeader("Range");
            Match  match      = m_RangeRequestValue.Match(rangeValue);

            if (!match.Success)
            {
                response.SignalFailure();
                return;
            }

            long fileSize = new FileInfo(cleanUrl).Length;

            long   startByte     = long.Parse(match.Groups ["From"].Value);
            string endByteString = match.Groups ["To"].Value;
            long   endByte       = fileSize - 1;

            if (string.IsNullOrEmpty(endByteString))
            {
                // Clamp to a maximum chunk size
                const long MaxPartialReadSize = 16 * 1024 * 1024;
                if (endByte - startByte > MaxPartialReadSize)
                {
                    endByte = startByte + MaxPartialReadSize;
                }
            }
            else
            {
                endByte = long.Parse(endByteString);
            }

            // Clamp to int.MaxValue since that's the type BinaryReader
            // allows us to read; if it could read more bytes, then we would
            // clamp the size to uint.MaxValue since ResourceResponse.GetBuffer
            // expects an uint value.
            long bufferSize = Math.Min((long)int.MaxValue,
                                       endByte - startByte + 1);

            byte[] bytes = new byte[bufferSize];
            using (BinaryReader reader = new BinaryReader(
                       new FileStream(cleanUrl, FileMode.Open)))
            {
                reader.BaseStream.Seek(startByte, SeekOrigin.Begin);
                reader.Read(bytes, 0, (int)bufferSize);
            }

            // Set required response headers
            response.SetStatus(206);
            response.SetExpectedLength(fileSize);
            response.SetResponseHeader("Accept-Ranges", "bytes");
            response.SetResponseHeader("Content-Range", "bytes " + startByte +
                                       "-" + endByte + "/" + fileSize);
            response.SetResponseHeader("Content-Length",
                                       bufferSize.ToString());

            response.ReceiveData(bytes, bytes.LongLength);

            response.SignalSuccess();
        }
        public override void OnResourceRead(ResourceRequestUIGT request,
                                            ResourceResponseUIGT response)
        {
            if (m_UISystem == null)
            {
                m_UISystem = CoherentUIGTSystem.CurrentUISystem;
            }

            string url      = request.GetURL();
            string cleanUrl = GetFilepath(url);

            if (IsImageRequest(url) && url.StartsWith("coui://" + PRELOADEDIMAGES_PATH))
            {
                var    asUri         = new Uri(url);
                string fileExtension = url.Substring(url.LastIndexOf('.'));
                string texturePath   = url.Replace(asUri.Scheme + "://", "").Replace(fileExtension, "");;
                if (LoadPreloadedImage(texturePath, ref response))
                {
                    response.SignalSuccess();
                }
                else
                {
                    response.SignalFailure();
                }
                response.Release();
                return;
            }
            else if (m_UISystem.LiveGameViewComponents.ContainsKey(url))
            {
                if (LoadLiveViewFromComponent(url, ref response))
                {
                    response.SignalSuccess();
                }
                else
                {
                    response.SignalFailure();
                }
                response.Release();
                return;
            }

            if (!File.Exists(cleanUrl))
            {
                Debug.LogError("[Coherent GT] File not found for " + url);
                response.SignalFailure();
                response.Release();
                return;
            }

            if (request.GetHeaderIndex("Range") < 0)
            {
                DoCompleteRead(cleanUrl, request, response);
            }
            else
            {
                DoPartialRead(cleanUrl, request, response);
            }
            response.Release();
        }
        private void DoCompleteRead(string cleanUrl,
                                    ResourceRequestUIGT request, ResourceResponseUIGT response)
        {
            // TODO: Handle exception & notify response -
            // maybe handle it in the calling method
            byte[] bytes = File.ReadAllBytes(cleanUrl);

            response.SetStatus(200);
            response.SetExpectedLength(bytes.LongLength);
            response.ReceiveData(bytes, bytes.LongLength);
            response.SignalSuccess();
        }
        public override void OnResourceRead(ResourceRequestUIGT request,
                                            ResourceResponseUIGT response)
        {
            if (m_ViewComponent != null)
            {
                string url   = request.GetURL();
                var    asUri = new Uri(url);
                if (asUri.Scheme == "coui" && !url.EndsWith(".renderTexture"))
                {
                    string uiresources  = PlayerPrefs.GetString("CoherentGT:UIResources");
                    string resourcePath = asUri.GetComponents(UriComponents.Path, UriFormat.Unescaped);
                    string path         = "Assets/" + uiresources + "/" + resourcePath;
                    m_ViewComponent.m_ResourcesInUse.Add(path);
                }
            }

            m_Handler.OnResourceRead(request, response);
        }