Ejemplo n.º 1
0
        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}.");
        }
Ejemplo n.º 2
0
        /// <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;
            }
        }
Ejemplo n.º 3
0
 /// <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;
 }
Ejemplo n.º 4
0
        public void NullNotEqual()
        {
            var reference = new IndirectReference(1267775544, 690);

            // ReSharper disable once SuspiciousTypeConversion.Global
            Assert.False(reference.Equals(null));
        }
Ejemplo n.º 5
0
        public void TwoIndirectHashCodeNotEqual()
        {
            var reference1 = new IndirectReference(1267775544, 690);
            var reference2 = new IndirectReference(1267775544, 12);

            Assert.NotEqual(reference1.GetHashCode(), reference2.GetHashCode());
        }
Ejemplo n.º 6
0
        public void SetsProperties()
        {
            var reference = new IndirectReference(129, 45);

            Assert.Equal(129, reference.ObjectNumber);
            Assert.Equal(45, reference.Generation);
        }
Ejemplo n.º 7
0
        public void TwoIndirectHashCodeSimilarValuesNotEqual()
        {
            var reference1 = new IndirectReference(12, 1);
            var reference2 = new IndirectReference(1, 12);

            Assert.NotEqual(reference1.GetHashCode(), reference2.GetHashCode());
        }
Ejemplo n.º 8
0
        public void TwoIndirectReferenceEqual()
        {
            var reference1 = new IndirectReference(1574, 690);
            var reference2 = new IndirectReference(1574, 690);

            Assert.True(reference1.Equals(reference2));
        }
Ejemplo n.º 9
0
        public void TwoIndirectReferenceNotEqual()
        {
            var reference1 = new IndirectReference(1574, 690);
            var reference2 = new IndirectReference(12, 0);

            Assert.False(reference1.Equals(reference2));
        }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 11
0
        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())));
            }
        }
Ejemplo n.º 13
0
        public void OtherObjectNotEqual()
        {
            var reference = new IndirectReference(1267775544, 690);
            var obj       = "test";

            // ReSharper disable once SuspiciousTypeConversion.Global
            Assert.False(reference.Equals(obj));
        }
Ejemplo n.º 14
0
        private IndirectReferenceToken AddToken(IToken token, int reservedNumber)
        {
            var reference      = new IndirectReference(reservedNumber, 0);
            var referenceToken = new IndirectReferenceToken(reference);

            tokenReferences.Add(referenceToken, token);
            return(referenceToken);
        }
Ejemplo n.º 15
0
        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;
            }
        }
Ejemplo n.º 17
0
        public IndirectReference Add(IPdfObject value)
        {
            var indRef = new IndirectReference(nextObjectNumber++, 0);

            this[indRef] = value;
            guidToReferenceTable.Add(value.Id, indRef);

            return(indRef);
        }
Ejemplo n.º 18
0
        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);
        }
Ejemplo n.º 19
0
        /// <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())));
            }
        }
Ejemplo n.º 20
0
 public IPdfObject this[IndirectReference reference]
 {
     get
     {
         return(internalDictionary[reference]);
     }
     set
     {
         internalDictionary[reference] = value;
     }
 }
Ejemplo n.º 21
0
        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);
        }
Ejemplo n.º 22
0
        internal PageTreeNode GetPageByReference(IndirectReference reference)
        {
            foreach (var page in pagesByNumber)
            {
                if (page.Value.Reference.Equals(reference))
                {
                    return(page.Value);
                }
            }

            return(null);
        }
Ejemplo n.º 23
0
        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);
        }
Ejemplo n.º 24
0
        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);
        }
Ejemplo n.º 25
0
        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);
        }
Ejemplo n.º 26
0
        /// <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));
            }
        }
Ejemplo n.º 27
0
        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));
        }
Ejemplo n.º 28
0
        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);
        }
Ejemplo n.º 29
0
        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);
        }
Ejemplo n.º 30
0
        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);
        }