diff --git a/OpenMetaverse/AssetManager.cs b/OpenMetaverse/AssetManager.cs index a9767840..a65db997 100644 --- a/OpenMetaverse/AssetManager.cs +++ b/OpenMetaverse/AssetManager.cs @@ -1230,7 +1230,9 @@ namespace OpenMetaverse if (packetNum == 0) { // This is the first packet received in the download, the first four bytes are a network order size integer - download.Size = (int)Helpers.BytesToUIntBig(xfer.DataPacket.Data); + // FIXME: Is this actually true? + byte[] bytes = xfer.DataPacket.Data; + download.Size = (bytes[3] + (bytes[2] << 8) + (bytes[1] << 16) + (bytes[0] << 24)); download.AssetData = new byte[download.Size]; Buffer.BlockCopy(xfer.DataPacket.Data, 4, download.AssetData, 0, xfer.DataPacket.Data.Length - 4); diff --git a/OpenMetaverse/CapsToPacket.cs b/OpenMetaverse/CapsToPacket.cs index d7dd76be..632fbf63 100644 --- a/OpenMetaverse/CapsToPacket.cs +++ b/OpenMetaverse/CapsToPacket.cs @@ -181,7 +181,7 @@ namespace OpenMetaverse.Packets { // uints come in as a byte array, convert it manually here byte[] bytes = blockData[field.Name].AsBinary(); - uint value = Helpers.BytesToUIntBig(bytes); + uint value = Helpers.BytesToUInt(bytes); field.SetValue(block, value); } else if (fieldType == typeof(ushort)) diff --git a/OpenMetaverse/Helpers.cs b/OpenMetaverse/Helpers.cs index 4093e58d..142b3f8a 100644 --- a/OpenMetaverse/Helpers.cs +++ b/OpenMetaverse/Helpers.cs @@ -275,32 +275,6 @@ namespace OpenMetaverse return BytesToUInt(bytes, 0); } - /// - /// Convert the first four bytes starting at the given position in - /// big endian ordering to an unsigned integer - /// - /// Byte array containing the uint - /// Position to start reading the uint from - /// An unsigned integer, will be zero if a uint can't be read - /// at the given position - public static uint BytesToUIntBig(byte[] bytes, int pos) - { - if (bytes.Length < pos + 4) return 0; - return (uint)(bytes[pos + 3] + (bytes[pos + 2] << 8) + (bytes[pos + 1] << 16) + (bytes[pos + 0] << 24)); - } - - /// - /// Convert the first four bytes of the given array in big endian - /// ordering to an unsigned integer - /// - /// An array four bytes or longer - /// An unsigned integer, will be zero if the array contains - /// less than four bytes - public static uint BytesToUIntBig(byte[] bytes) - { - return BytesToUIntBig(bytes, 0); - } - /// /// Convert the first eight bytes of the given array in little endian /// ordering to an unsigned 64-bit integer diff --git a/Programs/GridProxy/GridProxy.cs b/Programs/GridProxy/GridProxy.cs index effeee72..354ec1c0 100644 --- a/Programs/GridProxy/GridProxy.cs +++ b/Programs/GridProxy/GridProxy.cs @@ -540,7 +540,7 @@ namespace GridProxy if (uri == "/") { - if (contentType == "application/xml+llsd") { + if (contentType == "application/xml+llsd" || contentType == "application/xml") { ProxyLoginLLSD(netStream, content); } else { ProxyLogin(netStream, content); @@ -914,7 +914,7 @@ namespace GridProxy else info = (LLSDMap)(((LLSDArray)body["RegionData"])[0]); byte[] bytes = info["SimIP"].AsBinary(); - uint simIP = Helpers.BytesToUIntBig(bytes); + uint simIP = Helpers.BytesToUInt(bytes); ushort simPort = (ushort)info["SimPort"].AsInteger(); string capsURL = info["SeedCapability"].AsString(); @@ -933,7 +933,7 @@ namespace GridProxy string ipAndPort = body["sim-ip-and-port"].AsString(); string[] pieces = ipAndPort.Split(':'); byte[] bytes = IPAddress.Parse(pieces[0]).GetAddressBytes(); - uint simIP = (uint)(bytes[0] + (bytes[1] << 8) + (bytes[2] << 16) + (bytes[3] << 24)); + uint simIP = Helpers.BytesToUInt(bytes); ushort simPort = (ushort)Convert.ToInt32(pieces[1]); string capsURL = body["seed-capability"].AsString(); @@ -975,14 +975,6 @@ namespace GridProxy Log(e.StackTrace, true); } - // add our userAgent and author to the request - System.Collections.Hashtable requestParams = new System.Collections.Hashtable(); - if (proxyConfig.userAgent != null) - requestParams["user-agent"] = proxyConfig.userAgent; - if (proxyConfig.author != null) - requestParams["author"] = proxyConfig.author; - request.Params.Add(requestParams); - XmlRpcResponse response; try { @@ -1051,7 +1043,8 @@ namespace GridProxy lock (this) { ServicePointManager.CertificatePolicy = new AcceptAllCertificatePolicy(); AutoResetEvent remoteComplete = new AutoResetEvent(false); - CapsClient loginRequest = new CapsClient(proxyConfig.remoteLoginUri); + //CapsClient loginRequest = new CapsClient(proxyConfig.remoteLoginUri); + CapsClient loginRequest = new CapsClient(new Uri("https://login1.aditi.lindenlab.com/cgi-bin/auth.cgi")); LLSD response = null; loginRequest.OnComplete += new CapsClient.CompleteCallback( delegate(CapsClient client, LLSD result, Exception error) @@ -1064,7 +1057,7 @@ namespace GridProxy remoteComplete.Set(); } ); - loginRequest.StartRequest(content, "application/xml+llsd"); + loginRequest.StartRequest(content, "application/xml"); //xml+llsd remoteComplete.WaitOne(30000, false); if (response == null) { @@ -1548,105 +1541,110 @@ namespace GridProxy // pause listening and fetch the packet bool needsZero = false; bool needsCopy = true; - int length; - length = socket.EndReceiveFrom(ar, ref clientEndPoint); + int length = 0; - // interpret the packet according to the SL protocol - int end = length - 1; - Packet packet = OpenMetaverse.Packets.Packet.BuildPacket(receiveBuffer, ref end, zeroBuffer); + try { length = socket.EndReceiveFrom(ar, ref clientEndPoint); } + catch (SocketException) { } + + if (length != 0) + { + // interpret the packet according to the SL protocol + int end = length - 1; + Packet packet = OpenMetaverse.Packets.Packet.BuildPacket(receiveBuffer, ref end, zeroBuffer); #if DEBUG_SEQUENCE Console.WriteLine("-> " + packet.Type + " #" + packet.Header.Sequence); #endif - // check for ACKs we're waiting for - packet = CheckAcks(packet, Direction.Outgoing, ref length, ref needsCopy); + // check for ACKs we're waiting for + packet = CheckAcks(packet, Direction.Outgoing, ref length, ref needsCopy); - // modify sequence numbers to account for injections - uint oldSequence = packet.Header.Sequence; - packet = ModifySequence(packet, Direction.Outgoing, ref length, ref needsCopy); + // modify sequence numbers to account for injections + uint oldSequence = packet.Header.Sequence; + packet = ModifySequence(packet, Direction.Outgoing, ref length, ref needsCopy); - // keep track of sequence numbers - if (packet.Header.Sequence > outgoingSequence) - outgoingSequence = packet.Header.Sequence; + // keep track of sequence numbers + if (packet.Header.Sequence > outgoingSequence) + outgoingSequence = packet.Header.Sequence; - // check the packet for addresses that need proxying - if (proxy.outgoingCheckers.ContainsKey(packet.Type)) - { - /* if (packet.Header.Zerocoded) { - length = Helpers.ZeroDecode(packet.Header.Data, length, zeroBuffer); - packet.Header.Data = zeroBuffer; - needsZero = false; - } */ - - Packet newPacket = ((AddressChecker)proxy.outgoingCheckers[packet.Type])(packet); - SwapPacket(packet, newPacket); - packet = newPacket; - length = packet.Header.Data.Length; - needsCopy = false; - } - - // pass the packet to any callback delegates - if (proxy.outgoingDelegates.ContainsKey(packet.Type)) - { - /* if (packet.Header.Zerocoded) { - length = Helpers.ZeroDecode(packet.Header.Data, length, zeroBuffer); - packet.Header.Data = zeroBuffer; - needsCopy = true; - } */ - - if (needsCopy) + // check the packet for addresses that need proxying + if (proxy.outgoingCheckers.ContainsKey(packet.Type)) { - byte[] newData = new byte[packet.Header.Data.Length]; - Array.Copy(packet.Header.Data, 0, newData, 0, packet.Header.Data.Length); - packet.Header.Data = newData; // FIXME!!! + /* if (packet.Header.Zerocoded) { + length = Helpers.ZeroDecode(packet.Header.Data, length, zeroBuffer); + packet.Header.Data = zeroBuffer; + needsZero = false; + } */ + + Packet newPacket = ((AddressChecker)proxy.outgoingCheckers[packet.Type])(packet); + SwapPacket(packet, newPacket); + packet = newPacket; + length = packet.Header.Data.Length; + needsCopy = false; } - try + // pass the packet to any callback delegates + if (proxy.outgoingDelegates.ContainsKey(packet.Type)) { - Packet newPacket = proxy.callDelegates(proxy.outgoingDelegates, packet, remoteEndPoint); - if (newPacket == null) - { - if ((packet.Header.Flags & Helpers.MSG_RELIABLE) != 0) - Inject(proxy.SpoofAck(oldSequence), Direction.Incoming); + /* if (packet.Header.Zerocoded) { + length = Helpers.ZeroDecode(packet.Header.Data, length, zeroBuffer); + packet.Header.Data = zeroBuffer; + needsCopy = true; + } */ - if ((packet.Header.Flags & Helpers.MSG_APPENDED_ACKS) != 0) - packet = proxy.SeparateAck(packet); + if (needsCopy) + { + byte[] newData = new byte[packet.Header.Data.Length]; + Array.Copy(packet.Header.Data, 0, newData, 0, packet.Header.Data.Length); + packet.Header.Data = newData; // FIXME!!! + } + + try + { + Packet newPacket = proxy.callDelegates(proxy.outgoingDelegates, packet, remoteEndPoint); + if (newPacket == null) + { + if ((packet.Header.Flags & Helpers.MSG_RELIABLE) != 0) + Inject(proxy.SpoofAck(oldSequence), Direction.Incoming); + + if ((packet.Header.Flags & Helpers.MSG_APPENDED_ACKS) != 0) + packet = proxy.SeparateAck(packet); + else + packet = null; + } else - packet = null; + { + bool oldReliable = (packet.Header.Flags & Helpers.MSG_RELIABLE) != 0; + bool newReliable = (newPacket.Header.Flags & Helpers.MSG_RELIABLE) != 0; + if (oldReliable && !newReliable) + Inject(proxy.SpoofAck(oldSequence), Direction.Incoming); + else if (!oldReliable && newReliable) + WaitForAck(packet, Direction.Outgoing); + + SwapPacket(packet, newPacket); + packet = newPacket; + } } - else + catch (Exception e) { - bool oldReliable = (packet.Header.Flags & Helpers.MSG_RELIABLE) != 0; - bool newReliable = (newPacket.Header.Flags & Helpers.MSG_RELIABLE) != 0; - if (oldReliable && !newReliable) - Inject(proxy.SpoofAck(oldSequence), Direction.Incoming); - else if (!oldReliable && newReliable) - WaitForAck(packet, Direction.Outgoing); - - SwapPacket(packet, newPacket); - packet = newPacket; + proxy.Log("exception in outgoing delegate: " + e.Message, true); + proxy.Log(e.StackTrace, true); } + + if (packet != null) + proxy.SendPacket(packet, remoteEndPoint, false); } - catch (Exception e) + else + proxy.SendPacket(packet, remoteEndPoint, needsZero); + + // send any packets queued for injection + if (firstReceive) { - proxy.Log("exception in outgoing delegate: " + e.Message, true); - proxy.Log(e.StackTrace, true); + firstReceive = false; + foreach (Packet queuedPacket in proxy.queuedIncomingInjections) + Inject(queuedPacket, Direction.Incoming); + proxy.queuedIncomingInjections = new List(); } - - if (packet != null) - proxy.SendPacket(packet, remoteEndPoint, false); - } - else - proxy.SendPacket(packet, remoteEndPoint, needsZero); - - // send any packets queued for injection - if (firstReceive) - { - firstReceive = false; - foreach (Packet queuedPacket in proxy.queuedIncomingInjections) - Inject(queuedPacket, Direction.Incoming); - proxy.queuedIncomingInjections = new List(); } } catch (Exception e) @@ -1931,7 +1929,7 @@ namespace GridProxy simPort = (ushort)fakeSim.Port; int i = 0; byte[] bytes = fakeSim.Address.GetAddressBytes(); - simIP = (uint)(bytes[i++] + (bytes[i++] << 8) + (bytes[i++] << 16) + (bytes[i++] << 24)); + simIP = Helpers.BytesToUInt(bytes); if (simCaps != null && simCaps.Length > 0) { CapInfo info = new CapInfo(simCaps, realSim, "SeedCapability"); diff --git a/Programs/examples/TestClient/Commands/Inventory/InventoryCommand.cs b/Programs/examples/TestClient/Commands/Inventory/InventoryCommand.cs index 701cda91..1e6a9569 100644 --- a/Programs/examples/TestClient/Commands/Inventory/InventoryCommand.cs +++ b/Programs/examples/TestClient/Commands/Inventory/InventoryCommand.cs @@ -37,13 +37,19 @@ namespace OpenMetaverse.TestClient void PrintFolder(InventoryFolder f, StringBuilder result, int indent) { - foreach (InventoryBase i in Manager.FolderContents(f.UUID, Client.Self.AgentID, true, true, InventorySortOrder.ByName, 3000)) + List contents = Manager.FolderContents(f.UUID, Client.Self.AgentID, + true, true, InventorySortOrder.ByName, 3000); + + if (contents != null) { - result.AppendFormat("{0}{1} ({2})\n", new String(' ', indent * 2), i.Name, i.UUID); - if (i is InventoryFolder) + foreach (InventoryBase i in contents) { - InventoryFolder folder = (InventoryFolder)i; - PrintFolder(folder, result, indent + 1); + result.AppendFormat("{0}{1} ({2})\n", new String(' ', indent * 2), i.Name, i.UUID); + if (i is InventoryFolder) + { + InventoryFolder folder = (InventoryFolder)i; + PrintFolder(folder, result, indent + 1); + } } } }