コード例 #1
0
		public Managed Parse(TextParser parser, string defaultName)
		{
			ResGroup group = new ResGroup(this.context.Resolve<IResourceManager>(), parser.ResourceFile, this.context)
				{ BasePath = parser.BasePath };
			group.Name = defaultName;
			parser.Consume("CIwResGroup");
			parser.Consume("{");
			for (;;)
			{
				var attribute = parser.Lexem;
				if (attribute == "}")
				{
					parser.Consume();
					break;
				}
				if (attribute == "name")
				{
					parser.Consume();
					group.Name = parser.ConsumeString();
					continue;
				}
				if (attribute == "shared")
				{
					parser.Consume();
					group.IsShared = parser.ConsumeBool();
					continue;
				}
				if (attribute == "useTemplate")
				{
					//TODO: make a template handler
					parser.Consume();
					var ext = parser.ConsumeString();
					var name = parser.ConsumeString();
					continue;
				}

				var relPath = attribute.Replace('/', Path.DirectorySeparatorChar);
				if (relPath.Length > 2 && relPath[0] == '.' && relPath[1] == Path.DirectorySeparatorChar)
				{
					relPath = relPath.Substring(2);
				}
				string fullPath;
				if (relPath[0] == Path.DirectorySeparatorChar)
				{
					var searchPath = parser.BasePath;
					do
					{
						var subpath = relPath.Substring(1);
						fullPath = Path.Combine(searchPath, subpath);
						if (File.Exists(fullPath))
						{
							ParseFileReference(parser, @group, fullPath);
							continue;
						}
						searchPath = Path.GetDirectoryName(searchPath);
					}
					while (!string.IsNullOrEmpty(searchPath));

					//fullPath = Path.Combine(searchPath, parser.BasePath);
					//ParseFileReference(parser, @group, fullPath);
					//continue;
				}
				else
				{
					fullPath = Path.Combine(parser.BasePath, relPath);
					//if (File.Exists(fullPath))
					{
						ParseFileReference(parser, @group, fullPath);
						continue;
					}
				}
				parser.UnknownLexemError();
			}
			return group;
		}
コード例 #2
0
		private static void ParseFileReference(TextParser parser, ResGroup @group, string fullPath)
		{
			@group.AddFile(fullPath);
			parser.ConsumeString();
			if (parser.Lexem == "{")
			{
				//TODO: make a block handler
				parser.ConsumeBlock();
			}
		}
コード例 #3
0
		private void ParseGroupResources(BinaryParser parser, ResGroup resGroup)
		{
			uint numResources = parser.ConsumeUInt32();
			while (numResources > 0)
			{
				uint hash = parser.ConsumeUInt32();
				uint resCount = parser.ConsumeUInt32();

				bool unknown0 = parser.ConsumeBool();
				bool unknown1 = parser.ConsumeBool();

				while (resCount > 0)
				{
					--resCount;
					var pos = parser.Position;
					uint length = parser.ConsumeUInt32();

					object ser = null;
					if (!this.context.TryResolveKeyed(hash, typeof(IBinarySerializer), out ser))
					{
						this.errorHandler.CanNotRead(
							parser.BasePath, new FormatException(string.Format("Can't find resource reader for type {0}", hash)));
						parser.Skip(length - 4);
						continue;
					}
					var s = (IBinarySerializer)ser;
					Managed res = null;
					try
					{
						res = s.Parse(parser);
						resGroup.AddResource(res);
					}
					catch (Exception ex)
					{
						this.errorHandler.CanNotRead(
							parser.BasePath, new FormatException(string.Format("Can't read resource for type {0}", hash), ex));
						parser.Position = pos + length;
						continue;
					}

					if (parser.Position != pos + length)
					{
						throw new FormatException(
							string.Format(
								"Parse of {0} failed: wrong position by {1} bytes",
								(res == null) ? hash.ToString() : res.GetType().Name,
								parser.Position - (pos + length)));
						//parser.Position = pos + length;
					}
				}

				--numResources;
			}
		}
コード例 #4
0
		private void ParseResGroupMembers(BinaryParser parser, ResGroup resGroup)
		{
			resGroup.Name = parser.ConsumeStringZ();
			resGroup.Flags = parser.ConsumeUInt32();
		}
コード例 #5
0
		private void ParseChildGroups(BinaryParser parser, ResGroup resGroup)
		{
			byte num = parser.ConsumeByte();
			while (num > 0)
			{
				string path = parser.ConsumeStringZ();
				if (!string.IsNullOrEmpty(path))
				{
					resGroup.AddFile(path);
				}
				{
					if (0 != parser.ConsumeUInt32())
					{
						throw new FormatException();
					}
				}
				{
					if (0x00001000 != parser.ConsumeInt32())
					{
						throw new FormatException();
					}
				}
				{
					if (0xd9794596 != parser.ConsumeUInt32())
					{
						throw new FormatException();
					}
				}

				--num;
			}
		}