ClientView.ProcessPackets.cs 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524
  1. /*
  2. * Copyright (c) Contributors, http://www.openmetaverse.org/
  3. * See CONTRIBUTORS.TXT for a full list of copyright holders.
  4. *
  5. * Redistribution and use in source and binary forms, with or without
  6. * modification, are permitted provided that the following conditions are met:
  7. * * Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions and the following disclaimer.
  9. * * Redistributions in binary form must reproduce the above copyright
  10. * notice, this list of conditions and the following disclaimer in the
  11. * documentation and/or other materials provided with the distribution.
  12. * * Neither the name of the OpenSim Project nor the
  13. * names of its contributors may be used to endorse or promote products
  14. * derived from this software without specific prior written permission.
  15. *
  16. * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
  17. * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  18. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  19. * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
  20. * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  21. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  22. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  23. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  24. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  25. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. *
  27. */
  28. using System;
  29. using System.Collections;
  30. using System.Collections.Generic;
  31. using libsecondlife;
  32. using libsecondlife.Packets;
  33. using Nwc.XmlRpc;
  34. using System.Net;
  35. using System.Net.Sockets;
  36. using System.IO;
  37. using System.Threading;
  38. using System.Timers;
  39. using OpenSim.Framework.Interfaces;
  40. using OpenSim.Framework.Types;
  41. using OpenSim.Framework.Inventory;
  42. using OpenSim.Framework.Utilities;
  43. using OpenSim.Assets;
  44. namespace OpenSim
  45. {
  46. public partial class ClientView
  47. {
  48. protected override void ProcessInPacket(Packet Pack)
  49. {
  50. ack_pack(Pack);
  51. if (debug)
  52. {
  53. if (Pack.Type != PacketType.AgentUpdate)
  54. {
  55. Console.WriteLine(Pack.Type.ToString());
  56. }
  57. }
  58. if (this.ProcessPacketMethod(Pack))
  59. {
  60. //there is a handler registered that handled this packet type
  61. return;
  62. }
  63. else
  64. {
  65. System.Text.Encoding _enc = System.Text.Encoding.ASCII;
  66. switch (Pack.Type)
  67. {
  68. case PacketType.ViewerEffect:
  69. ViewerEffectPacket viewer = (ViewerEffectPacket)Pack;
  70. foreach (ClientView client in m_clientThreads.Values)
  71. {
  72. if (client.AgentID != this.AgentID)
  73. {
  74. viewer.AgentData.AgentID = client.AgentID;
  75. viewer.AgentData.SessionID = client.SessionID;
  76. client.OutPacket(viewer);
  77. }
  78. }
  79. break;
  80. #region World/Avatar
  81. case PacketType.ChatFromViewer:
  82. ChatFromViewerPacket inchatpack = (ChatFromViewerPacket)Pack;
  83. if (Util.FieldToString(inchatpack.ChatData.Message) == "")
  84. {
  85. //empty message so don't bother with it
  86. break;
  87. }
  88. string fromName = ""; //ClientAvatar.firstname + " " + ClientAvatar.lastname;
  89. byte[] message = inchatpack.ChatData.Message;
  90. byte type = inchatpack.ChatData.Type;
  91. LLVector3 fromPos = new LLVector3(); // ClientAvatar.Pos;
  92. LLUUID fromAgentID = AgentID;
  93. if (OnChatFromViewer != null)
  94. {
  95. this.OnChatFromViewer(message, type, fromPos, fromName, fromAgentID);
  96. }
  97. break;
  98. case PacketType.RezObject:
  99. RezObjectPacket rezPacket = (RezObjectPacket)Pack;
  100. AgentInventory inven = this.m_inventoryCache.GetAgentsInventory(this.AgentID);
  101. if (inven != null)
  102. {
  103. if (inven.InventoryItems.ContainsKey(rezPacket.InventoryData.ItemID))
  104. {
  105. AssetBase asset = this.m_assetCache.GetAsset(inven.InventoryItems[rezPacket.InventoryData.ItemID].AssetID);
  106. if (asset != null)
  107. {
  108. if (OnRezObject != null)
  109. {
  110. this.OnRezObject(asset, rezPacket.RezData.RayEnd);
  111. this.m_inventoryCache.DeleteInventoryItem(this, rezPacket.InventoryData.ItemID);
  112. }
  113. }
  114. }
  115. }
  116. break;
  117. case PacketType.DeRezObject:
  118. if (OnDeRezObject != null)
  119. {
  120. OnDeRezObject(Pack, this);
  121. }
  122. break;
  123. case PacketType.ModifyLand:
  124. ModifyLandPacket modify = (ModifyLandPacket)Pack;
  125. if (modify.ParcelData.Length > 0)
  126. {
  127. if (OnModifyTerrain != null)
  128. {
  129. OnModifyTerrain(modify.ModifyBlock.Action, modify.ParcelData[0].North, modify.ParcelData[0].West);
  130. }
  131. }
  132. break;
  133. case PacketType.RegionHandshakeReply:
  134. if (OnRegionHandShakeReply != null)
  135. {
  136. OnRegionHandShakeReply(this);
  137. }
  138. break;
  139. case PacketType.AgentWearablesRequest:
  140. if (OnRequestWearables != null)
  141. {
  142. OnRequestWearables(this);
  143. }
  144. if (OnRequestAvatarsData != null)
  145. {
  146. OnRequestAvatarsData(this);
  147. }
  148. break;
  149. case PacketType.AgentSetAppearance:
  150. AgentSetAppearancePacket appear = (AgentSetAppearancePacket)Pack;
  151. if (OnSetAppearance != null)
  152. {
  153. OnSetAppearance(appear.ObjectData.TextureEntry, appear.VisualParam);
  154. }
  155. break;
  156. case PacketType.CompleteAgentMovement:
  157. if (OnCompleteMovementToRegion != null)
  158. {
  159. OnCompleteMovementToRegion();
  160. }
  161. break;
  162. case PacketType.AgentUpdate:
  163. if (OnAgentUpdate != null)
  164. {
  165. AgentUpdatePacket agenUpdate = (AgentUpdatePacket) Pack;
  166. OnAgentUpdate(this, agenUpdate.AgentData.ControlFlags, agenUpdate.AgentData.BodyRotation );
  167. }
  168. break;
  169. case PacketType.AgentAnimation:
  170. if (!m_child)
  171. {
  172. AgentAnimationPacket AgentAni = (AgentAnimationPacket)Pack;
  173. for (int i = 0; i < AgentAni.AnimationList.Length; i++)
  174. {
  175. if (AgentAni.AnimationList[i].StartAnim)
  176. {
  177. if (OnStartAnim != null)
  178. {
  179. OnStartAnim(AgentAni.AnimationList[i].AnimID, 1);
  180. }
  181. }
  182. }
  183. }
  184. break;
  185. #endregion
  186. #region Objects/Prims
  187. case PacketType.ObjectLink:
  188. // OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.LOW, Pack.ToString());
  189. ObjectLinkPacket link = (ObjectLinkPacket)Pack;
  190. uint parentprimid = 0;
  191. List<uint> childrenprims = new List<uint>();
  192. if (link.ObjectData.Length > 1)
  193. {
  194. parentprimid = link.ObjectData[0].ObjectLocalID;
  195. for (int i = 1; i < link.ObjectData.Length; i++)
  196. {
  197. childrenprims.Add(link.ObjectData[i].ObjectLocalID);
  198. }
  199. }
  200. if (OnLinkObjects != null)
  201. {
  202. OnLinkObjects(parentprimid, childrenprims);
  203. }
  204. break;
  205. case PacketType.ObjectAdd:
  206. // m_world.AddNewPrim((ObjectAddPacket)Pack, this);
  207. if (OnAddPrim != null)
  208. {
  209. OnAddPrim(Pack, this);
  210. }
  211. break;
  212. case PacketType.ObjectShape:
  213. ObjectShapePacket shape = (ObjectShapePacket)Pack;
  214. for (int i = 0; i < shape.ObjectData.Length; i++)
  215. {
  216. if (OnUpdatePrimShape != null)
  217. {
  218. OnUpdatePrimShape(shape.ObjectData[i].ObjectLocalID, shape.ObjectData[i]);
  219. }
  220. }
  221. break;
  222. case PacketType.ObjectSelect:
  223. ObjectSelectPacket incomingselect = (ObjectSelectPacket)Pack;
  224. for (int i = 0; i < incomingselect.ObjectData.Length; i++)
  225. {
  226. if (OnObjectSelect != null)
  227. {
  228. OnObjectSelect(incomingselect.ObjectData[i].ObjectLocalID, this);
  229. }
  230. }
  231. break;
  232. case PacketType.ObjectFlagUpdate:
  233. ObjectFlagUpdatePacket flags = (ObjectFlagUpdatePacket)Pack;
  234. if (OnUpdatePrimFlags != null)
  235. {
  236. OnUpdatePrimFlags(flags.AgentData.ObjectLocalID, Pack, this);
  237. }
  238. break;
  239. case PacketType.ObjectImage:
  240. ObjectImagePacket imagePack = (ObjectImagePacket)Pack;
  241. for (int i = 0; i < imagePack.ObjectData.Length; i++)
  242. {
  243. if (OnUpdatePrimTexture != null)
  244. {
  245. OnUpdatePrimTexture(imagePack.ObjectData[i].ObjectLocalID, imagePack.ObjectData[i].TextureEntry, this);
  246. }
  247. }
  248. break;
  249. #endregion
  250. #region Inventory/Asset/Other related packets
  251. case PacketType.RequestImage:
  252. RequestImagePacket imageRequest = (RequestImagePacket)Pack;
  253. for (int i = 0; i < imageRequest.RequestImage.Length; i++)
  254. {
  255. m_assetCache.AddTextureRequest(this, imageRequest.RequestImage[i].Image);
  256. }
  257. break;
  258. case PacketType.TransferRequest:
  259. //Console.WriteLine("OpenSimClient.cs:ProcessInPacket() - Got transfer request");
  260. TransferRequestPacket transfer = (TransferRequestPacket)Pack;
  261. m_assetCache.AddAssetRequest(this, transfer);
  262. break;
  263. case PacketType.AssetUploadRequest:
  264. AssetUploadRequestPacket request = (AssetUploadRequestPacket)Pack;
  265. this.UploadAssets.HandleUploadPacket(request, request.AssetBlock.TransactionID.Combine(this.SecureSessionID));
  266. break;
  267. case PacketType.RequestXfer:
  268. //Console.WriteLine(Pack.ToString());
  269. break;
  270. case PacketType.SendXferPacket:
  271. this.UploadAssets.HandleXferPacket((SendXferPacketPacket)Pack);
  272. break;
  273. case PacketType.CreateInventoryFolder:
  274. CreateInventoryFolderPacket invFolder = (CreateInventoryFolderPacket)Pack;
  275. m_inventoryCache.CreateNewInventoryFolder(this, invFolder.FolderData.FolderID, (ushort)invFolder.FolderData.Type, Util.FieldToString(invFolder.FolderData.Name), invFolder.FolderData.ParentID);
  276. //Console.WriteLine(Pack.ToString());
  277. break;
  278. case PacketType.CreateInventoryItem:
  279. //Console.WriteLine(Pack.ToString());
  280. CreateInventoryItemPacket createItem = (CreateInventoryItemPacket)Pack;
  281. if (createItem.InventoryBlock.TransactionID != LLUUID.Zero)
  282. {
  283. this.UploadAssets.CreateInventoryItem(createItem);
  284. }
  285. else
  286. {
  287. // Console.Write(Pack.ToString());
  288. this.CreateInventoryItem(createItem);
  289. }
  290. break;
  291. case PacketType.FetchInventory:
  292. //Console.WriteLine("fetch item packet");
  293. FetchInventoryPacket FetchInventory = (FetchInventoryPacket)Pack;
  294. m_inventoryCache.FetchInventory(this, FetchInventory);
  295. break;
  296. case PacketType.FetchInventoryDescendents:
  297. FetchInventoryDescendentsPacket Fetch = (FetchInventoryDescendentsPacket)Pack;
  298. m_inventoryCache.FetchInventoryDescendents(this, Fetch);
  299. break;
  300. case PacketType.UpdateInventoryItem:
  301. UpdateInventoryItemPacket update = (UpdateInventoryItemPacket)Pack;
  302. //Console.WriteLine(Pack.ToString());
  303. for (int i = 0; i < update.InventoryData.Length; i++)
  304. {
  305. if (update.InventoryData[i].TransactionID != LLUUID.Zero)
  306. {
  307. AssetBase asset = m_assetCache.GetAsset(update.InventoryData[i].TransactionID.Combine(this.SecureSessionID));
  308. if (asset != null)
  309. {
  310. // Console.WriteLine("updating inventory item, found asset" + asset.FullID.ToStringHyphenated() + " already in cache");
  311. m_inventoryCache.UpdateInventoryItemAsset(this, update.InventoryData[i].ItemID, asset);
  312. }
  313. else
  314. {
  315. asset = this.UploadAssets.AddUploadToAssetCache(update.InventoryData[i].TransactionID);
  316. if (asset != null)
  317. {
  318. //Console.WriteLine("updating inventory item, adding asset" + asset.FullID.ToStringHyphenated() + " to cache");
  319. m_inventoryCache.UpdateInventoryItemAsset(this, update.InventoryData[i].ItemID, asset);
  320. }
  321. else
  322. {
  323. //Console.WriteLine("trying to update inventory item, but asset is null");
  324. }
  325. }
  326. }
  327. else
  328. {
  329. m_inventoryCache.UpdateInventoryItemDetails(this, update.InventoryData[i].ItemID, update.InventoryData[i]); ;
  330. }
  331. }
  332. break;
  333. case PacketType.RequestTaskInventory:
  334. // Console.WriteLine(Pack.ToString());
  335. RequestTaskInventoryPacket requesttask = (RequestTaskInventoryPacket)Pack;
  336. ReplyTaskInventoryPacket replytask = new ReplyTaskInventoryPacket();
  337. bool foundent = false;
  338. /* foreach (Entity ent in m_world.Entities.Values)
  339. {
  340. if (ent.localid == requesttask.InventoryData.LocalID)
  341. {
  342. replytask.InventoryData.TaskID = ent.uuid;
  343. replytask.InventoryData.Serial = 0;
  344. replytask.InventoryData.Filename = new byte[0];
  345. foundent = true;
  346. }
  347. }
  348. if (foundent)
  349. {
  350. this.OutPacket(replytask);
  351. }*/
  352. break;
  353. case PacketType.UpdateTaskInventory:
  354. // Console.WriteLine(Pack.ToString());
  355. UpdateTaskInventoryPacket updatetask = (UpdateTaskInventoryPacket)Pack;
  356. AgentInventory myinventory = this.m_inventoryCache.GetAgentsInventory(this.AgentID);
  357. /*if (myinventory != null)
  358. {
  359. if (updatetask.UpdateData.Key == 0)
  360. {
  361. if (myinventory.InventoryItems[updatetask.InventoryData.ItemID] != null)
  362. {
  363. if (myinventory.InventoryItems[updatetask.InventoryData.ItemID].Type == 7)
  364. {
  365. LLUUID noteaid = myinventory.InventoryItems[updatetask.InventoryData.ItemID].AssetID;
  366. AssetBase assBase = this.m_assetCache.GetAsset(noteaid);
  367. if (assBase != null)
  368. {
  369. foreach (Entity ent in m_world.Entities.Values)
  370. {
  371. if (ent.localid == updatetask.UpdateData.LocalID)
  372. {
  373. if (ent is OpenSim.world.Primitive)
  374. {
  375. this.m_world.AddScript(ent, Util.FieldToString(assBase.Data));
  376. }
  377. }
  378. }
  379. }
  380. }
  381. }
  382. }
  383. }*/
  384. break;
  385. case PacketType.MapLayerRequest:
  386. this.RequestMapLayer();
  387. break;
  388. case PacketType.MapBlockRequest:
  389. MapBlockRequestPacket MapRequest = (MapBlockRequestPacket)Pack;
  390. if (OnRequestMapBlocks != null)
  391. {
  392. OnRequestMapBlocks(this, MapRequest.PositionData.MinX, MapRequest.PositionData.MinY, MapRequest.PositionData.MaxX, MapRequest.PositionData.MaxY);
  393. }
  394. break;
  395. case PacketType.TeleportLandmarkRequest:
  396. TeleportLandmarkRequestPacket tpReq = (TeleportLandmarkRequestPacket)Pack;
  397. TeleportStartPacket tpStart = new TeleportStartPacket();
  398. tpStart.Info.TeleportFlags = 8; // tp via lm
  399. this.OutPacket(tpStart);
  400. TeleportProgressPacket tpProgress = new TeleportProgressPacket();
  401. tpProgress.Info.Message = (new System.Text.ASCIIEncoding()).GetBytes("sending_landmark");
  402. tpProgress.Info.TeleportFlags = 8;
  403. tpProgress.AgentData.AgentID = tpReq.Info.AgentID;
  404. this.OutPacket(tpProgress);
  405. // Fetch landmark
  406. LLUUID lmid = tpReq.Info.LandmarkID;
  407. AssetBase lma = this.m_assetCache.GetAsset(lmid);
  408. if (lma != null)
  409. {
  410. AssetLandmark lm = new AssetLandmark(lma);
  411. if (lm.RegionID == m_regionData.SimUUID)
  412. {
  413. TeleportLocalPacket tpLocal = new TeleportLocalPacket();
  414. tpLocal.Info.AgentID = tpReq.Info.AgentID;
  415. tpLocal.Info.TeleportFlags = 8; // Teleport via landmark
  416. tpLocal.Info.LocationID = 2;
  417. tpLocal.Info.Position = lm.Position;
  418. OutPacket(tpLocal);
  419. }
  420. else
  421. {
  422. TeleportCancelPacket tpCancel = new TeleportCancelPacket();
  423. tpCancel.Info.AgentID = tpReq.Info.AgentID;
  424. tpCancel.Info.SessionID = tpReq.Info.SessionID;
  425. OutPacket(tpCancel);
  426. }
  427. }
  428. else
  429. {
  430. Console.WriteLine("Cancelling Teleport - fetch asset not yet implemented");
  431. TeleportCancelPacket tpCancel = new TeleportCancelPacket();
  432. tpCancel.Info.AgentID = tpReq.Info.AgentID;
  433. tpCancel.Info.SessionID = tpReq.Info.SessionID;
  434. OutPacket(tpCancel);
  435. }
  436. break;
  437. case PacketType.TeleportLocationRequest:
  438. TeleportLocationRequestPacket tpLocReq = (TeleportLocationRequestPacket)Pack;
  439. // Console.WriteLine(tpLocReq.ToString());
  440. if (OnTeleportLocationRequest != null)
  441. {
  442. OnTeleportLocationRequest(this, tpLocReq.Info.RegionHandle, tpLocReq.Info.Position, tpLocReq.Info.LookAt, 16);
  443. }
  444. else
  445. {
  446. //no event handler so cancel request
  447. TeleportCancelPacket tpCancel = new TeleportCancelPacket();
  448. tpCancel.Info.SessionID = tpLocReq.AgentData.SessionID;
  449. tpCancel.Info.AgentID = tpLocReq.AgentData.AgentID;
  450. OutPacket(tpCancel);
  451. }
  452. break;
  453. #endregion
  454. #region Parcel related packets
  455. case PacketType.ParcelPropertiesRequest:
  456. ParcelPropertiesRequestPacket propertiesRequest = (ParcelPropertiesRequestPacket)Pack;
  457. if (OnParcelPropertiesRequest != null)
  458. {
  459. OnParcelPropertiesRequest((int)Math.Round(propertiesRequest.ParcelData.West), (int)Math.Round(propertiesRequest.ParcelData.South), (int)Math.Round(propertiesRequest.ParcelData.East), (int)Math.Round(propertiesRequest.ParcelData.North), propertiesRequest.ParcelData.SequenceID, propertiesRequest.ParcelData.SnapSelection, this);
  460. }
  461. break;
  462. case PacketType.ParcelDivide:
  463. ParcelDividePacket parcelDivide = (ParcelDividePacket)Pack;
  464. if (OnParcelDivideRequest != null)
  465. {
  466. OnParcelDivideRequest((int)Math.Round(parcelDivide.ParcelData.West), (int)Math.Round(parcelDivide.ParcelData.South), (int)Math.Round(parcelDivide.ParcelData.East), (int)Math.Round(parcelDivide.ParcelData.North), this);
  467. }
  468. break;
  469. case PacketType.ParcelJoin:
  470. ParcelJoinPacket parcelJoin = (ParcelJoinPacket)Pack;
  471. if (OnParcelJoinRequest != null)
  472. {
  473. OnParcelJoinRequest((int)Math.Round(parcelJoin.ParcelData.West), (int)Math.Round(parcelJoin.ParcelData.South), (int)Math.Round(parcelJoin.ParcelData.East), (int)Math.Round(parcelJoin.ParcelData.North), this);
  474. }
  475. break;
  476. case PacketType.ParcelPropertiesUpdate:
  477. ParcelPropertiesUpdatePacket updatePacket = (ParcelPropertiesUpdatePacket)Pack;
  478. if (OnParcelPropertiesUpdateRequest != null)
  479. {
  480. OnParcelPropertiesUpdateRequest(updatePacket, this);
  481. }
  482. break;
  483. #endregion
  484. #region Estate Packets
  485. case PacketType.EstateOwnerMessage:
  486. EstateOwnerMessagePacket messagePacket = (EstateOwnerMessagePacket)Pack;
  487. if (OnEstateOwnerMessage != null)
  488. {
  489. OnEstateOwnerMessage(messagePacket, this);
  490. }
  491. break;
  492. #endregion
  493. #region unimplemented handlers
  494. case PacketType.AgentIsNowWearing:
  495. // AgentIsNowWearingPacket wear = (AgentIsNowWearingPacket)Pack;
  496. //Console.WriteLine(Pack.ToString());
  497. break;
  498. case PacketType.ObjectScale:
  499. //OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.LOW, Pack.ToString());
  500. break;
  501. #endregion
  502. }
  503. }
  504. }
  505. }
  506. }