/// <summary> Creates a new manager and loads settings stored in the <see cref="EWpfClientFile.Settings"/> file. </summary>
        /// <param name="generateDatabase"> Whether to read data from JSON instead of the database. </param>
        /// <param name="readOnlyJson"> Whether to generate the database. </param>
        /// <param name="readPreviouslyUnpackedJson"> Whether to extract game files. </param>
        public WpfClientManager
        (
            IWarThunderFileManager fileManager,
            IWarThunderFileReader fileReader,
            IWarThunderSettingsManager settingsManager,
            IParser parser,
            IUnpacker unpacker,
            IConverter converter,
            IWarThunderJsonHelper jsonHelper,
            ICsvDeserializer csvDeserializer,
            IDataRepositoryFactory dataRepositoryFactory,
            IRandomiser randomizer,
            IVehicleSelector vehicleSelector,
            IPresetGenerator presetGenerator,
            bool generateDatabase,
            bool readOnlyJson,
            bool readPreviouslyUnpackedJson,
            params IConfiguredLogger[] loggers
        ) : base(fileManager, fileReader, settingsManager, parser, unpacker, converter, jsonHelper, csvDeserializer, dataRepositoryFactory, randomizer, vehicleSelector, presetGenerator, generateDatabase, readOnlyJson, readPreviouslyUnpackedJson, loggers)
        {
            _flagImageSources             = new Dictionary <ECountry, ImageSource>();
            _vehicleIconBitmapSources     = new ConcurrentDictionary <string, BitmapSource>();
            _vehiclePortraitBitmapSources = new ConcurrentDictionary <string, BitmapSource>();

            ProcessVehicleImages = (vehicle) => { GetIconBitmapSource(vehicle); GetPortraitBitmapSource(vehicle); };
        }
