Esempio n. 1
0
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
}
Esempio n. 2
0
const char * JValue::asCString() const
{
	if (!isString()) {
		return NULL;
	}

	raw_buffer backingBuffer = jstring_get_fast(m_jval);

	return backingBuffer.m_str;
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
/**
 *******************************************************************************
 * @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;
}
Esempio n. 5
0
//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;
}
Esempio n. 6
0
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));
}
Esempio n. 7
0
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;
}