Files
OSSP/src/libopensubsonic/endpoint_ping.c
T

73 lines
2.8 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../external/cJSON.h"
#include "logger.h"
#include "utils.h"
#include "endpoint_ping.h"
// Parse the JSON returned from the /rest/ping endpoint
// Returns 1 if failure occured, else 0
int opensubsonic_ping_parse(char* data, opensubsonic_ping_struct** pingStruct) {
// Allocate on the heap
*pingStruct = malloc(sizeof(opensubsonic_ping_struct));
// Initialize struct variables
(*pingStruct)->status = NULL;
(*pingStruct)->version = NULL;
(*pingStruct)->serverType = NULL;
(*pingStruct)->serverVersion = NULL;
(*pingStruct)->openSubsonicCapable = false;
(*pingStruct)->error = false;
(*pingStruct)->errorCode = 0;
(*pingStruct)->errorMessage = NULL;
// Parse the JSON
cJSON* root = cJSON_Parse(data);
if (root == NULL) {
logger_log_error(__func__, "Error parsing JSON.");
return 1;
}
// Make an object from subsonic-response
cJSON* subsonic_root = cJSON_GetObjectItemCaseSensitive(root, "subsonic-response");
if (subsonic_root == NULL) {
logger_log_error(__func__, "Error handling JSON - subsonic-response does not exist.");
cJSON_Delete(root);
return 1;
}
OSS_Psoj(&(*pingStruct)->status, subsonic_root, "status");
OSS_Psoj(&(*pingStruct)->version, subsonic_root, "version");
OSS_Psoj(&(*pingStruct)->serverType, subsonic_root, "type");
OSS_Psoj(&(*pingStruct)->serverVersion, subsonic_root, "serverVersion");
OSS_Pboj(&(*pingStruct)->openSubsonicCapable, subsonic_root, "openSubsonic");
// Check if an error is present
cJSON* subsonic_error = cJSON_GetObjectItemCaseSensitive(subsonic_root, "error");
if (subsonic_error == NULL) {
// Error did not occur, return
cJSON_Delete(root);
return 0;
}
(*pingStruct)->error = true;
// From this point on, error has occured, capture error information
OSS_Pioj(&(*pingStruct)->errorCode, subsonic_error, "code");
OSS_Psoj(&(*pingStruct)->errorMessage, subsonic_error, "message");
logger_log_error(__func__, "Error noted in JSON - Code %d: %s", (*pingStruct)->errorCode, (*pingStruct)->errorMessage);
cJSON_Delete(root);
return 1;
}
void opensubsonic_ping_struct_free(opensubsonic_ping_struct** pingStruct) {
logger_log_general(__func__, "Freeing /ping endpoint heap objects.");
if ((*pingStruct)->status != NULL) { free((*pingStruct)->status); }
if ((*pingStruct)->version != NULL) { free((*pingStruct)->version); }
if ((*pingStruct)->serverType != NULL) { free((*pingStruct)->serverType); }
if ((*pingStruct)->serverVersion != NULL) { free((*pingStruct)->serverVersion); }
if ((*pingStruct)->errorMessage != NULL) { free((*pingStruct)->errorMessage); }
if (*pingStruct != NULL) { free(*pingStruct); }
}