Beispiel #1
0
        public void Execute(long EntryPoint)
        {
            Work = new Thread(delegate()
            {
                Translator.ExecuteSubroutine(EntryPoint);

                Memory.RemoveMonitor(ThreadId);

                WorkFinished?.Invoke(this, EventArgs.Empty);
            });

            if (Priority < 12)
            {
                Work.Priority = ThreadPriority.Highest;
            }
            else if (Priority < 24)
            {
                Work.Priority = ThreadPriority.AboveNormal;
            }
            else if (Priority < 36)
            {
                Work.Priority = ThreadPriority.Normal;
            }
            else if (Priority < 48)
            {
                Work.Priority = ThreadPriority.BelowNormal;
            }
            else
            {
                Work.Priority = ThreadPriority.Lowest;
            }

            Work.Start();
        }
 public void Handle(WorkFinished @event)
 {
     if (!ErrorMessageVisible)
     {
         SetSuccessStatusMessage(@event.Message);
     }
 }
        private async Task LoadAccountAsync()
        {
            if (account != null)
            {
                return;
            }

            if (loadingAccount != null)
            {
                await Task.WhenAny(loadingAccount);

                return;
            }

            Debug.WriteLine("Accessing Twitter Account...");
            WorkStarted?.Invoke(this, EventArgs.Empty);

            var type   = accountStore.FindAccountType(ACAccountType.Twitter);
            var result = await accountStore.RequestAccessAsync(type, null);

            if (result.Item1)
            {
                account = accountStore.Accounts[0];
                Debug.WriteLine($"Access granted: {account.Username}");
            }
            else
            {
                Debug.WriteLine("Access denied!");
            }

            WorkFinished?.Invoke(this, EventArgs.Empty);

            loadingAccount = null;
        }
Beispiel #4
0
 public void DoWorkWrapped(CancellationToken cancellationToken)
 {
     try
     {
         DoWork(cancellationToken);
     }
     catch (OperationCanceledException)
     {
         SetError("Операция прервана пользователем");
     }
     catch (AggregateException e)
     {
         if (e.InnerException is TaskCanceledException)
         {
             SetError("Операция прервана пользователем");
         }
         else
         {
             SetError(e.InnerException.Message);
             Logger.LogError(e.InnerException, "Error");
             throw;
         }
     }
     catch (Exception e)
     {
         SetError(e.Message);
         Logger.LogError(e, "Error");
         throw;
     }
     finally
     {
         WorkFinished?.Invoke(this, new DiaryAsyncImplementationFinishedArguments());
     }
 }
Beispiel #5
0
        public bool Execute()
        {
            lock (ExecuteLock)
            {
                if (IsExecuting)
                {
                    return(false);
                }

                IsExecuting = true;
            }

            Work = new Thread(delegate()
            {
                Translator.ExecuteSubroutine(this, EntryPoint);

                Memory.RemoveMonitor(ThreadId);

                WorkFinished?.Invoke(this, EventArgs.Empty);
            });

            Work.Priority = Priority;

            Work.Start();

            return(true);
        }
 public void Handle(WorkFinished @event)
 {
     if (WorkCount > 0)
     {
         WorkCount--;
     }
 }
Beispiel #7
0
        public override int GetHashCode()
        {
            int hash = 1;

            if (WorkStarted != 0L)
            {
                hash ^= WorkStarted.GetHashCode();
            }
            if (WorkFinished != 0L)
            {
                hash ^= WorkFinished.GetHashCode();
            }
            if (NumRecordsProduced != 0L)
            {
                hash ^= NumRecordsProduced.GetHashCode();
            }
            if (CurrentWork.Length != 0)
            {
                hash ^= CurrentWork.GetHashCode();
            }
            if (_unknownFields != null)
            {
                hash ^= _unknownFields.GetHashCode();
            }
            return(hash);
        }
