Ejemplo n.º 1
0
        internal void InitAsParent(string encoding, bool namespaces)
        {
            XMLParser *parser;

            lock (this) {
                if (xmlParser != null)
                {
                    throw new ExpatException(ExpatParser <X, E, U> .InternalStateError);
                }
                RuntimeHelpers.PrepareConstrainedRegions();
                try { }
                finally {
                    if (namespaces)
                    {
                        parser = LibExpat.XMLParserCreateNS(encoding, ExpatUtils.NSSep);
                    }
                    else
                    {
                        parser = LibExpat.XMLParserCreate(encoding);
                    }
                    xmlParser = parser;
                    GC.ReRegisterForFinalize(this);
                }
            }
            if (parser == null)
            {
                throw new OutOfMemoryException();
            }
        }
Ejemplo n.º 2
0
 // this re-assigns all handlers except for the UnknownEncodingHandler
 protected void ReAssignHandlers(XMLParser *parser)
 {
     LibExpat.XMLSetElementDeclHandler(parser, elementDeclHandler);
     LibExpat.XMLSetAttlistDeclHandler(parser, attlistDeclHandler);
     LibExpat.XMLSetXmlDeclHandler(parser, xmlDeclHandler);
     LibExpat.XMLSetElementHandler(parser, startElementHandler, endElementHandler);
     LibExpat.XMLSetCharacterDataHandler(parser, characterDataHandler);
     LibExpat.XMLSetProcessingInstructionHandler(parser, processingInstructionHandler);
     LibExpat.XMLSetCommentHandler(parser, commentHandler);
     LibExpat.XMLSetCdataSectionHandler(parser, startCdataSectionHandler, endCdataSectionHandler);
     if (skipInternal)
     {
         LibExpat.XMLSetDefaultHandler(parser, defaultHandler);
     }
     else
     {
         LibExpat.XMLSetDefaultHandlerExpand(parser, defaultHandler);
     }
     LibExpat.XMLSetDoctypeDeclHandler(parser, startDoctypeDeclHandler, endDoctypeDeclHandler);
     LibExpat.XMLSetEntityDeclHandler(parser, entityDeclHandler);
     LibExpat.XMLSetNotationDeclHandler(parser, notationDeclHandler);
     LibExpat.XMLSetNamespaceDeclHandler(parser, startNamespaceDeclHandler, endNamespaceDeclHandler);
     LibExpat.XMLSetNotStandaloneHandler(parser, notStandaloneHandler);
     LibExpat.XMLSetSkippedEntityHandler(parser, skippedEntityHandler);
     // this is a private handler that always needs to be set
     LibExpat.XMLSetExternalEntityRefHandler(parser, externalEntityRefHandler);
 }
Ejemplo n.º 3
0
 public void SetUnknownEncodingHandler(XMLUnknownEncodingHandler handler,
                                       IntPtr encodingHandlerData)
 {
     CheckNotParsing();
     unknownEncodingHandler = handler;
     LibExpat.XMLSetUnknownEncodingHandler(
         entityContext.XmlParser, handler, encodingHandlerData);
 }
Ejemplo n.º 4
0
        public bool SetParamEntityParsing(XMLParamEntityParsing peParsing)
        {
            bool result = LibExpat.XMLSetParamEntityParsing(entityContext.XmlParser, peParsing) != 0;

            if (result)
            {
                paramEntityParsing = peParsing;
            }
            return(result);
        }
Ejemplo n.º 5
0
 private void ConfigureParentParser(XMLParser *xmlParser)
 {
     if (namespaces)
     {
         LibExpat.XMLSetReturnNSTriplet(xmlParser, 1);
     }
     LibExpat.XMLSetUserData(xmlParser, (IntPtr)parserHandle);
     // this is a private handler that always needs to be set
     LibExpat.XMLSetExternalEntityRefHandler(xmlParser, externalEntityRefHandler);
 }
