|
| 1 | +#!/usr/bin/env ruby |
| 2 | + |
| 3 | +# require 'pathname' |
| 4 | +# require File.dirname(__FILE__)+'/filemessage.pb.rb' |
| 5 | +require 'victoriafresh' |
| 6 | +require 'cbor' |
| 7 | +require 'lzma' |
| 8 | +require 'get_process_mem' |
| 9 | + |
| 10 | +def checkMemoryUsage(lineNumber) |
| 11 | + mem= GetProcessMem.new |
| 12 | + |
| 13 | + puts("#{lineNumber} , Memory: #{mem.mb}"); #Debug |
| 14 | + |
| 15 | +end #def checkMemoryUsage |
| 16 | + |
| 17 | +#根据版本号,提取VFS数据内容 |
| 18 | +def extractVfsDataWithVersionExternalFile(wholeCbor, fileVersion) |
| 19 | + victoriaFreshData='' #解压后的数据块整体 |
| 20 | + dataFileName='victoriafreshdata.w' #数据文件名 |
| 21 | + dataFile={} #数据文件对象 |
| 22 | + |
| 23 | + if (fileVersion==14) #14版本 |
| 24 | + compressedVfsData=wholeCbor['vfsData'] #获取压缩后的数据内容 |
| 25 | + |
| 26 | + victoriaFreshData=LZMA.decompress(compressedVfsData) #解压缩数据内容 |
| 27 | + |
| 28 | + dataFile=File.open(dataFileName, 'wb') #打开文件 |
| 29 | + |
| 30 | + dataFile.syswrite(victoriaFreshData) #写入内容 |
| 31 | + |
| 32 | + dataFile.close #关闭文件 |
| 33 | + elsif (fileVersion>=30) #30以上版本 |
| 34 | + compressedVfsDataList=wholeCbor['vfsDataList'] #获取压缩后的数据块列表 |
| 35 | + |
| 36 | + puts("data block amont: #{compressedVfsDataList.length}") #Debug |
| 37 | + |
| 38 | + dataBlockCounter=0 #Data block counter |
| 39 | + |
| 40 | + dataFile=File.open(dataFileName, 'wb') #打开文件 |
| 41 | + |
| 42 | + |
| 43 | + compressedVfsDataList.each do |currentCompressed| #一块块地解压 |
| 44 | + puts("data block counter: #{dataBlockCounter}") #Debug |
| 45 | + checkMemoryUsage(34) |
| 46 | + |
| 47 | + currentRawData=LZMA.decompress(currentCompressed) #解压这一块 |
| 48 | + |
| 49 | + dataFile.syswrite(currentRawData) #写入内容 |
| 50 | + |
| 51 | +# victoriaFreshData=victoriaFreshData+currentRawData #追加 |
| 52 | +# victoriaFreshData << currentRawData #追加 |
| 53 | + |
| 54 | + puts("byte size: #{victoriaFreshData.bytesize}") #debug. |
| 55 | + |
| 56 | + dataBlockCounter=dataBlockCounter+1 #count |
| 57 | + end #compressedVfsDataList.each do |currentCompressed| |
| 58 | + |
| 59 | + dataFile.close #关闭文件 |
| 60 | + end #if (fileVersion==14) #14版本 |
| 61 | + |
| 62 | + return dataFileName #返回解压后的数据块整体 |
| 63 | +end #def extractVfsDataWithVersionExternalFile(wholeCbor, fileVersion) #根据版本号,提取VFS数据内容 |
| 64 | + |
| 65 | +def extractVfsDataWithVersion(wholeCbor, fileVersion) #根据版本号,提取VFS数据内容 |
| 66 | + victoriaFreshData='' #解压后的数据块整体 |
| 67 | + |
| 68 | + if (fileVersion==14) #14版本 |
| 69 | + compressedVfsData=wholeCbor['vfsData'] #获取压缩后的数据内容 |
| 70 | + |
| 71 | + victoriaFreshData=LZMA.decompress(compressedVfsData) #解压缩数据内容 |
| 72 | + elsif (fileVersion>=30) #30以上版本 |
| 73 | + compressedVfsDataList=wholeCbor['vfsDataList'] #获取压缩后的数据块列表 |
| 74 | + |
| 75 | + puts("data block amont: #{compressedVfsDataList.length}") #Debug |
| 76 | + |
| 77 | + dataBlockCounter=0 #Data block counter |
| 78 | + |
| 79 | + compressedVfsDataList.each do |currentCompressed| #一块块地解压 |
| 80 | + puts("data block counter: #{dataBlockCounter}") #Debug |
| 81 | + checkMemoryUsage(34) |
| 82 | + |
| 83 | + currentRawData=LZMA.decompress(currentCompressed) #解压这一块 |
| 84 | + |
| 85 | +# victoriaFreshData=victoriaFreshData+currentRawData #追加 |
| 86 | + victoriaFreshData << currentRawData #追加 |
| 87 | + |
| 88 | + puts("byte size: #{victoriaFreshData.bytesize}") #debug. |
| 89 | + |
| 90 | + dataBlockCounter=dataBlockCounter+1 #count |
| 91 | + end #compressedVfsDataList.each do |currentCompressed| |
| 92 | + end #if (fileVersion==14) #14版本 |
| 93 | + |
| 94 | + return victoriaFreshData #返回解压后的数据块整体 |
| 95 | +end # extractVfsDataWithVersion(wholeCbor, fileVersion) #根据版本号,提取VFS数据内容 |
| 96 | + |
| 97 | +class ExtremeUnZip |
| 98 | + #解压 |
| 99 | + def exuz(rootPath) |
| 100 | + wholeFileContent=File.read(rootPath) #最终文件内容 |
| 101 | + |
| 102 | + checkMemoryUsage(60) |
| 103 | + |
| 104 | + puts wholeFileContent.class #debug |
| 105 | + |
| 106 | + wholeCborByteArray=wholeFileContent[4..-1] #从第5个到末尾 |
| 107 | + checkMemoryUsage(65) |
| 108 | + |
| 109 | + |
| 110 | + # puts wholeCborByteArray #Debug. |
| 111 | + |
| 112 | + checkMemoryUsage(70) |
| 113 | + wholeCbor=CBOR.decode(wholeCborByteArray) #解码 |
| 114 | + # wholeCbor=wholeCborByteArray.from_cbor #解码CBOR |
| 115 | + |
| 116 | + # puts wholeCbor #Debug. |
| 117 | + checkMemoryUsage(75) |
| 118 | + |
| 119 | + fileVersion=wholeCbor['version'] #获取版本号 |
| 120 | + |
| 121 | + puts 'fileVersion:' #Debug |
| 122 | + checkMemoryUsage(80) |
| 123 | + puts fileVersion #Debug. |
| 124 | + |
| 125 | + |
| 126 | + if (fileVersion<14) #版本号过小 |
| 127 | + checkMemoryUsage(85) |
| 128 | + puts 'file version too old' #报告错误 |
| 129 | + else #版本号够大 |
| 130 | + compressedVfsMenu=wholeCbor['vfsMenu'] #获取压缩后的目录内容 |
| 131 | + |
| 132 | + checkMemoryUsage(90) |
| 133 | + replyByteArray=LZMA.decompress(compressedVfsMenu) #解码目录VFS字节数组内容 |
| 134 | + |
| 135 | + # puts replyByteArray #Debug |
| 136 | + |
| 137 | + checkMemoryUsage(95) |
| 138 | + # victoriaFreshData=extractVfsDataWithVersion(wholeCbor, fileVersion) #根据版本号,提取VFS数据内容 |
| 139 | + victoriaFreshDataFile=extractVfsDataWithVersionExternalFile(wholeCbor, fileVersion) #根据版本号,提取VFS数据内容 |
| 140 | + |
| 141 | + # puts victoriaFreshData #Debug |
| 142 | + |
| 143 | + checkMemoryUsage(100) |
| 144 | + $clipDownloader=VictoriaFresh.new #创建下载器。 |
| 145 | + |
| 146 | + |
| 147 | + $clipDownloader.releaseFilesExternalDataFile(replyByteArray, victoriaFreshDataFile) #释放各个文件 |
| 148 | + |
| 149 | + fileToRemove=File.new(victoriaFreshDataFile) #要删除的文件 |
| 150 | + |
| 151 | + File.delete(fileToRemove) #删除文件 |
| 152 | + |
| 153 | + end #if (fileVersion<14) #版本号过小 |
| 154 | + |
| 155 | + end #def exuz(rootPath) |
| 156 | +end #class ExtremeUnZip |
| 157 | + |
0 commit comments