using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.IO.Compression; using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; namespace Shadowsocks.Util { public class Utils { // return path to store temporary files public static string GetTempPath() { if (File.Exists(Application.StartupPath + "\\shadowsocks_portable_mode.txt")) { try { Directory.CreateDirectory(Application.StartupPath + "\\temp"); } catch (Exception e) { Console.WriteLine(e); } // don't use "/", it will fail when we call explorer /select xxx/temp\xxx.log return Application.StartupPath + "\\temp"; } return Path.GetTempPath(); } public static void ReleaseMemory(bool removePages) { // release any unused pages // making the numbers look good in task manager // this is totally nonsense in programming // but good for those users who care // making them happier with their everyday life // which is part of user experience GC.Collect(GC.MaxGeneration); GC.WaitForPendingFinalizers(); if (removePages) { // as some users have pointed out // removing pages from working set will cause some IO // which lowered user experience for another group of users // // so we do 2 more things here to satisfy them: // 1. only remove pages once when configuration is changed // 2. add more comments here to tell users that calling // this function will not be more frequent than // IM apps writing chat logs, or web browsers writing cache files // if they're so concerned about their disk, they should // uninstall all IM apps and web browsers // // please open an issue if you're worried about anything else in your computer // no matter it's GPU performance, monitor contrast, audio fidelity // or anything else in the task manager // we'll do as much as we can to help you // // just kidding SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, (UIntPtr)0xFFFFFFFF, (UIntPtr)0xFFFFFFFF); } } public static string UnGzip(byte[] buf) { byte[] buffer = new byte[1024]; int n; using (MemoryStream sb = new MemoryStream()) { using (GZipStream input = new GZipStream(new MemoryStream(buf), CompressionMode.Decompress, false)) { while ((n = input.Read(buffer, 0, buffer.Length)) > 0) { sb.Write(buffer, 0, n); } } return System.Text.Encoding.UTF8.GetString(sb.ToArray()); } } [DllImport("kernel32.dll")] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool SetProcessWorkingSetSize(IntPtr process, UIntPtr minimumWorkingSetSize, UIntPtr maximumWorkingSetSize); } }