public static T Get <T>(IndirectReference reference, IPdfTokenScanner scanner) where T : IToken { var temp = scanner.Get(reference); if (temp.Data is T locatedResult) { return(locatedResult); } if (temp.Data is IndirectReferenceToken nestedReference) { return(Get <T>(nestedReference, scanner)); } if (temp.Data is ArrayToken array && array.Data.Count == 1) { var arrayElement = array.Data[0]; if (arrayElement is IndirectReferenceToken arrayReference) { return(Get <T>(arrayReference, scanner)); } if (arrayElement is T arrayToken) { return(arrayToken); } } throw new PdfDocumentFormatException($"Could not find the object number {reference} with type {typeof(T).Name}."); }
/// <summary> /// Create a new <see cref="PageTreeNode"/>. /// </summary> internal PageTreeNode(DictionaryToken nodeDictionary, IndirectReference reference, bool isPage, int?pageNumber, IReadOnlyList <PageTreeNode> children) { NodeDictionary = nodeDictionary ?? throw new ArgumentNullException(nameof(nodeDictionary)); Reference = reference; IsPage = isPage; PageNumber = pageNumber; Children = children ?? throw new ArgumentNullException(nameof(children)); if (IsPage && Children.Count > 0) { throw new ArgumentException("Cannot define children on a page node.", nameof(children)); } if (!IsPage && pageNumber.HasValue) { throw new ArgumentException("Cannot define page number for a pages node.", nameof(pageNumber)); } foreach (var child in Children) { child.Parent = this; } }
/// <summary> /// Create a new <see cref="AddedImage"/>. /// </summary> internal AddedImage(IndirectReference reference, int width, int height) { Id = Guid.NewGuid(); Reference = reference; Width = width; Height = height; }
public void NullNotEqual() { var reference = new IndirectReference(1267775544, 690); // ReSharper disable once SuspiciousTypeConversion.Global Assert.False(reference.Equals(null)); }
public void TwoIndirectHashCodeNotEqual() { var reference1 = new IndirectReference(1267775544, 690); var reference2 = new IndirectReference(1267775544, 12); Assert.NotEqual(reference1.GetHashCode(), reference2.GetHashCode()); }
public void SetsProperties() { var reference = new IndirectReference(129, 45); Assert.Equal(129, reference.ObjectNumber); Assert.Equal(45, reference.Generation); }
public void TwoIndirectHashCodeSimilarValuesNotEqual() { var reference1 = new IndirectReference(12, 1); var reference2 = new IndirectReference(1, 12); Assert.NotEqual(reference1.GetHashCode(), reference2.GetHashCode()); }
public void TwoIndirectReferenceEqual() { var reference1 = new IndirectReference(1574, 690); var reference2 = new IndirectReference(1574, 690); Assert.True(reference1.Equals(reference2)); }
public void TwoIndirectReferenceNotEqual() { var reference1 = new IndirectReference(1574, 690); var reference2 = new IndirectReference(12, 0); Assert.False(reference1.Equals(reference2)); }
public bool TryGetOffset(IndirectReference reference, out long offset) { if (!loadedFromTable) { var table = crossReferenceTable.Invoke(); if (table != null) { foreach (var objectOffset in table.ObjectOffsets) { offsets[objectOffset.Key] = objectOffset.Value; } loadedFromTable = true; } } if (offsets.TryGetValue(reference, out offset)) { return(true); } var locations = searcher.GetObjectLocations(); if (locations.TryGetValue(reference, out offset)) { return(true); } return(false); }
public ObjectToken WriteObject(Stream stream, IToken token, int?reservedNumber = null) { int number; if (reservedNumber.HasValue) { if (!reservedNumbers.Remove(reservedNumber.Value)) { throw new InvalidOperationException(); } number = reservedNumber.Value; } else { number = CurrentNumber++; } var reference = new IndirectReference(number, 0); var obj = new ObjectToken(stream.Position, reference, token); objectOffsets.Add(reference, obj.Position); TokenWriter.WriteToken(obj, stream); return(obj); }
protected virtual void WriteInterceptorInvocationMethod(MethodInfo method, EasyMethod builder) { ArgumentReference[] arguments = builder.Arguments; TypeReference[] args = IndirectReference.WrapIfByRef(builder.Arguments); LocalReference target = builder.CodeBuilder.DeclareLocal(this.Context.Invocation); EasyCallable callable = this._method2Delegate[method] as EasyCallable; FieldReference reference2 = this.ObtainCallableFieldBuilderDelegate(callable); builder.CodeBuilder.AddStatement(new AssignStatement(target, new MethodInvocationExpression(this._method2Invocation, new Expression[] { reference2.ToExpression(), new MethodTokenExpression(this.GetCorrectMethod(method)), this.GetPseudoInvocationTarget(method) }))); LocalReference reference3 = builder.CodeBuilder.DeclareLocal(typeof(object)); LocalReference reference4 = builder.CodeBuilder.DeclareLocal(typeof(object[])); builder.CodeBuilder.AddStatement(new AssignStatement(reference4, new ReferencesToObjectArrayExpression(args))); builder.CodeBuilder.AddStatement(new AssignStatement(reference3, new VirtualMethodInvocationExpression(this.InterceptorField, this.Context.Interceptor.GetMethod("Intercept"), new Expression[] { target.ToExpression(), reference4.ToExpression() }))); for (int i = 0; i < arguments.Length; i++) { if (arguments[i].Type.IsByRef) { builder.CodeBuilder.AddStatement(new AssignStatement(args[i], new ConvertExpression(args[i].Type, new LoadRefArrayElementExpression(i, reference4)))); } } if (builder.ReturnType == typeof(void)) { builder.CodeBuilder.AddStatement(new ReturnStatement()); } else { builder.CodeBuilder.AddStatement(new ReturnStatement(new ConvertExpression(builder.ReturnType, reference3.ToExpression()))); } }
public void OtherObjectNotEqual() { var reference = new IndirectReference(1267775544, 690); var obj = "test"; // ReSharper disable once SuspiciousTypeConversion.Global Assert.False(reference.Equals(obj)); }
private IndirectReferenceToken AddToken(IToken token, int reservedNumber) { var reference = new IndirectReference(reservedNumber, 0); var referenceToken = new IndirectReferenceToken(reference); tokenReferences.Add(referenceToken, token); return(referenceToken); }
public ObjectToken WriteObject(Stream stream, IToken token) { var reference = new IndirectReference(CurrentNumber++, 0); var obj = new ObjectToken(stream.Position, reference, token); objectOffsets.Add(reference, obj.Position); TokenWriter.WriteToken(obj, stream); return(obj); }
public void Add(long objectId, int generationNumber, long offset) { IndirectReference objKey = new IndirectReference(objectId, generationNumber); if (!objects.ContainsKey(objKey)) { objects[objKey] = offset; } }
public IndirectReference Add(IPdfObject value) { var indRef = new IndirectReference(nextObjectNumber++, 0); this[indRef] = value; guidToReferenceTable.Add(value.Id, indRef); return(indRef); }
private static ObjectToken WriteObject(IToken content, Stream stream, Dictionary <IndirectReference, long> objectOffsets, ref int number) { var reference = new IndirectReference(number++, 0); var obj = new ObjectToken(stream.Position, reference, content); objectOffsets.Add(reference, obj.Position); // TODO: write TokenWriter.WriteToken(obj, stream); return(obj); }
/// <summary> /// Writes the method implementation. This /// method generates the IL code for property get/set method and /// ordinary methods. /// </summary> /// <param name="method">The method to implement.</param> /// <param name="builder"><see cref="EasyMethod"/> being constructed.</param> protected virtual void WriteInterceptorInvocationMethod(MethodInfo method, EasyMethod builder) { ArgumentReference[] arguments = builder.Arguments; TypeReference[] dereferencedArguments = IndirectReference.WrapIfByRef(builder.Arguments); LocalReference local_inv = builder.CodeBuilder.DeclareLocal(Context.Invocation); EasyCallable callable = _method2Delegate[method] as EasyCallable; FieldReference fieldDelegate = ObtainCallableFieldBuilderDelegate(callable); builder.CodeBuilder.AddStatement( new AssignStatement(local_inv, new MethodInvocationExpression(_method2Invocation, fieldDelegate.ToExpression(), new MethodTokenExpression(GetCorrectMethod(method)), GetPseudoInvocationTarget(method)))); LocalReference ret_local = builder.CodeBuilder.DeclareLocal(typeof(object)); LocalReference args_local = builder.CodeBuilder.DeclareLocal(typeof(object[])); // Store arguments into an object array. builder.CodeBuilder.AddStatement( new AssignStatement(args_local, new ReferencesToObjectArrayExpression(dereferencedArguments))); // Invoke the interceptor. builder.CodeBuilder.AddStatement( new AssignStatement(ret_local, new VirtualMethodInvocationExpression(InterceptorField, Context.Interceptor.GetMethod("Intercept"), local_inv.ToExpression(), args_local.ToExpression()))); // Load possibly modified ByRef arguments from the array. for (int i = 0; i < arguments.Length; i++) { if (arguments[i].Type.IsByRef) { builder.CodeBuilder.AddStatement( new AssignStatement(dereferencedArguments[i], new ConvertExpression(dereferencedArguments[i].Type, new LoadRefArrayElementExpression(i, args_local)))); } } if (builder.ReturnType == typeof(void)) { builder.CodeBuilder.AddStatement(new ReturnStatement()); } else { builder.CodeBuilder.AddStatement(new ReturnStatement( new ConvertExpression(builder.ReturnType, ret_local.ToExpression()))); } }
public IPdfObject this[IndirectReference reference] { get { return(internalDictionary[reference]); } set { internalDictionary[reference] = value; } }
private static ObjectToken WriteObject(IToken content, MemoryStream stream, Dictionary <IndirectReference, long> objectOffsets, ref int number) { var reference = new IndirectReference(number++, 0); var obj = new ObjectToken(stream.Position, reference, content); objectOffsets.Add(reference, obj.Position); // TODO: write stream.Write(new byte[50], 0, 50); stream.WriteByte(Break); return(obj); }
internal PageTreeNode GetPageByReference(IndirectReference reference) { foreach (var page in pagesByNumber) { if (page.Value.Reference.Equals(reference)) { return(page.Value); } } return(null); }
public void TryGetCanFollowMultipleReferenceLinks() { var reference1 = new IndirectReference(7, 0); var reference2 = new IndirectReference(9, 0); scanner.Objects[reference1] = new ObjectToken(10, reference1, new IndirectReferenceToken(reference2)); scanner.Objects[reference2] = new ObjectToken(12, reference2, new NumericToken(69)); Assert.True(DirectObjectFinder.TryGet(new IndirectReferenceToken(reference1), scanner, out NumericToken result)); Assert.Equal(69, result.Int); }
public void GetTokenCanFollowMultipleReferenceLinks() { var reference1 = new IndirectReference(7, 0); var reference2 = new IndirectReference(9, 0); scanner.Objects[reference1] = new ObjectToken(10, reference1, new IndirectReferenceToken(reference2)); scanner.Objects[reference2] = new ObjectToken(12, reference2, new NumericToken(69)); var result = DirectObjectFinder.Get <NumericToken>(new IndirectReferenceToken(reference1), scanner); Assert.Equal(69, result.Int); }
public void GetThrowsOnInvalidArray() { var reference = new IndirectReference(10, 0); scanner.Objects[reference] = new ObjectToken(10, reference, new ArrayToken(new[] { new NumericToken(5), new NumericToken(6), new NumericToken(0) })); Action action = () => DirectObjectFinder.Get <StringToken>(reference, scanner); Assert.Throws <PdfDocumentFormatException>(action); }
/// <summary> /// Create a new <see cref="PageTreeNode"/>. /// </summary> internal PageTreeNode(DictionaryToken nodeDictionary, IndirectReference reference, bool isPage, int?pageNumber) { NodeDictionary = nodeDictionary ?? throw new ArgumentNullException(nameof(nodeDictionary)); Reference = reference; IsPage = isPage; PageNumber = pageNumber; if (!IsPage && PageNumber.HasValue) { throw new ArgumentException("Cannot define page number for a pages node.", nameof(pageNumber)); } }
public CosBase Parse(IndirectReference indirectReference, IRandomAccessRead reader, bool isLenientParsing = true, bool requireExistingObject = false) { var key = new CosObjectKey(indirectReference.ObjectNumber, indirectReference.Generation); var pdfObject = objectPool.GetOrCreateDefault(key); if (pdfObject.GetObject() != null) { return(pdfObject.GetObject()); } var offsetOrStreamNumber = TryGet(key, crossReferenceTable.ObjectOffsets); if (requireExistingObject && (offsetOrStreamNumber == null || offsetOrStreamNumber <= 0)) { throw new InvalidOperationException("Object must be defined and not compressed: " + key); } if (isLenientParsing && offsetOrStreamNumber == null) { var locations = bruteForceSearcher.GetObjectLocations(); offsetOrStreamNumber = TryGet(key, locations); if (offsetOrStreamNumber != null) { crossReferenceTable.UpdateOffset(key, offsetOrStreamNumber.Value); } } if (offsetOrStreamNumber == null) { if (isLenientParsing) { return(CosNull.Null); } throw new InvalidOperationException($"Could not locate the object {key.Number} which was not found in the cross reference table."); } var isCompressedStreamObject = offsetOrStreamNumber <= 0; if (!isCompressedStreamObject) { return(ParseObjectFromFile(offsetOrStreamNumber.Value, reader, key, objectPool, isLenientParsing)); } return(ParseCompressedStreamObject(reader, -offsetOrStreamNumber.Value, indirectReference.ObjectNumber, isLenientParsing)); }
public void GetReturnsSingleItemFromArray() { var reference = new IndirectReference(10, 0); const string expected = "Goopy"; scanner.Objects[reference] = new ObjectToken(10, reference, new ArrayToken(new [] { new StringToken(expected) })); var result = DirectObjectFinder.Get <StringToken>(reference, scanner); Assert.Equal(expected, result.Data); }
public void CatalogDictionary() { var input = StringBytesTestConverter.Convert("<</Pages 14 0 R /Type /Catalog >>"); var result = tokenizer.TryTokenize(input.First, input.Bytes, out var token); Assert.True(result); var dictionary = AssertDictionaryToken(token); var reference = new IndirectReference(14, 0); AssertDictionaryEntry <NameToken, CosName, IndirectReferenceToken, IndirectReference>(dictionary, 0, CosName.PAGES, reference); AssertDictionaryEntry <NameToken, CosName, NameToken, CosName>(dictionary, 1, CosName.TYPE, CosName.CATALOG); }
public void CatalogDictionary() { var input = StringBytesTestConverter.Convert("<</Pages 14 0 R /Type /Catalog >>"); var result = tokenizer.TryTokenize(input.First, input.Bytes, out var token); Assert.True(result); var dictionary = AssertDictionaryToken(token); var reference = new IndirectReference(14, 0); AssertDictionaryEntry <IndirectReferenceToken, IndirectReference>(dictionary, NameToken.Pages, reference); AssertDictionaryEntry <NameToken, string>(dictionary, NameToken.Type, NameToken.Catalog); }