Ejemplo n.º 6
0
        ExternalEntityRefHandlerImpl(XMLParser *parser,
                                     char *context,
                                     char *baseUri,
                                     char *systemId,
                                     char *publicId)
        {
            int result = (int)XMLStatus.OK;

            GCHandle parserHandle = (GCHandle)LibExpat.XMLGetUserData(parser);
            X        expatParser  = (X)parserHandle.Target;

            E      newEntityContext = expatParser.freeEntityContext; // should always be != null
            string encoding;

            try {
                if (!newEntityContext.Open(context, baseUri, systemId, publicId, out encoding))
                {
                    return(result);
                }
            }
            catch (Exception e) {
                expatParser.error = e;
                result            = (int)XMLStatus.ERROR;
                return(result);
            }

            expatParser.PushChildEntityParseContext(parser, context, encoding);

            ParseStatus status = ExpatUtils.Parse(
                newEntityContext.XmlParser, newEntityContext.Read, out newEntityContext.error);

            switch (status)
            {
            case ParseStatus.Finished:
                expatParser.PopChildEntityParseContext();
                break;

            case ParseStatus.Suspended:
                // must suspend parent parser as well - don't check return value
                LibExpat.XMLStopParser(parser, XMLBool.TRUE);
                break;

            case ParseStatus.FatalError:
                result = (int)XMLStatus.ERROR;
                break;

            case ParseStatus.Aborted:
                // must abort parent parser as well - don't check return value
                LibExpat.XMLStopParser(parser, XMLBool.FALSE);
                break;
            }
            return(result);
        }
Ejemplo n.º 7
0
 /// <summary>Handler for unhandled events.</summary>
 /// <remarks>Will optionally skip internal entities.</remarks>
 public void SetDefaultHandler(XMLDefaultHandler value, bool skipInternal)
 {
     CheckNotDisposed();
     defaultHandler    = value;
     this.skipInternal = skipInternal;
     if (skipInternal)
     {
         LibExpat.XMLSetDefaultHandler(entityContext.XmlParser, value);
     }
     else
     {
         LibExpat.XMLSetDefaultHandlerExpand(entityContext.XmlParser, value);
     }
 }
Ejemplo n.º 8
0
        private XMLParser *ResetParser()
        {
            Reset();
            XMLParser *parser = entityContext.XmlParser;

            if (parser != null && LibExpat.XMLParserReset(parser, encoding) == XMLBool.FALSE)
            {
                throw new ExpatException(InternalStateError);
            }
            // all handlers have been cleared (except for unknownEncodingHandler)
            LibExpat.XMLSetUserData(parser, (IntPtr)parserHandle);
            ReInitializeHandlers(parser);
            LibExpat.XMLSetParamEntityParsing(parser, paramEntityParsing);
            return(parser);
        }
Ejemplo n.º 9
0
 /// <summary>Cleans up unmanaged resources.</summary>
 /// <remarks>Called at end of child entity, after <see cref="Finish"/> and
 /// before <see cref="Reset"/>. Gets called for root entity only when the
 /// <see cref="ExpatParser&lt;X, E, U>">ExpatParser</see> instance that owns
 /// it gets disposed.</remarks>
 protected internal virtual void Cleanup()
 {
     lock (this) {
         RuntimeHelpers.PrepareConstrainedRegions();
         try { }
         finally {
             XMLParser *parser = xmlParser;
             if (parser != null)
             {
                 LibExpat.XMLParserFree(parser);
                 xmlParser = null;
             }
         }
     }
     GC.SuppressFinalize(this);
 }
Ejemplo n.º 10
0
        Parse(XMLParser *parser, ReadBuffer read, int bufferSize, out XMLError error)
        {
            Debug.Assert(read != null && bufferSize > 0);
            bool     isFinal = false;
            GCHandle bufferHandle;

            while (!isFinal)
            {
                XMLStatus status;
                int       count = read(bufferSize, out bufferHandle);
                try {
                    isFinal = count == 0;
                    IntPtr bufPtr = bufferHandle.AddrOfPinnedObject();
                    status = LibExpat.XMLParse(parser, (byte *)bufPtr, count, isFinal ? 1 : 0);
                }
                finally {
                    if (!isFinal) // if count == 0 then GCHandle was not pinned
                    {
                        bufferHandle.Free();
                    }
                }

                switch (status)
                {
                case XMLStatus.OK:
                    continue;

                case XMLStatus.ERROR:
                    error = LibExpat.XMLGetErrorCode(parser);
#if EXPAT_1_95_8_UP
                    if (error == XMLError.ABORTED)
                    {
                        return(ParseStatus.Aborted);
                    }
#endif
                    return(ParseStatus.FatalError);

#if EXPAT_1_95_8_UP
                case XMLStatus.SUSPENDED:
                    error = XMLError.NONE;
                    return(ParseStatus.Suspended);
#endif
                }
            }
            error = XMLError.NONE;
            return(ParseStatus.Finished);
        }
