aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs')
-rw-r--r--OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs58
1 files changed, 42 insertions, 16 deletions
diff --git a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs
index 57875da..c5a6e62 100644
--- a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs
+++ b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs
@@ -40,8 +40,8 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
40 private Scene m_scene; 40 private Scene m_scene;
41 private Dictionary<string, XferRequest> Requests = new Dictionary<string, XferRequest>(); 41 private Dictionary<string, XferRequest> Requests = new Dictionary<string, XferRequest>();
42 private List<XferRequest> RequestTime = new List<XferRequest>(); 42 private List<XferRequest> RequestTime = new List<XferRequest>();
43 public Dictionary<string, byte[]> NewFiles = new Dictionary<string, byte[]>(); 43 private Dictionary<string, FileData> NewFiles = new Dictionary<string, FileData>();
44 public Dictionary<ulong, XferDownLoad> Transfers = new Dictionary<ulong, XferDownLoad>(); 44 private Dictionary<ulong, XferDownLoad> Transfers = new Dictionary<ulong, XferDownLoad>();
45 45
46 46
47 public struct XferRequest 47 public struct XferRequest
@@ -51,6 +51,12 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
51 public string fileName; 51 public string fileName;
52 public DateTime timeStamp; 52 public DateTime timeStamp;
53 } 53 }
54
55 private class FileData
56 {
57 public byte[] Data;
58 public int Count;
59 }
54 60
55 #region IRegionModule Members 61 #region IRegionModule Members
56 62
@@ -89,21 +95,22 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
89 lock (NewFiles) 95 lock (NewFiles)
90 { 96 {
91 if (NewFiles.ContainsKey(fileName)) 97 if (NewFiles.ContainsKey(fileName))
92 { 98 NewFiles[fileName].Count++;
93 NewFiles[fileName] = data;
94 }
95 else 99 else
96 { 100 {
97 NewFiles.Add(fileName, data); 101 FileData fd = new FileData();
102 fd.Count = 1;
103 fd.Data = data;
104 NewFiles.Add(fileName, fd);
98 } 105 }
99 } 106 }
100 string filename = string.Empty;
101 107
102 if (Requests.ContainsKey(fileName)) 108 // This should not be here
103 { 109 //if (Requests.ContainsKey(fileName))
104 RequestXfer(Requests[fileName].remoteClient, Requests[fileName].xferID, fileName); 110 //{
105 Requests.Remove(fileName); 111 // RequestXfer(Requests[fileName].remoteClient, Requests[fileName].xferID, fileName);
106 } 112 // Requests.Remove(fileName);
113 //}
107 114
108 return true; 115 return true;
109 } 116 }
@@ -135,6 +142,7 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
135 ulong zxferid = RequestTime[0].xferID; 142 ulong zxferid = RequestTime[0].xferID;
136 remoteClient.SendAbortXferPacket(zxferid); 143 remoteClient.SendAbortXferPacket(zxferid);
137 RemoveXferData(zxferid); 144 RemoveXferData(zxferid);
145 RemoveOrDecrement(fileName);
138 } 146 }
139 } 147 }
140 148
@@ -142,16 +150,19 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
142 { 150 {
143 if (!Transfers.ContainsKey(xferID)) 151 if (!Transfers.ContainsKey(xferID))
144 { 152 {
145 byte[] fileData = NewFiles[fileName]; 153 byte[] fileData = NewFiles[fileName].Data;
146 XferDownLoad transaction = new XferDownLoad(fileName, fileData, xferID, remoteClient); 154 XferDownLoad transaction = new XferDownLoad(fileName, fileData, xferID, remoteClient);
147 155
148 Transfers.Add(xferID, transaction); 156 Transfers.Add(xferID, transaction);
149 NewFiles.Remove(fileName);
150 157
151 if (transaction.StartSend()) 158 if (transaction.StartSend())
152 { 159 {
153 RemoveXferData(xferID); 160 RemoveXferData(xferID);
154 } 161 }
162
163 // The transaction for this file is either complete or on its way
164 RemoveOrDecrement(fileName);
165
155 } 166 }
156 } 167 }
157 else 168 else
@@ -195,6 +206,7 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
195 { 206 {
196 { 207 {
197 RemoveXferData(xferID); 208 RemoveXferData(xferID);
209 RemoveOrDecrement(dl.FileName);
198 } 210 }
199 } 211 }
200 else 212 else
@@ -226,8 +238,6 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
226 xferItem.DataPointer = 0; 238 xferItem.DataPointer = 0;
227 239
228 // If the abort comes in 240 // If the abort comes in
229 if (NewFiles.ContainsKey(xferItem.FileName))
230 NewFiles.Remove(xferItem.FileName);
231 241
232 if (Requests.ContainsKey(xferItem.FileName)) 242 if (Requests.ContainsKey(xferItem.FileName))
233 Requests.Remove(xferItem.FileName); 243 Requests.Remove(xferItem.FileName);
@@ -239,10 +249,26 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
239 { 249 {
240 lock (NewFiles) 250 lock (NewFiles)
241 { 251 {
252 if (Transfers.ContainsKey(xferID))
253 RemoveOrDecrement(Transfers[xferID].FileName);
254
242 RemoveXferData(xferID); 255 RemoveXferData(xferID);
243 } 256 }
244 } 257 }
245 258
259 private void RemoveOrDecrement(string fileName)
260 {
261 // NewFiles must be locked
262
263 if (NewFiles.ContainsKey(fileName))
264 {
265 if (NewFiles[fileName].Count == 1)
266 NewFiles.Remove(fileName);
267 else
268 NewFiles[fileName].Count--;
269 }
270 }
271
246 #region Nested type: XferDownLoad 272 #region Nested type: XferDownLoad
247 273
248 public class XferDownLoad 274 public class XferDownLoad