* Commented a few unused variables out in GroupManager

* ACKing performance enhancements in NetworkManager for high packet loads
* More sanity checking in Parcel.cs
* Added comment skeletons, reorganized member ordering, and added a ToBytes() skeleton function in Textures.cs

git-svn-id: http://libopenmetaverse.googlecode.com/svn/trunk@408 52acb1d6-8a22-11de-b505-999d5b087335
This commit is contained in:
John Hurliman
2006-10-27 21:42:23 +00:00
parent 3c08ee0252
commit caca9ebdfd
4 changed files with 208 additions and 103 deletions

View File

@@ -691,14 +691,14 @@ namespace libsecondlife
private void GroupActiveProposalItemHandler(Packet packet, Simulator simulator)
{
GroupActiveProposalItemReplyPacket proposal = (GroupActiveProposalItemReplyPacket)packet;
//GroupActiveProposalItemReplyPacket proposal = (GroupActiveProposalItemReplyPacket)packet;
// TODO: Create a proposal class to represent the fields in a proposal item
}
private void GroupVoteHistoryItemHandler(Packet packet, Simulator simulator)
{
GroupVoteHistoryItemReplyPacket history = (GroupVoteHistoryItemReplyPacket)packet;
//GroupVoteHistoryItemReplyPacket history = (GroupVoteHistoryItemReplyPacket)packet;
// TODO: This was broken in the official viewer when I was last trying to work on it
}
@@ -763,7 +763,9 @@ namespace libsecondlife
private void GroupAccountTransactionsHandler(Packet packet, Simulator simulator)
{
GroupAccountTransactionsReplyPacket transactions = (GroupAccountTransactionsReplyPacket)packet;
//GroupAccountTransactionsReplyPacket transactions = (GroupAccountTransactionsReplyPacket)packet;
// TODO: This one is slightly different than the previous two
//if (GroupAccountTransactionsCallbacks.ContainsKey(transactions.AgentData.GroupID))
//{

View File

@@ -354,6 +354,52 @@ namespace libsecondlife
}
}
private void SendAck(ushort id)
{
PacketAckPacket ack = new PacketAckPacket();
ack.Packets = new PacketAckPacket.PacketsBlock[1];
ack.Packets[0] = new PacketAckPacket.PacketsBlock();
ack.Packets[0].ID = id;
ack.Header.Reliable = false;
lock (PendingAcks)
{
if (PendingAcks.Contains(id))
{
PendingAcks.Remove(id);
}
}
SendPacket(ack, true);
}
private void SendAcks()
{
lock (PendingAcks)
{
if (PendingAcks.Count > 0)
{
int i = 0;
PacketAckPacket acks = new PacketAckPacket();
acks.Packets = new PacketAckPacket.PacketsBlock[PendingAcks.Count];
foreach (uint ack in PendingAcks)
{
acks.Packets[i] = new PacketAckPacket.PacketsBlock();
acks.Packets[i].ID = ack;
i++;
}
acks.Header.Reliable = false;
SendPacket(acks, true);
PendingAcks.Clear();
}
}
}
private void OnReceivedData(IAsyncResult result)
{
Packet packet = null;
@@ -398,6 +444,11 @@ namespace libsecondlife
// Track the sequence number for this packet if it's marked as reliable
if (packet.Header.Reliable)
{
if (PendingAcks.Count > 10)
{
SendAcks();
}
// Check if we already received this packet
lock (Inbox)
{
@@ -407,13 +458,20 @@ namespace libsecondlife
packet.Header.Sequence + ", resent=" + ((packet.Header.Resent) ? "Yes" : "No"),
Helpers.LogLevel.Info);
// Send an ACK for this packet immediately
SendAck(packet.Header.Sequence);
// Avoid firing a callback twice for the same packet
return;
}
else
{
Inbox.Add(packet.Header.Sequence, packet.Header.Sequence);
PendingAcks.Add((uint)packet.Header.Sequence);
lock (PendingAcks)
{
PendingAcks.Add((uint)packet.Header.Sequence);
}
}
}
}
@@ -498,27 +556,7 @@ namespace libsecondlife
return;
}
lock (PendingAcks)
{
if (PendingAcks.Count > 0)
{
int i = 0;
PacketAckPacket acks = new PacketAckPacket();
acks.Packets = new PacketAckPacket.PacketsBlock[PendingAcks.Count];
acks.Header.Reliable = false;
foreach (uint ack in PendingAcks)
{
acks.Packets[i] = new PacketAckPacket.PacketsBlock();
acks.Packets[i].ID = ack;
i++;
}
SendPacket(acks, true);
PendingAcks.Clear();
}
}
SendAcks();
}
}

