GVariant* jsValueToGVariant(JSContextRef ctx, JSValueRef jsVal, std::string signature)
{
- LoggerD("Entered");
+ LoggerE("Entered");
JSType type = JSValueGetType(ctx, jsVal);
- LoggerD("JSType: " << type <<" signature: "<<signature);
+ LoggerE("JSType: " << type <<" signature: "<<signature);
Converter converter(ctx);
GVariant *parameters,
gpointer user_data)
{
- LoggerD("Entered");
+ LoggerE("Entered");
VehicleMaster* master = static_cast<VehicleMaster*>(user_data);
char* key;
GVariant *value;
- LoggerD("argument type: " << g_variant_get_type_string(valueArray));
+ LoggerE("argument type: " << g_variant_get_type_string(valueArray));
g_variant_iter_init(&iter,valueArray);
ObjectZone object(master->objectPathToObjectNameMap[object_path]);
- LoggerD("Object name is: "<<object.name);
- LoggerD("Object zone is: "<<object.zone);
- LoggerD("number of items in the array: " << g_variant_iter_n_children(&iter));
+ LoggerE("Object name is: "<<object.name);
+ LoggerE("Object zone is: "<<object.zone);
+ LoggerE("number of items in the array: " << g_variant_iter_n_children(&iter));
while(g_variant_iter_next(&iter,"{sv}", &key, &value))
{
- LoggerD("setting key: "<<key);
+ LoggerE("setting key: "<<key);
if(master->objectToPropertyValuesMap[object].find(key) == master->objectToPropertyValuesMap[object].end())
{
std::map<std::string, GVariant*> VehicleMaster::get(std::string property, int zone)
{
- LoggerD("Entered");
+ LoggerE("Entered");
std::map<std::string, GVariant*> returnValue;
if(objPStr == "")
{
- LoggerD("could not find property " << property);
+ LoggerE("could not find property " << property);
return returnValue;
}
- LoggerD("Getting properties interface");
+ LoggerE("Getting properties interface");
GDBusProxy* propertiesProxy = g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_NONE, NULL,
"org.automotive.message.broker",
if(error)
{
- LoggerD("failed to call GetAll on interface " << interfaceName);
+ LoggerE("failed to call GetAll on interface " << interfaceName);
g_object_unref(propertiesProxy);
g_error_free(error);
return returnValue;
return returnValue;
}
+void VehicleMaster::get(std::string property, JSObjectRef successCallback, JSObjectRef errorCallback, JSContextRef context, int zone)
+{
+ LoggerE("Async Entered");
+
+ GError* error = NULL;
+
+ std::string objPStr = findProperty(property, zone);
+
+ if(objPStr == "")
+ {
+ LoggerE("could not find property " << property);
+ return;
+ }
+
+ LoggerE("Getting properties interface");
+
+ GDBusProxy* propertiesProxy = g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_NONE, NULL,
+ "org.automotive.message.broker",
+ objPStr.c_str(),
+ "org.freedesktop.DBus.Properties",
+ NULL,
+ &error);
+
+ if(error)
+ {
+ LoggerE("failed to get properties proxy");
+ g_error_free(error);
+ return;
+ }
+
+ std::string interfaceName = "org.automotive." + property;
+
+ VehicleSubscribeCB * cbObj = new VehicleSubscribeCB;
+
+ cbObj->callback = successCallback;
+ cbObj->errorCallback = errorCallback;
+ cbObj->context = context;
+
+ g_dbus_proxy_call(propertiesProxy, "GetAll", g_variant_new("(s)", interfaceName.c_str()), G_DBUS_CALL_FLAGS_NONE, -1, NULL,[](GObject* source, GAsyncResult* res, gpointer user_data)
+ {
+ LoggerE("GetAll() method call completed");
+
+ GError * error= nullptr;
+
+ GVariant* propertyMap = g_dbus_proxy_call_finish (G_DBUS_PROXY (source), res, &error);
+
+ if(error)
+ {
+ LoggerE("failed to call GetAll on interface.");
+ g_error_free(error);
+ return;
+ }
+
+ VehicleSubscribeCB * cbObj = static_cast<VehicleSubscribeCB*>(user_data);
+
+ if(!cbObj)
+ {
+ return;
+ }
+
+ GVariantIter* iter;
+ char* key;
+ GVariant *value;
+
+ std::map<std::string, GVariant*> returnValue;
+
+ g_variant_get(propertyMap,"(a{sv})",&iter);
+
+ while(g_variant_iter_next(iter,"{sv}", &key, &value))
+ {
+ returnValue[key] = value;
+ }
+
+ std::stringstream json;
+
+ json<<"{";
+
+ for(auto itr = returnValue.begin(); itr != returnValue.end(); itr++)
+ {
+ if(json.str() != "{") json<<",";
+
+ std::string key = (*itr).first;
+
+ /// make key lowerCamelCase:
+ std::transform(key.begin(), key.begin()+1, key.begin(), ::tolower);
+
+ GVariant* var = (*itr).second;
+
+ gsize size;
+
+ LoggerE("get variant type: " << g_variant_get_type_string(var));
+ json<<"\""<<key<<"\" : "<<json_gvariant_serialize_data(var,&size);
+
+ g_variant_unref(var);
+
+ }
+
+ json << "}";
+
+ Converter converter(cbObj->context);
+
+ LoggerE("get json: " << json.str().c_str());
+
+ JSStringRef jsonString = converter.toJSStringRef(json.str());
+
+ JSValueRef val = JSValueMakeFromJSONString(cbObj->context, jsonString);
+
+ const JSValueRef arguments[1] = { val };
+
+ LoggerE("calling callback");
+ JSObjectCallAsFunction(cbObj->context, cbObj->callback, NULL, 1, arguments, NULL);
+ LoggerE("finished calling callback");
+
+ delete cbObj;
+
+ }, cbObj);
+
+}
+
void VehicleMaster::subscribe(std::string objectName, JSObjectRef successCallback, JSContextRef context, int zone)
{
- LoggerD("Entered");
- LoggerD("Subscribing to " << objectName << " in zone: " << zone);
+ LoggerE("Entered");
+ LoggerE("Subscribing to " << objectName << " in zone: " << zone);
ObjectZone object(objectName,zone);
if(error)
{
- LoggerD("failed to call GetAll on interface " << interfaceName<< " "<<error->message);
+ LoggerE("failed to call GetAll on interface " << interfaceName<< " "<<error->message);
///TODO: call error callback
return;
}
while(g_variant_iter_next(iter,"{sv}", &key, &value))
{
- LoggerD("Setting initial value for " << key);
+ LoggerE("Setting initial value for " << key);
objectToPropertyValuesMap[object][key] = value;
}
}
else {
- LoggerD("Already subscribed to " << objectName);
+ LoggerE("Already subscribed to " << objectName);
}
VehicleSubscribeCB cb;
objectToFunctionListMap[object].push_back(cb);
- LoggerD("Successfully subscribed!");
+ LoggerE("Successfully subscribed!");
}
GDBusProxy* VehicleMaster::automotiveManager()
{
- LoggerD("Entered");
+ LoggerE("Entered");
if(mAutomotiveManager) return mAutomotiveManager;
std::string VehicleMaster::findProperty(std::string objectName, int zone)
{
- LoggerD("Entered");
+ LoggerE("Entered");
GDBusProxy* managerProxy = automotiveManager();
GError *error = nullptr;
if(error)
{
- LoggerD("error calling FindObjectForZone "<< error->message);
- LoggerD("Could not find object in zone "<< zone );
+ LoggerE("error calling FindObjectForZone "<< error->message);
+ LoggerE("Could not find object in zone "<< zone );
g_error_free(error);
return "";
}
if(!objectPath)
{
- LoggerD("Could not find object in zone "<< zone );
+ LoggerE("Could not find object in zone "<< zone );
return "";
}
- LoggerD("returned object path: " << g_variant_get_type_string(objectPath));
+ LoggerE("returned object path: " << g_variant_get_type_string(objectPath));
gchar * objP;
g_variant_get(objectPath,"(o)", &objP);
- LoggerD("FindObjectForZone() returned object path: " <<objP);
+ LoggerE("FindObjectForZone() returned object path: " <<objP);
g_variant_unref(objectPath);
void VehicleMaster::onSignalReceived(ObjectZone objectName, std::map<std::string, GVariant*> propertyMap)
{
- LoggerD("Entered");
+ LoggerE("Entered");
std::string json = mapToJSon(propertyMap);
if(!cbs.size())
{
- LoggerD("No callbacks for this signal. aborting");
+ LoggerE("No callbacks for this signal. aborting");
return;
}
{
VehicleSubscribeCB cb = *itr;
- LoggerD("calling callback");
+ LoggerE("calling callback");
JSObjectCallAsFunction(cb.context, cb.callback, NULL, 1, arguments, NULL);
- LoggerD("finished calling callback");
+ LoggerE("finished calling callback");
}
}catch(...)
{
GVariant* VehicleMaster::listObjects()
{
- LoggerD("Entered");
+ LoggerE("Entered");
GDBusProxy* managerProxy = automotiveManager();
if(error)
{
- LoggerD("error calling list "<< error->message);
+ LoggerE("error calling list "<< error->message);
g_error_free(error);
if(supportedList)
VehicleMaster::ErrorType VehicleMaster::set(std::string objectName, std::map<std::string, JSValueRef> values, JSContextRef context, int zone)
{
- LoggerD("Entered");
+ LoggerE("Entered");
std::string objectPath = findProperty(objectName, zone);
if(objectPath == "")
{
- LoggerD("Object not found. Check object Name and zone.");
+ LoggerE("Object not found. Check object Name and zone.");
return InvalidArguments;
}
&error);
std::string interfaceName = "org.automotive." + objectName;
- LoggerD("Trace");
+ LoggerE("Trace");
for(auto itr = values.begin(); itr != values.end(); itr++)
{
GError* err = nullptr;
std::string property = (*itr).first;
- LoggerD("trying to set property "<< property);
+ LoggerE("trying to set property "<< property);
/// First, get the value so we know the signature:
if(err || varValue == nullptr)
{
- LoggerD("error getting initial property signature type.");
+ LoggerE("error getting initial property signature type.");
g_error_free(err);
err = nullptr;
return Unknown;
}
- LoggerD("Trace");
+ LoggerE("Trace");
- LoggerD("var value type: "<<g_variant_get_type_string(varValue));
+ LoggerE("var value type: "<<g_variant_get_type_string(varValue));
GVariant* getValue;
g_variant_get(varValue, "(v)", &getValue);
if(!getValue)
{
- LoggerD("Error getting variant value");
+ LoggerE("Error getting variant value");
g_object_unref(propertiesProxy);
g_variant_unref(varValue);
return Unknown;
}
GVariant *value = jsValueToGVariant(context, (*itr).second, g_variant_get_type_string(getValue));
- LoggerD("Trace");
+ LoggerE("Trace");
if(!value)
{
return Unknown;
}
- LoggerD("calling Set");
+ LoggerE("calling Set");
g_dbus_proxy_call_sync(propertiesProxy, "Set", g_variant_new("(ssv)", interfaceName.c_str(), property.c_str(), value), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err);
- LoggerD("set called");
+ LoggerE("set called");
g_variant_unref(value);
g_variant_unref(varValue);
g_variant_unref(getValue);
- LoggerD("cleaned up");
+ LoggerE("cleaned up");
if(err)
{
- LoggerD("error setting property:" << err->message);
+ LoggerE("error setting property:" << err->message);
/// TODO: return proper ErrorType here:
g_object_unref(propertiesProxy);
if(err->code == G_IO_ERROR_PERMISSION_DENIED || std::string(g_dbus_error_get_remote_error(err)) == "org.freedesktop.DBus.Error.AccessDenied")
{
- LoggerD("permission denied");
+ LoggerE("permission denied");
return PermissionDenied;
}
return Unknown;
}
- LoggerD("set was probably successful");
+ LoggerE("set was probably successful");
}
g_object_unref(propertiesProxy);
void VehicleMaster::getHistory(std::string objectName, int zone, double begin, double end, JSObjectRef successCallback, JSObjectRef errorCallback, JSContextRef context)
{
- LoggerD("Entered");
+ LoggerE("Entered");
std::string objectPath = findProperty(objectName, zone);
auto cb = [](GObject* source, GAsyncResult *res, gpointer user_data)
{
- LoggerD("GetHistory DBus call completed");
+ LoggerE("GetHistory DBus call completed");
GError *error = nullptr;
GVariant *result;
if(error)
{
- LoggerD("error getting history: "<<error->message);
- LoggerD("pre-error-callback");
+ LoggerE("error getting history: "<<error->message);
+ LoggerE("pre-error-callback");
const JSValueRef arguments[1] = { JSValueMakeNumber(histCb.context, 10) };
JSObjectCallAsFunction(histCb.context, histCb.errorCallback, NULL, 1, arguments, NULL);
- LoggerD("post error callback");
+ LoggerE("post error callback");
return;
}
- LoggerD("TRACE");
+ LoggerE("TRACE");
GVariantIter* iter;
char* key;
GVariant *value;
double time;
- LoggerD("variant sig type: "<<g_variant_get_type_string(result));
+ LoggerE("variant sig type: "<<g_variant_get_type_string(result));
g_variant_get(result,"(a(svd))",&iter);
gsize s = g_variant_iter_n_children(iter);
- LoggerD("Results: "<<s);
+ LoggerE("Results: "<<s);
std::list<std::string > superList;
std::map<std::string, GVariant*> obj;
int i=0;
- LoggerD("populating array");
+ LoggerE("populating array");
for(auto itr = superList.begin(); itr != superList.end(); itr++)
{
JSStringRelease(jsonString);
}
- LoggerD("making array");
+ LoggerE("making array");
JSObjectRef jsresult = JSObjectMakeArray(histCb.context, superList.size(), values, NULL);
const JSValueRef arguments[1] = { jsresult };
- LoggerD("calling callback");
+ LoggerE("calling callback");
JSObjectCallAsFunction(histCb.context, histCb.callback, NULL, 1, arguments, NULL);
- LoggerD("finished calling callback");
+ LoggerE("finished calling callback");
JSValueUnprotect(histCb.context, histCb.callback);
JSValueUnprotect(histCb.context, histCb.errorCallback);
GVariant* VehicleMaster::listZones(std::string objectName)
{
- LoggerD("Entered");
+ LoggerE("Entered");
GDBusProxy* managerProxy = automotiveManager();
if(error)
{
- LoggerD("error calling listZones "<< error->message);
+ LoggerE("error calling listZones "<< error->message);
g_error_free(error);
if(supportedList)