using System; using System.IO; namespace zero { namespace netboot { public class DownloadManager { public string file_url; public long file_size; public int progress; public bool debug; public System.Net.WebRequest request; public System.Net.FtpWebRequest ftp_request; public System.Net.WebResponse response; public System.Net.FtpWebResponse ftp_response; public bool pause; public string file_name; public string file_short; public System.IO.FileStream file_down; public bool downloading; public long old_size=0; public long speed; public long counter=0; public DownloadManager () { dprint("INIT"); debug=zero.netboot.Core.getCore().debug; pause=false; } public bool checkSpeed() { try { speed=(long)((file_down.Length - old_size)/1024); old_size=file_down.Length; return downloading; } catch { return false; } } public void download_file(string url, int startPoint, int id) { try { if(url.Contains("http")) { request=System.Net.WebRequest.Create(url); Console.WriteLine("http"); request.Credentials=System.Net.CredentialCache.DefaultCredentials; response=(System.Net.HttpWebResponse)request.GetResponse(); file_size=response.ContentLength; Console.WriteLine(file_size); foreach(zero.netboot.DownloadInfo info in zero.netboot.Core.getCore().downList) { if(info.id==id) info.file_size=file_size; } int index=url.LastIndexOf("/"); file_name=zero.netboot.Core.getCore().confman.options["default_save_path"] + url.Substring(index+1); file_short=url.Substring(index+1); dprint("Downloading " + file_name + ": " + Convert.ToString(file_size) + " bytes"); if (startPoint == 0) { //Download from 0 file_down=new System.IO.FileStream(file_name,System.IO.FileMode.Create,System.IO.FileAccess.Write,System.IO.FileShare.None); } else { //Resume from startPoint file_down=new System.IO.FileStream(file_name,System.IO.FileMode.Append,System.IO.FileAccess.Write,System.IO.FileShare.None); } int bytesSize=0; byte []downBuffer=new byte[8192]; System.IO.Stream stream; stream=request.GetResponse().GetResponseStream(); string tmp=""; downloading=true; GLib.Timeout.Add(1000,new GLib.TimeoutHandler(checkSpeed)); zero.netboot.Core core=zero.netboot.Core.getCore(); while ((bytesSize = stream.Read(downBuffer, 0, downBuffer.Length)) > 0) { file_down.Write(downBuffer,0,bytesSize); counter+=bytesSize; //Console.WriteLine(bytesSize); //speed=(long)((file_down.Length - old_size)); // Console.WriteLine("Speed: " + speed + "kB/s" + " size: " + file_down.Length); if(core.gui) { Gtk.TreeIter iter=new Gtk.TreeIter(); core.downwidget.isos.GetIterFirst(out iter); do { if((string)core.downwidget.isos.GetValue(iter,1)==file_short) { progress=Convert.ToInt32(file_down.Length*(long)100/file_size); Gtk.Application.Invoke(delegate { core.downwidget.isos.SetValue(iter,2,progress); core.downwidget.isos.SetValue(iter,3,Convert.ToString(speed) + "kB/s " + Convert.ToString((int)(file_down.Length/1048576))+"/"+Convert.ToString((int)(file_size/1048576)) + " Mb (" + Convert.ToString(progress) + "%)"); }); break; } } while(core.downwidget.isos.IterNext(ref iter)); } if(Convert.ToString(file_down.Length*(long)100/file_size)!=tmp) { tmp=Convert.ToString(file_down.Length*(long)100/file_size); //dprint(tmp); //zero.netboot.Core.getCore().win.Title="Downloading " + tmp + "%"; progress=Convert.ToInt32(tmp); } } Console.WriteLine("Before: " + counter); counter+=bytesSize; Console.WriteLine("After: " + counter); } // IF HTTP if(url.Contains("ftp")) { Console.WriteLine("[DownloadManager] FTP Download mode"); // CHECK FILE SIZE ftp_request=(System.Net.FtpWebRequest)System.Net.FtpWebRequest.Create(url); ftp_request.KeepAlive=false; ftp_request.Method=System.Net.WebRequestMethods.Ftp.GetFileSize; ftp_request.Credentials=new System.Net.NetworkCredential("anonymous",""); ftp_request.UseBinary=true; ftp_request.UsePassive=false; ftp_response=(System.Net.FtpWebResponse)ftp_request.GetResponse(); file_size=ftp_response.ContentLength; int index=url.LastIndexOf("/"); file_name=zero.netboot.Core.getCore().confman.options["default_save_path"] + url.Substring(index+1); file_short=url.Substring(index+1); dprint("Downloading " + file_name + ": " + Convert.ToString(file_size) + " bytes"); ftp_response.Close(); ftp_request.Abort(); // DONE CHECKING // DOWNLOAD ftp_request=(System.Net.FtpWebRequest)System.Net.FtpWebRequest.Create(url); ftp_request.KeepAlive=false; ftp_request.Method=System.Net.WebRequestMethods.Ftp.DownloadFile; ftp_request.Credentials=new System.Net.NetworkCredential("anonymous",""); ftp_request.UseBinary=true; ftp_response=(System.Net.FtpWebResponse)ftp_request.GetResponse(); if (startPoint == 0) { //Download from 0 dprint("Downloading from 0..."); file_down=new System.IO.FileStream(file_name,System.IO.FileMode.Create); } else { //Resume from startPoint file_down=new System.IO.FileStream(file_name,System.IO.FileMode.Append,System.IO.FileAccess.Write,System.IO.FileShare.None); } int bytesSize=0; byte []downBuffer=new byte[160000]; System.IO.Stream stream; stream=ftp_response.GetResponseStream(); string tmp=""; downloading=true; GLib.Timeout.Add(1000,new GLib.TimeoutHandler(checkSpeed)); while ((bytesSize = stream.Read(downBuffer, 0, downBuffer.Length)) > 0) { file_down.Write(downBuffer,0,bytesSize); // speed=(long)((file_down.Length - old_size)/10); // Console.WriteLine("Speed: " + speed + "kB/s"); zero.netboot.Core core=zero.netboot.Core.getCore(); // old_size=file_down.Length; // Console.WriteLine("! " + old_size); if(core.gui) { Gtk.TreeIter iter=new Gtk.TreeIter(); core.downwidget.isos.GetIterFirst(out iter); do { if((string)core.downwidget.isos.GetValue(iter,1)==file_short) { progress=Convert.ToInt32(file_down.Length*(long)100/file_size); Gtk.Application.Invoke(delegate {core.downwidget.isos.SetValue(iter,2,progress); core.downwidget.isos.SetValue(iter,3,Convert.ToString(speed) + "kB/s " + Convert.ToString((int)(file_down.Length/1048576))+"/"+Convert.ToString((int)(file_size/1048576)) + " Mb (" + Convert.ToString(progress) + "%)"); }); break; } } while(core.downwidget.isos.IterNext(ref iter)); } if(Convert.ToString(file_down.Length*(long)100/file_size)!=tmp) { tmp=Convert.ToString(file_down.Length*(long)100/file_size); //dprint(tmp); //zero.netboot.Core.getCore().win.Title="Downloading " + tmp + "%"; progress=Convert.ToInt32(tmp); } } } // IF FTP } catch(Exception e) { if(File.Exists(file_name)) { dprint("Download paused."); Console.WriteLine(e); } else { zero.netboot.Core core=zero.netboot.Core.getCore(); Gtk.TreeIter iter=new Gtk.TreeIter(); core.downwidget.isos.GetIterFirst(out iter); do { if((string)core.downwidget.isos.GetValue(iter,1)==file_short) { Gtk.Application.Invoke(delegate {core.downwidget.isos.SetValue(iter,3,Mono.Unix.Catalog.GetString("Can't write to file '")+ file_name + Mono.Unix.Catalog.GetString("' may be file path is not accessible or doen't exist"));}); // break; } } while(core.downwidget.isos.IterNext(ref iter)); return ; } downloading=false; } downloading=false; file_down.Flush(); Console.WriteLine("i'm done"); Console.WriteLine("Original file size " + file_size); Console.WriteLine("Downloaded file size " + file_down.Length); if (file_down.Length >= file_size) { dprint("Download Complete."); zero.netboot.DownloadInfo info=zero.netboot.DownloadInfo.getInfo(id); zero.netboot.Core.getCore().sqlman.finish_download(info); if(zero.netboot.Core.getCore().gui) { Gtk.TreeIter iter=new Gtk.TreeIter(); zero.netboot.Core.getCore().downwidget.isos.GetIterFirst(out iter); do { if((string)zero.netboot.Core.getCore().downwidget.isos.GetValue(iter,1)==file_short) { progress=Convert.ToInt32(file_down.Length*(long)100/file_size); Gtk.Application.Invoke(delegate { zero.netboot.Core.getCore().downwidget.isos.SetValue(iter,2,progress); zero.netboot.Core.getCore().downwidget.isos.SetValue(iter,3,Mono.Unix.Catalog.GetString("Download Complete. File is found in ") + zero.netboot.Core.getCore().confman.options["default_save_path"]); file_down.Close(); }); break; } } while(zero.netboot.Core.getCore().downwidget.isos.IterNext(ref iter)); } } else { dprint("Download paused."); //zero.netboot.Core.getCore().sqlman.pause_download(id,progress); } } public void dprint(string txt) { if (debug) { Console.WriteLine("[DownloadManager] {0}",txt); } } } } }