| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 part of dart._vmservice; | 5 part of dart._vmservice; |
| 6 | 6 |
| 7 class Asset { | 7 class Asset { |
| 8 final String name; | 8 final String name; |
| 9 final Uint8List data; | 9 final Uint8List data; |
| 10 | 10 |
| 11 Asset(this.name, this.data); | 11 Asset(this.name, this.data); |
| 12 | 12 |
| 13 String get mimeType { | 13 String get mimeType { |
| 14 var extensionStart = name.lastIndexOf('.'); | 14 var extensionStart = name.lastIndexOf('.'); |
| 15 var extension = name.substring(extensionStart+1); | 15 var extension = name.substring(extensionStart + 1); |
| 16 switch (extension) { | 16 switch (extension) { |
| 17 case 'html': | 17 case 'html': |
| 18 return 'text/html; charset=UTF-8'; | 18 return 'text/html; charset=UTF-8'; |
| 19 case 'dart': | 19 case 'dart': |
| 20 return 'application/dart; charset=UTF-8'; | 20 return 'application/dart; charset=UTF-8'; |
| 21 case 'js': | 21 case 'js': |
| 22 return 'application/javascript; charset=UTF-8'; | 22 return 'application/javascript; charset=UTF-8'; |
| 23 case 'css': | 23 case 'css': |
| 24 return 'text/css; charset=UTF-8'; | 24 return 'text/css; charset=UTF-8'; |
| 25 case 'gif': | 25 case 'gif': |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 94 int get cursor => _cursor; | 94 int get cursor => _cursor; |
| 95 void set cursor(int cursor) { | 95 void set cursor(int cursor) { |
| 96 _cursor = cursor; | 96 _cursor = cursor; |
| 97 if (_cursor > length) { | 97 if (_cursor > length) { |
| 98 _cursor = length; | 98 _cursor = length; |
| 99 } | 99 } |
| 100 } | 100 } |
| 101 } | 101 } |
| 102 | 102 |
| 103 class _TarArchive { | 103 class _TarArchive { |
| 104 static const List<int> tarMagic = const [ 0x75, 0x73, 0x74, 0x61, 0x72, 0 ]; | 104 static const List<int> tarMagic = const [0x75, 0x73, 0x74, 0x61, 0x72, 0]; |
| 105 static const List<int> tarVersion = const [ 0x30, 0x30 ]; | 105 static const List<int> tarVersion = const [0x30, 0x30]; |
| 106 static const int tarHeaderSize = 512; | 106 static const int tarHeaderSize = 512; |
| 107 static const int tarHeaderFilenameSize = 100; | 107 static const int tarHeaderFilenameSize = 100; |
| 108 static const int tarHeaderFilenameOffset = 0; | 108 static const int tarHeaderFilenameOffset = 0; |
| 109 static const int tarHeaderSizeSize = 12; | 109 static const int tarHeaderSizeSize = 12; |
| 110 static const int tarHeaderSizeOffset = 124; | 110 static const int tarHeaderSizeOffset = 124; |
| 111 static const int tarHeaderTypeSize = 1; | 111 static const int tarHeaderTypeSize = 1; |
| 112 static const int tarHeaderTypeOffset = 156; | 112 static const int tarHeaderTypeOffset = 156; |
| 113 static const int tarHeaderFileType = 0x30; | 113 static const int tarHeaderFileType = 0x30; |
| 114 | 114 |
| 115 static String _readCString(_ByteStream bs, int length) { | 115 static String _readCString(_ByteStream bs, int length) { |
| (...skipping 29 matching lines...) Expand all Loading... |
| 145 return result; | 145 return result; |
| 146 } | 146 } |
| 147 | 147 |
| 148 static void _skipContents(_ByteStream bs, int size) { | 148 static void _skipContents(_ByteStream bs, int size) { |
| 149 bs.skip(size); | 149 bs.skip(size); |
| 150 bs.seekToNextBlock(tarHeaderSize); | 150 bs.seekToNextBlock(tarHeaderSize); |
| 151 } | 151 } |
| 152 | 152 |
| 153 static int _readSize(_ByteStream bs) { | 153 static int _readSize(_ByteStream bs) { |
| 154 String octalSize = _readCString(bs, tarHeaderSizeSize); | 154 String octalSize = _readCString(bs, tarHeaderSizeSize); |
| 155 return int.parse(octalSize, | 155 return int.parse(octalSize, radix: 8, onError: (_) => 0); |
| 156 radix: 8, | |
| 157 onError: (_) => 0); | |
| 158 } | 156 } |
| 159 | 157 |
| 160 static int _readType(_ByteStream bs) { | 158 static int _readType(_ByteStream bs) { |
| 161 return bs.readByte(); | 159 return bs.readByte(); |
| 162 } | 160 } |
| 163 | 161 |
| 164 static bool _endOfArchive(_ByteStream bs) { | 162 static bool _endOfArchive(_ByteStream bs) { |
| 165 if (bs.remaining < (tarHeaderSize * 2)) { | 163 if (bs.remaining < (tarHeaderSize * 2)) { |
| 166 return true; | 164 return true; |
| 167 } | 165 } |
| 168 for (int i = 0; i < (tarHeaderSize * 2); i++) { | 166 for (int i = 0; i < (tarHeaderSize * 2); i++) { |
| 169 if (bs.peekByte(i) != 0) { | 167 if (bs.peekByte(i) != 0) { |
| 170 return false; | 168 return false; |
| 171 } | 169 } |
| 172 } | 170 } |
| 173 return true; | 171 return true; |
| 174 } | 172 } |
| 175 | 173 |
| 176 final _ByteStream _bs; | 174 final _ByteStream _bs; |
| 177 | 175 |
| 178 _TarArchive(Uint8List bytes) | 176 _TarArchive(Uint8List bytes) : _bs = new _ByteStream(bytes); |
| 179 : _bs = new _ByteStream(bytes); | |
| 180 | 177 |
| 181 bool hasNext() { | 178 bool hasNext() { |
| 182 return !_endOfArchive(_bs); | 179 return !_endOfArchive(_bs); |
| 183 } | 180 } |
| 184 | 181 |
| 185 Asset next() { | 182 Asset next() { |
| 186 int startOfBlock = _bs.cursor; | 183 int startOfBlock = _bs.cursor; |
| 187 String filename = _readFilename(_bs); | 184 String filename = _readFilename(_bs); |
| 188 _bs.cursor = startOfBlock + tarHeaderSizeOffset; | 185 _bs.cursor = startOfBlock + tarHeaderSizeOffset; |
| 189 int size = _readSize(_bs); | 186 int size = _readSize(_bs); |
| 190 _bs.cursor = startOfBlock + tarHeaderTypeOffset; | 187 _bs.cursor = startOfBlock + tarHeaderTypeOffset; |
| 191 int type = _readType(_bs); | 188 int type = _readType(_bs); |
| 192 _bs.seekToNextBlock(tarHeaderSize); | 189 _bs.seekToNextBlock(tarHeaderSize); |
| 193 if (type != tarHeaderFileType) { | 190 if (type != tarHeaderFileType) { |
| 194 _skipContents(_bs, size); | 191 _skipContents(_bs, size); |
| 195 return null; | 192 return null; |
| 196 } | 193 } |
| 197 Uint8List bytes = _readContents(_bs, size); | 194 Uint8List bytes = _readContents(_bs, size); |
| 198 return new Asset(filename, bytes); | 195 return new Asset(filename, bytes); |
| 199 } | 196 } |
| 200 } | 197 } |
| OLD | NEW |