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); } }
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(); } } }
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(); } } }