Trigger the UploadProgressChanged event wen uploading a file.
authorGonzalo Paniagua Javier <gonzalo.mono@gmail.com>
Thu, 22 Mar 2012 04:17:48 +0000 (00:17 -0400)
committerGonzalo Paniagua Javier <gonzalo.mono@gmail.com>
Thu, 22 Mar 2012 04:17:48 +0000 (00:17 -0400)
Fixes bug #3100.

mcs/class/System/System.Net/UploadProgressChangedEventArgs.cs
mcs/class/System/System.Net/WebClient.cs

index 4169b6ef698d6458d7786de2779bfb7c407dd81e..c6cf36c0fc5901d3bffd03b6fcba1907b6d42994 100644 (file)
@@ -27,8 +27,6 @@
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
-#if NET_2_0
-
 using System.ComponentModel;
 using System.IO;
 
@@ -68,4 +66,4 @@ namespace System.Net
        }
 }
 
-#endif
+
index a20b867d35b681a60e97e29a962832dd0e833d66..07abdc8b9400680c70e86d2f1d67ef2218a38ac5 100644 (file)
@@ -563,9 +563,30 @@ namespace System.Net
                                        reqStream.Write (partHeadersBytes, 0, partHeadersBytes.Length);
                                }
                                int nread;
+                               long bytes_sent = 0;
+                               long file_size = -1;
+                               long step = 16384; // every 16kB
+                               if (fStream.CanSeek) {
+                                       file_size = fStream.Length;
+                                       step = file_size / 100;
+                               }
+                               var upload_args = new UploadProgressChangedEventArgs (0, 0, bytes_sent, file_size, 0, userToken);
+                               OnUploadProgressChanged (upload_args);
                                byte [] buffer = new byte [4096];
-                               while ((nread = fStream.Read (buffer, 0, 4096)) != 0)
+                               long sum = 0;
+                               while ((nread = fStream.Read (buffer, 0, 4096)) > 0) {
                                        reqStream.Write (buffer, 0, nread);
+                                       bytes_sent += nread;
+                                       sum += nread;
+                                       if (sum >= step || nread < 4096) {
+                                               int percent = 0;
+                                               if (file_size > 0)
+                                                       percent = (int) (bytes_sent * 100 / file_size);
+                                               upload_args = new UploadProgressChangedEventArgs (0, 0, bytes_sent, file_size, percent, userToken);
+                                               OnUploadProgressChanged (upload_args);
+                                               sum = 0;
+                                       }
+                               }
 
                                if (needs_boundary) {
                                        reqStream.WriteByte ((byte) '\r');