Esempio n. 1
0
        protected void checkReceived(bool handleMultipleRequests = true)
        {
            OnDemandData request;

            lock (mandatoryRequests)
            {
                request = (OnDemandData)mandatoryRequests.popFront();
            }

            while (request != null)
            {
                HandleOneRequest(request);

                //If multiple requests aren't to be handled then we should just break here.
                if (!handleMultipleRequests)
                {
                    break;
                }

                lock (mandatoryRequests)
                {
                    request = (OnDemandData)mandatoryRequests.popFront();
                }
            }
        }
        private void checkReceived()
        {
            OnDemandData request;

            lock (mandatoryRequests)
            {
                request = (OnDemandData)mandatoryRequests.popFront();
            }

            while (request != null)
            {
                waiting = true;
                byte[] data = null;
                if (clientInstance.caches[0] != null)
                {
                    data = clientInstance.caches[request.dataType + 1].decompress((int)request.id);
                }
                if (!crcMatches(versions[request.dataType][request.id],
                                crcs[request.dataType][request.id], data))
                {
                    data = null;
                }
                lock (mandatoryRequests)
                {
                    if (data == null)
                    {
                        unrequested.pushBack(request);
                    }
                    else
                    {
                        request.InitializeBuffer(data);
                        lock (complete)
                        {
                            complete.pushBack(request);
                        }
                    }

                    request = (OnDemandData)mandatoryRequests.popFront();
                }
            }
        }
        public OnDemandData getNextNode()
        {
            OnDemandData onDemandData;

            lock (complete)
            {
                onDemandData = (OnDemandData)complete.popFront();
            }

            if (onDemandData == null)
            {
                return(null);
            }
            lock (nodeSubList)
            {
                onDemandData.unlinkCacheable();
            }

            if (onDemandData.buffer == null)
            {
                return(onDemandData);
            }
            int i = 0;

            try
            {
                GZipStream gzipinputstream = new GZipStream(new MemoryStream(onDemandData.buffer), CompressionMode.Decompress);
                do
                {
                    if (i == gzipInputBuffer.Length)
                    {
                        throw new Exception("buffer overflow!");
                    }
                    int k = gzipinputstream.Read(gzipInputBuffer, i, gzipInputBuffer.Length - i);
                    if (k == -1 || k == 0)                    //This was causing a hang here, different return value in C#. RS2Sharp made this change, but did not document it.
                    {
                        break;
                    }
                    i += k;
                } while(true);
            }
            catch (Exception _ex)
            {
                throw new Exception("error unzipping", _ex);
            }

            onDemandData.InitializeBuffer(new byte[i]);
            System.Buffer.BlockCopy(gzipInputBuffer, 0, onDemandData.buffer, 0, i);

            return(onDemandData);
        }
        private void handleFailed()
        {
            uncompletedCount = 0;
            completedCount   = 0;
            for (OnDemandData onDemandData = (OnDemandData)requested
                                             .peekFront();
                 onDemandData != null;
                 onDemandData = (OnDemandData)requested.getPrevious())
            {
                if (onDemandData.incomplete)
                {
                    uncompletedCount++;
                }
                else
                {
                    completedCount++;
                }
            }

            while (uncompletedCount < 10)
            {
                OnDemandData onDemandData_1 = (OnDemandData)unrequested.popFront();
                if (onDemandData_1 == null)
                {
                    break;
                }
                if (filePriorities[onDemandData_1.dataType][onDemandData_1.id] != 0)
                {
                    filesLoaded++;
                }
                filePriorities[onDemandData_1.dataType][onDemandData_1.id] = 0;
                requested.pushBack(onDemandData_1);
                uncompletedCount++;
                closeRequest(onDemandData_1);
                waiting = true;
            }
        }
        private void method568()
        {
            while (uncompletedCount == 0 && completedCount < 10)
            {
                if (highestPriority == 0)
                {
                    break;
                }
                OnDemandData onDemandData;
                lock (passiveRequests)
                {
                    onDemandData = (OnDemandData)passiveRequests.popFront();
                }

                while (onDemandData != null)
                {
                    if (filePriorities[onDemandData.dataType][onDemandData.id] != 0)
                    {
                        filePriorities[onDemandData.dataType][onDemandData.id] = 0;
                        requested.pushBack(onDemandData);
                        closeRequest(onDemandData);
                        waiting = true;
                        if (filesLoaded < totalFiles)
                        {
                            filesLoaded++;
                        }
                        statusString = "Loading extra files - " + (filesLoaded * 100) / totalFiles + "%";
                        completedCount++;
                        if (completedCount == 10)
                        {
                            return;
                        }
                    }

                    lock (passiveRequests)
                    {
                        onDemandData = (OnDemandData)passiveRequests.popFront();
                    }
                }

                for (int j = 0; j < 4; j++)
                {
                    byte[] abyte0 = filePriorities[j];
                    int    k      = abyte0.Length;
                    for (int l = 0; l < k; l++)
                    {
                        if (abyte0[l] == highestPriority)
                        {
                            abyte0[l] = 0;
                            OnDemandData onDemandData_1 = new OnDemandData();
                            onDemandData_1.dataType   = j;
                            onDemandData_1.id         = l;
                            onDemandData_1.incomplete = false;
                            requested.pushBack(onDemandData_1);
                            closeRequest(onDemandData_1);
                            waiting = true;
                            if (filesLoaded < totalFiles)
                            {
                                filesLoaded++;
                            }
                            statusString = "Loading extra files - " + (filesLoaded * 100) / totalFiles + "%";
                            completedCount++;
                            if (completedCount == 10)
                            {
                                return;
                            }
                        }
                    }
                }

                highestPriority--;
            }
        }