コード例 #1
0
        private void Log(string fileName,
                          IDataObjectInputStream input,
                          SifMessageInfo info,
                          bool logToConsole)
        {
            try
            {
                // Ensure that the directory is there
                FileInfo file = new FileInfo(fileName);
                file.Directory.Create();
                int numObjects = 0;

                using (Stream outStream = File.OpenWrite(fileName))
                {
                    using (TextWriter twriter = new StreamWriter(outStream, Encoding.UTF8))
                    {
                        twriter.WriteLine("<SIF_ObjectData>");
                        twriter.Flush();
                        SifWriter writer = new SifWriter(twriter);
                        SifWriter consoleWriter = null;
                        if (logToConsole)
                        {
                            consoleWriter = new SifWriter(Console.Out);
                        }

                        SifDataObject o;
                        while ((o = input.ReadDataObject()) != null)
                        {
                            numObjects++;
                            Track(o);
                            writer.Write(o);
                            if (logToConsole)
                            {
                                consoleWriter.Write(o);
                                Console.WriteLine();
                            }
                        }
                        writer.Flush();
                        if (logToConsole)
                        {
                            consoleWriter.Flush();
                        }
                        twriter.WriteLine("</SIF_ObjectData>");
                    }

                    outStream.Close();

                    Console.WriteLine
                        ("Received {0} objects for {1}, Packet# {2}", numObjects,
                          input.ObjectType.Name, info.PacketNumber);
                }
            }
            catch (Exception ex)
            {
                Adk.Log.Error(ex.Message, ex);
            }
        }
