// 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" #define DART_TIMESTAMP(name) \ Dart_CObject name; \ if (archive_entry_ ## name ## _is_set(e)) { \ int64_t seconds = archive_entry_ ## name(e); \ int64_t nanoseconds = archive_entry_ ## name ## _nsec(e); \ name.type = kInt64; \ name.value.as_int64 = seconds * 1000 + nanoseconds / 1000000; \ } else { \ name.type = kNull; \ } #define RAW_ARCHIVE_SIZE 29 void postArchiveEntryArray(Dart_Port p, struct archive_entry* e) { if (checkPointerError(p, e, "archive entry")) return; Dart_CObject* archive_entry_array[RAW_ARCHIVE_SIZE]; DART_INT64(id, (intptr_t) e); archive_entry_array[0] = &id; // archive_entry_paths(3) DART_STRING(hardlink, (char*) archive_entry_hardlink(e)); archive_entry_array[1] = &hardlink; DART_STRING(pathname, (char*) archive_entry_pathname(e)); archive_entry_array[2] = &pathname; DART_STRING(sourcepath, (char*) archive_entry_sourcepath(e)); archive_entry_array[3] = &sourcepath; DART_STRING(symlink, (char*) archive_entry_symlink(e)); archive_entry_array[4] = &symlink; // archive_entry_perms(3) DART_INT32(gid, archive_entry_gid(e)); archive_entry_array[5] = &gid; DART_INT32(uid, archive_entry_uid(e)); archive_entry_array[6] = &uid; DART_INT32(perm, archive_entry_perm(e)); archive_entry_array[7] = &perm; DART_STRING(strmode, (char*) archive_entry_strmode(e)); archive_entry_array[8] = &strmode; DART_STRING(gname, (char*) archive_entry_gname(e)); archive_entry_array[9] = &gname; DART_STRING(uname, (char*) archive_entry_uname(e)); archive_entry_array[10] = &uname; unsigned long fflags_set; unsigned long fflags_clear; archive_entry_fflags(e, &fflags_set, &fflags_clear); DART_INT64(wrapped_fflags_set, fflags_set); archive_entry_array[11] = &wrapped_fflags_set; DART_INT64(wrapped_fflags_clear, fflags_clear); archive_entry_array[12] = &wrapped_fflags_clear; DART_STRING(fflags_text, (char*) archive_entry_fflags_text(e)); archive_entry_array[13] = &fflags_text; // archive_entry_stat(3) DART_INT32(filetype, archive_entry_filetype(e)); archive_entry_array[14] = &filetype; DART_INT32(mode, archive_entry_mode(e)); archive_entry_array[15] = &mode; Dart_CObject size; if (archive_entry_size_is_set(e)) { size.type = kInt64; size.value.as_int64 = archive_entry_size(e); } else { size.type = kNull; } archive_entry_array[16] = &size; Dart_CObject dev; if (archive_entry_dev_is_set(e)) { dev.type = kInt64; dev.value.as_int64 = archive_entry_dev(e); } else { dev.type = kNull; } archive_entry_array[17] = &dev; DART_INT64(devmajor, archive_entry_devmajor(e)); archive_entry_array[18] = &devmajor; DART_INT64(devminor, archive_entry_devminor(e)); archive_entry_array[19] = &devminor; Dart_CObject ino; if (archive_entry_ino_is_set(e)) { ino.type = kInt64; ino.value.as_int64 = archive_entry_ino64(e); } else { ino.type = kNull; } archive_entry_array[20] = &ino; DART_INT64(nlink, archive_entry_nlink(e)); archive_entry_array[21] = &nlink; DART_INT64(rdev, archive_entry_rdev(e)); archive_entry_array[22] = &rdev; DART_INT64(rdevmajor, archive_entry_rdevmajor(e)); archive_entry_array[23] = &rdevmajor; DART_INT64(rdevminor, archive_entry_rdevminor(e)); archive_entry_array[24] = &rdevminor; // archive_entry_time(3) DART_TIMESTAMP(atime); archive_entry_array[25] = &atime; DART_TIMESTAMP(birthtime); archive_entry_array[26] = &birthtime; DART_TIMESTAMP(ctime); archive_entry_array[27] = &ctime; DART_TIMESTAMP(mtime); archive_entry_array[28] = &mtime; // If you add entries, don't forget to increase RAW_ARCHIVE_SIZE. Dart_CObject wrapped_archive_entry; wrapped_archive_entry.type = kArray; wrapped_archive_entry.value.as_array.values = archive_entry_array; wrapped_archive_entry.value.as_array.length = RAW_ARCHIVE_SIZE; postSuccess(p, &wrapped_archive_entry); } void archiveEntryClone(Dart_Port p, struct archive_entry* e) { postArchiveEntryArray(p, archive_entry_clone(e)); } void archiveEntryFree(Dart_Port p, struct archive_entry* e) { archive_entry_free(e); postSuccess(p, NULL); } void archiveEntryNew(Dart_Port p) { postArchiveEntryArray(p, archive_entry_new()); } void archiveEntrySetHardlink(Dart_Port p, struct archive_entry* e, Dart_CObject* request) { Dart_CObject* value = getNullableStringArgument(p, request, 0); if (value == NULL) return; archive_entry_set_hardlink(e, getNullableString(value)); postSuccess(p, NULL); } void archiveEntrySetPathname(Dart_Port p, struct archive_entry* e, Dart_CObject* request) { Dart_CObject* value = getNullableStringArgument(p, request, 0); if (value == NULL) return; archive_entry_set_pathname(e, getNullableString(value)); postSuccess(p, NULL); } void archiveEntrySetSymlink(Dart_Port p, struct archive_entry* e, Dart_CObject* request) { Dart_CObject* value = getNullableStringArgument(p, request, 0); if (value == NULL) return; archive_entry_set_symlink(e, getNullableString(value)); postSuccess(p, NULL); } void archiveEntrySetGid(Dart_Port p, struct archive_entry* e, Dart_CObject* request) { Dart_CObject* value = getIntArgument(p, request, 0); if (value == NULL) return; archive_entry_set_gid(e, getInteger(value)); postSuccess(p, NULL); } void archiveEntrySetUid(Dart_Port p, struct archive_entry* e, Dart_CObject* request) { Dart_CObject* value = getIntArgument(p, request, 0); if (value == NULL) return; archive_entry_set_uid(e, getInteger(value)); postSuccess(p, NULL); } void archiveEntrySetPerm(Dart_Port p, struct archive_entry* e, Dart_CObject* request) { Dart_CObject* value = getIntArgument(p, request, 0); if (value == NULL) return; archive_entry_set_perm(e, getInteger(value)); postSuccess(p, NULL); } void archiveEntrySetGname(Dart_Port p, struct archive_entry* e, Dart_CObject* request) { Dart_CObject* value = getNullableStringArgument(p, request, 0); if (value == NULL) return; archive_entry_update_gname_utf8(e, getNullableString(value)); postSuccess(p, NULL); } void archiveEntrySetUname(Dart_Port p, struct archive_entry* e, Dart_CObject* request) { Dart_CObject* value = getNullableStringArgument(p, request, 0); if (value == NULL) return; archive_entry_update_uname_utf8(e, getNullableString(value)); postSuccess(p, NULL); } void archiveEntrySetFflagsSet(Dart_Port p, struct archive_entry* e, Dart_CObject* request) { Dart_CObject* value = getIntArgument(p, request, 0); if (value == NULL) return; archive_entry_set_fflags(e, getInteger(value), 0); postSuccess(p, NULL); } void archiveEntrySetFflagsClear(Dart_Port p, struct archive_entry* e, Dart_CObject* request) { Dart_CObject* value = getIntArgument(p, request, 0); if (value == NULL) return; archive_entry_set_fflags(e, 0, getInteger(value)); postSuccess(p, NULL); } void archiveEntrySetFiletype(Dart_Port p, struct archive_entry* e, Dart_CObject* request) { Dart_CObject* value = getIntArgument(p, request, 0); if (value == NULL) return; archive_entry_set_filetype(e, getInteger(value)); postSuccess(p, NULL); } void archiveEntrySetMode(Dart_Port p, struct archive_entry* e, Dart_CObject* request) { Dart_CObject* value = getIntArgument(p, request, 0); if (value == NULL) return; archive_entry_set_mode(e, getInteger(value)); postSuccess(p, NULL); } void archiveEntrySetSize(Dart_Port p, struct archive_entry* e, Dart_CObject* request) { if (request->type == kNull) { archive_entry_unset_size(e); postSuccess(p, NULL); return; } Dart_CObject* value = getIntArgument(p, request, 0); if (value == NULL) return; archive_entry_set_size(e, getInteger(value)); postSuccess(p, NULL); } void archiveEntrySetDev(Dart_Port p, struct archive_entry* e, Dart_CObject* request) { Dart_CObject* value = getIntArgument(p, request, 0); if (value == NULL) return; archive_entry_set_dev(e, getInteger(value)); postSuccess(p, NULL); } void archiveEntrySetDevmajor(Dart_Port p, struct archive_entry* e, Dart_CObject* request) { Dart_CObject* value = getIntArgument(p, request, 0); if (value == NULL) return; archive_entry_set_devmajor(e, getInteger(value)); postSuccess(p, NULL); } void archiveEntrySetDevminor(Dart_Port p, struct archive_entry* e, Dart_CObject* request) { Dart_CObject* value = getIntArgument(p, request, 0); if (value == NULL) return; archive_entry_set_devminor(e, getInteger(value)); postSuccess(p, NULL); } void archiveEntrySetIno(Dart_Port p, struct archive_entry* e, Dart_CObject* request) { Dart_CObject* value = getIntArgument(p, request, 0); if (value == NULL) return; archive_entry_set_ino64(e, getInteger(value)); postSuccess(p, NULL); } void archiveEntrySetNlink(Dart_Port p, struct archive_entry* e, Dart_CObject* request) { Dart_CObject* value = getIntArgument(p, request, 0); if (value == NULL) return; archive_entry_set_nlink(e, getInteger(value)); postSuccess(p, NULL); } void archiveEntrySetRdev(Dart_Port p, struct archive_entry* e, Dart_CObject* request) { Dart_CObject* value = getIntArgument(p, request, 0); if (value == NULL) return; archive_entry_set_rdev(e, getInteger(value)); postSuccess(p, NULL); } void archiveEntrySetRdevmajor(Dart_Port p, struct archive_entry* e, Dart_CObject* request) { Dart_CObject* value = getIntArgument(p, request, 0); if (value == NULL) return; archive_entry_set_rdevmajor(e, getInteger(value)); postSuccess(p, NULL); } void archiveEntrySetRdevminor(Dart_Port p, struct archive_entry* e, Dart_CObject* request) { Dart_CObject* value = getIntArgument(p, request, 0); if (value == NULL) return; archive_entry_set_rdevminor(e, getInteger(value)); postSuccess(p, NULL); } void archiveEntrySetAtime(Dart_Port p, struct archive_entry* e, Dart_CObject* request) { if (request->type == kNull) { archive_entry_unset_atime(e); postSuccess(p, NULL); return; } Dart_CObject* value = getIntArgument(p, request, 0); if (value == NULL) return; int64_t atime = getInteger(value); archive_entry_set_atime(e, atime / 1000, (atime % 1000) * 1000000); postSuccess(p, NULL); } void archiveEntrySetBirthtime(Dart_Port p, struct archive_entry* e, Dart_CObject* request) { if (request->type == kNull) { archive_entry_unset_birthtime(e); postSuccess(p, NULL); return; } Dart_CObject* value = getIntArgument(p, request, 0); if (value == NULL) return; int64_t birthtime = getInteger(value); archive_entry_set_birthtime( e, birthtime / 1000, (birthtime % 1000) * 1000000); postSuccess(p, NULL); } void archiveEntrySetCtime(Dart_Port p, struct archive_entry* e, Dart_CObject* request) { if (request->type == kNull) { archive_entry_unset_ctime(e); postSuccess(p, NULL); return; } Dart_CObject* value = getIntArgument(p, request, 0); if (value == NULL) return; int64_t ctime = getInteger(value); archive_entry_set_ctime(e, ctime / 1000, (ctime % 1000) * 1000000); postSuccess(p, NULL); } void archiveEntrySetMtime(Dart_Port p, struct archive_entry* e, Dart_CObject* request) { if (request->type == kNull) { archive_entry_unset_mtime(e); postSuccess(p, NULL); return; } Dart_CObject* value = getIntArgument(p, request, 0); if (value == NULL) return; int64_t mtime = getInteger(value); archive_entry_set_mtime(e, mtime / 1000, (mtime % 1000) * 1000000); postSuccess(p, NULL); }