| // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| #include "entry.h" |
| #include "messaging.h" |
| #include "reader.h" |
| |
| void archiveReadNew(Dart_Port p) { |
| checkPointerResult(p, archive_read_new(), "archive input stream"); |
| } |
| |
| void archiveReadSupportFilterAll(Dart_Port p, struct archive* a) { |
| checkResult(p, a, archive_read_support_filter_all(a)); |
| } |
| |
| void archiveReadSupportFilterBzip2(Dart_Port p, struct archive* a) { |
| checkResult(p, a, archive_read_support_filter_bzip2(a)); |
| } |
| |
| void archiveReadSupportFilterCompress(Dart_Port p, struct archive* a) { |
| checkResult(p, a, archive_read_support_filter_compress(a)); |
| } |
| |
| void archiveReadSupportFilterGzip(Dart_Port p, struct archive* a) { |
| checkResult(p, a, archive_read_support_filter_gzip(a)); |
| } |
| |
| void archiveReadSupportFilterLzma(Dart_Port p, struct archive* a) { |
| checkResult(p, a, archive_read_support_filter_lzma(a)); |
| } |
| |
| void archiveReadSupportFilterXz(Dart_Port p, struct archive* a) { |
| checkResult(p, a, archive_read_support_filter_xz(a)); |
| } |
| |
| void archiveReadSupportFilterProgram(Dart_Port p, struct archive* a, |
| Dart_CObject* request) { |
| Dart_CObject* cmd = getTypedArgument(p, request, 0, kString); |
| if (cmd == NULL) return; |
| int result = archive_read_support_filter_program( |
| a, cmd->value.as_string); |
| checkResult(p, a, result); |
| } |
| |
| void archiveReadSupportFilterProgramSignature( |
| Dart_Port p, struct archive* a, Dart_CObject* request) { |
| Dart_CObject* cmd = getTypedArgument(p, request, 0, kString); |
| if (cmd == NULL) return; |
| |
| Dart_CObject* signature = getTypedArgument(p, request, 1, kUint8Array); |
| if (cmd == NULL) return; |
| |
| int result = archive_read_support_filter_program_signature( |
| a, cmd->value.as_string, signature->value.as_byte_array.values, |
| signature->value.as_byte_array.length); |
| checkResult(p, a, result); |
| } |
| |
| void archiveReadSupportFormatAll(Dart_Port p, struct archive* a) { |
| checkResult(p, a, archive_read_support_format_all(a)); |
| } |
| |
| void archiveReadSupportFormatAr(Dart_Port p, struct archive* a) { |
| checkResult(p, a, archive_read_support_format_ar(a)); |
| } |
| |
| void archiveReadSupportFormatCpio(Dart_Port p, struct archive* a) { |
| checkResult(p, a, archive_read_support_format_cpio(a)); |
| } |
| |
| void archiveReadSupportFormatEmpty(Dart_Port p, struct archive* a) { |
| checkResult(p, a, archive_read_support_format_empty(a)); |
| } |
| |
| void archiveReadSupportFormatIso9660(Dart_Port p, struct archive* a) { |
| checkResult(p, a, archive_read_support_format_iso9660(a)); |
| } |
| |
| void archiveReadSupportFormatMtree(Dart_Port p, struct archive* a) { |
| checkResult(p, a, archive_read_support_format_mtree(a)); |
| } |
| |
| void archiveReadSupportFormatRaw(Dart_Port p, struct archive* a) { |
| checkResult(p, a, archive_read_support_format_raw(a)); |
| } |
| |
| void archiveReadSupportFormatTar(Dart_Port p, struct archive* a) { |
| checkResult(p, a, archive_read_support_format_tar(a)); |
| } |
| |
| void archiveReadSupportFormatZip(Dart_Port p, struct archive* a) { |
| checkResult(p, a, archive_read_support_format_zip(a)); |
| } |
| |
| void archiveReadSetFilterOption(Dart_Port p, struct archive* a, |
| Dart_CObject* request) { |
| char* module; |
| char* name; |
| char* value; |
| |
| getOptionArguments(p, request, &module, &name, &value); |
| int result = archive_read_set_filter_option(a, module, name, value); |
| checkResult(p, a, result); |
| } |
| |
| void archiveReadSetFormatOptions(Dart_Port p, struct archive* a, |
| Dart_CObject* request) { |
| char* module; |
| char* name; |
| char* value; |
| |
| getOptionArguments(p, request, &module, &name, &value); |
| int result = archive_read_set_format_option(a, module, name, value); |
| checkResult(p, a, result); |
| } |
| |
| void archiveReadSetOptions(Dart_Port p, struct archive* a, |
| Dart_CObject* request) { |
| char* module; |
| char* name; |
| char* value; |
| |
| getOptionArguments(p, request, &module, &name, &value); |
| int result = archive_read_set_option(a, module, name, value); |
| checkResult(p, a, result); |
| } |
| |
| // TODO(nweiz): wrap archive_read_open2 |
| // TODO(nweiz): wrap archive_read_FILE when issue 4160 is fixed |
| |
| void archiveReadOpenFilename(Dart_Port p, struct archive* a, |
| Dart_CObject* request) { |
| Dart_CObject* filename = getTypedArgument(p, request, 0, kString); |
| if (filename == NULL) return; |
| |
| Dart_CObject* block_size = getIntArgument(p, request, 1); |
| if (block_size == NULL) return; |
| |
| int result = archive_read_open_filename(a, filename->value.as_string, |
| getInteger(block_size)); |
| checkResult(p, a, result); |
| } |
| |
| void archiveReadOpenMemory(Dart_Port p, struct archive* a, |
| Dart_CObject* request) { |
| Dart_CObject* filename = getTypedArgument(p, request, 0, kUint8Array); |
| if (filename == NULL) return; |
| |
| int result = archive_read_open_memory(a, filename->value.as_byte_array.values, |
| filename->value.as_byte_array.length); |
| checkResult(p, a, result); |
| } |
| |
| void archiveReadNextHeader(Dart_Port p, struct archive* a) { |
| // TODO(nweiz): At some point, we'll want to attach the actual archive pointer |
| // to the struct we send to Dart so that it can later be modified, passed in |
| // to other functions, etc. When we do so, we'll need to use archive_entry_new |
| // to create it and we'll have to attach a finalizer to the Dart object to |
| // ensure that it gets freed. |
| struct archive_entry* entry = archive_entry_new(); |
| if (checkPointerError(p, entry, "archive entry")) return; |
| |
| int result = archive_read_next_header2(a, entry); |
| if (result == ARCHIVE_EOF) { |
| postSuccess(p, NULL); |
| archive_entry_free(entry); |
| } else if (checkError(p, a, result)) { |
| archive_entry_free(entry); |
| } else { |
| postArchiveEntryArray(p, entry); |
| } |
| } |
| |
| void archiveReadDataBlock(Dart_Port p, struct archive* a) { |
| const void* buffer; |
| size_t len; |
| int64_t offset; |
| int result = archive_read_data_block(a, &buffer, &len, &offset); |
| if (result == ARCHIVE_EOF) { |
| postSuccess(p, NULL); |
| return; |
| } |
| if (checkError(p, a, result)) return; |
| |
| Dart_CObject wrapped_data_block; |
| wrapped_data_block.type = kUint8Array; |
| wrapped_data_block.value.as_byte_array.length = len; |
| wrapped_data_block.value.as_byte_array.values = (void*) buffer + offset; |
| postSuccess(p, &wrapped_data_block); |
| } |
| |
| void archiveReadDataSkip(Dart_Port p, struct archive* a) { |
| checkResult(p, a, archive_read_data_skip(a)); |
| } |
| |
| // TODO(nweiz): wrap archive_read_into_fd when issue 4160 is fixed |
| // TODO(nweiz): wrap archive_read_extract and friends |
| |
| void archiveReadClose(Dart_Port p, struct archive* a) { |
| checkResult(p, a, archive_read_close(a)); |
| } |
| |
| void archiveReadFree(Dart_Port p, struct archive* a) { |
| checkResult(p, a, archive_read_free(a)); |
| } |