diff options
Diffstat (limited to 'OpenSim/Services/LLLoginService/LLLoginResponse.cs')
-rw-r--r-- | OpenSim/Services/LLLoginService/LLLoginResponse.cs | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/OpenSim/Services/LLLoginService/LLLoginResponse.cs b/OpenSim/Services/LLLoginService/LLLoginResponse.cs index fbce63f..18a4f02 100644 --- a/OpenSim/Services/LLLoginService/LLLoginResponse.cs +++ b/OpenSim/Services/LLLoginService/LLLoginResponse.cs | |||
@@ -28,11 +28,19 @@ | |||
28 | using System; | 28 | using System; |
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Net; | ||
31 | using System.Reflection; | 32 | using System.Reflection; |
33 | |||
32 | using OpenSim.Framework; | 34 | using OpenSim.Framework; |
35 | using OpenSim.Framework.Capabilities; | ||
36 | using OpenSim.Services.Interfaces; | ||
37 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; | ||
38 | |||
33 | using log4net; | 39 | using log4net; |
34 | using OpenMetaverse; | 40 | using OpenMetaverse; |
35 | using OpenMetaverse.StructuredData; | 41 | using OpenMetaverse.StructuredData; |
42 | using OSDArray = OpenMetaverse.StructuredData.OSDArray; | ||
43 | using OSDMap = OpenMetaverse.StructuredData.OSDMap; | ||
36 | 44 | ||
37 | namespace OpenSim.Services.LLLoginService | 45 | namespace OpenSim.Services.LLLoginService |
38 | { | 46 | { |
@@ -202,6 +210,132 @@ namespace OpenSim.Services.LLLoginService | |||
202 | SetDefaultValues(); | 210 | SetDefaultValues(); |
203 | } | 211 | } |
204 | 212 | ||
213 | public LLLoginResponse(UserAccount account, AgentCircuitData aCircuit, PresenceInfo pinfo, | ||
214 | GridRegion destination, List<InventoryFolderBase> invSkel, | ||
215 | string where, string startlocation, Vector3 position, Vector3 lookAt, string message, | ||
216 | GridRegion home, IPEndPoint clientIP) | ||
217 | : this() | ||
218 | { | ||
219 | FillOutInventoryData(invSkel); | ||
220 | |||
221 | CircuitCode = (int)aCircuit.circuitcode; | ||
222 | Lastname = account.LastName; | ||
223 | Firstname = account.FirstName; | ||
224 | AgentID = account.PrincipalID; | ||
225 | SessionID = aCircuit.SessionID; | ||
226 | SecureSessionID = aCircuit.SecureSessionID; | ||
227 | Message = message; | ||
228 | // While we don't have friends... | ||
229 | //BuddList = ConvertFriendListItem(m_userManager.GetUserFriendList(agentID)); | ||
230 | BuddList = new LLLoginResponse.BuddyList(); | ||
231 | StartLocation = where; | ||
232 | |||
233 | FillOutHomeData(pinfo, home); | ||
234 | LookAt = String.Format("[r{0},r{1},r{2}]", lookAt.X, lookAt.Y, lookAt.Z); | ||
235 | |||
236 | FillOutRegionData(destination); | ||
237 | |||
238 | FillOutSeedCap(aCircuit, destination, clientIP); | ||
239 | |||
240 | } | ||
241 | |||
242 | private void FillOutInventoryData(List<InventoryFolderBase> invSkel) | ||
243 | { | ||
244 | InventoryData inventData = null; | ||
245 | |||
246 | try | ||
247 | { | ||
248 | inventData = GetInventorySkeleton(invSkel); | ||
249 | } | ||
250 | catch (Exception e) | ||
251 | { | ||
252 | m_log.WarnFormat( | ||
253 | "[LLLOGIN SERVICE]: Error processing inventory skeleton of agent {0} - {1}", | ||
254 | agentID, e); | ||
255 | |||
256 | // ignore and continue | ||
257 | } | ||
258 | |||
259 | if (inventData != null) | ||
260 | { | ||
261 | ArrayList AgentInventoryArray = inventData.InventoryArray; | ||
262 | |||
263 | Hashtable InventoryRootHash = new Hashtable(); | ||
264 | InventoryRootHash["folder_id"] = inventData.RootFolderID.ToString(); | ||
265 | InventoryRoot = new ArrayList(); | ||
266 | InventoryRoot.Add(InventoryRootHash); | ||
267 | InventorySkeleton = AgentInventoryArray; | ||
268 | } | ||
269 | |||
270 | // Inventory Library Section | ||
271 | Hashtable InventoryLibRootHash = new Hashtable(); | ||
272 | InventoryLibRootHash["folder_id"] = "00000112-000f-0000-0000-000100bba000"; | ||
273 | InventoryLibRoot = new ArrayList(); | ||
274 | InventoryLibRoot.Add(InventoryLibRootHash); | ||
275 | |||
276 | InventoryLibraryOwner = GetLibraryOwner(); | ||
277 | InventoryLibrary = GetInventoryLibrary(); | ||
278 | } | ||
279 | |||
280 | private void FillOutHomeData(PresenceInfo pinfo, GridRegion home) | ||
281 | { | ||
282 | int x = 1000 * (int)Constants.RegionSize, y = 1000 * (int)Constants.RegionSize; | ||
283 | if (home != null) | ||
284 | { | ||
285 | x = home.RegionLocX; | ||
286 | y = home.RegionLocY; | ||
287 | } | ||
288 | |||
289 | Home = string.Format( | ||
290 | "{{'region_handle':[r{0},r{1}], 'position':[r{2},r{3},r{4}], 'look_at':[r{5},r{6},r{7}]}}", | ||
291 | home.RegionLocX, | ||
292 | home.RegionLocY, | ||
293 | pinfo.HomePosition.X, pinfo.HomePosition.Y, pinfo.HomePosition.Z, | ||
294 | pinfo.HomeLookAt.X, pinfo.HomeLookAt.Y, pinfo.HomeLookAt.Z); | ||
295 | |||
296 | } | ||
297 | |||
298 | private void FillOutRegionData(GridRegion destination) | ||
299 | { | ||
300 | IPEndPoint endPoint = destination.ExternalEndPoint; | ||
301 | SimAddress = endPoint.Address.ToString(); | ||
302 | SimPort = (uint)endPoint.Port; | ||
303 | RegionX = (uint)destination.RegionLocX; | ||
304 | RegionY = (uint)destination.RegionLocY; | ||
305 | } | ||
306 | |||
307 | private void FillOutSeedCap(AgentCircuitData aCircuit, GridRegion destination, IPEndPoint ipepClient) | ||
308 | { | ||
309 | string capsSeedPath = String.Empty; | ||
310 | |||
311 | // Don't use the following! It Fails for logging into any region not on the same port as the http server! | ||
312 | // Kept here so it doesn't happen again! | ||
313 | // response.SeedCapability = regionInfo.ServerURI + capsSeedPath; | ||
314 | |||
315 | #region IP Translation for NAT | ||
316 | if (ipepClient != null) | ||
317 | { | ||
318 | capsSeedPath | ||
319 | = "http://" | ||
320 | + NetworkUtil.GetHostFor(ipepClient.Address, destination.ExternalHostName) | ||
321 | + ":" | ||
322 | + destination.HttpPort | ||
323 | + CapsUtil.GetCapsSeedPath(aCircuit.CapsPath); | ||
324 | } | ||
325 | else | ||
326 | { | ||
327 | capsSeedPath | ||
328 | = "http://" | ||
329 | + destination.ExternalHostName | ||
330 | + ":" | ||
331 | + destination.HttpPort | ||
332 | + CapsUtil.GetCapsSeedPath(aCircuit.CapsPath); | ||
333 | } | ||
334 | #endregion | ||
335 | |||
336 | SeedCapability = capsSeedPath; | ||
337 | } | ||
338 | |||
205 | private void SetDefaultValues() | 339 | private void SetDefaultValues() |
206 | { | 340 | { |
207 | DST = TimeZone.CurrentTimeZone.IsDaylightSavingTime(DateTime.Now) ? "Y" : "N"; | 341 | DST = TimeZone.CurrentTimeZone.IsDaylightSavingTime(DateTime.Now) ? "Y" : "N"; |
@@ -465,6 +599,97 @@ namespace OpenSim.Services.LLLoginService | |||
465 | // this.classifiedCategoriesHash.Clear(); | 599 | // this.classifiedCategoriesHash.Clear(); |
466 | } | 600 | } |
467 | 601 | ||
602 | |||
603 | private static LLLoginResponse.BuddyList ConvertFriendListItem(List<FriendListItem> LFL) | ||
604 | { | ||
605 | LLLoginResponse.BuddyList buddylistreturn = new LLLoginResponse.BuddyList(); | ||
606 | foreach (FriendListItem fl in LFL) | ||
607 | { | ||
608 | LLLoginResponse.BuddyList.BuddyInfo buddyitem = new LLLoginResponse.BuddyList.BuddyInfo(fl.Friend); | ||
609 | buddyitem.BuddyID = fl.Friend; | ||
610 | buddyitem.BuddyRightsHave = (int)fl.FriendListOwnerPerms; | ||
611 | buddyitem.BuddyRightsGiven = (int)fl.FriendPerms; | ||
612 | buddylistreturn.AddNewBuddy(buddyitem); | ||
613 | } | ||
614 | return buddylistreturn; | ||
615 | } | ||
616 | |||
617 | private InventoryData GetInventorySkeleton(List<InventoryFolderBase> folders) | ||
618 | { | ||
619 | UUID rootID = UUID.Zero; | ||
620 | ArrayList AgentInventoryArray = new ArrayList(); | ||
621 | Hashtable TempHash; | ||
622 | foreach (InventoryFolderBase InvFolder in folders) | ||
623 | { | ||
624 | if (InvFolder.ParentID == UUID.Zero) | ||
625 | { | ||
626 | rootID = InvFolder.ID; | ||
627 | } | ||
628 | TempHash = new Hashtable(); | ||
629 | TempHash["name"] = InvFolder.Name; | ||
630 | TempHash["parent_id"] = InvFolder.ParentID.ToString(); | ||
631 | TempHash["version"] = (Int32)InvFolder.Version; | ||
632 | TempHash["type_default"] = (Int32)InvFolder.Type; | ||
633 | TempHash["folder_id"] = InvFolder.ID.ToString(); | ||
634 | AgentInventoryArray.Add(TempHash); | ||
635 | } | ||
636 | |||
637 | return new InventoryData(AgentInventoryArray, rootID); | ||
638 | |||
639 | } | ||
640 | |||
641 | /// <summary> | ||
642 | /// Converts the inventory library skeleton into the form required by the rpc request. | ||
643 | /// </summary> | ||
644 | /// <returns></returns> | ||
645 | protected virtual ArrayList GetInventoryLibrary() | ||
646 | { | ||
647 | // While we don't have library... | ||
648 | //Dictionary<UUID, InventoryFolderImpl> rootFolders | ||
649 | // = m_libraryRootFolder.RequestSelfAndDescendentFolders(); | ||
650 | Dictionary<UUID, InventoryFolderImpl> rootFolders = new Dictionary<UUID,InventoryFolderImpl>(); | ||
651 | ArrayList folderHashes = new ArrayList(); | ||
652 | |||
653 | foreach (InventoryFolderBase folder in rootFolders.Values) | ||
654 | { | ||
655 | Hashtable TempHash = new Hashtable(); | ||
656 | TempHash["name"] = folder.Name; | ||
657 | TempHash["parent_id"] = folder.ParentID.ToString(); | ||
658 | TempHash["version"] = (Int32)folder.Version; | ||
659 | TempHash["type_default"] = (Int32)folder.Type; | ||
660 | TempHash["folder_id"] = folder.ID.ToString(); | ||
661 | folderHashes.Add(TempHash); | ||
662 | } | ||
663 | |||
664 | return folderHashes; | ||
665 | } | ||
666 | |||
667 | /// <summary> | ||
668 | /// | ||
669 | /// </summary> | ||
670 | /// <returns></returns> | ||
671 | protected virtual ArrayList GetLibraryOwner() | ||
672 | { | ||
673 | //for now create random inventory library owner | ||
674 | Hashtable TempHash = new Hashtable(); | ||
675 | TempHash["agent_id"] = "11111111-1111-0000-0000-000100bba000"; | ||
676 | ArrayList inventoryLibOwner = new ArrayList(); | ||
677 | inventoryLibOwner.Add(TempHash); | ||
678 | return inventoryLibOwner; | ||
679 | } | ||
680 | |||
681 | public class InventoryData | ||
682 | { | ||
683 | public ArrayList InventoryArray = null; | ||
684 | public UUID RootFolderID = UUID.Zero; | ||
685 | |||
686 | public InventoryData(ArrayList invList, UUID rootID) | ||
687 | { | ||
688 | InventoryArray = invList; | ||
689 | RootFolderID = rootID; | ||
690 | } | ||
691 | } | ||
692 | |||
468 | #region Properties | 693 | #region Properties |
469 | 694 | ||
470 | public string Login | 695 | public string Login |