celix_status_t celix_bundleArchive_create()

in libs/framework/src/celix_bundle_archive.c [243:316]


celix_status_t celix_bundleArchive_create(celix_framework_t* fw, const char *archiveRoot, long id, const char *location, celix_bundle_archive_t** bundle_archive) {
    celix_status_t status = CELIX_SUCCESS;
    celix_autoptr(celix_bundle_archive_t) archive = calloc(1, sizeof(*archive));
    bool isFrameworkBundle = id == CELIX_FRAMEWORK_BUNDLE_ID;

    if (!archive) {
        fw_log(fw->logger, CELIX_LOG_LEVEL_ERROR, "Could not allocate memory for the bundle archive.");
        return ENOMEM;
    }

    archive->fw = fw;
    archive->id = id;

    if (isFrameworkBundle) {
        archive->resourceCacheRoot = getcwd(NULL, 0);
        archive->storeRoot = getcwd(NULL, 0);
        if (archive->resourceCacheRoot == NULL || archive->storeRoot == NULL) {
            status = CELIX_ENOMEM;
        }
    } else {
        status = CELIX_ENOMEM;
        do {
            archive->location = celix_utils_strdup(location);
            if (archive->location == NULL) {
                break;
            }
            archive->archiveRoot = celix_utils_strdup(archiveRoot);
            if (archive->archiveRoot == NULL) {
                break;
            }
            if (asprintf(&archive->savedBundleStatePropertiesPath, "%s/%s", archiveRoot,
                         CELIX_BUNDLE_ARCHIVE_STATE_PROPERTIES_FILE_NAME) < 0) {
                break;
            }
            if (asprintf(&archive->storeRoot, "%s/%s", archive->archiveRoot, CELIX_BUNDLE_ARCHIVE_STORE_DIRECTORY_NAME) < 0) {
                break;
            }
            if (asprintf(&archive->resourceCacheRoot, "%s/%s", archive->archiveRoot, CELIX_BUNDLE_ARCHIVE_RESOURCE_CACHE_NAME) < 0) {
                break;
            }
            status = CELIX_SUCCESS;
        } while (0);
    }
    if (status != CELIX_SUCCESS) {
        fw_log(fw->logger, CELIX_LOG_LEVEL_ERROR, "Failed to create bundle archive; Out of memory.");
        return status;
    }

    if (isFrameworkBundle) {
        status = celix_bundleManifest_createFrameworkManifest(&archive->manifest);
    } else {
        status = celix_bundleArchive_createCacheDirectory(archive, &archive->manifest);
    }
    if (status != CELIX_SUCCESS) {
        fw_logCode(fw->logger, CELIX_LOG_LEVEL_ERROR, status, "Failed to create bundle archive.");
        if (!isFrameworkBundle) {
            celix_utils_deleteDirectory(archive->archiveRoot, NULL);
        }
        return status;
    }

    if (!isFrameworkBundle) {
        status = celix_bundleArchive_storeBundleStateProperties(archive);
        if (status != CELIX_SUCCESS) {
            fw_logCode(fw->logger, CELIX_LOG_LEVEL_ERROR, status, "Failed to store bundle state properties.");
            celix_utils_deleteDirectory(archive->archiveRoot, NULL);
            return status;
        }
    }
    archive->cacheValid = true;
    archive->valid = true;
    *bundle_archive = celix_steal_ptr(archive);
    return CELIX_SUCCESS;
}