aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs84
1 files changed, 49 insertions, 35 deletions
diff --git a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs
index 4f9e32b..df4ff05 100644
--- a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs
+++ b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs
@@ -37,9 +37,9 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
37{ 37{
38 public class XferModule : IRegionModule, IXfer 38 public class XferModule : IRegionModule, IXfer
39 { 39 {
40 private static uint counter = 0;
40 private Scene m_scene; 41 private Scene m_scene;
41 private Dictionary<string, XferRequest> Requests = new Dictionary<string, XferRequest>(); 42 private Dictionary<string, XferRequest> Requests = new Dictionary<string, XferRequest>();
42 private List<XferRequest> RequestTime = new List<XferRequest>();
43 private Dictionary<string, FileData> NewFiles = new Dictionary<string, FileData>(); 43 private Dictionary<string, FileData> NewFiles = new Dictionary<string, FileData>();
44 private Dictionary<ulong, XferDownLoad> Transfers = new Dictionary<ulong, XferDownLoad>(); 44 private Dictionary<ulong, XferDownLoad> Transfers = new Dictionary<ulong, XferDownLoad>();
45 45
@@ -95,18 +95,29 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
95 lock (NewFiles) 95 lock (NewFiles)
96 { 96 {
97 if (NewFiles.ContainsKey(fileName)) 97 if (NewFiles.ContainsKey(fileName))
98 {
98 NewFiles[fileName].Count++; 99 NewFiles[fileName].Count++;
100 //Console.WriteLine("AddNewFile " + fileName + " counter=" + NewFiles[fileName].Count);
101 }
99 else 102 else
100 { 103 {
101 FileData fd = new FileData(); 104 FileData fd = new FileData();
102 fd.Count = 1; 105 fd.Count = 1;
103 fd.Data = data; 106 fd.Data = data;
104 NewFiles.Add(fileName, fd); 107 NewFiles.Add(fileName, fd);
108 //Console.WriteLine("AddNewFile " + fileName);
105 } 109 }
106 } 110 }
107 111
112 // This happens when the Xfer request ends up coming before
113 // the fileName is added by this method. That may happen when
114 // the file generation (the event that calle this method)
115 // takes a long time. In this case, we need to kick the
116 // Xfer request mannually.
108 if (Requests.ContainsKey(fileName)) 117 if (Requests.ContainsKey(fileName))
109 { 118 {
119 //Console.WriteLine("*** AddNewFile Requests.Contains " + fileName);
120
110 RequestXfer(Requests[fileName].remoteClient, Requests[fileName].xferID, fileName); 121 RequestXfer(Requests[fileName].remoteClient, Requests[fileName].xferID, fileName);
111 Requests.Remove(fileName); 122 Requests.Remove(fileName);
112 } 123 }
@@ -133,22 +144,14 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
133 { 144 {
134 lock (NewFiles) 145 lock (NewFiles)
135 { 146 {
136 if (RequestTime.Count > 0) 147 //Console.WriteLine("---- RequestXfer " + fileName + " ----");
137 {
138 TimeSpan ts = new TimeSpan(DateTime.UtcNow.Ticks - RequestTime[0].timeStamp.Ticks);
139 if (ts.TotalSeconds > 30)
140 {
141 ulong zxferid = RequestTime[0].xferID;
142 remoteClient.SendAbortXferPacket(zxferid);
143 RemoveXferData(zxferid);
144 RemoveOrDecrement(fileName);
145 }
146 }
147 148
148 if (NewFiles.ContainsKey(fileName)) 149 if (NewFiles.ContainsKey(fileName))
149 { 150 {
151 //Console.WriteLine("NewFiles.ContainsKey " + fileName + " with count=" + NewFiles[fileName].Count);
150 if (!Transfers.ContainsKey(xferID)) 152 if (!Transfers.ContainsKey(xferID))
151 { 153 {
154 //Console.WriteLine("!Transfers.ContainsKey("+xferID+")");
152 byte[] fileData = NewFiles[fileName].Data; 155 byte[] fileData = NewFiles[fileName].Data;
153 XferDownLoad transaction = new XferDownLoad(fileName, fileData, xferID, remoteClient); 156 XferDownLoad transaction = new XferDownLoad(fileName, fileData, xferID, remoteClient);
154 157
@@ -166,27 +169,38 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
166 } 169 }
167 else 170 else
168 { 171 {
169 if (RequestTime.Count > 0) 172 ////Console.WriteLine("*** ! NewFiles.ContainsKey " + fileName);
170 { 173 //if (RequestTime.Count > 0)
171 TimeSpan ts = new TimeSpan(DateTime.UtcNow.Ticks - RequestTime[0].timeStamp.Ticks); 174 //{
172 if (ts.TotalSeconds > 30) 175 // //Console.WriteLine("RequestTime.Count > 0");
173 { 176 // TimeSpan ts = new TimeSpan(DateTime.UtcNow.Ticks - RequestTime[0].timeStamp.Ticks);
174 Requests.Remove(RequestTime[0].fileName); 177 // if (ts.TotalSeconds > 30)
175 RequestTime.RemoveAt(0); 178 // {
176 // Do we want to abort this here? 179 // Console.WriteLine("ts.TotalSeconds > 30");
177 //remoteClient.SendAbortXfer(xferID); 180 // Requests.Remove(RequestTime[0].fileName);
178 } 181 // RequestTime.RemoveAt(0);
179 } 182 // // Do we want to abort this here?
183 // //remoteClient.SendAbortXfer(xferID);
184 // }
185 //}
186
187 XferRequest nRequest = new XferRequest();
188 nRequest.remoteClient = remoteClient;
189 nRequest.xferID = xferID;
190 nRequest.fileName = fileName;
191 nRequest.timeStamp = DateTime.UtcNow;
192 nRequest.fileName = fileName;
180 193
181 if (!Requests.ContainsKey(fileName)) 194 if (!Requests.ContainsKey(fileName))
182 { 195 {
183 XferRequest nRequest = new XferRequest(); 196 //Console.WriteLine("**** !Requests.ContainsKey(" + fileName + ")");
184 nRequest.remoteClient = remoteClient;
185 nRequest.xferID = xferID;
186 nRequest.fileName = fileName;
187 nRequest.timeStamp = DateTime.UtcNow;
188 Requests.Add(fileName, nRequest); 197 Requests.Add(fileName, nRequest);
189 RequestTime.Add(nRequest); 198 }
199 else
200 {
201 //Console.WriteLine("**** Requests.ContainsKey(" + fileName + ")");
202 Requests.Add(fileName + "-" + counter.ToString(), nRequest);
203 counter++;
190 } 204 }
191 205
192 } 206 }
@@ -203,17 +217,13 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
203 XferDownLoad dl = Transfers[xferID]; 217 XferDownLoad dl = Transfers[xferID];
204 if (Transfers[xferID].AckPacket(packet)) 218 if (Transfers[xferID].AckPacket(packet))
205 { 219 {
206 { 220 RemoveXferData(xferID);
207 RemoveXferData(xferID); 221 RemoveOrDecrement(dl.FileName);
208 RemoveOrDecrement(dl.FileName);
209 }
210 } 222 }
211 else 223 else
212 { 224 {
213
214 if (Requests.ContainsKey(dl.FileName)) 225 if (Requests.ContainsKey(dl.FileName))
215 { 226 {
216 //
217 XferRequest req = Requests[dl.FileName]; 227 XferRequest req = Requests[dl.FileName];
218 req.timeStamp = DateTime.UtcNow; 228 req.timeStamp = DateTime.UtcNow;
219 Requests[dl.FileName] = req; 229 Requests[dl.FileName] = req;
@@ -262,9 +272,13 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
262 if (NewFiles.ContainsKey(fileName)) 272 if (NewFiles.ContainsKey(fileName))
263 { 273 {
264 if (NewFiles[fileName].Count == 1) 274 if (NewFiles[fileName].Count == 1)
275 {
265 NewFiles.Remove(fileName); 276 NewFiles.Remove(fileName);
277 }
266 else 278 else
279 {
267 NewFiles[fileName].Count--; 280 NewFiles[fileName].Count--;
281 }
268 } 282 }
269 } 283 }
270 284