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;
}