// TODO: Implement /* * * private SIF_Request createSIF_Request( ElementDef objectType, String refId, Zone zone ) * { * SIF_Request request = new SIF_Request(); * request.getHeader().setSIF_MsgId( MSG_GUID ); * request.getHeader().setSIF_SourceId( "foo" ); * request.setSIF_MaxBufferSize("32768"); * request.setSIF_Version( ADK.getSIFVersion().toString() ); * Query query = new Query(objectType); * query.addCondition(SifDtd.SIF_REPORTOBJECT_REFID, Condition.EQ, refId); * * SIF_Query q = SIFPrimitives.createSIF_Query(query, zone); * SIF_QueryObject sqo = new SIF_QueryObject(); * sqo.setObjectName( objectType.name() ); * * q.setSIF_QueryObject(sqo); * request.setSIF_Query(q); * * return request; * } * */ private SIF_Response createSIF_Response(IElementDef objType, bool storeInRequestCache, ISerializable stateObject) { SIF_Request req = createSIF_Request(objType); if (storeInRequestCache) { Query q = new Query(objType); q.UserData = stateObject; RequestCache.GetInstance(fAgent).StoreRequestInfo(req, q, fZone); } SIF_Response resp = new SIF_Response(); resp.SIF_RequestMsgId = req.Header.SIF_MsgId; SIF_ObjectData sod = new SIF_ObjectData(); resp.SIF_ObjectData = sod; Object responseObject = null; try { responseObject = ClassFactory.CreateInstance(objType.FQClassName, false); } catch (Exception cfe) { throw new AdkException("Unable to create instance of " + objType.Name, fZone, cfe); } sod.AddChild((SifElement)responseObject); return(resp); }
private void assertRequestCacheCleared(SIF_Response r) { // Now the RequestCache should no longer contain the specified object IRequestInfo inf = RequestCache.GetInstance(fAgent).LookupRequestInfo(r.SIF_RequestMsgId, fZone); Assert.IsNull(inf, "RequestInfo should be removed from the cache"); }
public void testSifResponseSenderMultiplePackets() { MessageDispatcher testDispatcher = new MessageDispatcher(Zone); Zone.Properties.OneObjectPerResponse = true; Zone.SetDispatcher(testDispatcher); Zone.Connect(ProvisioningFlags.None); InMemoryProtocolHandler testProto = (InMemoryProtocolHandler)Zone.ProtocolHandler; testProto.clear(); // Send a single SIF_Response with a small Authentication object String SifRequestMsgId = Adk.MakeGuid(); String sourceId = "TEST_SOURCEID"; SifVersion testVersion = SifVersion.LATEST; int maxBufferSize = int.MaxValue; IElementDef[] testRestrictions = new IElementDef[] { InfrastructureDTD.AUTHENTICATION_REFID }; SifResponseSender srs = new SifResponseSender(); srs.Open(Zone, SifRequestMsgId, sourceId, testVersion, maxBufferSize, testRestrictions); srs.Write(new Authentication(Adk.MakeGuid(), Adk.MakeGuid(), AuthSifRefIdType.EMPLOYEEPERSONAL)); srs.Write(new Authentication(Adk.MakeGuid(), Adk.MakeGuid(), AuthSifRefIdType.EMPLOYEEPERSONAL)); srs.Write(new Authentication(Adk.MakeGuid(), Adk.MakeGuid(), AuthSifRefIdType.EMPLOYEEPERSONAL)); srs.Write(new Authentication(Adk.MakeGuid(), Adk.MakeGuid(), AuthSifRefIdType.EMPLOYEEPERSONAL)); srs.Write(new Authentication(Adk.MakeGuid(), Adk.MakeGuid(), AuthSifRefIdType.EMPLOYEEPERSONAL)); srs.Close(); for (int x = 0; x < 5; x++) { // Retrieve the SIF_Response message off the protocol handler and asssert the results SIF_Response response = (SIF_Response)testProto.readMsg(); Assert.AreEqual(SifRequestMsgId, response.SIF_RequestMsgId); Assert.AreEqual(x + 1, response.SIF_PacketNumber.Value); if (x == 4) { Assert.AreEqual("No", response.SIF_MorePackets); } else { Assert.AreEqual("Yes", response.SIF_MorePackets); } SIF_Header header = response.SIF_Header; Assert.AreEqual(sourceId, header.SIF_DestinationId); SifElement responseObject = response.SIF_ObjectData.GetChildList()[0]; Assert.IsNotNull(responseObject); } }
public void testSetPacketNumberAndMorePackets() { MessageDispatcher testDispatcher = new MessageDispatcher(this.Zone); this.Zone.SetDispatcher(testDispatcher); this.Zone.Connect(ProvisioningFlags.None); InMemoryProtocolHandler testProto = (InMemoryProtocolHandler)this.Zone.ProtocolHandler; testProto.clear(); // Send a single SIF_Response with a small Authentication object String SifRequestMsgId = Adk.MakeGuid(); String sourceId = "TEST_SOURCEID"; SifVersion testVersion = SifVersion.LATEST; int maxBufferSize = int.MaxValue; int packetNumber = 999; YesNo morePacketsValue = YesNo.YES; IElementDef[] testRestrictions = new IElementDef[] { InfrastructureDTD.AUTHENTICATION_REFID }; SifResponseSender srs = new SifResponseSender(); srs.Open(this.Zone, SifRequestMsgId, sourceId, testVersion, maxBufferSize, testRestrictions); srs.SIF_PacketNumber = packetNumber; srs.SIF_MorePackets = morePacketsValue; // Assert the values of the properties set before writing Assert.AreEqual(packetNumber, srs.SIF_PacketNumber); Assert.AreEqual(morePacketsValue, srs.SIF_MorePackets); srs.Write(new Authentication(Adk.MakeGuid(), Adk.MakeGuid(), AuthSifRefIdType.EMPLOYEEPERSONAL)); srs.Close(); // Assert the values of the properties set after writing Assert.AreEqual(packetNumber, srs.SIF_PacketNumber); Assert.AreEqual(morePacketsValue, srs.SIF_MorePackets); // Retrieve the SIF_Response message off the protocol handler and asssert the results SIF_Response response = (SIF_Response)testProto.readMsg(); Assert.AreEqual(SifRequestMsgId, response.SIF_RequestMsgId); Assert.AreEqual(packetNumber, response.SIF_PacketNumber.Value); Assert.AreEqual(morePacketsValue.ToString(), response.SIF_MorePackets); SIF_Header header = response.SIF_Header; Assert.AreEqual(sourceId, header.SIF_DestinationId); SifElement responseObject = response.SIF_ObjectData.GetChildList()[0]; Assert.IsNotNull(responseObject); }
public void testQueryResultsNoCache() { IElementDef objType = StudentDTD.STUDENTCONTACT; ErrorMessageHandler handler = new ErrorMessageHandler(ErrorMessageHandler.HandlerBehavior.Normal); fZone.SetQueryResults(handler, objType, null); fZone.Connect(ProvisioningFlags.Register); SIF_Response r = createSIF_Response(objType, false, null); assertNormalHandling(handler, r, fZone); assertRequestCacheCleared(r); }
/// <summary> Called by the Adk to construct a SifMessageInfo</summary> /// <param name="msg">The SIF_Message /// </param> /// <param name="zone">The associated zone /// </param> public SifMessageInfo(SifMessagePayload msg, IZone zone) { fZone = zone; fPayload = Adk.Dtd.GetElementType(msg.ElementDef.Name); if (zone.Properties.KeepMessageContent) { try { StringWriter sw = new StringWriter(); SifWriter writer = new SifWriter(sw); writer.Write(msg); writer.Flush(); writer.Close(); sw.Close(); fMessage = sw.ToString(); } catch { // Do nothing } } // Set SIF_Header values fHeader = msg.Header; IList <SifContext> contexts = msg.SifContexts; fContexts = new SifContext[contexts.Count]; contexts.CopyTo(fContexts, 0); // Set information about the message payload fPayloadVersion = msg.SifVersion; switch (fPayload) { case SifMessageType.SIF_Request: { SIF_Request req = (SIF_Request)msg; fObjects["SIF_MaxBufferSize"] = req.SIF_MaxBufferSize; fObjects["SIF_RequestVersions"] = req.parseRequestVersions(fZone.Log); } break; case SifMessageType.SIF_Response: { SIF_Response rsp = (SIF_Response)msg; this.SIFRequestMsgId = rsp.SIF_RequestMsgId; fObjects["SIF_PacketNumber"] = rsp.SIF_PacketNumber; SetAttribute("SIF_MorePackets", rsp.SIF_MorePackets); } break; } }
public void ParseLibraryPatronStatus() { // This test attempts to parse LibraryPatronStatus, which had a problem with parsing // Child elements that were SIFTime // Parse the object from the file Console.WriteLine("Parsing from file..."); SifParser p = SifParser.NewInstance(); SIF_Response msg = null; using (Stream inStream = GetResourceStream("LibraryPatronStatus.xml")) { msg = (SIF_Response)p.Parse(inStream, null); inStream.Close(); } Assert.IsNotNull(msg); AdkObjectParseHelper.runParsingTest((SifDataObject)msg.SIF_ObjectData.GetChildList()[0], SifVersion.SIF15r1); }
public void testSIFRetryQueryResultsNoCache() { IElementDef objType = StudentDTD.STUDENTCONTACT; ErrorMessageHandler handler = new ErrorMessageHandler(ErrorMessageHandler.HandlerBehavior.ThrowSIFRetryException); fZone.SetQueryResults(handler, objType, null); fZone.Connect(ProvisioningFlags.Register); SIF_Response r = createSIF_Response(objType, false, null); AssertRetryHandling(handler, r, fZone); // Now, dispatch a second time. This time the dispatching should work correctly, including // custom state handler.Behavior = ErrorMessageHandler.HandlerBehavior.Normal; assertNormalHandling(handler, r, fZone); assertRequestCacheCleared(r); }
public static SifMessagePayload MakeSIFMessagePayload(SifElement payload) { if (payload is SIF_Response) { return((SIF_Response)payload); } SIF_Response rsp = new SIF_Response(); rsp.SetSIF_MorePackets(YesNo.NO); rsp.SIF_RequestMsgId = Adk.MakeGuid(); rsp.SIF_PacketNumber = 1; SIF_Header hdr = rsp.Header; hdr.SIF_Timestamp = DateTime.Now; hdr.SIF_MsgId = Adk.MakeGuid(); hdr.SIF_SourceId = "ADK Unit Tests"; hdr.SetSIF_Security(new SIF_SecureChannel(AuthenticationLevel.ZERO, EncryptionLevel.ZERO)); hdr.SIF_DestinationId = "Schema Validator"; if (payload is SifDataObject) { SIF_ObjectData data = new SIF_ObjectData(); data.AddChild(payload); rsp.SIF_ObjectData = data; } else if (payload is SIF_ObjectData) { rsp.SIF_ObjectData = (SIF_ObjectData)payload; } else { throw new ArgumentException("Unable to use payload: " + payload.ElementDef.Name); } return(rsp); }
/// <summary> Calculate the size of a SIF_Response minus the SIF_ObjectData content.</summary> protected virtual long CalcEnvelopeSize(ZoneImpl zone) { long size = 400; try { SIF_Response rsp = new SIF_Response(); rsp.SIF_MorePackets = "Yes"; rsp.SIF_RequestMsgId = fReqId; rsp.SIF_PacketNumber = 100000000; SIF_ObjectData data = new SIF_ObjectData(); data.TextValue = " "; rsp.SIF_ObjectData = data; SIF_Header hdr = rsp.Header; hdr.SIF_Timestamp = DateTime.Now; hdr.SIF_MsgId = "012345678901234567890123456789012"; hdr.SIF_SourceId = zone.Agent.Id; hdr.SIF_Security = zone.Dispatcher.secureChannel(); hdr.SIF_DestinationId = fDestId; using (MemoryStream buffer = new MemoryStream()) { SifWriter writer = new SifWriter(buffer); writer.Write(rsp); writer.Flush(); size = buffer.Length + 10; writer.Close(); buffer.Close(); } } catch (Exception ex) { zone.Log.Warn("Error calculating packet size: " + ex, ex); } return(size); }
public void testSifResponseSender010() { string queryStr = @"<SIF_Query> <SIF_QueryObject ObjectName='SectionInfo'> <SIF_Element>@RefId</SIF_Element> <SIF_Element>@SchoolCourseInfoRefId</SIF_Element> <SIF_Element>@SchoolYear</SIF_Element> <SIF_Element>LocalId</SIF_Element> <SIF_Element>ScheduleInfoList/ScheduleInfo/@TermInfoRefId</SIF_Element> <SIF_Element>Description</SIF_Element> <SIF_Element>LanguageOfInstruction</SIF_Element> <SIF_Element>LanguageOfInstruction/Code</SIF_Element> </SIF_QueryObject> </SIF_Query>"; string sectionInfoStr = @"<SectionInfo RefId='D9C9889878144863B190C7D3428D7953' SchoolCourseInfoRefId='587F89D23EDD4761A59C04BA0D39E8D9' SchoolYear='2008'> <LocalId>1</LocalId> <Description>section 19</Description> <ScheduleInfoList> <ScheduleInfo TermInfoRefId='0D8165B1ADB34780BD1DFF9E38A7B935'> <TeacherList> <StaffPersonalRefId>F9D3916707634682B84C530BCF96B5CA</StaffPersonalRefId> </TeacherList> <SectionRoomList> <RoomInfoRefId>EED167D761CD493EA94A875F56ABB0CB</RoomInfoRefId> </SectionRoomList> <MeetingTimeList> <MeetingTime> <TimetableDay>R</TimetableDay> <TimetablePeriod>6</TimetablePeriod> </MeetingTime> <MeetingTime> <TimetableDay>F</TimetableDay> <TimetablePeriod>6</TimetablePeriod> </MeetingTime> <MeetingTime> <TimetableDay>W</TimetableDay> <TimetablePeriod>6</TimetablePeriod> </MeetingTime> <MeetingTime> <TimetableDay>M</TimetableDay> <TimetablePeriod>6</TimetablePeriod> </MeetingTime> <MeetingTime> <TimetableDay>T</TimetableDay> <TimetablePeriod>6</TimetablePeriod> </MeetingTime> </MeetingTimeList> </ScheduleInfo> </ScheduleInfoList> <MediumOfInstruction><Code>0605</Code></MediumOfInstruction> <LanguageOfInstruction><Code>eng</Code></LanguageOfInstruction> <SummerSchool>No</SummerSchool> </SectionInfo>"; SifParser parser = SifParser.NewInstance(); SIF_Query sifquery = (SIF_Query)parser.Parse(queryStr); SectionInfo section = (SectionInfo)parser.Parse(sectionInfoStr); Query query = new Query(sifquery); String SifRequestMsgId = Adk.MakeGuid(); String sourceId = "TEST_SOURCEID"; SifVersion testVersion = SifVersion.LATEST; int maxBufferSize = int.MaxValue; MessageDispatcher testDispatcher = new MessageDispatcher(Zone); Zone.SetDispatcher(testDispatcher); Zone.Connect(ProvisioningFlags.None); InMemoryProtocolHandler testProto = (InMemoryProtocolHandler)Zone.ProtocolHandler; testProto.clear(); SifResponseSender srs = new SifResponseSender(); srs.Open(Zone, SifRequestMsgId, sourceId, testVersion, maxBufferSize, query); srs.Write(section); srs.Close(); // Retrieve the SIF_Response message off the protocol handler and asssert the results SIF_Response response = (SIF_Response)testProto.readMsg(); Assert.AreEqual(SifRequestMsgId, response.SIF_RequestMsgId); Assert.AreEqual(1, response.SIF_PacketNumber.Value); Assert.AreEqual("No", response.SIF_MorePackets); SIF_Header header = response.SIF_Header; Assert.AreEqual(sourceId, header.SIF_DestinationId); SifDataObject responseObject = (SifDataObject)response.SIF_ObjectData.GetChildList()[0]; Assert.IsNotNull(responseObject); Console.Out.WriteLine(responseObject.ToXml()); SifXPathContext context = SifXPathContext.NewSIFContext(responseObject); foreach (ElementRef reference in query.FieldRestrictionRefs) { Element found = context.GetElementOrAttribute(reference.XPath); Assert.IsNotNull(found, reference.XPath); } Element sectionInfoList = responseObject.GetElementOrAttribute("ScheduleInfoList/ScheduleInfo/SectionInfoList"); Assert.IsNull(sectionInfoList); }
public void testSifResponseSenderError() { MessageDispatcher testDispatcher = new MessageDispatcher(Zone); Zone.SetDispatcher(testDispatcher); Zone.Connect(ProvisioningFlags.None); InMemoryProtocolHandler testProto = (InMemoryProtocolHandler)Zone.ProtocolHandler; testProto.clear(); // Send a single SIF_Response with a small Authentication object String SifRequestMsgId = Adk.MakeGuid(); String sourceId = "TEST_SOURCEID"; SifVersion testVersion = SifVersion.LATEST; int maxBufferSize = int.MaxValue; SIF_Error error = new SIF_Error(SifErrorCategoryCode.Generic, SifErrorCodes.GENERIC_GENERIC_ERROR_1, "ERROR", "EXT_ERROR"); IElementDef[] testRestrictions = new IElementDef[] { InfrastructureDTD.AUTHENTICATION_REFID }; SifResponseSender srs = new SifResponseSender(); srs.Open(Zone, SifRequestMsgId, sourceId, testVersion, maxBufferSize, testRestrictions); srs.Write(new Authentication(Adk.MakeGuid(), Adk.MakeGuid(), AuthSifRefIdType.EMPLOYEEPERSONAL)); srs.Write(error); srs.Close(); // Retrieve the SIF_Response message off the protocol handler and asssert the results SIF_Response response = (SIF_Response)testProto.readMsg(); Assert.AreEqual(SifRequestMsgId, response.SIF_RequestMsgId); Assert.AreEqual(1, response.SIF_PacketNumber.Value); Assert.AreEqual("Yes", response.SIF_MorePackets); SIF_Header header = response.SIF_Header; Assert.AreEqual(sourceId, header.SIF_DestinationId); SifElement responseObject = response.SIF_ObjectData.GetChildList()[0]; Assert.IsNotNull(responseObject); // now test the error packet response = (SIF_Response)testProto.readMsg(); Assert.AreEqual(SifRequestMsgId, response.SIF_RequestMsgId); Assert.AreEqual(2, response.SIF_PacketNumber.Value); Assert.AreEqual("No", response.SIF_MorePackets); header = response.SIF_Header; Assert.AreEqual(sourceId, header.SIF_DestinationId); Assert.IsNull(response.SIF_ObjectData); SIF_Error respError = response.SIF_Error; Assert.IsNotNull(respError); Assert.AreEqual(12, respError.SIF_Category.Value); Assert.AreEqual(1, respError.SIF_Code.Value); Assert.AreEqual("ERROR", respError.SIF_Desc); Assert.AreEqual("EXT_ERROR", respError.SIF_ExtendedDesc); }
public void TestxsiNill_SIFMessagePayload() { LearnerPersonal lp = new LearnerPersonal(); // Add a null UPN SifString str = new SifString(null); lp.SetField(LearnerDTD.LEARNERPERSONAL_UPN, str); // Add a null AlertMsg AlertMsg msg = new AlertMsg(AlertMsgType.DISCIPLINE, null); lp.AlertMsgList = new AlertMsgList(msg); msg.SetField(CommonDTD.ALERTMSG, new SifString(null)); SIF_Response sifMessage = new SIF_Response(); sifMessage.AddChild(lp); // Write the object to a file Console.WriteLine("Writing to file..."); using (Stream fos = File.Open("SifWriterTest.Temp.xml", FileMode.Create, FileAccess.Write)) { SifWriter writer = new SifWriter(fos); sifMessage.SetChanged(true); writer.Write(sifMessage); writer.Flush(); fos.Close(); } // Parse the object from the file Console.WriteLine("Parsing from file..."); SifParser p = SifParser.NewInstance(); using (Stream fis = File.OpenRead("SifWriterTest.Temp.xml")) { sifMessage = (SIF_Response)p.Parse(fis, null); } lp = (LearnerPersonal)sifMessage.GetChildList()[0]; SimpleField upn = lp.GetField(LearnerDTD.LEARNERPERSONAL_UPN); Assert.IsNotNull(upn); SifString rawValue = (SifString)upn.SifValue; Assert.IsNotNull(rawValue); Assert.IsNull(rawValue.Value); Assert.IsNull(upn.Value); AlertMsgList alertMsgs = lp.AlertMsgList; Assert.IsNotNull(alertMsgs); Assert.IsTrue(alertMsgs.Count == 1); msg = (AlertMsg)alertMsgs.GetChildList()[0]; Assert.IsNull(msg.Value); SifSimpleType msgValue = msg.SifValue; Assert.IsNotNull(msgValue); Assert.IsNull(msgValue.RawValue); }
private void RunLengthTest(Stream[] payloads, bool error, bool replace, SifVersion version) { // This test loosely emulates what ResponseDelivery does when it builds up the MessageStreamer class // Prepare SIF_Response SIF_Response rsp = new SIF_Response(); rsp.SIF_MorePackets = "No"; rsp.SIF_RequestMsgId = "12345123451234512345"; rsp.SIF_PacketNumber = 1; rsp.SifVersion = version; // Write an empty "<SIF_ObjectData> </SIFObjectData>" for the // MessageStreamer to fill in. If this is an errorPacket, the empty // element is required per SIF Specifications. SIF_ObjectData placeholder = new SIF_ObjectData(); placeholder.TextValue = " "; rsp.SIF_ObjectData = placeholder; if (error) { SIF_Error err = new SIF_Error(); err.TextValue = " "; rsp.SIF_Error = err; } // Assign values to message header - this is usually done by // MessageDispatcher.send() but because we're preparing a SIF_Response // output stream we need to do it manually SIF_Header hdr = rsp.Header; hdr.SIF_Timestamp = DateTime.Now; hdr.SIF_MsgId = SifFormatter.GuidToSifRefID(Guid.NewGuid()); hdr.SIF_SourceId = "UnitTest"; hdr.SIF_DestinationId = "123451234512345"; // Write SIF_Response -- without its SIF_ObjectData payload -- to a buffer using (MemoryStream envelope = new MemoryStream()) { SifWriter writer = new SifWriter(envelope); writer.Write(rsp); writer.Flush(); envelope.Seek(0, SeekOrigin.Begin); StreamReader reader = new StreamReader(envelope, Encoding.UTF8); String envelopeStr = reader.ReadToEnd(); Console.Out.WriteLine(envelopeStr); envelope.Seek(0, SeekOrigin.Begin); using ( MessageStreamer ms = new MessageStreamer(envelope, payloads, error ? "<SIF_Error>" : "<SIF_ObjectData>", replace)) { AssertMessageStreamer(ms, version); } envelope.Close(); } }
/// <summary> /// Sends a specific packet to the zone /// </summary> /// <param name="file"></param> /// <param name="morePackets"></param> protected internal virtual void SendPacket(FileInfo file, bool morePackets) { long extraBytes = 0; ResponsePacketInfo responsePacket = DeserializeResponseFileName(file.Name); /* If we're processing SIF_ReportObject responses, read the ReportInfo * data from the "requestMsgId.rpt" file * * TT 894 - If a SIFException is thrown after the ReportInfo is set on * the ReportObjectStream, then we don't want to include that ReportInfo * in the packet with the error. In that case, rptInfoReader will be * null and will not be included in the list of payloads below. */ FileStream rptInfoStream = null; if (fSrc == ResponseDeliveryType.SIFReportObject && !responsePacket.errorPacket) { try { FileInfo f = new FileInfo (fWorkDir + Path.DirectorySeparatorChar.ToString() + responsePacket.destinationId + "." + responsePacket.requestMsgId + ".rpt"); rptInfoStream = f.OpenRead(); extraBytes = f.Length; } catch (FileNotFoundException fnfe) { fZone.Log.Debug ("Error sending SIF_ReportObject packet #" + responsePacket.packetNumber + (morePackets ? "" : " (last packet)") + ", file not found: " + fnfe.Message); } } if ((Adk.Debug & AdkDebugFlags.Messaging) != 0) { fZone.Log.Debug ("Sending " + (responsePacket.errorPacket ? "SIF_Error response" : "SIF_Response") + " packet #" + responsePacket.packetNumber + (morePackets ? "" : " (last packet)")); } // Prepare SIF_Response SIF_Response rsp = new SIF_Response(); rsp.SetSIF_MorePackets(morePackets ? YesNo.YES : YesNo.NO); rsp.SIF_RequestMsgId = responsePacket.requestMsgId; rsp.SIF_PacketNumber = responsePacket.packetNumber; // The SIF_Response is rendered in the same version of SIF as the original SIF_Request rsp.SifVersion = responsePacket.version; if (responsePacket.errorPacket) { // Write an empty "<SIF_Error> </SIF_Error>" for the MessageStreamer // to replace SIF_Error err = new SIF_Error(); err.TextValue = " "; rsp.SIF_Error = err; } if (!responsePacket.errorPacket || responsePacket.version.Major == 1) { // Write an empty "<SIF_ObjectData> </SIFObjectData>" for the // MessageStreamer to fill in. If this is an errorPacket, the empty // element is required per the SIF 1.x Specifications, but disallowed // in SIF 2.x. SIF_ObjectData placeholder = new SIF_ObjectData(); placeholder.TextValue = " "; rsp.SIF_ObjectData = placeholder; } // Assign values to message header - this is usually done by // MessageDispatcher.send() but because we're preparing a SIF_Response // output stream we need to do it manually SIF_Header hdr = rsp.Header; hdr.SIF_Timestamp = DateTime.Now; hdr.SIF_MsgId = SifFormatter.GuidToSifRefID(Guid.NewGuid()); hdr.SIF_SourceId = fZone.Agent.Id; hdr.SIF_Security = fZone.Dispatcher.secureChannel(); hdr.SIF_DestinationId = responsePacket.destinationId; // Write SIF_Response -- without its SIF_ObjectData payload -- to a buffer using (MemoryStream envelope = new MemoryStream()) { SifWriter writer = new SifWriter(envelope); writer.Write(rsp); writer.Flush(); envelope.Seek(0, SeekOrigin.Begin); FileStream fs = file.OpenRead(); try { // Send the SIF_Response as a stream Stream [] payloads; if (fSrc == ResponseDeliveryType.Generic) { payloads = new Stream [] { fs }; } else { if (rptInfoStream != null) { payloads = new Stream [] { rptInfoStream, fs }; } else { payloads = new Stream [] { fs }; } } using (MessageStreamer ms = new MessageStreamer ( envelope, payloads, responsePacket.errorPacket ? "<SIF_Error>" : "<SIF_ObjectData>", responsePacket.errorPacket)) { if ((Adk.Debug & AdkDebugFlags.Messaging) != 0) { fZone.Log.Debug("Send SIF_Response"); } if ((Adk.Debug & AdkDebugFlags.Messaging_Detailed) != 0) { fZone.Log.Debug(" MsgId: " + rsp.MsgId); } SIF_Ack ack; using (IMessageInputStream ackStream = fZone.ProtocolHandler.Send(ms)) { ack = (SIF_Ack) fParser.Parse (ackStream.GetInputStream(), fZone, SifParserFlags.None); } if (ack != null) { ack.LogRecv(fZone.Log); } } // If we get here, the message was sent successfully envelope.Close(); for (int i = 0; i < payloads.Length; i++) { payloads[i].Close(); } fs.Close(); if (DELETE_ON_SUCCESS && file.Exists) { file.Delete(); } } catch (AdkException adke) { AdkUtils._throw(adke, fZone.Log); } catch (Exception e) { AdkUtils._throw (new AdkException("Failed to send SIF_Response: " + e, fZone), fZone.Log); } finally { if (fs != null) { fs.Close(); } if (rptInfoStream != null) { rptInfoStream.Close(); } } } }