コード例 #2
0
        public static SifMessageInfo Parse(TextReader reader, bool keepMessage, IZone zone)
        {
            StringWriter writer = null;

            try
            {
                if ( keepMessage )
                {
                    writer = new StringWriter();
                }

                //  Header info, payload type, and full message if desired
                SifMessageInfo inf = new SifMessageInfo();
                inf.fZone = zone;

                int ch;
                int elements = 0;
                int bytes = 0;
                bool inTag = false;
                bool inHeader = false;
                bool storValue = false;
                bool ack = false, response = false;

                //  Buffer for retaining message content
                char[] buf = keepMessage ? new char[1024] : null;

                //  Tag buffer size is 16*2, enough for largest SIF10r1 element name
                StringBuilder tag = new StringBuilder( 16*2 );
                //  Value buffer size is 16*3, enough for GUID
                StringBuilder value = new StringBuilder( 16*3 );

                //  SIF 1.0r1 Optimization: as soon as we parse the SIF_Header and
                //  optionally the SIF_OriginalMsgId and SIF_OriginalSourceId elements
                //  of a SIF_Ack we're done. So continue for as long as
                //  required_elements != 3.
                //
                int required_elements = 0;

                while ( reader.Peek() > -1 && required_elements != 3 )
                {
                    ch = reader.Read();

                    if ( keepMessage )
                    {
                        buf[bytes++] = (char) ch;
                        if ( bytes == buf.Length - 1 )
                        {
                            writer.Write( buf, 0, bytes );
                            bytes = 0;
                        }
                    }

                    if ( ch == '<' )
                    {
                        inTag = true;
                        storValue = false;
                    }
                    else if ( ch == ' ' && inTag )
                    {
                        inTag = false;
                        storValue = true; // attributes follow
                    }
                    else if ( ch == '>' )
                    {
                        if ( storValue )
                        {
                            Console.WriteLine( "Attributes: " + value.ToString() );
                        }

                        //  We now have text of next element
                        switch ( elements )
                        {
                            case 0:
                                //  Ensure first element is <SIF_Message>
                                if ( !tag.ToString().Equals( "SIF_Message" ) )
                                {
                                    throw new AdkMessagingException( "Message does not begin with SIF_Message", zone );
                                }
                                break;

                            case 1:
                                //
                                //  Payload element (e.g. "SIF_Ack", "SIF_Register", etc.)
                                //  Ask the DTD object for a type code for this message, store
                                //  it as the payload type in SIFMessageInfo. If zero, it means
                                //  the element is not recognized as a valid payload type for
                                //  this version of SIF.
                                //
                                inf.fPayload = Adk.Dtd.GetElementType( tag.ToString() );
                                if ( inf.fPayload == 0 )
                                {
                                    throw new AdkMessagingException(
                                        "<" + tag.ToString() + "> is not a valid payload message", zone );
                                }

                                //  Is this a SIF_Ack or SIF_Response?
                                ack = (inf.fPayload == SifMessageType.SIF_Ack);
                                response = ack ? false : (inf.fPayload == SifMessageType.SIF_Response);
                                if ( !ack && !response )
                                    required_elements += 2;
                                else if ( response )
                                    required_elements += 1;

                                break;

                            default:
                                String s = tag.ToString();
                                if ( inHeader )
                                {
                                    //  End of a header element, or </SIF_Header>...
                                    if ( s[0] == '/' )
                                    {
                                        if ( s.Equals( "/SIF_Header" ) )
                                        {
                                            inHeader = false;
                                            required_elements++;
                                        }
                                        else if ( !(s.StartsWith( "/SIF_Sec" )) )
                                        {
                                            inf.SetAttribute( s.Substring( 1 ), value.ToString() );
                                        }
                                    }
                                    else
                                        storValue = true;
                                }
                                else // if ( !inHeader )
                                {
                                    if ( s.Equals( "SIF_Header" ) )
                                    {
                                        //  Begin <SIF_Header>
                                        // TODO: This class maintains SIF_Header information in the fHeader
                                        // variable. This particular parsing mechanism doesn't re-create a SIF_Header
                                        // element. Therefore if the parse method is used, the only way to get these
                                        // properties back out is to use the getAttribute() call.
                                        inHeader = true;
                                    }
                                    else if ( ack )
                                    {
                                        //  SIF_Ack / SIF_OriginalSourceId or SIF_OriginalMsgId
                                        if ( s.StartsWith( "SIF_Orig" ) )
                                            storValue = true;
                                        else if ( s.StartsWith( "/SIF_Orig" ) )
                                        {
                                            required_elements++;
                                            inf.SetAttribute( s.Substring( 1 ), value.ToString() );
                                        }
                                    }
                                    else if ( response )
                                    {
                                        //  SIF_Response / SIF_RequestMsgId
                                        if ( s.StartsWith( "SIF_Req" ) )
                                            storValue = true;
                                        else if ( s.StartsWith( "/SIF_Req" ) )
                                        {
                                            required_elements++;
                                            inf.SetAttribute( s.Substring( 1 ), value.ToString() );
                                        }
                                    }
                                }

                                value.Length = 0;
                                break;
                        }

                        inTag = false;
                        tag.Length = 0;
                        elements++;
                    }
                    else
                    {
                        if ( inTag )
                            tag.Append( (char) ch );
                        else if ( storValue )
                            value.Append( (char) ch );
                    }
                }

                if ( writer != null )
                {
                    //  Read the remainder of the input stream and copy it to the
                    //  output buffer
                    if ( bytes > 0 )
                        writer.Write( buf, 0, bytes );
                    while ( reader.Peek() > -1 )
                    {
                        bytes = reader.Read( buf, 0, buf.Length - 1 );
                        writer.Write( buf, 0, bytes );
                    }

                    //  Store message content
                    writer.Flush();
                    inf.fMessage = writer.GetStringBuilder().ToString();
                }

                return inf;
            }
            finally
            {
                if ( writer != null )
                {
                    writer.Flush();
                    writer.Close();
                }
            }
        }
