Ooops
March 05, 2021, 07:23:24 AM

Author Topic: [bb] Online Patcher using the recursive CRC-32 builder by ozak [ 1+ years ago ]  (Read 570 times)

Offline BlitzBot

Title : Online Patcher using the recursive CRC-32 builder
Author : ozak
Posted : 1+ years ago

Description : Use my recursive CRC-32 file builder to build a patch info file.
Place it on your webserver and use this patcher to download changed files.


Code :
Code: BlitzBasic
  1. ; HTTP Patcher for use with BuildCRC by Odin Jensen (www.furi.dk)
  2.  
  3. ; Global config
  4. Global url$ = "http://www.yourwebsitehere.com"
  5. Global patchDir$ = "yourpatchdirhere"
  6. Global aTitle$ = "HTTP Patcher v1.0"
  7. Global winTitle$ = "HTTP Patcher v1.0 by Odin Jensen"
  8. Global gameExe$ = "game.exe"
  9.  
  10. ; Global control handles
  11. Global patchBtn
  12. Global playBtn
  13. Global curProgBar
  14. Global totalProgBar
  15. Global infoBox
  16.  
  17. ; Number of files to be patched
  18. Global numFiles# = 0
  19.  
  20. ; Download bank
  21. Global bank=CreateBank(16384)
  22.  
  23. ; File storage struct
  24. Type FileEntry
  25.  
  26.         Field fileName$
  27.        
  28. End Type
  29.  
  30. ; Initialize CRC table
  31. Dim CRC32_table(255)
  32. CRC32_init()
  33.  
  34. ; Create main window and controls
  35. InitApp()
  36.  
  37. ; Main loop
  38. While WaitEvent()<>$803
  39.  
  40.         ; Was it a gadget action event?
  41.         If (EventID()=$401)
  42.  
  43.                 ; Play button
  44.                 If (EventSource()=playBtn)
  45.                         ExecFile(gameExe)
  46.                 End If
  47.        
  48.                 ; Patch button
  49.                 If (EventSource()=patchBtn)
  50.                         ; Connected
  51.                         AddGadgetItem(infoBox,"Retrieving patch information.")
  52.        
  53.                         ; Get patch info file
  54.                         If (GetHTTPFile("patchinfo.dat") = False)                              
  55.                                 AddGadgetItem(infoBox, "Error: Could not retrieve patch information")                          
  56.                         Else
  57.                                 ; Inform the user of our progress
  58.                                 AddGadgetItem(infoBox, "Patch information retrieved ok.")
  59.                                 AddGadgetItem(infoBox, "Scanning files.")
  60.  
  61.                                 ; Read and check files
  62.                                 inFile = OpenFile("patchinfo.dat")
  63.  
  64.                                 While (Not Eof(inFile))
  65.  
  66.                                         ; Read entry
  67.                                         curLine$ = ReadLine(inFile)
  68.                                         fe.FileEntry = New FileEntry
  69.                                         fefileName = Left(curLine, Instr(curLine,",")-1)
  70.                                         CRC$ = Mid(curLine, Instr(curLine, ",")+1, Len(curLine))                                       
  71.                                                                                
  72.                                         ; Check CRC
  73.                                         fileCRC$ = Hex(CRC32_FromFile(fefileName))
  74.                                         If (Not fileCRC = CRC)
  75.                                                 AddGadgetItem(infoBox, "File '" +  fefileName + "' needs patching.")
  76.                                                 numFiles=numFiles+1
  77.                                         Else
  78.                                                 AddGadgetItem(infoBox, "File '" +  fefileName + "' is up to date.")
  79.                                                 Delete(fe)
  80.                                         End If
  81.                                                                        
  82.                                 Wend                           
  83.  
  84.                                 ; Close file
  85.                                 CloseFile(infile)
  86.  
  87.                                 ; Patch those files
  88.                                 If (numFiles <> 0)                     
  89.                                         AddGadgetItem(infoBox, "Patching files.")
  90.                                 End If
  91.                                
  92.                                 progPos = 0
  93.                                 For fe.FileEntry=Each FileEntry
  94.                                        
  95.                                         GetHTTPFile(fefileName)
  96.                                         progPos=progPos+1
  97.                                         UpdateProgBar(totalProgBar,progPos/numFiles)
  98.                                
  99.                                 Next
  100.        
  101.                                 ; Patching done
  102.                                 UpdateProgBar(totalProgBar,1)
  103.                                 AddGadgetItem(infoBox, "Ready to play!")
  104.                                 EnableGadget(playBtn)
  105.                                 DisableGadget(patchBtn)
  106.  
  107.                                 ; Delete patch info file
  108.                                 DeleteFile("patchInfo.dat")
  109.                         End If                                 
  110.                 EndIf
  111.         EndIf
  112.  
  113. Wend
  114.  
  115.  
  116. ; Create main window and controls function
  117. Function InitApp()
  118.  
  119.         ; Set app title
  120.         AppTitle(aTitle)
  121.  
  122.         ; Create main window           
  123.         mainWindow=CreateWindow(winTitle,(ClientWidth (Desktop ()) / 2) - 200,(ClientHeight (Desktop ()) / 2) - 200,400,400,0,1)
  124.        
  125.         ; Create canvas
  126.         mainCanvas = CreateCanvas(0,0,GadgetWidth(mainWindow),GadgetHeight(mainWindow),mainWindow,0)
  127.        
  128.         ; Setup canvas for drawing
  129.         SetBuffer(CanvasBuffer(mainCanvas))
  130.         Color(100,100,100)
  131.         Rect(0,0,GadgetWidth(mainWindow),GadgetHeight(mainWindow))
  132.        
  133.         ; Create labels
  134.         Color(255,255,255)
  135.         Text(5, 10, "Total progress")
  136.         Text(5, 65, "Current progress")
  137.         Text(5, 120, "Information")
  138.        
  139.         ; Create progress bars
  140.         totalProgBar=CreateProgBar(5, 30, GadgetWidth(mainWindow) - 16, 20, mainCanvas)
  141.         curProgBar=CreateProgBar(5, 85, GadgetWidth(mainWindow) - 16, 20, mainCanvas)
  142.        
  143.         ; Create listbox for information
  144.         infoBox=CreateListBox(5, 140, GadgetWidth(mainWindow) - 16, GadgetHeight(mainWindow) - 200, mainCanvas)
  145.        
  146.         ; Create buttons
  147.         patchBtn=CreateButton("Patch", 5, GadgetHeight(mainWindow) - 50, 50, 20, mainCanvas)
  148.         playBtn=CreateButton("Play", GadgetWidth(mainWindow) - 60, GadgetHeight(mainWindow) - 50, 50, 20, mainCanvas)
  149.         DisableGadget(playBtn)
  150.        
  151.         ; Add some start info
  152.         AddGadgetItem(infoBox, "Welcome to the patcher. Click the patch button to begin.")
  153.        
  154.         ; Update canvas
  155.         FlipCanvas(mainCanvas)
  156.        
  157. End Function
  158.  
  159. ; Get HTTP file function
  160. Function GetHTTPFile(fileName$)
  161.  
  162.         ; Open stream
  163.         tcpStream=OpenTCPStream(url,80)
  164.  
  165.         ; Get and write patch info file
  166.         WriteLine tcpStream,"GET "+url+patchDir+"/"+fileName+" HTTP/1.0"
  167.         WriteLine tcpStream,Chr$(10)
  168.        
  169.         ; Error?
  170.         If (Eof(tcpStream))    
  171.                 Return False    
  172.         End If
  173.  
  174.         ; Open file for writing                        
  175.         error=False
  176.         Local temp$
  177.         Local size# = 0
  178.        
  179.         ; Read header
  180.         Repeat
  181.                 ; Read next HTTP line
  182.                 temp = ReadLine$(tcpStream)
  183.                
  184.                 ; If we got a 404 Not Found, the file is missing from the server (or mispelled somewhere :)
  185.                 If (Instr(temp, "404 Not Found")) error=True
  186.  
  187.                 ; Get size
  188.                 If  (Instr(temp, "Content-Length"))
  189.                         size = Mid(temp, Instr(temp,": ")+2, Len(temp))
  190.                 End If                                                                 
  191.                
  192.                 ; End of header
  193.                 If (temp = "")
  194.                
  195.                         Exit
  196.                
  197.                 End If
  198.                
  199.         Forever
  200.  
  201.         ; Error?
  202.         If (error)     
  203.                 Return False
  204.         End If
  205.  
  206.         ; Read and write file  
  207.         Local outfile = WriteFile(fileName)
  208.  
  209.         progPos = 0
  210.         While (Not Eof(tcpStream))
  211.                 n=ReadBytes(bank,tcpStream,0,16384)
  212.                 WriteBytes(bank,outfile,0,n)
  213.                 progPos=progPos+n
  214.                 UpdateProgBar(curProgBar,progPos/size)
  215.         Wend
  216.  
  217.         CloseFile(outfile)
  218.  
  219.         ; Close stream
  220.         CloseTCPStream(tcpStream)                              
  221.        
  222.         ; All went well
  223.         Return True
  224.        
  225. End Function
  226.  
  227. ; CRC init function
  228. Function CRC32_Init()
  229.  
  230.   Local i
  231.   Local j
  232.   Local value
  233.  
  234.   For i=0 To 255
  235.     value=i
  236.     For j=0 To 7
  237.       If (value And $1) Then
  238.         value=(value Shr 1) Xor $EDB88320
  239.       Else
  240.         value=(value Shr 1)
  241.       EndIf
  242.     Next
  243.     CRC32_table(i)=value
  244.   Next
  245.  
  246. End Function
  247.  
  248. ; Function to get CRC-32 value from a file
  249. Function CRC32_FromFile(name$)
  250.  
  251.   Local byte
  252.   Local crc
  253.   Local file
  254.  
  255.   crc=$FFFFFFFF
  256.   file=ReadFile(name$)
  257.   If file=0 Then Return
  258.   While Not Eof(file)
  259.     byte=ReadByte(file)
  260.     crc=(crc Shr 8) Xor CRC32_table(byte Xor (crc And $FF))
  261.   Wend
  262.   Return ~crc
  263.  
  264. End Function


Comments :


Xzider(Posted 1+ years ago)

 looks cool.. but Function waitevent() not found ?


ozak(Posted 1+ years ago)

 Better late than never. It's Blitz2D code :)


Damien Sturdy(Posted 1+ years ago)

 You mean B+ :)


ozak(Posted 1+ years ago)

 Yes. Yes I do :)


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal