public Bitmap Decode(RoomBlock roomBlock, int objectIndex, int imageIndex) { ObjectImage obj = roomBlock.GetOBIMs()[objectIndex]; if (obj.GetIMxx()[imageIndex].GetBOMP() == null) { return(new Bitmap(1, 1)); } var IMHD = obj.GetIMHD(); _width = IMHD.Width; _height = IMHD.Height; _imageData = obj.GetIMxx()[imageIndex].GetBOMP(); if (PaletteIndex == 0) { _pallete = roomBlock.GetDefaultPalette(); } else { _pallete = roomBlock.GetPALS().GetWRAP().GetAPALs()[PaletteIndex]; } Decode(); return(_resultBitmap); }
public bool FieldReferenceEquals(ObjectImage referenceContext, JavaScriptObject fieldReference, JavaScriptObject fieldDefinition) { if (((string)fieldDefinition["Name"]) == ((string)fieldReference["Name"])) { return true; } return false; }
public void Encode(RoomBlock blockToEncode, int objectIndex, int imageIndex, Bitmap imageToEncode) { ObjectImage obj = blockToEncode.GetOBIMs()[objectIndex]; _imageToEncode = imageToEncode; var IMHD = obj.GetIMHD(); _width = IMHD.Width; _height = IMHD.Height; _imageBomp = obj.GetIMxx()[imageIndex].GetBOMP(); if (PaletteIndex == 0) { _pallete = blockToEncode.GetDefaultPalette(); } else { _pallete = blockToEncode.GetPALS().GetWRAP().GetAPALs()[PaletteIndex]; } Encode(); }
public override void SetAndRefreshData(Structures.BlockBase blockBase) { base.SetAndRefreshData(blockBase); if (ReferenceEquals(_diskBlock, blockBase)) { return; } _loading = true; _diskBlock = (DiskBlock)blockBase; var roomBlock = (RoomBlock)_diskBlock.Childrens.Single(r => r.GetType() == typeof(RoomBlock)); //Configurando as palettas Padrão PalettesData pals = roomBlock.GetPALS(); List <PaletteData> paletteDatas = null; if (pals != null) { paletteDatas = pals.GetWRAP().GetAPALs(); } Palettes.Items.Clear(); if (paletteDatas != null) { for (int i = 0; i < paletteDatas.Count; i++) { Palettes.Items.Add("Palette #" + i); } } else { Palettes.Items.Add("Palette #0"); } if (Palettes.SelectedIndex < 0) { Palettes.SelectedIndex = 0; } Palettes.Visible = Palettes.Items.Count != 1; //Termino de configuração das palettas padrão TreeImages.Nodes.Clear(); _roomImages = new Dictionary <string, RoomBlockImageControl>(); CreateInfos = new Dictionary <string, ClassCreateInfo>(); TreeNode backgroundNode = null; RoomImage RMIM = roomBlock.GetRMIM(); if (RMIM.GetIM00().GetSMAP().Strips.Count > 0) { var createInfo = new ClassCreateInfo(); createInfo.ImageType = ImageType.Background; createInfo.ControlId = "Background"; CreateInfos.Add("Background", createInfo); backgroundNode = TreeImages.Nodes.Add("Background", "Room Background"); } List <ZPlane> zPlanes = RMIM.GetIM00().GetZPlanes(); for (int i = 0; i < zPlanes.Count; i++) { string planeKey = "Background ZPlane " + (i + 1); var createInfo = new ClassCreateInfo(); createInfo.ImageType = ImageType.ZPlane; createInfo.ControlId = planeKey; createInfo.ZPlaneIndex = i; CreateInfos.Add(planeKey, createInfo); if (backgroundNode == null) { TreeImages.Nodes.Add(planeKey, "Background Z-Plane " + (i + 1)); } else { backgroundNode.Nodes.Add(planeKey, "Z-Plane " + (i + 1)); } } //Objetos List <ObjectImage> OBIMs = roomBlock.GetOBIMs(); for (int i = 0; i < OBIMs.Count; i++) { TreeNode nodeObject = TreeImages.Nodes.Add("_object" + i, "Object " + i); ObjectImage item = OBIMs[i]; List <ImageData> IMXX = item.GetIMxx(); for (int j = 0; j < IMXX.Count; j++) { ImageData image = IMXX[j]; string objectImageKey = string.Format("Object #{0}-{1}", i, j); TreeNode nodeImage = nodeObject.Nodes.Add(objectImageKey, "Image " + j); var createInfo = new ClassCreateInfo(); createInfo.ImageType = ImageType.Object; createInfo.ControlId = objectImageKey; createInfo.ObjectIndex = i; createInfo.ImageIndex = j; CreateInfos.Add(objectImageKey, createInfo); List <ZPlane> objectZPlanes = image.GetZPlanes(); for (int k = 0; k < objectZPlanes.Count; k++) { string objectZPlaneKey = string.Format("Object #{0}-{1} ZPlane {2}", i, j, (k + 1)); nodeImage.Nodes.Add(objectZPlaneKey, "Z-Plane " + k); createInfo = new ClassCreateInfo(); createInfo.ImageType = ImageType.ObjectsZPlane; createInfo.ControlId = objectZPlaneKey; createInfo.ObjectIndex = i; createInfo.ImageIndex = j; createInfo.ZPlaneIndex = k; CreateInfos.Add(objectZPlaneKey, createInfo); } } //Remove os itens se não tiver nenhuma imagem neles, só serve para poluir a tela. if (nodeObject.Nodes.Count == 0) { TreeImages.Nodes.Remove(nodeObject); } } //Costumes List <Costume> costumesList = _diskBlock.Childrens.OfType <Costume>().ToList(); for (int i = 0; i < costumesList.Count; i++) { TreeNode costume = TreeImages.Nodes.Add("_costume" + i, string.Format("Costume {0}", i.ToString().PadLeft(3, '0'))); Costume currentCostume = costumesList[i]; for (int j = 0; j < currentCostume.Pictures.Count; j++) { //Vamos filtras apenas os frames que tem imagem para decodificar. if (currentCostume.Pictures[j].ImageData.Length == 0 || currentCostume.Pictures[j].ImageData.Length == 1 && currentCostume.Pictures[j].ImageData[0] == 0) { continue; } string costumeKey = string.Format("Costume #{0}-{1}", i, j); var createInfo = new ClassCreateInfo(); createInfo.ImageType = ImageType.Costume; createInfo.Costume = currentCostume; createInfo.ControlId = costumeKey; createInfo.ImageIndex = j; CreateInfos.Add(costumeKey, createInfo); costume.Nodes.Add(costumeKey, string.Format("Frame {0}", j.ToString().PadLeft(2, '0'))); } } TreeImages.ExpandAll(); TreeImages.SelectedNode = TreeImages.Nodes[0]; _loading = false; }
private void OK_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(ExportLocation.Text)) { return; } if (!Directory.Exists(ExportLocation.Text)) { return; } string location = ExportLocation.Text; int fileCount = 0; Cursor = Cursors.WaitCursor; Cancel.Cursor = Cursors.Default; _cancelExport = false; _exporting = true; foreach (Control control in Controls) { if (control.Name != "Cancel" && control.GetType() != typeof(Label) && control.GetType() != typeof(ProgressBar)) { control.Enabled = false; } } Application.DoEvents(); var diskBlocks = _scummFile.DataFile.GetLFLFs(); Progress.Maximum = diskBlocks.Count - 1; Progress.Value = 0; Progress.Visible = true; FilesExported.Visible = true; FilesExportedLabel.Visible = true; var decoder = new ImageDecoder(); decoder.UseTransparentColor = ExportWithTransparency.Checked; var bompDecoder = new BompImageDecoder(); bompDecoder.UseTransparentColor = ExportWithTransparency.Checked; var costumeDecoder = new CostumeImageDecoder(); costumeDecoder.UseTransparentColor = ExportWithTransparency.Checked; var zplaneDecoder = new ZPlaneDecoder(); var convert = new ImageDepthConversor(); for (int i = 0; i < diskBlocks.Count; i++) { if (_cancelExport) { break; } var currentRoom = (RoomBlock)diskBlocks[i].Childrens.Single(r => r.GetType() == typeof(RoomBlock)); if (ExportBackgrounds.Checked) { Bitmap background = decoder.Decode(currentRoom); if (background != null) { if (Export8Bits.Checked) { background = convert.CopyToBpp(background, 8, currentRoom.GetDefaultPalette().Colors); } string backgroundName = Path.Combine(location, string.Format("Room#{0}.png", i)); background.Save(backgroundName, System.Drawing.Imaging.ImageFormat.Png); File.WriteAllText(backgroundName + ".idx", string.Join(";", decoder.UsedIndexes)); } FilesExported.Text = (++fileCount).ToString(); } if (ExportBackgroundZPlanes.Checked) { List <ZPlane> zPlanes = currentRoom.GetRMIM().GetIM00().GetZPlanes(); for (int j = 0; j < zPlanes.Count; j++) { if (_cancelExport) { break; } Bitmap zplane = zplaneDecoder.Decode(currentRoom, j); if (zplane != null) { if (Export8Bits.Checked) { zplane = convert.CopyToBpp(zplane, 1, new Color[2] { Color.Black, Color.White }); } zplane.Save(Path.Combine(location, string.Format("Room#{0} ZP#{1}.png", i, j)), System.Drawing.Imaging.ImageFormat.Png); FilesExported.Text = (++fileCount).ToString(); } } } if (ExportObjects.Checked) { var OBIMs = currentRoom.GetOBIMs(); for (int j = 0; j < OBIMs.Count; j++) { ObjectImage objectImage = OBIMs[j]; List <ImageData> IMxx = objectImage.GetIMxx(); for (int k = 0; k < IMxx.Count; k++) { if (_cancelExport) { break; } Bitmap image; int[] usedIndexes; if (IMxx[k].GetSMAP() == null) { image = bompDecoder.Decode(currentRoom, j, k); usedIndexes = bompDecoder.UsedIndexes.ToArray(); } else { image = decoder.Decode(currentRoom, j, k); usedIndexes = decoder.UsedIndexes.ToArray(); } if (Export8Bits.Checked) { image = convert.CopyToBpp(image, 8, currentRoom.GetDefaultPalette().Colors); } string objectFilename = Path.Combine(location, string.Format("Room#{0} Obj#{1} Img#{2}.png", i, j, k)); image.Save(objectFilename, System.Drawing.Imaging.ImageFormat.Png); File.WriteAllText(objectFilename + ".idx", string.Join(";", usedIndexes)); FilesExported.Text = (++fileCount).ToString(); } } } if (ExportObjectsZPlanes.Checked) { var OBIMs = currentRoom.GetOBIMs(); for (int j = 0; j < OBIMs.Count; j++) { ObjectImage objectImage = OBIMs[j]; List <ImageData> IMxx = objectImage.GetIMxx(); for (int k = 0; k < IMxx.Count; k++) { List <ZPlane> zplanes = IMxx[k].GetZPlanes(); for (int l = 0; l < zplanes.Count; l++) { if (_cancelExport) { break; } Bitmap zplane = zplaneDecoder.Decode(currentRoom, j, k, l); if (Export8Bits.Checked) { zplane = convert.CopyToBpp(zplane, 1, new Color[2] { Color.Black, Color.White }); } zplane.Save(Path.Combine(location, string.Format("Room#{0} Obj#{1} Img#{2} ZP#{3}.png", i, j, k, l)), System.Drawing.Imaging.ImageFormat.Png); FilesExported.Text = (++fileCount).ToString(); } } } } if (ExportCostumes.Checked) { DiskBlock currentDisk = diskBlocks[i]; List <Costume> costumesList = currentDisk.Childrens.OfType <Costume>().ToList(); for (int j = 0; j < costumesList.Count; j++) { Costume costume = costumesList[j]; for (int k = 0; k < costume.Pictures.Count; k++) { if (_cancelExport) { break; } if (costume.Pictures[k].ImageData.Length == 0 || costume.Pictures[k].ImageData.Length == 1 && costume.Pictures[k].ImageData[0] == 0) { continue; } Bitmap image = costumeDecoder.Decode(currentRoom, costume, k); if (Export8Bits.Checked) { var c = new List <Color>(); for (int z = 0; z < 256; z++) { c.Add(Color.Black); } PaletteData defaultPallete = currentRoom.GetDefaultPalette(); for (int z = 0; z < costume.Palette.Count; z++) { c[z] = defaultPallete.Colors[costume.Palette[z]]; } image = convert.CopyToBpp(image, 8, c.ToArray()); } image.Save(Path.Combine(location, string.Format("Room#{0} Costume#{1} FrameIndex#{2}.png", i, j, k)), System.Drawing.Imaging.ImageFormat.Png); FilesExported.Text = (++fileCount).ToString(); } } } Progress.Value = i; Application.DoEvents(); } Progress.Visible = false; _exporting = false; Cursor = Cursors.Default; if (_cancelExport) { MessageBox.Show("Export cancelled."); } else { MessageBox.Show("All images sucefully exported"); } Close(); }
//private static void GetTopNews(string html, FilterFullInfo record) //{ // try // { // long totalSize = 0; // //string p = "<div class="folder-top">.*?<a.*?href="(?<Link>.*?)".*?><img.*?src="(?<ImagePath>.*?)".*?/></a>.*?<p><a.*?href=".*?".*?class="link-topnews">(?<Title>.*?)</a>.*?<label class="item-time">(?<Time>.*?)</label>.*?<label class="item-date">(?<Date>.*?)</label></p>.*?<p>(?<Teaser>.*?)</p>.*?</div>"; // MatchCollection mcList = Regex.Matches(html, record.ParternGetTopNews, RegexOptions.IgnoreCase | RegexOptions.Singleline); // } // catch (Exception ex) // { // _logger.Info(string.Format("Error = {0}", ex.Message) + Environment.NewLine); // } //} //Tra ve 1 mang chua cac link va image thumb private static string StartMining(Record record) { string url = record.Source; long totalSize = 0; string html = RunBrowser(record.Source, out totalSize); HtmlDocument docList = new HtmlDocument(); docList.LoadHtml(html); HtmlNode nodes = docList.DocumentNode.SelectSingleNode(record.ListStartAfter); if (nodes != null) { html = nodes.InnerHtml; } else { html = ""; } if (html != "") { html = html.Replace("\r\n", "").Replace("> <", "><"); HtmlDocument doc1 = new HtmlDocument(); doc1.LoadHtml(html); HtmlNodeCollection nodesList = doc1.DocumentNode.SelectNodes(record.PartternNodeList); if (nodesList != null) { foreach (HtmlNode itemList in nodesList) { HtmlDocument docitemList = new HtmlDocument(); docitemList.LoadHtml(itemList.InnerHtml); string imgAvatar = ""; HtmlNode itemListNode = docitemList.DocumentNode; HtmlNode nodesImage = itemListNode.SelectSingleNode(record.PartternAvatar); if (nodesImage != null) { imgAvatar = nodesImage.InnerHtml; } //itemListNode = docitemList.DocumentNode; HtmlNode nodesTitle = itemListNode.SelectSingleNode(record.PartternTitle); string title = ""; if (nodesTitle != null) { title = nodesTitle.InnerText; } //itemListNode = docitemList.DocumentNode; HtmlNode nodesTeaser = itemListNode.SelectSingleNode(record.PartternTeaser); string Teaser = ""; if (nodesTeaser != null) { Teaser = Regex.Replace(nodesTeaser.InnerHtml, "<.*?>.*?</.*?>", "", RegexOptions.Singleline | RegexOptions.IgnoreCase); //Teaser = nodesTeaser.InnerText; } //itemListNode = docitemList.DocumentNode; HtmlNode nodesLink = itemListNode.SelectSingleNode(record.PartternLink); string link = ""; if (nodesLink != null) { HtmlAttribute linkAtt = nodesLink.Attributes["href"]; link = linkAtt.Value; } //HtmlNode nodesPubDate = itemList.SelectSingleNode("//*[@class=\"box-wiget-content-timpost\"]"); //string pubDate = nodesPubDate.InnerHtml; //MatchCollection mcList = Regex.Matches(html, record.ParternList, RegexOptions.IgnoreCase | RegexOptions.Singleline); var list = new List <ObjectLink>(); var listImage = new List <ObjectImage>(); int i = 0; //if (mcList != null && mcList.Count > 0) //{ // _logger.Debug("Matchs : " + mcList.Count.ToString()); //foreach (Match match in mcList) //{ #region Get main content var contentInfo = new ContentInfo(); contentInfo.Content_Headline = AppEnv.NCRToUnicode(Regex.Replace(title, "<.*?>", "", RegexOptions.IgnoreCase | RegexOptions.Singleline)); // AppEnv.NCRToUnicode(Regex.Replace(match.Groups["Title"].Value, "<.*?>", "", RegexOptions.IgnoreCase | RegexOptions.Singleline)); contentInfo.Content_Url = OptimiseUrl(link, record); //OptimiseUrl(match.Groups["Link"].Value, record); if (contentInfo.Content_Url.StartsWith("http://")) { try { Uri uri = new Uri(contentInfo.Content_Url); Uri uri1 = new Uri(record.Source); if (uri.Host != uri1.Host) { continue; } } catch (Exception) { continue; } } else { } long totalSizeTemp = 0; //if (contentInfo.Content_Url == "http://news.zing.vn/Hai-toa-nha-5-tang-sap-sau-tieng-no-tai-New-York-post398904.html#pictures") //{ // string es = ""; //} string contentDetail = GetContentDetail(contentInfo.Content_Url, record, out totalSizeTemp); if (contentDetail.Trim() == "") { continue; } contentInfo.Content_Teaser = GetContentTeaser(contentDetail, record); //Teaser; //if (contentInfo.Content_Teaser.Trim() == "") //{ // continue; //} string tags = GetTag(contentDetail, record); contentInfo.Content_Body = GetContentBody(contentDetail, record); //if (contentInfo.Content_Body.Trim() == "") //{ // continue; //} string date = ""; //date = pubDate;// match.Groups["PubDate"].Value; if (date == "") { //if (record.PartternPubDate != "") //{ date = GetPubDateByParttern(contentDetail, record); //} //else //{ // date = GetPubDate(contentInfo.Content_Body, record); //} } contentInfo.Content_CreateDate = OpitmisePubDate(date, record.FormatDate); contentInfo.Content_Status = 1; contentInfo.CategoryID = record.CategoryID; contentInfo.Content_UserID = 212; contentInfo.Content_HeadlineKD = UnicodeUtility.UnicodeToKoDau(contentInfo.Content_Headline); contentInfo.Content_TeaserKD = UnicodeUtility.UnicodeToKoDau(contentInfo.Content_Teaser); contentInfo.Content_Source = record.Page; string imagePath = imgAvatar;// match.Groups["ImagePath"].Value.Trim(); if (imagePath.IndexOf("src=\"") > -1) { imagePath = imagePath.Substring(imagePath.IndexOf("src=\"") + 5); imagePath = imagePath.Substring(0, imagePath.IndexOf("\"")); } if (imagePath.IndexOf("src='") > -1) { imagePath = imagePath.Substring(imagePath.IndexOf("src='") + 5); imagePath = imagePath.Substring(0, imagePath.IndexOf("'")); } string imageDownloadUrl = ""; string imageName = ""; if (Convert.ToInt32(AppEnv.GetSetting("SaveImage")) == 1) { #region lay anh dau tien trong bai chi tiet HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(contentInfo.Content_Body); HtmlNodeCollection node = doc.DocumentNode.SelectNodes("//img"); if (node != null) { foreach (HtmlNode img in node) { HtmlAttribute att = img.Attributes["src"]; imageDownloadUrl = att.Value; string exceptionImg = AppEnv.GetSetting("exceptionImg"); string[] arr = exceptionImg.Split(','); int flag = 0; foreach (string item in arr) { if (item != "") { if (imageDownloadUrl.Contains(item)) { flag = 1; imageDownloadUrl = ""; break; } } } if (flag == 1) { continue; } else { break; } } if (imageDownloadUrl == "") { imageDownloadUrl = imagePath; } } else { imageDownloadUrl = imagePath; } #endregion imageDownloadUrl = OptimiseUrl(imageDownloadUrl, record); imageName = DateTime.Now.ToString("yyyyMMddHHmmssffff") + ".jpg"; var objectImage = new ObjectImage { ImageName = imageName, Link = imageDownloadUrl }; listImage.Add(objectImage); contentInfo.Content_Avatar = AppEnv.GetSetting("virtualPath") + DateTime.Now.Year + "/" + DateTime.Now.Month + "/" + DateTime.Now.Day + "/" + imageName; } else { contentInfo.Content_Avatar = record.HttpPrefix + imagePath; } contentInfo.Content_BigAvatar = ""; if (i < 6) { contentInfo.Content_Rank = 2; } else { contentInfo.Content_Rank = 1; } contentInfo.IsPublished = true; try { DateTime dt = DateTime.Parse(contentInfo.Content_CreateDate, new CultureInfo("fr-FR", false)); if (dt.Year == DateTime.Now.Year && dt.Month == DateTime.Now.Month && dt.Day < DateTime.Now.Day) { continue; } else { if (dt.Year < DateTime.Now.Year || dt.Month < DateTime.Now.Month) { continue; } else { int returnValue = AppEnv.Insert(contentInfo); } } } catch (Exception) { try { } catch (Exception) { int returnValue = AppEnv.Insert(contentInfo); } } #endregion i++; totalSize += totalSizeTemp; //} string physicalPath = AppEnv.GetSetting("phyPath") + DateTime.Now.Year + "\\" + DateTime.Now.Month + "\\" + DateTime.Now.Day + "\\"; #region Download Image if (listImage != null && listImage.Count > 0) { int totalImage = 0; foreach (ObjectImage item in listImage) { Image image = DownloadImage(item.Link); if (image != null) { if (!Directory.Exists(physicalPath)) { Directory.CreateDirectory(physicalPath); } image.Save(physicalPath + item.ImageName, ImageFormat.Jpeg); totalImage++; } } } #endregion _logger.Info(string.Format("Finished mining with source = {0}", record.Source) + Environment.NewLine); //} } return(html); } else { return(""); } } else { return(""); } }
public ResolvedReference(ObjectImage context, JavaScriptObject resolved) { Context = context; Resolved = resolved; }
public void Fixup(ObjectImage objectImage) { JavaScriptObject metadata = objectImage.GetMetadata(); JavaScriptArray fixups = objectImage.GetFixups(); List<KeyValuePair<uint, string>> codeSectionFixups = objectImage.CodeSectionFixups = new List<KeyValuePair<uint, string>>(); List<KeyValuePair<uint, string>> dataSectionFixups = objectImage.DataSectionFixups = new List<KeyValuePair<uint, string>>(); List<KeyValuePair<uint, string>> initSectionFixups = objectImage.InitializationSectionFixups = new List<KeyValuePair<uint, string>>(); List<KeyValuePair<uint, string>> currentSectionFixups; foreach (JavaScriptObject fixup in fixups) { FixupType fixupType = (FixupType)(long)fixup["Type"]; FixupType sectionFixupType = fixupType & (FixupType.CodeSection | FixupType.DataSection | FixupType.InitializationSection); fixupType = fixupType & ~FixupType.CodeSection; fixupType = fixupType & ~FixupType.DataSection; fixupType = fixupType & ~FixupType.InitializationSection; switch (sectionFixupType) { case FixupType.CodeSection: { currentSectionFixups = codeSectionFixups; break; } case FixupType.DataSection: { currentSectionFixups = dataSectionFixups; break; } case FixupType.InitializationSection: { currentSectionFixups = initSectionFixups; break; } default: { throw new LinkerException(); } } uint fixupOffset = (uint)(long)fixup["Offset"]; int fixupIndex = (int)(long)fixup["Index"]; string fixedUp; try { switch (fixupType) { case FixupType.MethodCodePointer: { JavaScriptObject methodReference = (JavaScriptObject)((JavaScriptArray)metadata["MethodReferences"])[fixupIndex]; ResolvedReference resolvedReference = ResolveMethodReference(objectImage, methodReference); fixedUp = (resolvedReference.Context.ModuleImageCodeStoreIndex + (long)resolvedReference.Resolved["CodeIndex"]).ToString(); break; } case FixupType.StaticFieldDataPointer: { JavaScriptObject fieldReference = (JavaScriptObject)((JavaScriptArray)metadata["FieldReferences"])[fixupIndex]; ResolvedReference resolvedReference = ResolveFieldReference(objectImage, fieldReference); fixedUp = (resolvedReference.Context.ModuleImageDataStoreIndex + (long)resolvedReference.Resolved["DataIndex"]).ToString(); break; } case FixupType.VTableDataPointer: { JavaScriptObject typeReference = (JavaScriptObject)((JavaScriptArray)metadata["TypeReferences"])[fixupIndex]; ResolvedReference resolvedReference = ResolveTypeReference(objectImage, typeReference); fixedUp = (resolvedReference.Context.ModuleImageDataStoreIndex + (long)resolvedReference.Resolved["VTableIndex"]).ToString(); break; } case FixupType.VTableSlot: { JavaScriptObject methodReference = (JavaScriptObject)((JavaScriptArray)metadata["MethodReferences"])[fixupIndex]; ResolvedReference resolvedReference = ResolveMethodReference(objectImage, methodReference); fixedUp = resolvedReference.Resolved["VTableSlot"].ToString(); break; } default: { throw new InvalidObjectFormatException(); } } } catch (Exception e) { Error("COULD NOT FIXUP: [" + fixupType.ToString() + " " + e.Message + "]. Object image is: " + objectImage); fixedUp = "COULD NOT FIXUP: [" + fixupType.ToString() + " " + e.Message + "]"; } currentSectionFixups.Add(new KeyValuePair<uint, string>(fixupOffset, fixedUp)); } }
public bool TypeReferenceEquals(ObjectImage referenceContext, JavaScriptObject typeReference, ObjectImage definitionContext, JavaScriptObject typeDefinition) { bool isGeneric = (bool)typeReference["IsGeneric"]; if (isGeneric) { // TODO: check constraints etc return true; } string typeReferenceName = ((string)typeReference["Name"]); if (typeReferenceName.EndsWith("&")) { // this is a reference type // remove trailing "&" from type reference name typeReferenceName = typeReferenceName.Substring(0, typeReferenceName.Length - 1); } if (((string)typeDefinition["Name"]) == typeReferenceName && ((string)typeDefinition["Namespace"]) == ((string)typeReference["Namespace"])) { return true; } return false; }
public void SetEntryPointObjectImage(ObjectImage objectImage) { _entryPointImage = objectImage; }
public ResolvedReference ResolveTypeReference(ObjectImage context, JavaScriptObject typeReference) { JavaScriptObject metadata = context.GetMetadata(); int assemblyReferenceIndex = (int)(long)typeReference["Assembly"]; ObjectImage referencedObjectImage; if (assemblyReferenceIndex == -1) { referencedObjectImage = context; } else { JavaScriptObject assemblyReference = (JavaScriptObject)((JavaScriptArray)metadata["AssemblyReferences"])[assemblyReferenceIndex]; referencedObjectImage = ResolveAssemblyReference(assemblyReference); } JavaScriptObject referencedMetadata = referencedObjectImage.GetMetadata(); foreach (JavaScriptObject typeDefinition in (JavaScriptArray)referencedMetadata["Types"]) { if (TypeReferenceEquals(context, typeReference, referencedObjectImage, typeDefinition)) { int declaringTypeReferenceIndex = (int)(long)typeReference["DeclaringType"]; int declaringTypeReferenceIndex2 = (int)(long)typeDefinition["DeclaringType"]; if (declaringTypeReferenceIndex != -1 && declaringTypeReferenceIndex2 != -1) { // if both have declaring types JavaScriptObject declaringTypeReference = (JavaScriptObject)((JavaScriptArray)metadata["TypeReferences"])[declaringTypeReferenceIndex]; JavaScriptObject declaringTypeReference2 = (JavaScriptObject)((JavaScriptArray)referencedMetadata["TypeReferences"])[declaringTypeReferenceIndex2]; ResolvedReference resolvedReference = ResolveTypeReference(referencedObjectImage, declaringTypeReference2); if (!TypeReferenceEquals(context, declaringTypeReference, resolvedReference.Context, resolvedReference.Resolved)) { continue; } } else if (declaringTypeReferenceIndex != -1 || declaringTypeReferenceIndex2 != -1) { // if one has a declaring type and not the other continue; } return new ResolvedReference(referencedObjectImage, typeDefinition); } } // TODO: Resolve declaring type to get its full name throw new Exception("Could not resolve type: " + (typeReference.ContainsKey("DeclaringType") && (long)typeReference["DeclaringType"] != -1 ? typeReference["DeclaringType"] : typeReference["Namespace"]) + "." + typeReference["Name"]); }
public ResolvedReference ResolveMethodReference(ObjectImage context, JavaScriptObject methodReference) { JavaScriptObject metadata = context.GetMetadata(); int typeReferenceIndex = (int)(long)methodReference["Type"]; JavaScriptObject typeReference = (JavaScriptObject)((JavaScriptArray)metadata["TypeReferences"])[typeReferenceIndex]; ResolvedReference resolvedTypeDefinitionReference = ResolveTypeReference(context, typeReference); JavaScriptObject typeDefinition = resolvedTypeDefinitionReference.Resolved; foreach (JavaScriptObject methodDefinition in (JavaScriptArray)typeDefinition["Methods"]) { if (MethodReferenceEquals(context, methodReference, resolvedTypeDefinitionReference.Context, methodDefinition)) { return new ResolvedReference(resolvedTypeDefinitionReference.Context, methodDefinition); } } throw new Exception("Could not resolve method: " + typeReference["Namespace"] + "." + typeReference["Name"] + "::" + methodReference["Name"]); }
public ResolvedReference ResolveFieldReference(ObjectImage context, JavaScriptObject fieldReference) { JavaScriptObject metadata = context.GetMetadata(); int typeReferenceIndex = (int)(long)fieldReference["Type"]; JavaScriptObject typeReference = (JavaScriptObject)((JavaScriptArray)metadata["TypeReferences"])[typeReferenceIndex]; ResolvedReference resolvedTypeDefinitionReference = ResolveTypeReference(context, typeReference); JavaScriptObject typeDefinition = resolvedTypeDefinitionReference.Resolved; foreach (JavaScriptObject fieldDefinition in (JavaScriptArray)typeDefinition[(bool)fieldReference["IsStatic"] ? "StaticFields" : "Fields"]) { if (FieldReferenceEquals(context, fieldReference, fieldDefinition)) { return new ResolvedReference(resolvedTypeDefinitionReference.Context, fieldDefinition); } } throw new Exception("Could not resolve field: " + typeReference["Namespace"] + "." + typeReference["Name"] + "." + fieldReference["Name"]); }
public bool ParameterReferenceEquals(ObjectImage referenceContext, JavaScriptObject parameterReference, ObjectImage definitionContext, JavaScriptObject parameterDefinition) { /*if (((string)parameterReference["Name"]) != ((string)parameterDefinition["Name"])) { return false; }*/ if (((long)parameterReference["Sequence"]) != ((long)parameterDefinition["Sequence"])) { return false; } JavaScriptObject metadata = referenceContext.GetMetadata(); int typeReferenceIndex = (int)(long)parameterReference["Type"]; JavaScriptObject typeReference = (JavaScriptObject)((JavaScriptArray)metadata["TypeReferences"])[typeReferenceIndex]; ResolvedReference resolvedTypeDefinitionReference = ResolveTypeReference(referenceContext, typeReference); return TypeReferenceEquals(definitionContext, (JavaScriptObject)((JavaScriptArray)definitionContext.GetMetadata()["TypeReferences"])[(int)(long)parameterDefinition["Type"]], referenceContext, resolvedTypeDefinitionReference.Resolved); }
public bool MethodReferenceEquals(ObjectImage referenceContext, JavaScriptObject methodReference, ObjectImage definitionContext, JavaScriptObject methodDefinition) { if (((string)methodReference["Name"]) != ((string)methodDefinition["Name"])) { return false; } if (((bool)methodReference["HasThis"]) != ((bool)methodDefinition["HasThis"])) { return false; } JavaScriptArray methodReferenceParameterReferences = (JavaScriptArray)methodReference["Parameters"]; JavaScriptArray methodDefinitionParameters = (JavaScriptArray)methodDefinition["Parameters"]; if (methodReferenceParameterReferences.Count != methodDefinitionParameters.Count) { return false; } JavaScriptObject metadata = referenceContext.GetMetadata(); int i = 0; foreach (long parameterReferenceIndex in methodReferenceParameterReferences) { if (!ParameterReferenceEquals(referenceContext, (JavaScriptObject)((JavaScriptArray)metadata["ParameterReferences"])[(int)parameterReferenceIndex], definitionContext, (JavaScriptObject)methodDefinitionParameters[i++])) { return false; } } return true; }
public AssemblyName LoadObjectImage(string filepath) { ObjectImage objectImage = new ObjectImage(); XmlDocument objectFileXmlDocument = new XmlDocument(); try { objectFileXmlDocument.Load(filepath); } catch (XmlException e) { throw new LinkerException("Unable to load object image: " + filepath, e); } // TODO: Verify object file xml format XmlElement documentElement = objectFileXmlDocument.DocumentElement; XmlElement headerElement = (XmlElement)documentElement.GetElementsByTagName("Header")[0]; // load header JavaScriptObject header = (JavaScriptObject)JavaScriptConvert.DeserializeObject(((XmlCDataSection)headerElement.FirstChild).Data); objectImage.Header = header; JavaScriptObject metadata = objectImage.GetMetadata(); AssemblyName assemblyName = new AssemblyName(); JavaScriptObject assemblyNameObject = (JavaScriptObject)metadata["Name"]; assemblyName.Name = (string)assemblyNameObject["Name"]; assemblyName.Version = (string)assemblyNameObject["Version"]; assemblyName.Culture = (string)assemblyNameObject["Culture"]; objectImage.Name = assemblyName; // load code section XmlElement codeElement = (XmlElement)documentElement.GetElementsByTagName("Code")[0]; MemoryStream codeMemoryStream = new MemoryStream(); StreamWriter codeMemoryStreamWriter = new StreamWriter(codeMemoryStream); codeMemoryStreamWriter.Write(((XmlCDataSection)codeElement.FirstChild).Data); codeMemoryStreamWriter.Flush(); long codeMemoryStreamLength = codeMemoryStream.Position; codeMemoryStream.Seek(0, SeekOrigin.Begin); objectImage.CodeStream = codeMemoryStream; objectImage.CodeStreamLength = codeMemoryStreamLength; objectImage.MethodCount = (int)long.Parse(codeElement.GetAttribute("Length")); objectImage.ModuleImageCodeStoreIndex = _moduleImageCodeStoreSize; _moduleImageCodeStoreSize += objectImage.MethodCount; // load data section XmlElement dataElement = (XmlElement)documentElement.GetElementsByTagName("Data")[0]; MemoryStream dataMemoryStream = new MemoryStream(); StreamWriter dataMemoryStreamWriter = new StreamWriter(dataMemoryStream); dataMemoryStreamWriter.Write(((XmlCDataSection)dataElement.FirstChild).Data); dataMemoryStreamWriter.Flush(); long dataMemoryStreamLength = dataMemoryStream.Position; dataMemoryStream.Seek(0, SeekOrigin.Begin); objectImage.DataStream = dataMemoryStream; objectImage.DataStreamLength = dataMemoryStreamLength; objectImage.DataCount = (int)long.Parse(dataElement.GetAttribute("Length")); objectImage.ModuleImageDataStoreIndex = _moduleImageDataStoreSize; _moduleImageDataStoreSize += objectImage.DataCount; // load init section XmlElement initElement = (XmlElement)documentElement.GetElementsByTagName("Initialization")[0]; MemoryStream initMemoryStream = new MemoryStream(); StreamWriter initMemoryStreamWriter = new StreamWriter(initMemoryStream); initMemoryStreamWriter.Write(((XmlCDataSection)initElement.FirstChild).Data); initMemoryStreamWriter.Flush(); long initMemoryStreamLength = initMemoryStream.Position; initMemoryStream.Seek(0, SeekOrigin.Begin); objectImage.InitializationStream = initMemoryStream; objectImage.InitializationStreamLength = initMemoryStreamLength; _loadedObjectImages[assemblyName] = objectImage; return assemblyName; }