From 89401f4a5e79231eead6af4c16881da8eafddff4 Mon Sep 17 00:00:00 2001 From: Jim Radford Date: Fri, 8 May 2009 03:13:51 +0000 Subject: [PATCH] LIBOMV-503 Corrects deserialization and TimeStamp field date decoding of LandStatReplyMessage LIBOMV-512 Changes way sessions are saved to disk, better error checking and hopefully crashes won't cause corrupt settings.osd file now git-svn-id: http://libopenmetaverse.googlecode.com/svn/libopenmetaverse/trunk@2707 52acb1d6-8a22-11de-b505-999d5b087335 --- OpenMetaverse/Messages/LindenMessages.cs | 21 ++++++----- Programs/WinGridProxy/Form1.cs | 45 ++++++++++-------------- 2 files changed, 32 insertions(+), 34 deletions(-) diff --git a/OpenMetaverse/Messages/LindenMessages.cs b/OpenMetaverse/Messages/LindenMessages.cs index 1df212c7..ebcb76bd 100644 --- a/OpenMetaverse/Messages/LindenMessages.cs +++ b/OpenMetaverse/Messages/LindenMessages.cs @@ -361,7 +361,10 @@ namespace OpenMetaverse.Messages.Linden requestDataMap["ReportType"] = OSD.FromInteger(this.ReporType); requestDataMap["RequestFlags"] = OSD.FromInteger(this.RequestFlags); requestDataMap["TotalObjectCount"] = OSD.FromInteger(this.TotalObjectCount); - map["RequestData"] = requestDataMap; + + OSDArray requestDatArray = new OSDArray(); + requestDatArray.Add(requestDataMap); + map["RequestData"] = requestDatArray; OSDArray reportDataArray = new OSDArray(); OSDArray dataExtendedArray = new OSDArray(); @@ -385,7 +388,7 @@ namespace OpenMetaverse.Messages.Linden } map["ReportData"] = reportDataArray; - map["ExtendedData"] = dataExtendedArray; + map["DataExtended"] = dataExtendedArray; return map; } @@ -393,13 +396,15 @@ namespace OpenMetaverse.Messages.Linden public void Deserialize(OSDMap map) { - OSDMap requestDataMap = (OSDMap)map["RequestData"]; - this.ReporType = requestDataMap["ReportType"].AsInteger(); - this.RequestFlags = requestDataMap["RequestFlags"].AsInteger(); - this.TotalObjectCount = requestDataMap["TotalObjectCount"].AsInteger(); + OSDArray requestDataArray = (OSDArray)map["RequestData"]; + OSDMap requestMap = (OSDMap)requestDataArray[0]; + + this.ReporType = requestMap["ReportType"].AsInteger(); + this.RequestFlags = requestMap["RequestFlags"].AsInteger(); + this.TotalObjectCount = requestMap["TotalObjectCount"].AsInteger(); OSDArray dataArray = (OSDArray)map["ReportData"]; - OSDArray dataExtendedArray = (OSDArray)map["ExtendedData"]; + OSDArray dataExtendedArray = (OSDArray)map["DataExtended"]; ReportDataBlocks = new ReportDataBlock[dataArray.Count]; for (int i = 0; i < dataArray.Count; i++) @@ -417,7 +422,7 @@ namespace OpenMetaverse.Messages.Linden block.TaskLocalID = blockMap["TaskLocalID"].AsUInteger(); block.TaskName = blockMap["TaskName"].AsString(); block.MonoScore = (float)extMap["MonoScore"].AsReal(); - block.TimeStamp = extMap["TimeStamp"].AsDate(); + block.TimeStamp = Utils.UnixTimeToDateTime(extMap["TimeStamp"].AsUInteger()); ReportDataBlocks[i] = block; } diff --git a/Programs/WinGridProxy/Form1.cs b/Programs/WinGridProxy/Form1.cs index 248fad8f..64dc2529 100644 --- a/Programs/WinGridProxy/Form1.cs +++ b/Programs/WinGridProxy/Form1.cs @@ -667,7 +667,6 @@ namespace WinGridProxy enableDisableFilterByNameToolStripMenuItem.Text = String.Format("Capture {0} {1}", listViewSessions.FocusedItem.SubItems[2].Text, strPacketOrMessage); toolStripMenuItemSelectPacketName.Tag = enableDisableFilterByNameToolStripMenuItem.Tag = listViewSessions.FocusedItem.SubItems[2].Text; - toolStripMenuItemSelectPacketName.Text = String.Format("All {0} {1}", listViewSessions.FocusedItem.SubItems[2].Text, strPacketOrMessage); enableDisableFilterByNameToolStripMenuItem.Visible = @@ -715,7 +714,6 @@ namespace WinGridProxy toolStripMenuSessionsRemove.Enabled = selectToolStripMenuItem2.Enabled = false; } - } private void findSessions_Click(object sender, EventArgs e) @@ -733,7 +731,6 @@ namespace WinGridProxy sThread.Name = "Search"; sThread.Start(); } - } // Enable Inject button if box contains text @@ -764,6 +761,7 @@ namespace WinGridProxy { if(MessageBox.Show("Would you like to apply these settings to the currention session list?", "Apply Filter", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes) { + listViewSessions.BeginUpdate(); foreach(ListViewItem item in listViewSessions.Items) { ListViewItem found = FindListViewItem(listViewPacketFilters, item.SubItems[2].Text, false); @@ -772,8 +770,8 @@ namespace WinGridProxy if(found != null && !found.Checked) listViewSessions.Items.Remove(item); - } + listViewSessions.EndUpdate(); } } } @@ -789,7 +787,6 @@ namespace WinGridProxy proxy.AddUDPDelegate(packetTypeFromName(e.Item.Text), e.Item.Checked); } - private void checkBoxCheckallCaps_CheckedChanged(object sender, EventArgs e) { foreach (ListViewItem item in listViewMessageFilters.Items) @@ -815,12 +812,8 @@ namespace WinGridProxy private void saveSessionArchiveToolStripMenuItem_Click(object sender, EventArgs e) { - Stream myStream; if (saveFileDialog1.ShowDialog() == DialogResult.OK) { - if ((myStream = saveFileDialog1.OpenFile()) != null) - { - StreamWriter wText = new StreamWriter(myStream); OSDMap map = new OSDMap(1); OSDArray sessionArray = new OSDArray(); foreach (ListViewItem item in listViewSessions.Items) @@ -834,33 +827,35 @@ namespace WinGridProxy session["size"] = OSD.FromString(item.SubItems[3].Text); session["host"] = OSD.FromString(item.SubItems[4].Text); - - try { session["tag"] = OSD.FromBinary((byte[])item.Tag); } - catch (Exception ex) + catch { - Console.WriteLine(ex.Message + ": " + ex.StackTrace); session["tag"] = OSD.FromBinary(Utils.EmptyBytes); } - - sessionArray.Add(session); + finally + { + sessionArray.Add(session); + } } map["sessions"] = sessionArray; - wText.Write(map.ToString()); - wText.Flush(); - myStream.Close(); + try + { + File.WriteAllText(saveFileDialog1.FileName, map.ToString()); + } + catch (Exception ex) + { + MessageBox.Show("Exception occurred trying to save session archive: " + ex); } } } private void loadSessionArchiveToolStripMenuItem_Click(object sender, EventArgs e) { - if (openFileDialog1.ShowDialog() == DialogResult.OK) { OSD osd = OSDParser.DeserializeLLSDNotation(File.ReadAllText(openFileDialog1.FileName)); @@ -891,7 +886,6 @@ namespace WinGridProxy private void listViewFilterSorter_ColumnClick(object sender, ColumnClickEventArgs e) { ListView lv = (ListView)sender; - //this.listViewPacketFilters.ListViewItemSorter = new ListViewItemComparer(e.Column); ListViewItemComparer columnSorter = new ListViewItemComparer(); columnSorter.column = e.Column; @@ -905,7 +899,7 @@ namespace WinGridProxy private void exitToolStripMenuItem1_Click(object sender, EventArgs e) { - // warn if connected! + // TODO: warn if client is connected! this.Close(); } @@ -947,7 +941,6 @@ namespace WinGridProxy foreach (FieldInfo nestedField in nestedArrayObject.GetType().GetFields()) { - //var nt = nestedField.GetValue(nestedArrayObject).GetType().Name; if (nestedField.FieldType.IsEnum) { result.AppendFormat("{0, 30}: {1} {2} ({3})" + System.Environment.NewLine, @@ -1015,6 +1008,8 @@ namespace WinGridProxy /// /// The Packet /// A formatted string of values of the nested items in the Packet object + /// TODO: This is overly complex. Static helpers should be created to clean this up and it + /// should be made generic enough to decode IMessage objects too. public static string PacketToString(Packet packet) { StringBuilder result = new StringBuilder(); @@ -1048,12 +1043,10 @@ namespace WinGridProxy { if (propertyInfo.GetValue(nestedArrayRecord, null).GetType() == typeof(byte[])) { - result.AppendFormat("{0, 30}: {1}" + Environment.NewLine, - propertyInfo.Name, Utils.BytesToString((byte[])propertyInfo.GetValue(nestedArrayRecord, null))); - + propertyInfo.Name, + Utils.BytesToString((byte[])propertyInfo.GetValue(nestedArrayRecord, null))); } - } // handle fields