JValue::JValue(const char *str) : m_input(str) { PJ_DBG_CXX_STR(std::cerr << "Have handle to string at " << (void*)m_input.c_str() << std::endl); #if PBNJSON_ZERO_COPY_STL_STR m_jval = jstring_create_nocopy(strToRawBuffer(m_input)); assert(jstring_get_fast(m_jval).m_str == m_input.c_str() || m_input.length() == 0); assert(jstring_get_fast(m_jval).m_len == m_input.length()); #else m_jval = jstring_create_utf8(m_input.c_str(), m_input.size()); #endif }
const char * JValue::asCString() const { if (!isString()) { return NULL; } raw_buffer backingBuffer = jstring_get_fast(m_jval); return backingBuffer.m_str; }
ConversionResultFlags JValue::asString(std::string &asStr) const { if (!isString()) { return CONV_NOT_A_STRING; } raw_buffer backingBuffer = jstring_get_fast(m_jval); if (backingBuffer.m_str == NULL) { asStr = ""; return CONV_NOT_A_STRING; } asStr = std::string(backingBuffer.m_str, backingBuffer.m_len); return CONV_OK; }
/** ******************************************************************************* * @brief Get the service name from a "ServceStatus" message. The name is * allocated and should be freed. * * @param message IN message * * @retval name string on success * @retval NULL on error ******************************************************************************* */ char* LSTransportServiceStatusSignalGetServiceName(_LSTransportMessage *message) { JSchemaInfo schemaInfo; jschema_info_init(&schemaInfo, jschema_all(), NULL, NULL); LS_ASSERT(_LSTransportMessageGetType(message) == _LSTransportMessageTypeServiceDownSignal || _LSTransportMessageGetType(message) == _LSTransportMessageTypeServiceUpSignal); char *service_name = NULL; jvalue_ref service_name_obj = NULL; const char *payload = _LSTransportMessageGetPayload(message); if (!payload) { LOG_LS_ERROR(MSGID_LS_INVALID_JSON, 0, "Unable to get payload from message"); return NULL; } /* get the serviceName part of the JSON object */ jvalue_ref payload_json = jdom_parse(j_cstr_to_buffer(payload), DOMOPT_NOOPT, &schemaInfo); bool ret = jobject_get_exists(payload_json, J_CSTR_TO_BUF(SERVICE_STATUS_SERVICE_NAME), &service_name_obj); if (ret) { raw_buffer service_name_buf = jstring_get_fast(service_name_obj); service_name = g_strndup(service_name_buf.m_str, service_name_buf.m_len); } else { LOG_LS_ERROR(MSGID_LS_INVALID_JSON, 0, "Unable to get service name string from payload: %s", payload); } j_release(&payload_json); return service_name; }
//Helper function for jobject_to_string_append() static bool key_value_to_string_append (jobject_key_value key_value, JStreamRef generating) { //jvalue_to_string_append is enough for the key if schema validation isn't needed. //->o_key is called for validation. //jvalue_to_string_append (key_value.key, generating); if(generating->o_key(generating, jstring_deref(key_value.key)->m_data)) { //Key was OK - now process the value. if(UNLIKELY(!jvalue_to_string_append (key_value.value, generating))) { return false; } } else { PJ_LOG_ERR("Schema validation error with key: '%s'", jstring_get_fast(key_value.key).m_str); return false; } return true; }
bool JValue::remove(const JValue &key) { if (!jis_string(key.m_jval)) return false; return jobject_remove(m_jval, jstring_get_fast(key.m_jval)); }
static inline bool jsax_parse_inject_internal(JSAXContextRef ctxt, jvalue_ref key, jvalue_ref value) { assert (ctxt != NULL); assert (value != NULL); yajl_callbacks *cbs = ctxt->m_handlers; raw_buffer str; if (key) { str = jstring_get_fast(key); if (UNLIKELY(!cbs->yajl_map_key(ctxt, (const unsigned char *)str.m_str, str.m_len))) return false; } switch (value->m_type) { case JV_OBJECT: { jobject_key_value keyval; if (UNLIKELY(!cbs->yajl_start_map(ctxt))) return false; for (jobject_iter i = jobj_iter_init(value); jobj_iter_is_valid(i); i = jobj_iter_next(i)) { jobj_iter_deref(i, &keyval); if (UNLIKELY(!jsax_parse_inject(ctxt, keyval.key, keyval.value))) return false; } if (UNLIKELY(!cbs->yajl_end_map(ctxt))) return false; break; } case JV_ARRAY: { jvalue_ref item; if (UNLIKELY(!cbs->yajl_start_array(ctxt))) return false; for (ssize_t i = jarray_size(value) - 1; i >= 0; i--) { item = jarray_get(value, i); if (UNLIKELY(!jsax_parse_inject(ctxt, NULL, item))) return false; } if (UNLIKELY(!cbs->yajl_end_array(ctxt))) return false; break; } case JV_STR: { str = jstring_get_fast(value); if (UNLIKELY(!cbs->yajl_string(ctxt, (const unsigned char *)str.m_str, str.m_len))) return false; break; } case JV_NUM: { assert (value->value.val_num.m_type == NUM_RAW); // this numeric string should have come directly from a schema - we don't do any conversion internally. // how did this state occur? CHECK_CONDITION_RETURN_VALUE(value->value.val_num.m_type != NUM_RAW, false, "Some internal problem parsing schema"); str = jnumber_deref_raw(value); if (UNLIKELY(!cbs->yajl_number(ctxt, str.m_str, str.m_len))) return false; break; } case JV_BOOL: { if (UNLIKELY(!cbs->yajl_boolean(ctxt, jboolean_deref(value)))) return false; break; } case JV_NULL: { if (UNLIKELY(!cbs->yajl_null(ctxt))) return false; break; } default: { // how can this occur? - memory corruption? PJ_SCHEMA_ERR("Internal error - schema is corrupt"); return false; } } return true; }