func init // add using module sys.add_use('System.Net') sys.add_use('System.Threading') sys.add_use('RJH.Utils.WebDownload') // use external class sys.UseClass("DownloadThread") sys.UseClass("WebDownload") // define instance sys.add_object(this.codename, 'DownloadThread') // initialize events if(linked("onDownload")) blk_init.println(this.codename, '.CompleteCallback += new DownloadCompleteHandler(DownloadCompleteCallback);') sys.blocks_store() event("onDownload", 'dataDownloaded as byte[]') blk_proc_imp.println('private void DownloadCompleteCallback(byte[] dataDownloaded) { // ', this.codename, ':onDownload').inc() .println('if (this.InvokeRequired) {').inc() .println('try {').inc() .println('this.Invoke(new DownloadCompleteHandler(DownloadCompleteCallback), new object[] { dataDownloaded });') .dec().println('} catch {} return;') .dec().println('}') if(not blk_lvars.empty()) blk_proc_imp.copyhere(blk_lvars) end blk_proc_imp.copyhere(blk) .dec().println('}') sys.blocks_restore() end if(linked("onProgress")) // create temp blocks sys.blocks_store() tmp = block.reggen().inc().inc() tmp_lvars = block.reggen().inc().inc() event("onTotalBytes", '(int)totalBytes') // save event body "onTotalBytes" if(not blk.empty()) tmp.copyhere(blk) blk = block.reggen().inc().inc().inc() end if(not blk_lvars.empty()) tmp_lvars.copyhere(blk_lvars) blk_lvars = block.reggen().inc().inc().inc() end event("onProgress", '(int)bytesSoFar') blk_init.println(this.codename, '.ProgressCallback += new DownloadProgressHandler(DownloadProgressCallback);') blk_proc_imp.println('private void DownloadProgressCallback(int bytesSoFar, int totalBytes) { // ', this.codename, ':onProgress').inc() .println('if (this.InvokeRequired) {').inc() .println('try {').inc() .println('this.Invoke(new DownloadProgressHandler(DownloadProgressCallback), new object[] { bytesSoFar, totalBytes });') .dec().println('} catch {} return;') .dec().println('}') if(not tmp_lvars.empty()) blk_proc_imp.copyhere(tmp_lvars) end if(not blk_lvars.empty()) blk_proc_imp.copyhere(blk_lvars) end if(linked("TotalBytes")) sys.add_var('total', 1) blk.println(this.total, ' = (int)totalBytes;') end blk_proc_imp.copyhere(tmp) blk_proc_imp.copyhere(blk) .dec().println('}') //delete temp blocks sys.blocks_restore() block.delete(tmp) block.delete(tmp_lvars) end end func doDownload(url) blk.println(this.codename, '.DownloadUrl = ', d("URL"), ';') .println('Thread t = new Thread(new ThreadStart(', this.codename, '.Download));') .println('t.Start();') end func doCancel() blk.println(this.codename, '.Cancel();') end func TotalBytes return(this.total) end