aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Environment/XferModule.cs
diff options
context:
space:
mode:
authorMW2007-08-28 14:21:17 +0000
committerMW2007-08-28 14:21:17 +0000
commit8e3b2392d129d727bfd00a2d9faa08d9e5be92de (patch)
tree7e6b89ee495af1d5ea76c58fc0796a3bb38ecc5d /OpenSim/Region/Environment/XferModule.cs
parentEnsure that UserProfileData doesn't pass down null values. (diff)
downloadopensim-SC-8e3b2392d129d727bfd00a2d9faa08d9e5be92de.zip
opensim-SC-8e3b2392d129d727bfd00a2d9faa08d9e5be92de.tar.gz
opensim-SC-8e3b2392d129d727bfd00a2d9faa08d9e5be92de.tar.bz2
opensim-SC-8e3b2392d129d727bfd00a2d9faa08d9e5be92de.tar.xz
Start of trying to make Region/Scene more modular.
Added preliminary IRegionModule interface. Also have a work in progress way of Modules registering optional API methods (kind of like Apache optional functions). But there must be a cleaner/nicer way in c# of doing these than the current way. Added three work in progress modules: ChatModule (simple handles in world chat, but by moving this to a module, we could support other types of chat modules, ie like a irc - opensim bridge module. ) , AvatarProfilesModule and XferModule. Moved most of the code from Scene.ModifyTerrain() into the BasicTerrain library, as the start of trying to make that more modular. Stopped Child agents showing up as part of the "show users" command.
Diffstat (limited to 'OpenSim/Region/Environment/XferModule.cs')
-rw-r--r--OpenSim/Region/Environment/XferModule.cs175
1 files changed, 175 insertions, 0 deletions
diff --git a/OpenSim/Region/Environment/XferModule.cs b/OpenSim/Region/Environment/XferModule.cs
new file mode 100644
index 0000000..beb72120
--- /dev/null
+++ b/OpenSim/Region/Environment/XferModule.cs
@@ -0,0 +1,175 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5using libsecondlife;
6using OpenSim.Framework.Interfaces;
7using OpenSim.Framework.Utilities;
8using OpenSim.Region.Environment.Scenes;
9using OpenSim.Region.Environment.Interfaces;
10
11namespace OpenSim.Region.Environment
12{
13 public class XferModule : IRegionModule
14 {
15 public Dictionary<string, byte[]> NewFiles = new Dictionary<string, byte[]>();
16 public Dictionary<ulong, XferDownLoad> Transfers = new Dictionary<ulong, XferDownLoad>();
17
18 private Scene m_scene;
19
20 public XferModule()
21 {
22
23 }
24
25 public void Initialise(Scene scene)
26 {
27 m_scene = scene;
28 m_scene.EventManager.OnNewClient += NewClient;
29
30 m_scene.RegisterAPIMethod("API_AddXferFile", new ModuleAPIMethod<bool, string, byte[]>(this.AddNewFile));
31 }
32
33 public void PostInitialise()
34 {
35
36 }
37
38 public void CloseDown()
39 {
40
41 }
42
43 public string GetName()
44 {
45 return "XferModule";
46 }
47
48 public void NewClient(IClientAPI client)
49 {
50 client.OnRequestXfer += RequestXfer;
51 client.OnConfirmXfer += AckPacket;
52 }
53
54 /// <summary>
55 ///
56 /// </summary>
57 /// <param name="remoteClient"></param>
58 /// <param name="xferID"></param>
59 /// <param name="fileName"></param>
60 public void RequestXfer(IClientAPI remoteClient, ulong xferID, string fileName)
61 {
62 lock (NewFiles)
63 {
64 if (NewFiles.ContainsKey(fileName))
65 {
66 if (!Transfers.ContainsKey(xferID))
67 {
68 byte[] fileData = NewFiles[fileName];
69 XferDownLoad transaction = new XferDownLoad(fileName, fileData, xferID, remoteClient);
70 Transfers.Add(xferID, transaction);
71 NewFiles.Remove(fileName);
72 transaction.StartSend();
73 }
74 }
75 }
76 }
77
78 public void AckPacket(IClientAPI remoteClient, ulong xferID, uint packet)
79 {
80 if (this.Transfers.ContainsKey(xferID))
81 {
82 Transfers[xferID].AckPacket(packet);
83 }
84 }
85
86 public bool AddNewFile(string fileName, byte[] data)
87 {
88 lock (NewFiles)
89 {
90 if (NewFiles.ContainsKey(fileName))
91 {
92 NewFiles[fileName] = data;
93 }
94 else
95 {
96 NewFiles.Add(fileName, data);
97 }
98 }
99 return true;
100 }
101
102
103 public class XferDownLoad
104 {
105 public byte[] Data = new byte[0];
106 public string FileName = "";
107 public ulong XferID = 0;
108 public int DataPointer = 0;
109 public uint Packet = 0;
110 public IClientAPI Client;
111 public uint Serial = 1;
112 private bool complete = false;
113
114 public XferDownLoad(string fileName, byte[] data, ulong xferID, IClientAPI client)
115 {
116 FileName = fileName;
117 Data = data;
118 XferID = xferID;
119 Client = client;
120 }
121
122 public XferDownLoad()
123 {
124
125 }
126
127 public void StartSend()
128 {
129 if (Data.Length < 1000)
130 {
131 // for now (testing ) we only support files under 1000 bytes
132 byte[] transferData = new byte[Data.Length + 4];
133 Array.Copy(Helpers.IntToBytes(Data.Length), 0, transferData, 0, 4);
134 Array.Copy(Data, 0, transferData, 4, Data.Length);
135 Client.SendXferPacket(XferID, 0 + 0x80000000, transferData);
136 complete = true;
137 }
138 else
139 {
140 byte[] transferData = new byte[1000 +4];
141 Array.Copy(Helpers.IntToBytes(Data.Length), 0, transferData, 0, 4);
142 Array.Copy(Data, 0, transferData, 4, 1000);
143 Client.SendXferPacket(XferID, 0 , transferData);
144 Packet++;
145 DataPointer = 1000;
146 }
147 }
148
149 public void AckPacket(uint packet)
150 {
151 if (!complete)
152 {
153 if ((Data.Length - DataPointer) > 1000)
154 {
155 byte[] transferData = new byte[1000];
156 Array.Copy(Data, DataPointer, transferData, 0, 1000);
157 Client.SendXferPacket(XferID, Packet, transferData);
158 Packet++;
159 DataPointer += 1000;
160 }
161 else
162 {
163 byte[] transferData = new byte[Data.Length - DataPointer];
164 Array.Copy(Data, DataPointer, transferData, 0, Data.Length - DataPointer);
165 uint endPacket = Packet |= (uint)0x80000000;
166 Client.SendXferPacket(XferID, endPacket, transferData);
167 Packet++;
168 DataPointer += (Data.Length - DataPointer);
169 complete = true;
170 }
171 }
172 }
173 }
174 }
175}