コード例 #3
0
        public static SifMessageInfo Parse(TextReader reader, bool keepMessage, IZone zone)
        {
            StringWriter writer = null;

            try
            {
                if (keepMessage)
                {
                    writer = new StringWriter();
                }

                //  Header info, payload type, and full message if desired
                SifMessageInfo inf = new SifMessageInfo();
                inf.fZone = zone;

                int  ch;
                int  elements = 0;
                int  bytes = 0;
                bool inTag = false;
                bool inHeader = false;
                bool storValue = false;
                bool ack = false, response = false;

                //  Buffer for retaining message content
                char[] buf = keepMessage ? new char[1024] : null;

                //  Tag buffer size is 16*2, enough for largest SIF10r1 element name
                StringBuilder tag = new StringBuilder(16 * 2);
                //  Value buffer size is 16*3, enough for GUID
                StringBuilder value = new StringBuilder(16 * 3);

                //  SIF 1.0r1 Optimization: as soon as we parse the SIF_Header and
                //  optionally the SIF_OriginalMsgId and SIF_OriginalSourceId elements
                //  of a SIF_Ack we're done. So continue for as long as
                //  required_elements != 3.
                //
                int required_elements = 0;

                while (reader.Peek() > -1 && required_elements != 3)
                {
                    ch = reader.Read();

                    if (keepMessage)
                    {
                        buf[bytes++] = (char)ch;
                        if (bytes == buf.Length - 1)
                        {
                            writer.Write(buf, 0, bytes);
                            bytes = 0;
                        }
                    }

                    if (ch == '<')
                    {
                        inTag     = true;
                        storValue = false;
                    }
                    else if (ch == ' ' && inTag)
                    {
                        inTag     = false;
                        storValue = true; // attributes follow
                    }
                    else if (ch == '>')
                    {
                        if (storValue)
                        {
                            Console.WriteLine("Attributes: " + value.ToString());
                        }

                        //  We now have text of next element
                        switch (elements)
                        {
                        case 0:
                            //  Ensure first element is <SIF_Message>
                            if (!tag.ToString().Equals("SIF_Message"))
                            {
                                throw new AdkMessagingException("Message does not begin with SIF_Message", zone);
                            }
                            break;

                        case 1:
                            //
                            //  Payload element (e.g. "SIF_Ack", "SIF_Register", etc.)
                            //  Ask the DTD object for a type code for this message, store
                            //  it as the payload type in SIFMessageInfo. If zero, it means
                            //  the element is not recognized as a valid payload type for
                            //  this version of SIF.
                            //
                            inf.fPayload = Adk.Dtd.GetElementType(tag.ToString());
                            if (inf.fPayload == 0)
                            {
                                throw new AdkMessagingException(
                                          "<" + tag.ToString() + "> is not a valid payload message", zone);
                            }

                            //  Is this a SIF_Ack or SIF_Response?
                            ack      = (inf.fPayload == SifMessageType.SIF_Ack);
                            response = ack ? false : (inf.fPayload == SifMessageType.SIF_Response);
                            if (!ack && !response)
                            {
                                required_elements += 2;
                            }
                            else if (response)
                            {
                                required_elements += 1;
                            }

                            break;

                        default:
                            String s = tag.ToString();
                            if (inHeader)
                            {
                                //  End of a header element, or </SIF_Header>...
                                if (s[0] == '/')
                                {
                                    if (s.Equals("/SIF_Header"))
                                    {
                                        inHeader = false;
                                        required_elements++;
                                    }
                                    else if (!(s.StartsWith("/SIF_Sec")))
                                    {
                                        inf.SetAttribute(s.Substring(1), value.ToString());
                                    }
                                }
                                else
                                {
                                    storValue = true;
                                }
                            }
                            else     // if ( !inHeader )
                            {
                                if (s.Equals("SIF_Header"))
                                {
                                    //  Begin <SIF_Header>
                                    // TODO: This class maintains SIF_Header information in the fHeader
                                    // variable. This particular parsing mechanism doesn't re-create a SIF_Header
                                    // element. Therefore if the parse method is used, the only way to get these
                                    // properties back out is to use the getAttribute() call.
                                    inHeader = true;
                                }
                                else if (ack)
                                {
                                    //  SIF_Ack / SIF_OriginalSourceId or SIF_OriginalMsgId
                                    if (s.StartsWith("SIF_Orig"))
                                    {
                                        storValue = true;
                                    }
                                    else if (s.StartsWith("/SIF_Orig"))
                                    {
                                        required_elements++;
                                        inf.SetAttribute(s.Substring(1), value.ToString());
                                    }
                                }
                                else if (response)
                                {
                                    //  SIF_Response / SIF_RequestMsgId
                                    if (s.StartsWith("SIF_Req"))
                                    {
                                        storValue = true;
                                    }
                                    else if (s.StartsWith("/SIF_Req"))
                                    {
                                        required_elements++;
                                        inf.SetAttribute(s.Substring(1), value.ToString());
                                    }
                                }
                            }

                            value.Length = 0;
                            break;
                        }

                        inTag      = false;
                        tag.Length = 0;
                        elements++;
                    }
                    else
                    {
                        if (inTag)
                        {
                            tag.Append((char)ch);
                        }
                        else if (storValue)
                        {
                            value.Append((char)ch);
                        }
                    }
                }

                if (writer != null)
                {
                    //  Read the remainder of the input stream and copy it to the
                    //  output buffer
                    if (bytes > 0)
                    {
                        writer.Write(buf, 0, bytes);
                    }
                    while (reader.Peek() > -1)
                    {
                        bytes = reader.Read(buf, 0, buf.Length - 1);
                        writer.Write(buf, 0, bytes);
                    }

                    //  Store message content
                    writer.Flush();
                    inf.fMessage = writer.GetStringBuilder().ToString();
                }

                return(inf);
            }
            finally
            {
                if (writer != null)
                {
                    writer.Flush();
                    writer.Close();
                }
            }
        }