Пример #2
0
        /// <summary> Creates a new manager and loads settings stored in the settings file. </summary>
        /// <param name="generateDatabase"> Whether to read data from JSON instead of the database. </param>
        /// <param name="readOnlyJson"> Whether to generate the database. </param>
        public Manager
        (
            IWarThunderFileManager fileManager,
            IWarThunderFileReader fileReader,
            IWarThunderSettingsManager settingsManager,
            IParser parser,
            IUnpacker unpacker,
            IConverter converter,
            IWarThunderJsonHelper jsonHelper,
            ICsvDeserializer csvDeserializer,
            IDataRepositoryFactory dataRepositoryFactory,
            IRandomiser randomizer,
            IVehicleSelector vehicleSelector,
            IPresetGenerator presetGenerator,
            IThunderSkillParser thunderSkillParser,
            bool generateDatabase,
            bool readOnlyJson,
            bool readPreviouslyUnpackedJson,
            params IConfiguredLogger[] loggers
        ) : base(EOrganizationLogCategory.Manager, loggers)
        {
            _generateDatabase           = generateDatabase;
            _readOnlyJson               = readOnlyJson;
            _readPreviouslyUnpackedJson = readPreviouslyUnpackedJson;
            _startupConfiguration       = GetStartupConfiguration(_generateDatabase, _readOnlyJson, _readPreviouslyUnpackedJson);
            _excludedGaijinIdParts      = new List <string>()
            {
                "_football",
                "germ_panzerkampflaufer_565_r",
                "germ_panzerkampflaufer_565_r_2",
                "po-2_nw",
                "_race",
                "sdi_",
                "_space_suit",
                "toon_",
                "_tutorial",
                "ucav_assault",
                "ucav_scout",
                "uk_centaur_aa_mk_",
                "us_m35",
                "us_m35_2",
                "ussr_sht_1",
                "ussr_sht_1_2",
            };
            _fileManager           = fileManager;
            _fileReader            = fileReader;
            _parser                = parser;
            _unpacker              = unpacker;
            _converter             = converter;
            _jsonHelper            = jsonHelper;
            _csvDeserializer       = csvDeserializer;
            _dataRepositoryFactory = dataRepositoryFactory;
            _randomizer            = randomizer;
            _vehicleSelector       = vehicleSelector;
            _presetGenerator       = presetGenerator;
            _thunderSkillParser    = thunderSkillParser;

            _cache = new List <IPersistentObject>();

            PlayableVehicles = new Dictionary <string, IVehicle>();
Пример #3
0
        public void Execute(JitUnpackerSettings settings)
        {
            Module      module;
            void *      moduleHandle;
            ModuleDefMD moduleDef;

            void *[] methodHandles;

            PrepareAllMethods();
            // 防止陷入编译死循环
            module = Assembly.LoadFile(settings.AssemblyPath).ManifestModule;
            if (RuntimeEnvironment.IsClr4x)
            {
                moduleHandle = (void *)(IntPtr)module.GetType().GetField("m_pData", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(module);
            }
            else
            {
                moduleHandle = (void *)(IntPtr)typeof(ModuleHandle).GetField("m_ptr", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(module.ModuleHandle);
            }
            moduleDef     = ModuleDefMD.Load(settings.AssemblyPath);
            methodHandles = LoadMethodHandles(module, moduleDef);
            _unpacker     = LoadedUnpackerDetectors.Detect(moduleDef).CreateUnpacker(new UnpackerContext(module, moduleDef, moduleHandle, methodHandles, settings));
            Logger.Instance.LogInfo($"Detected {_unpacker.Name} Obfuscator ({Path.GetFullPath(settings.AssemblyPath)})");
            Console.CursorVisible = false;
            ExecuteImpl();
            Console.CursorVisible = true;
            SaveAs(PathInsertPostfix(settings.AssemblyPath, ".jupk"));
            _unpacker.Context.ModuleDef.Dispose();
            _unpacker.Context.DumpedModuleDef.Dispose();
            Logger.Instance.LogInfo("Finished");
            Logger.Instance.LogNewLine();
        }
Пример #4
0
        public Context()
        {
            Unpacker unpacker = new Unpacker();

            UserToken          = new UserToken();
            UserToken.Unpacker = unpacker;
            Unpacker           = unpacker;
        }
Пример #5
0
        public MyContext()
        {
            var unpacker = new MyUnpacker();

            this.UserToken          = new BaseUserToken();
            this.UserToken.Unpacker = unpacker;
            this.Unpacker           = unpacker;
        }
Пример #6
0
        internal ExchangeItem(BinaryReader reader, IUnpacker unpacker) : base(reader)
        {
            string text = reader.ReadString();

            if (!text.Equals("n"))
            {
                this.AttachContentId = new Guid(text);
                unpacker.SetContent(this, this.AttachContentId);
            }
        }
 public object Unpack(IDeserializer deserializer, IUnpacker unpacker)
 {
     CacheString cacheString = new CacheString()
                               {
                                   Id = deserializer.DeserializeVariantInt(),
                                   Value = deserializer.DeserializeString()
                               };
     this.RaiseEvent(CacheStringDeserializer, cacheString);
     return cacheString;
 }
        public void Initialise()
        {
            _fileManager     = new WarThunderFileManager(Presets.Logger);
            _fileReader      = new WarThunderFileReader(Presets.Logger);
            _unpacker        = new Unpacker(_fileManager, Presets.Logger);
            _converter       = new Converter(Presets.Logger);
            _jsonHelper      = new WarThunderJsonHelper(Presets.Logger);
            _csvDeserializer = new CsvDeserializer(Presets.Logger);

            var mockSettingsManager = new Mock <IWarThunderSettingsManager>();

            mockSettingsManager
            .Setup(manager => manager.GetSetting(nameof(Settings.WarThunderLocation)))
            .Returns(Settings.WarThunderLocation);
            mockSettingsManager
            .Setup(manager => manager.GetSetting(nameof(Settings.KlensysWarThunderToolsLocation)))
            .Returns(Settings.KlensysWarThunderToolsLocation);
            mockSettingsManager
            .Setup(manager => manager.GetSetting(nameof(Settings.TempLocation)))
            .Returns(Settings.TempLocation);

            _manager = new Manager
                       (
                _fileManager,
                _fileReader,
                mockSettingsManager.Object,
                new Mock <IParser>().Object,
                _unpacker,
                _converter,
                _jsonHelper,
                _csvDeserializer,
                new Mock <IDataRepositoryFactory>().Object,
                new Mock <IRandomiser>().Object,
                new Mock <IVehicleSelector>().Object,
                new Mock <IPresetGenerator>().Object,
                new Mock <IThunderSkillParser>().Object,
                true,
                false,
                false,
                Presets.Logger
                       );
            _rootDirectory        = $"{Directory.GetCurrentDirectory()}\\TestFiles";
            _defaultTempDirectory = Settings.TempLocation;

            if (!Directory.Exists(_rootDirectory))
            {
                Directory.CreateDirectory(_rootDirectory);
            }
            else
            {
                _fileManager.EmptyDirectory(_rootDirectory);
            }

            Settings.TempLocation = _rootDirectory;
        }
Пример #9
0
 public static bool TryUnpack(this IUnpacker unpacker, out Playlist playlist, Stream playlistStream)
 {
     try
     {
         return((playlist = unpacker.Unpack(playlistStream)) != null);
     }
     catch (Exception)
     {
         playlist = null;
         return(false);
     }
 }
        /// <summary> Initialises helpers. </summary>
        /// <param name="generateDatabase"> Whether to read data from JSON instead of the database. </param>
        /// <param name="readOnlyJson"> Whether to generate the database. </param>
        /// <param name="readPreviouslyUnpackedJson"> Whether to extract game files. </param>
        private static void InitialiseHelpers(bool generateDatabase, bool readOnlyJson, bool readPreviouslyUnpackedJson)
        {
            var settingsTypes = new List <Type>
            {
                typeof(Settings),
                typeof(WpfSettings),
            };

            var requiredSettingNames = settingsTypes
                                       .SelectMany(settingsType => settingsType.GetProperties(BindingFlags.Public | BindingFlags.Static))
                                       .Where(settingProperty => settingProperty.GetCustomAttribute <RequiredSettingAttribute>() is RequiredSettingAttribute)
                                       .Select(settingProperty => settingProperty.Name);

            WindowFactory = new WindowFactory(Loggers);

            FileManager            = new WarThunderFileManager(Loggers);
            FileReader             = new WarThunderFileReader(Loggers);
            SettingsManager        = new WpfClientSettingsManager(FileManager, EWpfClientFile.Settings, requiredSettingNames, Loggers);
            _parser                = new Parser(Loggers);
            _unpacker              = new Unpacker(FileManager, Loggers);
            _dataRepositoryFactory = new DataRepositoryFactoryWarThunder(Loggers);
            _converter             = new Converter(Loggers);
            _jsonHelper            = new WarThunderJsonHelper(Loggers);
            _csvDeserializer       = new CsvDeserializer(Loggers);
            _randomizer            = new CustomRandomiserWithNormalisation(Loggers);
            _vehicleSelector       = new VehicleSelector(_randomizer, Loggers);
            _presetGenerator       = new PresetGenerator(_randomizer, _vehicleSelector, Loggers);
            _thunderSkillParser    = new ThunderSkillParser(Loggers);

            Manager = new WpfClientManager
                      (
                FileManager,
                FileReader,
                SettingsManager,
                _parser,
                _unpacker,
                _converter,
                _jsonHelper,
                _csvDeserializer,
                _dataRepositoryFactory,
                _randomizer,
                _vehicleSelector,
                _presetGenerator,
                _thunderSkillParser,
                generateDatabase,
                readOnlyJson,
                readPreviouslyUnpackedJson,
                Loggers
                      );
            InitialiseLocalisationManager();
        }
Пример #11
0
 private async Task <bool> UnpackFile(IUnpacker unpacker, string archiveFile, string targetDir)
 {
     unpacker.ProgressChanged += (object sender, UnpackingProgressArgs e) =>
     {
         Dispatcher.CurrentDispatcher.Invoke(() =>
         {
             unpackProgress.Maximum = e.TotalFiles;
             unpackProgress.Value   = e.CurrentFile;
             unpackText.Text        = $"Unpacking {e.CurrentFilename}";
         });
     };
     Directory.CreateDirectory(targetDir);
     return(await unpacker.Unpack(archiveFile, targetDir));
 }
Пример #12
0
        /// <summary>
        /// 生成基本的IUserToken
        /// </summary>
        /// <returns></returns>
        public IUserToken Create(IContext context)
        {
            var type     = context.GetType();
            var typeInfo = _concurrentDictionary.GetOrAdd(type, (k) =>
            {
                return(new TypeInfo()
                {
                    UserTokenType = context.UserToken.GetType(),
                    UnpackerType = context.UserToken.Unpacker.GetType()
                });
            });
            IUserToken userToken = (IUserToken)Activator.CreateInstance(typeInfo.UserTokenType);
            IUnpacker  unpakcer  = (IUnpacker)Activator.CreateInstance(typeInfo.UnpackerType);

            userToken.Unpacker = unpakcer;
            return(userToken);
        }
        public void Initialize()
        {
            _fileManager          = new FileManager(Presets.Logger);
            _unpacker             = new Unpacker(_fileManager, Presets.Logger);
            _rootDirectory        = $"{Directory.GetCurrentDirectory()}\\TestFiles";
            _defaultTempDirectory = Settings.TempLocation;

            if (!Directory.Exists(_rootDirectory))
            {
                Directory.CreateDirectory(_rootDirectory);
            }
            else
            {
                _fileManager.EmptyDirectory(_rootDirectory);
            }

            Settings.TempLocation = _rootDirectory;
        }
Пример #14
0
        /// <summary>
        /// Unpack an object from JSON format.
        /// </summary>
        /// <param name="json"></param>
        /// <returns></returns>
        public static IPackable Unpack(string json)
        {
            IDictionary <string, object> values = UnpackRaw(json);

            if (values == null)
            {
                return(null);
            }
            // Do we have a type key ?
            Type t = null;

            if (values.ContainsKey(TypeKey))
            {
                try
                {
                    t = Type.GetType(values[TypeKey].ToString());
                }
                catch (Exception ex)
                {
                }
            }
            if (t == null)
            {
                // Create a generic object instance
                t = typeof(GenericPackedObject);
            }
            // Get the unpacker for this type
            Type unpackerType = typeof(IUnpacker <>).MakeGenericType(new Type[] { t });
            IUnpacker <IPackable> unpacker = (IUnpacker <IPackable>)Locator.Current.GetService(unpackerType);

            if (unpacker == null)
            {
                return(null);
            }
            try
            {
                return(unpacker.Unpack(values));
            }
            catch (Exception ex)
            {
                return(null);
            }
        }
Пример #15
0
        /// <summary>
        /// Create a compressed source which automatically decompressed a certain underlying source.
        /// The decompression algorithm to use and the local unpacked path are explicitly given.
        /// </summary>
        /// <param name="source">The underlying data set source to decompress.</param>
        /// <param name="localUnpackPath">The local unpack path (where the unpacked underlying source stream is stored locally).</param>
        /// <param name="unpacker">The unpacker to use to decompress the given source.</param>
        public CompressedSource(IDataSource source, string localUnpackPath, IUnpacker unpacker)
        {
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }

            if (localUnpackPath == null)
            {
                throw new ArgumentNullException(nameof(localUnpackPath));
            }

            if (unpacker == null)
            {
                throw new ArgumentNullException(nameof(unpacker));
            }

            UnderlyingSource = source;
            _localUnpackPath = localUnpackPath;
            Unpacker         = unpacker;
        }
Пример #16
0
        public static IUnpacker Register(string extension, IUnpacker unpacker)
        {
            extension = extension.ToLower();

            if (!RegisteredUnpackersByExtension.ContainsKey(extension))
            {
                RegisteredUnpackersByExtension.Add(extension, unpacker);
            }
            else
            {
                if (AllowExternalTypeOverwrites)
                {
                    Logger.Info($"Overwrote internal resource extension {extension} to now refer to the unpacker {unpacker} (this may not be what you wanted).");
                }
                else
                {
                    throw new ArgumentException($"Extension {extension} is already registered as {RegisteredUnpackersByExtension[extension]} and cannot be changed to {unpacker} (AllowExternalTypeOverwrites flag is set to false).");
                }
            }

            return(unpacker);
        }
Пример #17
0
        private static IUnpacker InferUnpacker(IDataSource source)
        {
            string resourceName = source.ResourceName;
            string extension    = Path.HasExtension(resourceName) ? Path.GetExtension(resourceName) : null;

            if (extension == null || extension.Length == 0)
            {
                throw new ArgumentException($"Unable to infer unpacker via extension for underlying source {source} with resource name {source.ResourceName}, extension could not be identified.");
            }
            else
            {
                IUnpacker inferredUnpacker = Unpackers.GetMatchingUnpacker(extension);

                if (inferredUnpacker == null)
                {
                    throw new ArgumentException($"Unable to infer unpacker via extension {extension} of resource name {source.ResourceName} with internal registry.");
                }
                else
                {
                    return(inferredUnpacker);
                }
            }
        }
Пример #18
0
        /// <summary>
        /// Unpack a specific type of object from JSON
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="json"></param>
        /// <returns></returns>
        public static T Unpack <T>(string json) where T : IPackable
        {
            IDictionary <string, object> values = UnpackRaw(json);

            if (values == null)
            {
                return(default(T));
            }
            IUnpacker <T> unpacker = Locator.Current.GetService <IUnpacker <T> >();

            if (unpacker == null)
            {
                return(default(T));
            }
            try
            {
                return(unpacker.Unpack(values));
            }
            catch (Exception ex)
            {
                return(default(T));
            }
        }
Пример #19
0
        string GetUnpackerFlags(IUnpacker unp)
        {
            UnpackerFlags flg = unp.GetFlags();
            string result;

            result = String.Format("{0}{1}{2}{3}{4}",
                flg.HasFlag(UnpackerFlags.SupportsPack) ? "P" : "-",
                flg.HasFlag(UnpackerFlags.SupportsSubdirectories) ? "S" : "-",
                flg.HasFlag(UnpackerFlags.SupportsTimestamps) ? "T" : "-",
                flg.HasFlag(UnpackerFlags.NoFilenames) ? "-" : "N",
                flg.HasFlag(UnpackerFlags.Experimental) ? "X" : "-");

            return result;
        }
Пример #20
0
 /// <summary>
 /// 上下文
 /// </summary>
 public MessageContext()
 {
     this.UserToken = new MessageUserToken();
     this.Unpacker = new BaseUnpacker();
     this.UserToken.Unpacker = this.Unpacker;
 }
Пример #21
0
 public PlaylistUnpacker(IUnpacker unpacker, IStorage storage)
 {
     this.unpacker = unpacker;
     this.storage  = storage;
 }
Пример #22
0
        /// <summary> Creates a new manager and loads settings stored in the settings file. </summary>
        /// <param name="generateDatabase"> Whether to read data from JSON instead of the database. </param>
        /// <param name="readOnlyJson"> Whether to generate the database. </param>
        public Manager
        (
            IWarThunderFileManager fileManager,
            IWarThunderFileReader fileReader,
            IWarThunderSettingsManager settingsManager,
            IParser parser,
            IUnpacker unpacker,
            IConverter converter,
            IWarThunderJsonHelper jsonHelper,
            ICsvDeserializer csvDeserializer,
            IDataRepositoryFactory dataRepositoryFactory,
            IRandomiser randomizer,
            IVehicleSelector vehicleSelector,
            IPresetGenerator presetGenerator,
            bool generateDatabase,
            bool readOnlyJson,
            bool readPreviouslyUnpackedJson,
            params IConfiguredLogger[] loggers
        ) : base(EOrganizationLogCategory.Manager, loggers)
        {
            _generateDatabase           = generateDatabase;
            _readOnlyJson               = readOnlyJson;
            _readPreviouslyUnpackedJson = readPreviouslyUnpackedJson;
            _startupConfiguration       = GetStartupConfiguration(_generateDatabase, _readOnlyJson, _readPreviouslyUnpackedJson);
            _excludedGaijinIdParts      = new List <string>()
            {
                "_football",
                "germ_panzerkampflaufer_565_r",
                "germ_panzerkampflaufer_565_r_2",
                "po-2_nw",
                "_race",
                "_space_suit",
                "_tutorial",
                "uk_centaur_aa_mk_",
                "us_m35",
                "us_m35_2",
                "ussr_sht_1",
                "ussr_sht_1_2",
            };
            _fileManager           = fileManager;
            _fileReader            = fileReader;
            _parser                = parser;
            _unpacker              = unpacker;
            _converter             = converter;
            _jsonHelper            = jsonHelper;
            _csvDeserializer       = csvDeserializer;
            _dataRepositoryFactory = dataRepositoryFactory;
            _randomizer            = randomizer;
            _vehicleSelector       = vehicleSelector;
            _presetGenerator       = presetGenerator;

            _cache           = new List <IPersistentObject>();
            PlayableVehicles = new Dictionary <string, IVehicle>();

            _settingsManager = settingsManager;
            _settingsManager.Initialise(_startupConfiguration.IsIn(new List <EStartup> {
                EStartup.ReadDatabase, EStartup.ReadUnpackedJson
            }));
            LoadSettings();

            ResearchTrees = new Dictionary <ENation, ResearchTree>();

            LogDebug(ECoreLogMessage.Created.FormatFluently(EOrganizationLogCategory.Manager));
        }
Пример #23
0
 internal SignalEx(BinaryReader reader, IUnpacker unpacker) : base(reader, unpacker)
 {
     this.disposed = false;
 }
Пример #24
0
 public PacketConverter(IPacker packer, IUnpacker unpacker)
 {
     _packer   = packer;
     _unpacker = unpacker;
 }
Пример #25
0
 /// <summary>
 /// 上下文
 /// </summary>
 public BaseContext()
 {
     this.UserToken          = new BaseUserToken();
     this.Unpacker           = Activator.CreateInstance <Coder>();
     this.UserToken.Unpacker = this.Unpacker;
 }
Пример #26
0
 /// <summary>
 /// 内置上下文
 /// 支持IContext 扩展
 /// </summary>
 public Context()
 {
     this.UserToken          = new UserToken();
     this.Unpacker           = new BaseUnpacker();
     this.UserToken.Unpacker = this.Unpacker;
 }
Пример #27
0
 /// <summary>
 /// 上下文
 /// </summary>
 public QContext()
 {
     this.UserToken          = new UserToken();
     this.Unpacker           = new QUnpacker();
     this.UserToken.Unpacker = this.Unpacker;
 }
Пример #28
0
 /// <summary>
 /// 上下文
 /// </summary>
 public WSContext()
 {
     this.UserToken          = new WSUserToken();
     this.Unpacker           = new WSCoder();
     this.UserToken.Unpacker = this.Unpacker;
 }
Пример #29
0
 /// <summary>
 /// Initializes a new instance of the <see cref="UpdaterService" /> class.
 /// </summary>
 /// <param name="unpacker">The unpacker.</param>
 /// <param name="preferencesService">The preferences service.</param>
 /// <param name="storageProvider">The storage provider.</param>
 /// <param name="mapper">The mapper.</param>
 public UpdaterService(IUnpacker unpacker, IPreferencesService preferencesService, IStorageProvider storageProvider, IMapper mapper) : base(storageProvider, mapper)
 {
     this.preferencesService = preferencesService;
     this.unpacker           = unpacker;
 }
Пример #30
0
 /// <summary>
 /// 上下文
 /// </summary>
 public RContext()
 {
     this.UserToken          = new UserToken();
     this.Unpacker           = new RCoder();
     this.UserToken.Unpacker = this.Unpacker;
 }
Пример #31
0
 /// <summary>
 /// Инициализация необходимых объектов.
 /// </summary>
 public UnpackerViewModel(IUnpacker unpacker, string name)
 {
     _unpacker = unpacker;
     _helperIO = new HelperIO();
     Name      = name;
 }