Beispiel #8
0
 public void Handle(WorkFinished @event)
 {
     if (workCount > 0)
     {
         workCount--;
         NotifyOfPropertyChange(() => WorkInProgress);
     }
 }
 public void Handle(WorkFinished @event)
 {
     if (workCount > 0)
     {
         workCount--;
         NotifyPropertiesChanged();
     }
 }
        public void Handle(WorkFinished @event)
        {
            if (workCounter <= 0)
            {
                return;
            }

            workCounter--;
            NotifyPropertiesChanged();
        }
        ///<summary>Finish work if it's due to be done.</summary>
        private async Task HandleWorker(WoTDbContext db, CharacterWork worker)
        {
            var args = await worker.UpdateAsync(db);

            if (args != null)
            {
                WorkFinished?.Invoke(worker, args);
                Logger?.LogLine(this, args.ToString(), LogSeverity.Verbose);
            }
        }
Beispiel #12
0
 private void WorkCallback(IAsyncResult result)
 {
     while (processedCount < domainsCount)
     {
         ;
     }
     workStarted = false;
     threadPause = false;
     Log("任务执行完成...");
     WorkFinished?.Invoke();
 }
Beispiel #13
0
 private void WorkFinished()
 {
     if (this.InvokeRequired)
     {
         var progrDel = new WorkFinished(WorkFinished);
         this.BeginInvoke(progrDel);
     }
     else
     {
         this.ChooseHoldingsBtn.Enabled  = true;
         this.ChooseSettingsBtn.Enabled  = true;
         this.ProcessFilesButton.Enabled = true;
     }
 }
Beispiel #14
0
        public CpuThread(Translator translator, MemoryManager memory, long entrypoint)
        {
            _translator = translator;
            Memory      = memory;

            ThreadState = new CpuThreadState();

            ThreadState.Running = true;

            Work = new Thread(delegate()
            {
                translator.ExecuteSubroutine(this, entrypoint);

                WorkFinished?.Invoke(this, EventArgs.Empty);
            });
        }
Beispiel #15
0
        protected virtual void OnFinished(EventArgs e)
        {
            if (!abort)
            {
                ChangeProgress(100, 100, "");
                pbxLoading.InvokeIfRequired(() => { pbxLoading.Image = Resources.accept_button; });
            }

            ChangeAdditional("");

            WorkFinished?.Invoke(this, e);

            if (!abort)
            {
                this.InvokeIfRequired(Close);
            }
        }
    // Add work to be execute on the thread pool
    public void AddWork(Action <ThreadContainer> workFunction, WorkFinished onWorkFinished)
    {
        // Create struct for passing args into ThreadFunction
        ThreadFunctionArgs args = new ThreadFunctionArgs
        {
            work      = workFunction,
            container = new ThreadContainer
            {
                OnWorkFinished = onWorkFinished,
            },
        };

        // Queue work item on ThreadPool
        ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadFunction), args);

        // Add container to set of currently running containers
        threadContainers.Add(args.container);
    }
Beispiel #17
0
        public CpuThread(Translator translator, MemoryManager memory, long entryPoint)
        {
            _translator = translator;
            Memory      = memory;

            ThreadState = new CpuThreadState();

            ThreadState.ExecutionMode = ExecutionMode.AArch64;

            ThreadState.Running = true;

            Work = new Thread(delegate()
            {
                translator.ExecuteSubroutine(this, entryPoint);

                memory.RemoveMonitor(ThreadState.Core);

                WorkFinished?.Invoke(this, EventArgs.Empty);
            });
        }
Beispiel #18
0
        public AThread(ATranslator Translator, AMemory Memory, long EntryPoint)
        {
            this.Translator = Translator;
            this.Memory     = Memory;

            ThreadState = new AThreadState();

            ThreadState.ExecutionMode = AExecutionMode.AArch64;

            ThreadState.Running = true;

            Work = new Thread(delegate()
            {
                Translator.ExecuteSubroutine(this, EntryPoint);

                Memory.RemoveMonitor(ThreadState.Core);

                WorkFinished?.Invoke(this, EventArgs.Empty);
            });
        }
Beispiel #19
0
        public bool Execute()
        {
            if (Interlocked.Exchange(ref IsExecuting, 1) == 1)
            {
                return(false);
            }

            Work = new Thread(delegate()
            {
                Translator.ExecuteSubroutine(this, EntryPoint);

                Memory.RemoveMonitor(ThreadState);

                WorkFinished?.Invoke(this, EventArgs.Empty);
            });

            Work.Start();

            return(true);
        }
