/// <summary> /// Prepare a login to the given region. This involves both telling the region to expect a connection /// and appropriately customising the response to the user. /// </summary> /// <param name="regionInfo"></param> /// <param name="user"></param> /// <param name="response"></param> /// <returns>true if the region was successfully contacted, false otherwise</returns> private bool PrepareLoginToRegion(RegionProfileData regionInfo, UserProfileData user, LoginResponse response, IPEndPoint remoteClient) { try { response.SimAddress = Util.GetHostFromURL(regionInfo.serverURI).ToString(); response.SimPort = uint.Parse(regionInfo.serverURI.Split(new char[] { '/', ':' })[4]); response.RegionX = regionInfo.regionLocX; response.RegionY = regionInfo.regionLocY; string capsPath = CapsUtil.GetRandomCapsObjectPath(); // Adam's working code commented for now -- Diva 5/25/2009 //// For NAT ////string host = NetworkUtil.GetHostFor(remoteClient.Address, regionInfo.ServerIP); //string host = response.SimAddress; //// TODO: This doesnt support SSL. -Adam //string serverURI = "http://" + host + ":" + regionInfo.ServerPort; //response.SeedCapability = serverURI + CapsUtil.GetCapsSeedPath(capsPath); // Take off trailing / so that the caps path isn't //CAPS/someUUID string uri = regionInfo.httpServerURI.Trim(new char[] { '/' }); response.SeedCapability = uri + CapsUtil.GetCapsSeedPath(capsPath); // Notify the target of an incoming user m_log.InfoFormat( "[LOGIN]: Telling {0} @ {1},{2} ({3}) to prepare for client connection", regionInfo.regionName, response.RegionX, response.RegionY, regionInfo.httpServerURI); // Update agent with target sim user.CurrentAgent.Region = regionInfo.UUID; user.CurrentAgent.Handle = regionInfo.regionHandle; // Prepare notification Hashtable loginParams = new Hashtable(); loginParams["session_id"] = user.CurrentAgent.SessionID.ToString(); loginParams["secure_session_id"] = user.CurrentAgent.SecureSessionID.ToString(); loginParams["firstname"] = user.FirstName; loginParams["lastname"] = user.SurName; loginParams["agent_id"] = user.ID.ToString(); loginParams["circuit_code"] = (Int32)Convert.ToUInt32(response.CircuitCode); loginParams["startpos_x"] = user.CurrentAgent.Position.X.ToString(); loginParams["startpos_y"] = user.CurrentAgent.Position.Y.ToString(); loginParams["startpos_z"] = user.CurrentAgent.Position.Z.ToString(); loginParams["regionhandle"] = user.CurrentAgent.Handle.ToString(); loginParams["caps_path"] = capsPath; // Get appearance AvatarAppearance appearance = m_userManager.GetUserAppearance(user.ID); if (appearance != null) { loginParams["appearance"] = appearance.ToHashTable(); m_log.DebugFormat("[LOGIN]: Found appearance for {0} {1}", user.FirstName, user.SurName); } else { m_log.DebugFormat("[LOGIN]: Appearance not for {0} {1}. Creating default.", user.FirstName, user.SurName); appearance = new AvatarAppearance(user.ID); loginParams["appearance"] = appearance.ToHashTable(); } ArrayList SendParams = new ArrayList(); SendParams.Add(loginParams); // Send XmlRpcRequest GridReq = new XmlRpcRequest("expect_user", SendParams); XmlRpcResponse GridResp = GridReq.Send(regionInfo.httpServerURI, 6000); if (!GridResp.IsFault) { bool responseSuccess = true; if (GridResp.Value != null) { Hashtable resp = (Hashtable)GridResp.Value; if (resp.ContainsKey("success")) { if ((string)resp["success"] == "FALSE") { responseSuccess = false; } } } if (responseSuccess) { handlerUserLoggedInAtLocation = OnUserLoggedInAtLocation; if (handlerUserLoggedInAtLocation != null) { handlerUserLoggedInAtLocation(user.ID, user.CurrentAgent.SessionID, user.CurrentAgent.Region, user.CurrentAgent.Handle, user.CurrentAgent.Position.X, user.CurrentAgent.Position.Y, user.CurrentAgent.Position.Z, user.FirstName, user.SurName); } } else { m_log.ErrorFormat("[LOGIN]: Region responded that it is not available to receive clients"); return false; } } else { m_log.ErrorFormat("[LOGIN]: XmlRpc request to region failed with message {0}, code {1} ", GridResp.FaultString, GridResp.FaultCode); return false; } } catch (Exception e) { m_log.ErrorFormat("[LOGIN]: Region not available for login, {0}", e); return false; } return true; }
public virtual void UpdateUserAppearance(UUID user, AvatarAppearance appearance) { try { Hashtable param = appearance.ToHashTable(); param["owner"] = user.ToString(); IList parameters = new ArrayList(); parameters.Add(param); XmlRpcRequest req = new XmlRpcRequest("update_avatar_appearance", parameters); XmlRpcResponse resp = req.Send(GetUserServerURL(user), 8000); Hashtable respData = (Hashtable)resp.Value; if (respData != null) { if (respData.Contains("returnString")) { if ((string)respData["returnString"] == "TRUE") { } else { m_log.Warn("[GRID]: Unable to update_user_appearance, User Server Reported an issue"); } } else { m_log.Warn("[GRID]: Unable to update_user_appearance, UserServer didn't understand me!"); } } else { m_log.Warn("[GRID]: Unable to update_user_appearance, UserServer didn't understand me!"); } } catch (WebException e) { m_log.Warn("[OGS1 USER SERVICES]: Error when trying to update Avatar's appearance: " + e.Message); // Return Empty list (no friends) } }