erifash Posted November 14, 2006 Share Posted November 14, 2006 I got tired of all the other download managers I have found so I decided to write my own. I have the GUI completely done and a couple of other functions too. The only problem I am having is with incomplete downloads. I would like to be able to start a download on my thumb drive, pause the download, then complete it on a different computer. In other words, how can I handle incomplete downloads? Here is the GUI: expandcollapse popup#NoTrayIcon #include <GUIConstants.au3> #include <GUIListView.au3> Global Const $WM_NOTIFY = 0x004E Global Const $NM_DBLCLK = -3 Opt("GUIResizeMode", 1) Opt("GUIOnEventMode", 1) _Exist("Download Manager") Global $oErr = ObjEvent("AutoIt.Error", "_ErrorHandler") $shell32 = @SystemDir & "\shell32.dll" $gui = GUICreate("Download Manager", 540, 160, Default, Default, $WS_OVERLAPPEDWINDOW) $start = GUICtrlCreateButton("Start", 0, 0, 20, 20, $BS_ICON) GUICtrlSetImage(-1, $shell32, 176, 0) GUICtrlSetTip(-1, "Start download") GUICtrlSetResizing(-1, $GUI_DOCKALL) GUICtrlSetOnEvent(-1, "_EventHandler") $pause = GUICtrlCreateButton("Pause", 20, 0, 20, 20, $BS_ICON) GUICtrlSetImage(-1, $shell32, 112, 0) GUICtrlSetTip(-1, "Pause download") GUICtrlSetResizing(-1, $GUI_DOCKALL) GUICtrlSetOnEvent(-1, "_EventHandler") $add = GUICtrlCreateButton("Add", 40, 0, 20, 20, $BS_ICON) GUICtrlSetImage(-1, $shell32, 155, 0) GUICtrlSetTip(-1, "Add new download") GUICtrlSetResizing(-1, $GUI_DOCKALL) GUICtrlSetOnEvent(-1, "_EventHandler") $remove = GUICtrlCreateButton("Remove", 60, 0, 20, 20, $BS_ICON) GUICtrlSetImage(-1, $shell32, 109, 0) GUICtrlSetTip(-1, "Remove selected download") GUICtrlSetResizing(-1, $GUI_DOCKALL) GUICtrlSetOnEvent(-1, "_EventHandler") $prefs = GUICtrlCreateButton("Preferences", 80, 0, 20, 20, $BS_ICON) GUICtrlSetImage(-1, $shell32, 126, 0) GUICtrlSetTip(-1, "Edit preferences") GUICtrlSetResizing(-1, $GUI_DOCKALL) GUICtrlSetOnEvent(-1, "_EventHandler") $progress = GUICtrlCreateProgress(100, 0, 440, 20) GUICtrlSetResizing(-1, $GUI_DOCKHEIGHT + $GUI_DOCKLEFT + $GUI_DOCKRIGHT) $list = GUICtrlCreateListView("Name|Status|Remaining|Speed", 0, 20, 540, 120, $LVS_SHOWSELALWAYS, $LVS_EX_GRIDLINES) GUICtrlSetResizing(-1, $GUI_DOCKBORDERS) _GUICtrlListViewSetColumnWidth(-1, 0, 240) _GUICtrlListViewSetColumnWidth(-1, 1, 80) _GUICtrlListViewSetColumnWidth(-1, 2, 105) _GUICtrlListViewSetColumnWidth(-1, 3, 90) $status = GUICtrlCreateInput("0 downloading; 0 files; 0 KB/s total", 0, 140, 540, 20) GUICtrlSetResizing(-1, $GUI_DOCKHEIGHT + $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKBOTTOM) GUISetOnEvent($GUI_EVENT_CLOSE, "_EventHandler", $gui) GUIRegisterMsg($WM_NOTIFY, "WM_Notify_Events") GUICtrlSetState($status, $GUI_DISABLE) GUICtrlSetState($list, $GUI_FOCUS) GUISetState() While 1 _ReduceMemory() Sleep(5000) WEnd Func WM_Notify_Events( $hWndGUI, $MsgID, $wParam, $lParam ) #forceref $hWndGUI, $MsgID, $wParam Local $tagNMHDR, $event, $hwndFrom, $code $tagNMHDR = DllStructCreate("int;int;int", $lParam) If @error Then Return $event = DllStructGetData($tagNMHDR, 3) Select Case $wParam = $list Select Case $event = $NM_DBLCLK _ListEventHandler(_GUICtrlListViewGetItemText($list, _GUICtrlListViewGetSelectedIndices($list))) EndSelect EndSelect $tagNMHDR = 0 $event = 0 $lParam = 0 EndFunc Func _EventHandler() Switch @GUI_CtrlId Case $GUI_EVENT_CLOSE Exit Case $start MsgBox(0, "Event", GUICtrlRead(@GUI_CtrlId)) Case $pause MsgBox(0, "Event", GUICtrlRead(@GUI_CtrlId)) Case $add MsgBox(0, "Event", GUICtrlRead(@GUI_CtrlId)) Case $remove MsgBox(0, "Event", GUICtrlRead(@GUI_CtrlId)) Case $prefs MsgBox(0, "Event", GUICtrlRead(@GUI_CtrlId)) EndSwitch EndFunc Func _ListEventHandler( $text ) $text = StringSplit($text, "|") If @error or $text[1] = "" Then Return MsgBox(0, "Event", $text[1]) EndFunc Func _ErrorHandler() MsgBox(0x41030, "COM Error", "Intercepted COM Error :" & @CRLF & @CRLF & _ "err.description is: " & @TAB & $oErr.description & @CRLF & _ "err.windescription:" & @TAB & $oErr.windescription & @CRLF & _ "err.number is: " & @TAB & Hex($oErr.number, 8) & @CRLF & _ "err.lastdllerror is: " & @TAB & $oErr.lastdllerror & @CRLF & _ "err.scriptline is: " & @TAB & $oErr.scriptline & @CRLF & _ "err.source is: " & @TAB & $oErr.source & @CRLF & _ "err.helpfile is: " & @TAB & $oErr.helpfile & @CRLF & _ "err.helpcontext is: " & @TAB & $oErr.helpcontext _ ) SetError(1) EndFunc Func _Exist( $str, $fatal = 1 ) Local $h = DllCall("kernel32.dll", "int", "CreateMutex", "int", 0, "long", 1, "str", StringReplace($str, "\", "..")), $l = DllCall("kernel32.dll", "int", "GetLastError") If $l[0] = 183 and $fatal Then Exit SetError($l[0]) Return $h[0] EndFunc Func _Error( $sText, $iFatal = 0, $sTitle = "Error", $iOpt = 0x41030 ) Local $ret = MsgBox($iOpt, $sTitle, $sText) If $iFatal Then Exit Return SetError(1, 0, $ret) EndFunc Func _ReduceMemory( $pid = -1, $psapi = "psapi.dll", $kernel32 = "kernel32.dll" ) If $pid = -1 Then Local $ret = DllCall($psapi, "int", "EmptyWorkingSet", "long", -1) Else Local $hwnd = DllCall($kernel32, "int", "OpenProcess", "int", 0x1F0FFF, "int", 0, "int", $pid) Local $ret = DllCall($psapi, "int", "EmptyWorkingSet", "long", $hwnd[0]) DllCall($kernel32, "int", "CloseHandle", "int", $hwnd[0]) EndIf Return $ret[0] EndFunc Func _ByteFormat( $bytes, $decimal = 0 ) Local $i = 0, $word[5] = [" B", " KB", " MB", " GB", " TB"] While $bytes < 1024 $bytes /= 1024 WEnd Return Round($bytes, $decimal) & $word[$i] EndFunc Thanks! My UDFs:_FilePrint() | _ProcessGetName() | _Degree() and _Radian()My Scripts:Drive Lock - Computer Lock Using a Flash DriveAU3Chat - Simple Multiuser TCP ChatroomStringChunk - Split a String Into Equal PartsAutoProxy - Custom Webserver Link to comment Share on other sites More sharing options...
lod3n Posted November 14, 2006 Share Posted November 14, 2006 Try BITS:http://www.microsoft.com/technet/technetma...ight/?related=y [font="Fixedsys"][list][*]All of my AutoIt Example Scripts[*]http://saneasylum.com[/list][/font] Link to comment Share on other sites More sharing options...
erifash Posted November 17, 2006 Author Share Posted November 17, 2006 (edited) @lod3n: Thanks for that bit of information, it helped a lot. I wanted to do it in pure AutoIt so I discovered that "partial content" is already built into the HTTP protocol. I scripted a small tcp listener set to port 80 and used a download manager to try and download an imaginary "file" off my imaginary "server." Here is the header that it sent: GET /woot.txt HTTP/1.0 Referer: http://x.x.x.x/woot.txt Range: bytes=0- User-Agent: Web Download Host: x.x.x.x Pragma: no-cacheI decided to give this header a test run so I wrote a script to start/resume a download of a large file (123 MB). Here it is: expandcollapse popup; try to start (or resume) the download of ; http://61.74.68.173/GIS/Gunbound_GIS_WC_545.exe ; which is 123 MB in size so it should be good for testing $file = @ScriptDir & "\Gunbound_GIS_WC_545.exe" If FileExists($file) Then $bytes = FileGetSize($file) Else $bytes = 0 EndIf TCPStartup() $conn = TCPConnect("61.74.68.173", 80) If $conn = -1 or @error Then Exit $h = "GET /GIS/Gunbound_GIS_WC_545.exe HTTP/1.0" & @CRLF $h &= "Referer: http://61.74.68.173/GIS/Gunbound_GIS_WC_545.exe" & @CRLF $h &= "Range: bytes=" & $bytes & "-" & @CRLF $h &= "User-Agent: AutoIt3" & @CRLF $h &= "Host: " & @IPAddress1 & @CRLF $h &= "Pragma: no-cache" & @CRLF $h &= @CRLF TCPSend($conn, $h) $listen = TCPListen(@IPAddress1, 80) While 1 $sock = TCPAccept($listen) If $sock > -1 Then $data = "" While not @error FileWrite($file, $data) $data = TCPRecv($sock, 2048) WEnd TCPCloseSocket($sock) EndIf Sleep(50) WEnd ... and it doesn't work If anyone would care to try and help me fix this it would be great! EDIT: Nevermind, I figured it out. Edited December 3, 2006 by erifash My UDFs:_FilePrint() | _ProcessGetName() | _Degree() and _Radian()My Scripts:Drive Lock - Computer Lock Using a Flash DriveAU3Chat - Simple Multiuser TCP ChatroomStringChunk - Split a String Into Equal PartsAutoProxy - Custom Webserver Link to comment Share on other sites More sharing options...
vinodkumarkp Posted January 30, 2007 Share Posted January 30, 2007 EDIT: Nevermind, I figured it out.Hi erifash,If you are done with the project, can you please post the script so that I can use it, if you don't mind?Thanks and Regards,Vinod Kumar Link to comment Share on other sites More sharing options...
BrettF Posted January 30, 2007 Share Posted January 30, 2007 i would love to see it too Vist my blog!UDFs: Opens The Default Mail Client | _LoginBox | Convert Reg to AU3 | BASS.au3 (BASS.dll) (Includes various BASS Libraries) | MultiLang.au3 (Multi-Language GUIs!)Example Scripts: Computer Info Telnet Server | "Secure" HTTP Server (Based on Manadar's Server)Software: AAMP- Advanced AutoIt Media Player | WorldCam | AYTU - Youtube Uploader Tutorials: Learning to Script with AutoIt V3Projects (Hardware + AutoIt): ArduinoUseful Links: AutoIt 1-2-3 | The AutoIt Downloads Section: | SciTE4AutoIt3 Full Version! Link to comment Share on other sites More sharing options...
Brontal Posted February 3, 2007 Share Posted February 3, 2007 Hi your Downloadmanager looks very nice I was wondering if you ever finished your functions like pause & resume? If yes could you share it with us all? thx alot Link to comment Share on other sites More sharing options...
DarthVega Posted April 8, 2007 Share Posted April 8, 2007 I got tired of all the other download managers I have found so I decided to write my own.I guess you got tired of this one as well? Link to comment Share on other sites More sharing options...
buymeapc Posted June 8, 2009 Share Posted June 8, 2009 EDIT: Nevermind, I figured it out.I know this was a while ago, but what was fixed to make this work?Thanks Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now