View File

@@ -366,13 +366,18 @@ namespace libsecondlife
Client = client;
ParcelsForSale = new List<DirectoryParcel>();
// Setup the timer
DirLandTimer = new Timer(8000);
DirLandTimer.Elapsed += new ElapsedEventHandler(DirLandTimerEvent);
DirLandTimeout = false;
// Setup the callbacks
Client.Network.RegisterCallback(PacketType.DirLandReply, new PacketCallback(DirLandReplyHandler));
Client.Network.RegisterCallback(PacketType.ParcelInfoReply, new PacketCallback(ParcelInfoReplyHandler));
Client.Network.RegisterCallback(PacketType.ParcelProperties, new PacketCallback(ParcelPropertiesHandler));
Client.Network.RegisterCallback(PacketType.ParcelDwellReply, new PacketCallback(ParcelDwellReplyHandler));
ParcelInfoParcel = new DirectoryParcel();
ParcelInfoParcel = null;
}
/// <summary>
@@ -450,9 +455,7 @@ namespace libsecondlife
// Clear the list
ParcelsForSale.Clear();
// Setup the timer
DirLandTimer = new Timer(15000);
DirLandTimer.Elapsed += new ElapsedEventHandler(DirLandTimerEvent);
// Start the timer
DirLandTimeout = false;
DirLandTimer.Start();
@@ -608,50 +611,53 @@ namespace libsecondlife
private void ParcelInfoReplyHandler(Packet packet, Simulator simulator)
{
ParcelInfoReplyPacket reply = (ParcelInfoReplyPacket)packet;
if (!reply.Data.ParcelID.Equals(ParcelInfoParcel.ID))
if (ParcelInfoParcel != null)
{
Client.Log("Received a ParcelInfoReply for " + reply.Data.ParcelID.ToString() +
", looking for " + ParcelInfoParcel.ID.ToString(), Helpers.LogLevel.Warning);
ParcelInfoReplyPacket reply = (ParcelInfoReplyPacket)packet;
// Build and resend the ParcelInfoRequest packet
ParcelInfoRequestPacket request = new ParcelInfoRequestPacket();
request.AgentData.AgentID = Client.Network.AgentID;
request.AgentData.SessionID = Client.Network.SessionID;
request.Data.ParcelID = ParcelInfoParcel.ID;
if (!reply.Data.ParcelID.Equals(ParcelInfoParcel.ID))
{
Client.Log("Received a ParcelInfoReply for " + reply.Data.ParcelID.ToString() +
", looking for " + ParcelInfoParcel.ID.ToString(), Helpers.LogLevel.Warning);
Client.Network.SendPacket(request);
// Build and resend the ParcelInfoRequest packet
ParcelInfoRequestPacket request = new ParcelInfoRequestPacket();
request.AgentData.AgentID = Client.Network.AgentID;
request.AgentData.SessionID = Client.Network.SessionID;
request.Data.ParcelID = ParcelInfoParcel.ID;
return;
Client.Network.SendPacket(request);
return;
}
ParcelInfoParcel.SimName = Helpers.FieldToString(reply.Data.SimName);
ParcelInfoParcel.ActualArea = reply.Data.ActualArea;
ParcelInfoParcel.GlobalPosition.X = reply.Data.GlobalX;
ParcelInfoParcel.GlobalPosition.Y = reply.Data.GlobalY;
ParcelInfoParcel.GlobalPosition.Z = reply.Data.GlobalZ;
ParcelInfoParcel.Name = Helpers.FieldToString(reply.Data.Name);
ParcelInfoParcel.Desc = Helpers.FieldToString(reply.Data.Desc);
ParcelInfoParcel.SalePrice = reply.Data.SalePrice;
ParcelInfoParcel.OwnerID = reply.Data.OwnerID;
ParcelInfoParcel.SnapshotID = reply.Data.SnapshotID;
ParcelInfoParcel.Dwell = reply.Data.Dwell;
// Get RegionHandle from GlobalX/GlobalY
uint handleX = (uint)Math.Floor(ParcelInfoParcel.GlobalPosition.X / 256.0F);
handleX *= 256;
uint handleY = (uint)Math.Floor(ParcelInfoParcel.GlobalPosition.Y / 256.0F);
handleY *= 256;
// FIXME: Helpers function needed
//ParcelInfoParcel.RegionHandle = new U64(handleX, handleY);
// Get SimPosition from GlobalX/GlobalY and RegionHandle
ParcelInfoParcel.SimPosition.X = ParcelInfoParcel.GlobalPosition.X - (float)handleX;
ParcelInfoParcel.SimPosition.Y = ParcelInfoParcel.GlobalPosition.Y - (float)handleY;
ParcelInfoParcel.SimPosition.Z = ParcelInfoParcel.GlobalPosition.Z;
Finished = true;
}
ParcelInfoParcel.SimName = Helpers.FieldToString(reply.Data.SimName);
ParcelInfoParcel.ActualArea = reply.Data.ActualArea;
ParcelInfoParcel.GlobalPosition.X = reply.Data.GlobalX;
ParcelInfoParcel.GlobalPosition.Y = reply.Data.GlobalY;
ParcelInfoParcel.GlobalPosition.Z = reply.Data.GlobalZ;
ParcelInfoParcel.Name = Helpers.FieldToString(reply.Data.Name);
ParcelInfoParcel.Desc = Helpers.FieldToString(reply.Data.Desc);
ParcelInfoParcel.SalePrice = reply.Data.SalePrice;
ParcelInfoParcel.OwnerID = reply.Data.OwnerID;
ParcelInfoParcel.SnapshotID = reply.Data.SnapshotID;
ParcelInfoParcel.Dwell = reply.Data.Dwell;
// Get RegionHandle from GlobalX/GlobalY
uint handleX = (uint)Math.Floor(ParcelInfoParcel.GlobalPosition.X / 256.0F);
handleX *= 256;
uint handleY = (uint)Math.Floor(ParcelInfoParcel.GlobalPosition.Y / 256.0F);
handleY *= 256;
// FIXME: Helpers function needed
//ParcelInfoParcel.RegionHandle = new U64(handleX, handleY);
// Get SimPosition from GlobalX/GlobalY and RegionHandle
ParcelInfoParcel.SimPosition.X = ParcelInfoParcel.GlobalPosition.X - (float)handleX;
ParcelInfoParcel.SimPosition.Y = ParcelInfoParcel.GlobalPosition.Y - (float)handleY;
ParcelInfoParcel.SimPosition.Z = ParcelInfoParcel.GlobalPosition.Z;
Finished = true;
}
//private void ParcelInfoTimerEvent(object source, System.Timers.ElapsedEventArgs ea)