Ejemplo n.º 11
0
        /* Resumable features */

#if EXPAT_1_95_8_UP
        public bool Suspend()
        {
            CheckNotDisposed();
            bool       result;
            XMLParser *parser = entityContext.XmlParser;

            result = LibExpat.XMLStopParser(parser, XMLBool.TRUE) == XMLStatus.OK;
            if (result)
            {
                entityContext.error = XMLError.NONE;
            }
            else
            {
                entityContext.error = LibExpat.XMLGetErrorCode(parser);
            }
            return(result);
        }
Ejemplo n.º 12
0
        public bool Abort()
        {
            CheckNotDisposed();
            bool       result;
            XMLParser *parser = entityContext.XmlParser;

            // no cleanup here, as we are in the middle of a call-back
            result = LibExpat.XMLStopParser(parser, XMLBool.FALSE) == XMLStatus.OK;
            if (result)
            {
                entityContext.error = XMLError.NONE;
            }
            else
            {
                entityContext.error = LibExpat.XMLGetErrorCode(parser);
            }
            return(result);
        }
Ejemplo n.º 13
0
        ResumeParsingBuffer(XMLParser *parser, ref ParseStatus parseStatus, out XMLError error)
        {
            bool      result = true;
            XMLStatus status = LibExpat.XMLResumeParser(parser);

            switch (status)
            {
            case XMLStatus.OK:
                error = XMLError.NONE;
                XMLParsingStatus pStatus;
                LibExpat.XMLGetParsingStatus(parser, out pStatus);
                if (pStatus.FinalBuffer == XMLBool.FALSE)
                {
                    result = false;
                }
                else
                {
                    parseStatus = ParseStatus.Finished;
                }
                break;

            case XMLStatus.ERROR:
                error = LibExpat.XMLGetErrorCode(parser);
                if (error == XMLError.ABORTED)
                {
                    parseStatus = ParseStatus.Aborted;
                }
                else
                {
                    parseStatus = ParseStatus.FatalError;
                }
                break;

            case XMLStatus.SUSPENDED:
                error       = XMLError.NONE;
                parseStatus = ParseStatus.Suspended;
                break;

            default:
                error = XMLError.NONE;
                break;
            }
            return(result);
        }
Ejemplo n.º 14
0
        internal void InitAsChild(XMLParser *parentParser, char *context, string encoding)
        {
            Debug.Assert(parentParser != null);
            XMLParser *parser;

            lock (this) {
                if (xmlParser != null)
                {
                    throw new ExpatException(ExpatParser <X, E, U> .InternalStateError);
                }
                RuntimeHelpers.PrepareConstrainedRegions();
                try { }
                finally {
                    parser    = LibExpat.XMLExternalEntityParserCreate(parentParser, context, encoding);
                    xmlParser = parser;
                    GC.ReRegisterForFinalize(this);
                }
            }
            if (parser == null)
            {
                throw new OutOfMemoryException();
            }
        }
Ejemplo n.º 15
0
        public void Reset(string encoding, bool namespaces, bool nsTriplets)
        {
            CheckNotParsing();
            this.encoding = encoding;
            XMLParser *parser;

            if (this.namespaces != namespaces)
            {
                Reset();
                this.namespaces = namespaces;
                entityContext.Cleanup();
                entityContext.InitAsParent(encoding, namespaces);
                parser = entityContext.XmlParser;
                ConfigureParentParser(parser);
                ReInitializeHandlers(parser);
                LibExpat.XMLSetParamEntityParsing(parser, paramEntityParsing);
            }
            else
            {
                parser = ResetParser();
            }
            LibExpat.XMLSetReturnNSTriplet(parser, nsTriplets ? 1 : 0);
            isDone = false;
        }
Ejemplo n.º 16
0
 public void FreeContentmodel(XMLContent *model)
 {
     LibExpat.XMLFreeContentModel(entityContext.XmlParser, model);
 }
Ejemplo n.º 17
0
 public byte *GetInputContext(ref int offset, ref int size)
 {
     return(LibExpat.XMLGetInputContext(entityContext.XmlParser, ref offset, ref size));
 }