Beispiel #20
0
        /// <summary>
        ///     Begins executing the <see cref="AsyncJob" />.
        /// </summary>
        internal async Task Execute()
        {
            try
            {
                // observe cancellation token
                if (_CancellationToken.IsCancellationRequested)
                {
                    return;
                }

                _Stopwatch.Restart();

                await Process().ConfigureAwait(false);

                ProcessTime = _Stopwatch.Elapsed;

                await ProcessFinished().ConfigureAwait(false);

                _Stopwatch.Stop();

                ExecutionTime = _Stopwatch.Elapsed;

                // and signal WorkFinished event
                WorkFinished?.Invoke(this, this);
            }
            catch (Exception ex)
            {
                // errors are always consumed here due to usage of Task.Run further up the call stack
                Log.Error($"({nameof(AsyncJob)}) {ex}");
                throw;
            }
            finally
            {
                // work is finished, so flip IsWorkFinished bool
                IsWorkFinished = true;

                // dereference any subscriptors to avoid memory leaks
                WorkFinished = null;
            }
        }
Beispiel #21
0
        public void Export()
        {
            SetMessage?.Invoke(this, new MessageEventArgs
            {
                Message = Localization.RetrievingRomSetFromDatabase
            });

            using var ctx = Context.Create(Settings.Settings.Current.DatabasePath);

            RomSet romSet = ctx.RomSets.Find(_romSetId);

            if (romSet == null)
            {
                SetMessage?.Invoke(this, new MessageEventArgs
                {
                    Message = Localization.CouldNotFindRomSetInDatabase
                });

                WorkFinished?.Invoke(this, System.EventArgs.Empty);

                return;
            }

            SetMessage?.Invoke(this, new MessageEventArgs
            {
                Message = Localization.ExportingRoms
            });

            _machines = ctx.Machines.Where(m => m.RomSet.Id == _romSetId).ToArray();

            SetProgressBounds?.Invoke(this, new ProgressBoundsEventArgs
            {
                Minimum = 0,
                Maximum = _machines.Length
            });

            _machinePosition = 0;
            CompressNextMachine();
        }
Beispiel #22
0
 /// <summary>
 ///     Finish the current visibility change job.
 /// </summary>
 private void Finish()
 {
     WorkFinished?.Invoke(this, EventArgs.Empty);
     _hideTimer.Enabled = false;
     Enabled            = false;
 }
 public void DoWork(Unit[] Work, WorkFinished Finished )
 {
     if( Notify  != null)
       {
     throw new Exception("Work already in progress");
       }
       Notify = Finished;
       ExpectedCompleteElements=Work.Length ;
       CompletedQueue.Clear();
       for (long i = 0;i <Work.Length ;i++)
       {
     WorkQueue.Enqueue(Work[i]);
       }
       WorkAvailable.Set();
 }
 private void ManagerMethod()
 {
     bool Signaled ;
       int ThreadReadyForWork;
       Unit WorkUnit ;
       while (true)
       {
     Signaled = WorkAvailable.WaitOne(100, false);
     if (Signaled)
     {
       ThreadReadyForWork= WaitHandle.WaitAny(ReadyForWork,100,false);
       if (ThreadReadyForWork != WaitHandle.WaitTimeout)
       {
     WorkUnit =null;
     if (WorkQueue.Count > 0)
     {
       WorkUnit = (Unit) WorkQueue.Dequeue();
       if (WorkUnit == null)
       {
         throw new Exception("Work is null");
       }
       Workers[ThreadReadyForWork].Work(WorkUnit);
     }
       }
       ThreadReadyForWork= WaitHandle.WaitAny(ResultsReady,100,false);
       if (ThreadReadyForWork != WaitHandle.WaitTimeout)
       {
     WorkUnit = Workers[ThreadReadyForWork].GetResults();
     if (WorkUnit  != null)
     {
       CompletedQueue.Enqueue(WorkUnit);
     }
       }
       // All threads may have finsihed their work
       if (CompletedQueue.Count == ExpectedCompleteElements)
       {
     if (Notify != null)
     {
       // Gather up the results and send them back
       ResultObjects = new ArrayList();
       while (CompletedQueue.Count > 0)
       {
         ResultObjects.Add(CompletedQueue.Dequeue());
       }
       Notify(ResultObjects);
       Notify = null;
     }
     WorkAvailable.Reset();
     FinishedWithWork.Set();
       }
     }
       }
 }