View File

@@ -30,11 +30,35 @@ using System.Text;
namespace libsecondlife
{
/// <summary>
///
/// </summary>
public class TextureEntry
{
private Dictionary<uint, TextureEntryFace> Textures;
/// <summary></summary>
public TextureEntryFace DefaultTexture;
private Dictionary<uint, TextureEntryFace> Textures;
/// <summary>
///
/// </summary>
public TextureEntry()
{
Textures = new Dictionary<uint, TextureEntryFace>();
DefaultTexture = new TextureEntryFace(null);
}
/// <summary>
///
/// </summary>
/// <param name="data"></param>
/// <param name="pos"></param>
public TextureEntry(byte[] data, int pos)
{
FromBytes(data, pos);
}
public TextureEntryFace GetFace(uint index)
{
if (Textures.ContainsKey(index))
@@ -43,6 +67,11 @@ namespace libsecondlife
return DefaultTexture;
}
/// <summary>
///
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public TextureEntryFace SetFace(uint index)
{
if (!Textures.ContainsKey(index))
@@ -51,18 +80,16 @@ namespace libsecondlife
return Textures[index];
}
public TextureEntry()
/// <summary>
///
/// </summary>
/// <returns></returns>
public byte[] ToBytes()
{
Textures = new Dictionary<uint, TextureEntryFace>();
DefaultTexture = new TextureEntryFace(null);
;
}
public TextureEntry(byte[] data, int pos)
{
FromByte(data, pos);
}
private bool readFaceBitfield(byte[] data, ref int pos, ref uint faceBits, ref uint bitfieldSize)
private bool ReadFaceBitfield(byte[] data, ref int pos, ref uint faceBits, ref uint bitfieldSize)
{
faceBits = 0;
bitfieldSize = 0;
@@ -92,7 +119,7 @@ namespace libsecondlife
return (float)((QV * QF - (0.5F * range)) + QF);
}
private void FromByte(byte[] data, int pos)
private void FromBytes(byte[] data, int pos)
{
Textures = new Dictionary<uint, TextureEntryFace>();
DefaultTexture = new TextureEntryFace(null);
@@ -105,7 +132,7 @@ namespace libsecondlife
DefaultTexture.TextureID = new LLUUID(data, i);
i += 16;
while (readFaceBitfield(data, ref i, ref faceBits, ref BitfieldSize))
while (ReadFaceBitfield(data, ref i, ref faceBits, ref BitfieldSize))
{
LLUUID tmpUUID = new LLUUID(data, i);
i += 16;
@@ -118,7 +145,7 @@ namespace libsecondlife
DefaultTexture.RGBA = (uint)(data[i] + (data[i + 1] << 8) + (data[i + 2] << 16) + (data[i + 3] << 24));
i += 4;
while (readFaceBitfield(data, ref i, ref faceBits, ref BitfieldSize))
while (ReadFaceBitfield(data, ref i, ref faceBits, ref BitfieldSize))
{
uint tmpUint = (uint)(data[i] + (data[i + 1] << 8) + (data[i + 2] << 16) + (data[i + 3] << 24));
i += 4;
@@ -131,7 +158,7 @@ namespace libsecondlife
DefaultTexture.RepeatU = Dequantize(data, i, -101.0F, 101.0F) + 1.0F;
i += 2;
while (readFaceBitfield(data, ref i, ref faceBits, ref BitfieldSize))
while (ReadFaceBitfield(data, ref i, ref faceBits, ref BitfieldSize))
{
float tmpFloat = Dequantize(data, i, -101.0F, 101.0F) + 1.0F;
i += 2;
@@ -144,7 +171,7 @@ namespace libsecondlife
DefaultTexture.RepeatV = Dequantize(data, i, -101.0F, 101.0F) + 1.0F;
i += 2;
while (readFaceBitfield(data, ref i, ref faceBits, ref BitfieldSize))
while (ReadFaceBitfield(data, ref i, ref faceBits, ref BitfieldSize))
{
float tmpFloat = Dequantize(data, i, -101.0F, 101.0F) + 1.0F;
i += 2;
@@ -157,7 +184,7 @@ namespace libsecondlife
DefaultTexture.OffsetU = Dequantize(data, i, -1.0F, 1.0F);
i += 2;
while (readFaceBitfield(data, ref i, ref faceBits, ref BitfieldSize))
while (ReadFaceBitfield(data, ref i, ref faceBits, ref BitfieldSize))
{
float tmpFloat = Dequantize(data, i, -1.0F, 1.0F);
i += 2;
@@ -170,7 +197,7 @@ namespace libsecondlife
DefaultTexture.OffsetV = Dequantize(data, i, -1.0F, 1.0F);
i += 2;
while (readFaceBitfield(data, ref i, ref faceBits, ref BitfieldSize))
while (ReadFaceBitfield(data, ref i, ref faceBits, ref BitfieldSize))
{
float tmpFloat = Dequantize(data, i, -1.0F, 1.0F);
i += 2;
@@ -183,7 +210,7 @@ namespace libsecondlife
DefaultTexture.Rotation = Dequantize(data, i, -359.995F, 359.995F);
i += 2;
while (readFaceBitfield(data, ref i, ref faceBits, ref BitfieldSize))
while (ReadFaceBitfield(data, ref i, ref faceBits, ref BitfieldSize))
{
float tmpFloat = Dequantize(data, i, -359.995F, 359.995F);
i += 2;
@@ -196,7 +223,7 @@ namespace libsecondlife
DefaultTexture.Flags1 = data[i];
i++;
while (readFaceBitfield(data, ref i, ref faceBits, ref BitfieldSize))
while (ReadFaceBitfield(data, ref i, ref faceBits, ref BitfieldSize))
{
byte tmpByte = data[i];
i++;
@@ -209,7 +236,7 @@ namespace libsecondlife
DefaultTexture.Flags2 = data[i];
i++;
while (readFaceBitfield(data, ref i, ref faceBits, ref BitfieldSize))
while (ReadFaceBitfield(data, ref i, ref faceBits, ref BitfieldSize))
{
byte tmpByte = data[i];
i++;
@@ -221,10 +248,13 @@ namespace libsecondlife
}
}
/// <summary>
///
/// </summary>
public class TextureEntryFace
{
[Flags]
private enum TextureAttributes : uint
public enum TextureAttributes : uint
{
None,
TextureID,
@@ -239,20 +269,10 @@ namespace libsecondlife
All = 0xFFFFFFFF
}
private TextureAttributes hasAttribute;
private TextureEntryFace DefaultTexture;
private LLUUID _TextureID;
private uint _RGBA;
private float _RepeatU;
private float _RepeatV;
private float _OffsetU;
private float _OffsetV;
private float _Rotation;
private byte _Flags1;
private byte _Flags2;
/// <summary>
///
/// </summary>
/// <param name="defaultTexture"></param>
public TextureEntryFace(TextureEntryFace defaultTexture)
{
DefaultTexture = defaultTexture;
@@ -262,6 +282,9 @@ namespace libsecondlife
hasAttribute = TextureAttributes.None;
}
/// <summary>
///
/// </summary>
public LLUUID TextureID
{
get
@@ -278,6 +301,9 @@ namespace libsecondlife
}
}
/// <summary>
///
/// </summary>
public uint RGBA
{
get
@@ -294,6 +320,9 @@ namespace libsecondlife
}
}
/// <summary>
///
/// </summary>
public float RepeatU
{
get
@@ -310,6 +339,9 @@ namespace libsecondlife
}
}
/// <summary>
///
/// </summary>
public float RepeatV
{
get
@@ -326,6 +358,9 @@ namespace libsecondlife
}
}
/// <summary>
///
/// </summary>
public float OffsetU
{
get
@@ -342,6 +377,9 @@ namespace libsecondlife
}
}
/// <summary>
///
/// </summary>
public float OffsetV
{
get
@@ -358,6 +396,9 @@ namespace libsecondlife
}
}
/// <summary>
///
/// </summary>
public float Rotation
{
get
@@ -374,6 +415,9 @@ namespace libsecondlife
}
}
/// <summary>
///
/// </summary>
public byte Flags1
{
get
@@ -390,6 +434,9 @@ namespace libsecondlife
}
}
/// <summary>
///
/// </summary>
public byte Flags2
{
get
@@ -405,5 +452,17 @@ namespace libsecondlife
hasAttribute |= TextureAttributes.Flags2;
}
}
private TextureAttributes hasAttribute;
private TextureEntryFace DefaultTexture;
private LLUUID _TextureID;
private uint _RGBA;
private float _RepeatU;
private float _RepeatV;
private float _OffsetU;
private float _OffsetV;
private float _Rotation;
private byte _Flags1;
private byte _Flags2;
}
}