mirror of
https://github.com/opensim/opensim.git
synced 2026-08-06 01:06:30 +08:00
Merge branch 'avination' into careminster
This commit is contained in:
@@ -151,6 +151,12 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
ulong regionHandle, byte simAccess, IPEndPoint regionExternalEndPoint,
|
||||
uint locationID, uint flags, string capsURL, UUID agentID)
|
||||
{
|
||||
// not sure why flags get overwritten here
|
||||
if ((flags & (uint)TeleportFlags.IsFlying) != 0)
|
||||
flags = (uint)TeleportFlags.ViaLocation | (uint)TeleportFlags.IsFlying;
|
||||
else
|
||||
flags = (uint)TeleportFlags.ViaLocation;
|
||||
|
||||
OSDMap info = new OSDMap();
|
||||
info.Add("AgentID", OSD.FromUUID(agentID));
|
||||
info.Add("LocationID", OSD.FromInteger(4)); // TODO what is this?
|
||||
@@ -159,7 +165,8 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
info.Add("SimAccess", OSD.FromInteger(simAccess));
|
||||
info.Add("SimIP", OSD.FromBinary(regionExternalEndPoint.Address.GetAddressBytes()));
|
||||
info.Add("SimPort", OSD.FromInteger(regionExternalEndPoint.Port));
|
||||
info.Add("TeleportFlags", OSD.FromULong(1L << 4)); // AgentManager.TeleportFlags.ViaLocation
|
||||
// info.Add("TeleportFlags", OSD.FromULong(1L << 4)); // AgentManager.TeleportFlags.ViaLocation
|
||||
info.Add("TeleportFlags", OSD.FromUInteger(flags));
|
||||
|
||||
OSDArray infoArr = new OSDArray();
|
||||
infoArr.Add(info);
|
||||
|
||||
@@ -60,11 +60,11 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
|
||||
private WebFetchInvDescHandler m_webFetchHandler;
|
||||
|
||||
private ManualResetEvent m_ev = new ManualResetEvent(true);
|
||||
private object m_lock = new object();
|
||||
|
||||
private Dictionary<UUID, string> m_capsDict = new Dictionary<UUID, string>();
|
||||
private Dictionary<UUID, Hashtable> m_requests = new Dictionary<UUID, Hashtable>();
|
||||
bool m_busy = false;
|
||||
|
||||
#region ISharedRegionModule Members
|
||||
|
||||
@@ -116,7 +116,9 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
string capUrl = "/CAPS/" + UUID.Random() + "/";
|
||||
|
||||
// Register this as a poll service
|
||||
// absurd large timeout to tune later to make a bit less than viewer
|
||||
PollServiceEventArgs args = new PollServiceEventArgs(HttpRequestHandler, HasEvents, GetEvents, NoEvents, agentID, 300000);
|
||||
|
||||
args.Type = PollServiceEventArgs.EventType.Inventory;
|
||||
MainServer.Instance.AddPollServiceHTTPHandler(capUrl, args);
|
||||
|
||||
@@ -133,6 +135,8 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
caps.RegisterHandler("FetchInventoryDescendents2", String.Format("{0}://{1}:{2}{3}", protocol, hostName, port, capUrl));
|
||||
|
||||
m_capsDict[agentID] = capUrl;
|
||||
|
||||
m_busy = false;
|
||||
}
|
||||
|
||||
private void DeregisterCaps(UUID agentID, Caps caps)
|
||||
@@ -149,25 +153,22 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
public void HttpRequestHandler(UUID requestID, Hashtable request)
|
||||
{
|
||||
// m_log.DebugFormat("[FETCH2]: Received request {0}", requestID);
|
||||
m_requests[requestID] = request;
|
||||
lock(m_lock)
|
||||
m_requests[requestID] = request;
|
||||
}
|
||||
|
||||
private bool HasEvents(UUID requestID, UUID sessionID)
|
||||
{
|
||||
lock (m_lock)
|
||||
{
|
||||
if (m_ev.WaitOne(0))
|
||||
{
|
||||
m_ev.Reset();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
return !m_busy;
|
||||
}
|
||||
}
|
||||
|
||||
private Hashtable NoEvents(UUID requestID, UUID sessionID)
|
||||
{
|
||||
m_requests.Remove(requestID);
|
||||
lock(m_lock)
|
||||
m_requests.Remove(requestID);
|
||||
|
||||
Hashtable response = new Hashtable();
|
||||
|
||||
@@ -177,11 +178,17 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
response["keepalive"] = false;
|
||||
response["reusecontext"] = false;
|
||||
|
||||
lock (m_lock)
|
||||
m_busy = false;
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
private Hashtable GetEvents(UUID requestID, UUID sessionID, string request)
|
||||
{
|
||||
lock (m_lock)
|
||||
m_busy = true;
|
||||
|
||||
Hashtable response = new Hashtable();
|
||||
|
||||
response["int_response_code"] = 500;
|
||||
@@ -192,20 +199,23 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
Hashtable requestHash;
|
||||
if (!m_requests.TryGetValue(requestID, out requestHash))
|
||||
lock (m_lock)
|
||||
{
|
||||
lock (m_lock)
|
||||
m_ev.Set();
|
||||
response["str_response_string"] = "Invalid request";
|
||||
return response;
|
||||
if (!m_requests.TryGetValue(requestID, out requestHash))
|
||||
{
|
||||
m_busy = false;
|
||||
response["str_response_string"] = "Invalid request";
|
||||
return response;
|
||||
}
|
||||
m_requests.Remove(requestID);
|
||||
}
|
||||
|
||||
// m_log.DebugFormat("[FETCH2]: Processed request {0}", requestID);
|
||||
|
||||
string reply = m_webFetchHandler.FetchInventoryDescendentsRequest(requestHash["body"].ToString(), String.Empty, String.Empty, null, null);
|
||||
|
||||
m_requests.Remove(requestID);
|
||||
|
||||
|
||||
response["int_response_code"] = 200;
|
||||
response["str_response_string"] = reply;
|
||||
@@ -213,7 +223,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||
finally
|
||||
{
|
||||
lock (m_lock)
|
||||
m_ev.Set();
|
||||
m_busy = false;
|
||||
}
|
||||
|
||||
return response;
|
||||
|
||||
@@ -807,7 +807,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
handshake.RegionInfo3.ProductName = Util.StringToBytes256(regionInfo.RegionType);
|
||||
handshake.RegionInfo3.ProductSKU = Utils.EmptyBytes;
|
||||
|
||||
OutPacket(handshake, ThrottleOutPacketType.Task);
|
||||
// OutPacket(handshake, ThrottleOutPacketType.Task);
|
||||
// use same as MoveAgentIntoRegion (both should be task )
|
||||
OutPacket(handshake, ThrottleOutPacketType.Unknown);
|
||||
}
|
||||
|
||||
public void MoveAgentIntoRegion(RegionInfo regInfo, Vector3 pos, Vector3 look)
|
||||
@@ -8748,16 +8750,61 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
|
||||
#region Parcel related packets
|
||||
|
||||
// acumulate several HandleRegionHandleRequest consecutive overlaping requests
|
||||
// to be done with minimal resources as possible
|
||||
// variables temporary here while in test
|
||||
|
||||
Queue<UUID> RegionHandleRequests = new Queue<UUID>();
|
||||
bool RegionHandleRequestsInService = false;
|
||||
|
||||
private bool HandleRegionHandleRequest(IClientAPI sender, Packet Pack)
|
||||
{
|
||||
RegionHandleRequestPacket rhrPack = (RegionHandleRequestPacket)Pack;
|
||||
UUID currentUUID;
|
||||
|
||||
RegionHandleRequest handlerRegionHandleRequest = OnRegionHandleRequest;
|
||||
if (handlerRegionHandleRequest != null)
|
||||
|
||||
if (handlerRegionHandleRequest == null)
|
||||
return true;
|
||||
|
||||
RegionHandleRequestPacket rhrPack = (RegionHandleRequestPacket)Pack;
|
||||
|
||||
lock (RegionHandleRequests)
|
||||
{
|
||||
handlerRegionHandleRequest(this, rhrPack.RequestBlock.RegionID);
|
||||
if (RegionHandleRequestsInService)
|
||||
{
|
||||
// we are already busy doing a previus request
|
||||
// so enqueue it
|
||||
RegionHandleRequests.Enqueue(rhrPack.RequestBlock.RegionID);
|
||||
return true;
|
||||
}
|
||||
|
||||
// else do it
|
||||
currentUUID = rhrPack.RequestBlock.RegionID;
|
||||
RegionHandleRequestsInService = true;
|
||||
}
|
||||
return true;
|
||||
|
||||
while (true)
|
||||
{
|
||||
handlerRegionHandleRequest(this, currentUUID);
|
||||
|
||||
lock (RegionHandleRequests)
|
||||
{
|
||||
// exit condition, nothing to do or closed
|
||||
// current code seems to assume we may loose the handler at anytime,
|
||||
// so keep checking it
|
||||
handlerRegionHandleRequest = OnRegionHandleRequest;
|
||||
|
||||
if (RegionHandleRequests.Count == 0 || !IsActive || handlerRegionHandleRequest == null)
|
||||
{
|
||||
RegionHandleRequests.Clear();
|
||||
RegionHandleRequestsInService = false;
|
||||
return true;
|
||||
}
|
||||
currentUUID = RegionHandleRequests.Dequeue();
|
||||
}
|
||||
}
|
||||
|
||||
return true; // actually unreached
|
||||
}
|
||||
|
||||
private bool HandleParcelInfoRequest(IClientAPI sender, Packet Pack)
|
||||
|
||||
Reference in New Issue
Block a user