Beispiel #25
0
        void CompressNextMachine()
        {
            SetProgress?.Invoke(this, new ProgressEventArgs
            {
                Value = _machinePosition
            });

            if (_machinePosition >= _machines.Length)
            {
                SetMessage?.Invoke(this, new MessageEventArgs
                {
                    Message = Localization.Finished
                });

                WorkFinished?.Invoke(this, System.EventArgs.Empty);

                return;
            }

            Machine machine = _machines[_machinePosition];

            SetMessage2?.Invoke(this, new MessageEventArgs
            {
                Message = machine.Name
            });

            using var ctx = Context.Create(Settings.Settings.Current.DatabasePath);

            string machineName = machine.Name;

            Dictionary <string, MediaByMachine> mediasByMachine = ctx.MediasByMachines.
                                                                  Where(f => f.Machine.Id == machine.Id &&
                                                                        f.Media.IsInRepo).
                                                                  ToDictionary(f => f.Name);

            if (mediasByMachine.Count > 0)
            {
                SetProgress2Bounds?.Invoke(this, new ProgressBoundsEventArgs
                {
                    Minimum = 0,
                    Maximum = mediasByMachine.Count
                });

                if (machineName.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase))
                {
                    machineName = machineName.Substring(0, machineName.Length - 4);
                }

                string machinePath = Path.Combine(_outPath, machineName);

                if (!Directory.Exists(machinePath))
                {
                    Directory.CreateDirectory(machinePath);
                }

                long mediaPosition = 0;

                foreach (KeyValuePair <string, MediaByMachine> mediaByMachine in mediasByMachine)
                {
                    string outputPath = Path.Combine(machinePath, mediaByMachine.Key);

                    if (!outputPath.EndsWith(".aif", StringComparison.InvariantCultureIgnoreCase))
                    {
                        outputPath += ".aif";
                    }

                    SetProgress2?.Invoke(this, new ProgressEventArgs
                    {
                        Value = mediaPosition
                    });

                    string repoPath   = null;
                    string md5Path    = null;
                    string sha1Path   = null;
                    string sha256Path = null;

                    DbMedia media = mediaByMachine.Value.Media;

                    if (media.Sha256 != null)
                    {
                        byte[] sha256Bytes = new byte[32];
                        string sha256      = media.Sha256;

                        for (int i = 0; i < 32; i++)
                        {
                            if (sha256[i * 2] >= 0x30 &&
                                sha256[i * 2] <= 0x39)
                            {
                                sha256Bytes[i] = (byte)((sha256[i * 2] - 0x30) * 0x10);
                            }
                            else if (sha256[i * 2] >= 0x41 &&
                                     sha256[i * 2] <= 0x46)
                            {
                                sha256Bytes[i] = (byte)((sha256[i * 2] - 0x37) * 0x10);
                            }
                            else if (sha256[i * 2] >= 0x61 &&
                                     sha256[i * 2] <= 0x66)
                            {
                                sha256Bytes[i] = (byte)((sha256[i * 2] - 0x57) * 0x10);
                            }

                            if (sha256[(i * 2) + 1] >= 0x30 &&
                                sha256[(i * 2) + 1] <= 0x39)
                            {
                                sha256Bytes[i] += (byte)(sha256[(i * 2) + 1] - 0x30);
                            }
                            else if (sha256[(i * 2) + 1] >= 0x41 &&
                                     sha256[(i * 2) + 1] <= 0x46)
                            {
                                sha256Bytes[i] += (byte)(sha256[(i * 2) + 1] - 0x37);
                            }
                            else if (sha256[(i * 2) + 1] >= 0x61 &&
                                     sha256[(i * 2) + 1] <= 0x66)
                            {
                                sha256Bytes[i] += (byte)(sha256[(i * 2) + 1] - 0x57);
                            }
                        }

                        string sha256B32 = Base32.ToBase32String(sha256Bytes);

                        sha256Path = Path.Combine(Settings.Settings.Current.RepositoryPath, "aaru", "sha256",
                                                  sha256B32[0].ToString(), sha256B32[1].ToString(),
                                                  sha256B32[2].ToString(), sha256B32[3].ToString(),
                                                  sha256B32[4].ToString(), sha256B32 + ".aif");
                    }

                    if (media.Sha1 != null)
                    {
                        byte[] sha1Bytes = new byte[20];
                        string sha1      = media.Sha1;

                        for (int i = 0; i < 20; i++)
                        {
                            if (sha1[i * 2] >= 0x30 &&
                                sha1[i * 2] <= 0x39)
                            {
                                sha1Bytes[i] = (byte)((sha1[i * 2] - 0x30) * 0x10);
                            }
                            else if (sha1[i * 2] >= 0x41 &&
                                     sha1[i * 2] <= 0x46)
                            {
                                sha1Bytes[i] = (byte)((sha1[i * 2] - 0x37) * 0x10);
                            }
                            else if (sha1[i * 2] >= 0x61 &&
                                     sha1[i * 2] <= 0x66)
                            {
                                sha1Bytes[i] = (byte)((sha1[i * 2] - 0x57) * 0x10);
                            }

                            if (sha1[(i * 2) + 1] >= 0x30 &&
                                sha1[(i * 2) + 1] <= 0x39)
                            {
                                sha1Bytes[i] += (byte)(sha1[(i * 2) + 1] - 0x30);
                            }
                            else if (sha1[(i * 2) + 1] >= 0x41 &&
                                     sha1[(i * 2) + 1] <= 0x46)
                            {
                                sha1Bytes[i] += (byte)(sha1[(i * 2) + 1] - 0x37);
                            }
                            else if (sha1[(i * 2) + 1] >= 0x61 &&
                                     sha1[(i * 2) + 1] <= 0x66)
                            {
                                sha1Bytes[i] += (byte)(sha1[(i * 2) + 1] - 0x57);
                            }
                        }

                        string sha1B32 = Base32.ToBase32String(sha1Bytes);

                        sha1Path = Path.Combine(Settings.Settings.Current.RepositoryPath, "aaru", "sha1",
                                                sha1B32[0].ToString(), sha1B32[1].ToString(), sha1B32[2].ToString(),
                                                sha1B32[3].ToString(), sha1B32[4].ToString(), sha1B32 + ".aif");
                    }

                    if (media.Md5 != null)
                    {
                        byte[] md5Bytes = new byte[16];
                        string md5      = media.Md5;

                        for (int i = 0; i < 16; i++)
                        {
                            if (md5[i * 2] >= 0x30 &&
                                md5[i * 2] <= 0x39)
                            {
                                md5Bytes[i] = (byte)((md5[i * 2] - 0x30) * 0x10);
                            }
                            else if (md5[i * 2] >= 0x41 &&
                                     md5[i * 2] <= 0x46)
                            {
                                md5Bytes[i] = (byte)((md5[i * 2] - 0x37) * 0x10);
                            }
                            else if (md5[i * 2] >= 0x61 &&
                                     md5[i * 2] <= 0x66)
                            {
                                md5Bytes[i] = (byte)((md5[i * 2] - 0x57) * 0x10);
                            }

                            if (md5[(i * 2) + 1] >= 0x30 &&
                                md5[(i * 2) + 1] <= 0x39)
                            {
                                md5Bytes[i] += (byte)(md5[(i * 2) + 1] - 0x30);
                            }
                            else if (md5[(i * 2) + 1] >= 0x41 &&
                                     md5[(i * 2) + 1] <= 0x46)
                            {
                                md5Bytes[i] += (byte)(md5[(i * 2) + 1] - 0x37);
                            }
                            else if (md5[(i * 2) + 1] >= 0x61 &&
                                     md5[(i * 2) + 1] <= 0x66)
                            {
                                md5Bytes[i] += (byte)(md5[(i * 2) + 1] - 0x57);
                            }
                        }

                        string md5B32 = Base32.ToBase32String(md5Bytes);

                        md5Path = Path.Combine(Settings.Settings.Current.RepositoryPath, "aaru", "md5",
                                               md5B32[0].ToString(), md5B32[1].ToString(), md5B32[2].ToString(),
                                               md5B32[3].ToString(), md5B32[4].ToString(), md5B32 + ".aif");
                    }

                    if (File.Exists(sha256Path))
                    {
                        repoPath = sha256Path;
                    }
                    else if (File.Exists(sha1Path))
                    {
                        repoPath = sha1Path;
                    }
                    else if (File.Exists(md5Path))
                    {
                        repoPath = md5Path;
                    }

                    if (repoPath == null)
                    {
                        throw new ArgumentException(string.Format(Localization.CannotFindHashInRepository,
                                                                  media.Sha256 ?? media.Sha1 ?? media.Md5));
                    }

                    var inFs  = new FileStream(repoPath, FileMode.Open, FileAccess.Read);
                    var outFs = new FileStream(outputPath, FileMode.Create, FileAccess.Write);

                    SetMessage3?.Invoke(this, new MessageEventArgs
                    {
                        Message = string.Format(Localization.Copying, Path.GetFileName(outputPath))
                    });

                    SetProgress3Bounds?.Invoke(this, new ProgressBoundsEventArgs
                    {
                        Minimum = 0,
                        Maximum = inFs.Length
                    });

                    byte[] buffer = new byte[BUFFER_SIZE];

                    while (inFs.Position + BUFFER_SIZE <= inFs.Length)
                    {
                        SetProgress3?.Invoke(this, new ProgressEventArgs
                        {
                            Value = inFs.Position
                        });

                        inFs.Read(buffer, 0, buffer.Length);
                        outFs.Write(buffer, 0, buffer.Length);
                    }

                    buffer = new byte[inFs.Length - inFs.Position];

                    SetProgress3?.Invoke(this, new ProgressEventArgs
                    {
                        Value = inFs.Position
                    });

                    inFs.Read(buffer, 0, buffer.Length);
                    outFs.Write(buffer, 0, buffer.Length);

                    inFs.Close();
                    outFs.Close();

                    mediaPosition++;
                }
            }

            Dictionary <string, DiskByMachine> disksByMachine = ctx.DisksByMachines.
                                                                Where(f => f.Machine.Id == machine.Id &&
                                                                      f.Disk.IsInRepo).
                                                                ToDictionary(f => f.Name);

            if (disksByMachine.Count > 0)
            {
                SetProgress2Bounds?.Invoke(this, new ProgressBoundsEventArgs
                {
                    Minimum = 0,
                    Maximum = disksByMachine.Count
                });

                if (machineName.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase))
                {
                    machineName = machineName.Substring(0, machineName.Length - 4);
                }

                string machinePath = Path.Combine(_outPath, machineName);

                if (!Directory.Exists(machinePath))
                {
                    Directory.CreateDirectory(machinePath);
                }

                long diskPosition = 0;

                foreach (KeyValuePair <string, DiskByMachine> diskByMachine in disksByMachine)
                {
                    string outputPath = Path.Combine(machinePath, diskByMachine.Key);

                    if (!outputPath.EndsWith(".chd", StringComparison.InvariantCultureIgnoreCase))
                    {
                        outputPath += ".chd";
                    }

                    SetProgress2?.Invoke(this, new ProgressEventArgs
                    {
                        Value = diskPosition
                    });

                    string repoPath = null;
                    string md5Path  = null;
                    string sha1Path = null;

                    DbDisk disk = diskByMachine.Value.Disk;

                    if (disk.Sha1 != null)
                    {
                        byte[] sha1Bytes = new byte[20];
                        string sha1      = disk.Sha1;

                        for (int i = 0; i < 20; i++)
                        {
                            if (sha1[i * 2] >= 0x30 &&
                                sha1[i * 2] <= 0x39)
                            {
                                sha1Bytes[i] = (byte)((sha1[i * 2] - 0x30) * 0x10);
                            }
                            else if (sha1[i * 2] >= 0x41 &&
                                     sha1[i * 2] <= 0x46)
                            {
                                sha1Bytes[i] = (byte)((sha1[i * 2] - 0x37) * 0x10);
                            }
                            else if (sha1[i * 2] >= 0x61 &&
                                     sha1[i * 2] <= 0x66)
                            {
                                sha1Bytes[i] = (byte)((sha1[i * 2] - 0x57) * 0x10);
                            }

                            if (sha1[(i * 2) + 1] >= 0x30 &&
                                sha1[(i * 2) + 1] <= 0x39)
                            {
                                sha1Bytes[i] += (byte)(sha1[(i * 2) + 1] - 0x30);
                            }
                            else if (sha1[(i * 2) + 1] >= 0x41 &&
                                     sha1[(i * 2) + 1] <= 0x46)
                            {
                                sha1Bytes[i] += (byte)(sha1[(i * 2) + 1] - 0x37);
                            }
                            else if (sha1[(i * 2) + 1] >= 0x61 &&
                                     sha1[(i * 2) + 1] <= 0x66)
                            {
                                sha1Bytes[i] += (byte)(sha1[(i * 2) + 1] - 0x57);
                            }
                        }

                        string sha1B32 = Base32.ToBase32String(sha1Bytes);

                        sha1Path = Path.Combine(Settings.Settings.Current.RepositoryPath, "chd", "sha1",
                                                sha1B32[0].ToString(), sha1B32[1].ToString(), sha1B32[2].ToString(),
                                                sha1B32[3].ToString(), sha1B32[4].ToString(), sha1B32 + ".chd");
                    }

                    if (disk.Md5 != null)
                    {
                        byte[] md5Bytes = new byte[16];
                        string md5      = disk.Md5;

                        for (int i = 0; i < 16; i++)
                        {
                            if (md5[i * 2] >= 0x30 &&
                                md5[i * 2] <= 0x39)
                            {
                                md5Bytes[i] = (byte)((md5[i * 2] - 0x30) * 0x10);
                            }
                            else if (md5[i * 2] >= 0x41 &&
                                     md5[i * 2] <= 0x46)
                            {
                                md5Bytes[i] = (byte)((md5[i * 2] - 0x37) * 0x10);
                            }
                            else if (md5[i * 2] >= 0x61 &&
                                     md5[i * 2] <= 0x66)
                            {
                                md5Bytes[i] = (byte)((md5[i * 2] - 0x57) * 0x10);
                            }

                            if (md5[(i * 2) + 1] >= 0x30 &&
                                md5[(i * 2) + 1] <= 0x39)
                            {
                                md5Bytes[i] += (byte)(md5[(i * 2) + 1] - 0x30);
                            }
                            else if (md5[(i * 2) + 1] >= 0x41 &&
                                     md5[(i * 2) + 1] <= 0x46)
                            {
                                md5Bytes[i] += (byte)(md5[(i * 2) + 1] - 0x37);
                            }
                            else if (md5[(i * 2) + 1] >= 0x61 &&
                                     md5[(i * 2) + 1] <= 0x66)
                            {
                                md5Bytes[i] += (byte)(md5[(i * 2) + 1] - 0x57);
                            }
                        }

                        string md5B32 = Base32.ToBase32String(md5Bytes);

                        md5Path = Path.Combine(Settings.Settings.Current.RepositoryPath, "chd", "md5",
                                               md5B32[0].ToString(), md5B32[1].ToString(), md5B32[2].ToString(),
                                               md5B32[3].ToString(), md5B32[4].ToString(), md5B32 + ".chd");
                    }

                    if (File.Exists(sha1Path))
                    {
                        repoPath = sha1Path;
                    }
                    else if (File.Exists(md5Path))
                    {
                        repoPath = md5Path;
                    }

                    if (repoPath == null)
                    {
                        throw new ArgumentException(string.Format(Localization.CannotFindHashInRepository,
                                                                  disk.Sha1 ?? disk.Md5));
                    }

                    var inFs  = new FileStream(repoPath, FileMode.Open, FileAccess.Read);
                    var outFs = new FileStream(outputPath, FileMode.Create, FileAccess.Write);

                    SetMessage3?.Invoke(this, new MessageEventArgs
                    {
                        Message = string.Format(Localization.Copying, Path.GetFileName(outputPath))
                    });

                    SetProgress3Bounds?.Invoke(this, new ProgressBoundsEventArgs
                    {
                        Minimum = 0,
                        Maximum = inFs.Length
                    });

                    byte[] buffer = new byte[BUFFER_SIZE];

                    while (inFs.Position + BUFFER_SIZE <= inFs.Length)
                    {
                        SetProgress3?.Invoke(this, new ProgressEventArgs
                        {
                            Value = inFs.Position
                        });

                        inFs.Read(buffer, 0, buffer.Length);
                        outFs.Write(buffer, 0, buffer.Length);
                    }

                    buffer = new byte[inFs.Length - inFs.Position];

                    SetProgress3?.Invoke(this, new ProgressEventArgs
                    {
                        Value = inFs.Position
                    });

                    inFs.Read(buffer, 0, buffer.Length);
                    outFs.Write(buffer, 0, buffer.Length);

                    inFs.Close();
                    outFs.Close();

                    diskPosition++;
                }
            }

            _filesByMachine = ctx.FilesByMachines.Where(f => f.Machine.Id == machine.Id && f.File.IsInRepo).
                              ToDictionary(f => f.Name);

            if (_filesByMachine.Count == 0)
            {
                _machinePosition++;
                Task.Run(CompressNextMachine);

                return;
            }

            SetProgress2Bounds?.Invoke(this, new ProgressBoundsEventArgs
            {
                Minimum = 0,
                Maximum = _filesByMachine.Count
            });

            if (!machineName.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase))
            {
                machineName += ".zip";
            }

            var zf = new ZipFile(Path.Combine(_outPath, machineName), Encoding.UTF8)
            {
                CompressionLevel  = CompressionLevel.BestCompression,
                CompressionMethod = CompressionMethod.Deflate,
                EmitTimesInUnixFormatWhenSaving    = true,
                EmitTimesInWindowsFormatWhenSaving = true,
                UseZip64WhenSaving      = Zip64Option.AsNecessary,
                SortEntriesBeforeSaving = true
            };

            zf.SaveProgress += Zf_SaveProgress;

            foreach (KeyValuePair <string, FileByMachine> fileByMachine in _filesByMachine)
            {
                // Is a directory
                if ((fileByMachine.Key.EndsWith("/", StringComparison.InvariantCultureIgnoreCase) ||
                     fileByMachine.Key.EndsWith("\\", StringComparison.InvariantCultureIgnoreCase)) &&
                    fileByMachine.Value.File.Size == 0)
                {
                    ZipEntry zd = zf.AddDirectoryByName(fileByMachine.Key.Replace('/', '\\'));
                    zd.Attributes   = FileAttributes.Normal;
                    zd.CreationTime = DateTime.UtcNow;
                    zd.AccessedTime = DateTime.UtcNow;
                    zd.LastModified = DateTime.UtcNow;
                    zd.ModifiedTime = DateTime.UtcNow;

                    continue;
                }

                ZipEntry zi = zf.AddEntry(fileByMachine.Key, Zf_HandleOpen, Zf_HandleClose);
                zi.Attributes   = FileAttributes.Normal;
                zi.CreationTime = DateTime.UtcNow;
                zi.AccessedTime = DateTime.UtcNow;
                zi.LastModified = DateTime.UtcNow;
                zi.ModifiedTime = DateTime.UtcNow;
            }

            zf.Save();
        }
Beispiel #26
0
 public void Handle(WorkFinished message)
 {
     Dispatcher.BeginInvoke((Action)(StopWorkInProgress));
 }
Beispiel #27
0
 protected virtual void OnWorkFinished()
 {
     WorkFinished?.Invoke(this, EventArgs.Empty);
 }
Beispiel #28
0
 public void FinishWork()
 {
     WorkFinished.SafeInvoke(_gold.Amount);
     _gold.Reset();
 }