From 6fecebbdce941e64d04f1f12de936de636266e14 Mon Sep 17 00:00:00 2001 From: Kevron Rees Date: Thu, 23 Jan 2014 14:33:36 -0800 Subject: [PATCH] added async version of vehicle.get Change-Id: Ida4cef5c0e9229841d05db99928009b9864919fc --- packaging/wrt-plugins-ivi.changes | 3 + packaging/wrt-plugins-ivi.spec | 2 +- src/Vehicle/JSVehicle.cpp | 42 +++++++ src/Vehicle/JSVehicle.h | 6 + src/Vehicle/Vehicle.cpp | 239 ++++++++++++++++++++++++++++---------- src/Vehicle/Vehicle.h | 2 + src/Vehicle/Vehicle.idl | 12 ++ 7 files changed, 245 insertions(+), 61 deletions(-) diff --git a/packaging/wrt-plugins-ivi.changes b/packaging/wrt-plugins-ivi.changes index a46d0bd..71d15ee 100644 --- a/packaging/wrt-plugins-ivi.changes +++ b/packaging/wrt-plugins-ivi.changes @@ -1,3 +1,6 @@ +* Thu Jan 23 2013 +- Added vehicle.getAsync() method + * Wed Dec 11 2013 - Fixed crash when using locale diff --git a/packaging/wrt-plugins-ivi.spec b/packaging/wrt-plugins-ivi.spec index f8bbc98..628d017 100644 --- a/packaging/wrt-plugins-ivi.spec +++ b/packaging/wrt-plugins-ivi.spec @@ -1,6 +1,6 @@ Name: wrt-plugins-ivi Summary: JavaScript plugins for WebRuntime for IVI -Version: 0.12.1 +Version: 0.13.0 Release: 1 Group: Development/Libraries License: Apache-2.0 diff --git a/src/Vehicle/JSVehicle.cpp b/src/Vehicle/JSVehicle.cpp index b135f8f..c50dd7c 100644 --- a/src/Vehicle/JSVehicle.cpp +++ b/src/Vehicle/JSVehicle.cpp @@ -44,6 +44,7 @@ JSClassDefinition JSVehicle::m_classInfo = { JSStaticFunction JSVehicle::m_function[] = { { "get", JSVehicle::get, kJSPropertyAttributeNone }, + { "getAsync", JSVehicle::getAsync, kJSPropertyAttributeNone }, { "subscribe", JSVehicle::subscribe, kJSPropertyAttributeNone }, { "supported", JSVehicle::supported, kJSPropertyAttributeNone }, { "set", JSVehicle::set, kJSPropertyAttributeNone }, @@ -183,6 +184,47 @@ JSValueRef JSVehicle::get(JSContextRef context, //return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Unknown Error"); } +JSValueRef JSVehicle::getAsync(JSContextRef context, + JSObjectRef object, + JSObjectRef thisObject, + size_t argumentCount, + const JSValueRef arguments[], + JSValueRef* exception) +{ + LoggerD("Entered async"); + //Try { + VehiclePrivObject* privateObject = static_cast(JSObjectGetPrivate(thisObject)); + if (NULL == privateObject) + { + LoggerE("private object is null"); + return JSValueMakeUndefined(context); + } + + LoggerD("Validating arguments: " << argumentCount); + + ArgumentValidator validator(context, argumentCount, arguments); + std::string property = validator.toString(0); + + JSObjectRef cb = validator.toFunction(1,true); + + JSObjectRef errorCb = validator.toFunction(2,true); + + JSValueProtect(context, cb); + JSValueProtect(context, errorCb); + + int zone = validator.toNumber(3, true); + + LoggerD("property to get: " << property << " in zone " << zone); + + JSContextRef gContext = privateObject->getContext(); + + VehiclePtr vehicle(privateObject->getObject()); + + vehicle->get(property, cb, errorCb, gContext, zone ); + + return JSValueMakeUndefined(context); +} + JSValueRef JSVehicle::subscribe(JSContextRef context, JSObjectRef object, JSObjectRef thisObject, diff --git a/src/Vehicle/JSVehicle.h b/src/Vehicle/JSVehicle.h index 74cabd8..39326d9 100644 --- a/src/Vehicle/JSVehicle.h +++ b/src/Vehicle/JSVehicle.h @@ -45,6 +45,12 @@ private: size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception); + static JSValueRef getAsync(JSContextRef context, + JSObjectRef object, + JSObjectRef thisObject, + size_t argumentCount, + const JSValueRef arguments[], + JSValueRef* exception); static JSValueRef subscribe(JSContextRef context, JSObjectRef object, diff --git a/src/Vehicle/Vehicle.cpp b/src/Vehicle/Vehicle.cpp index 2ff6eec..8a8441e 100644 --- a/src/Vehicle/Vehicle.cpp +++ b/src/Vehicle/Vehicle.cpp @@ -31,11 +31,11 @@ public: GVariant* jsValueToGVariant(JSContextRef ctx, JSValueRef jsVal, std::string signature) { - LoggerD("Entered"); + LoggerE("Entered"); JSType type = JSValueGetType(ctx, jsVal); - LoggerD("JSType: " << type <<" signature: "<(user_data); @@ -146,18 +146,18 @@ static void signalCallback( GDBusConnection *connection, 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: "<objectToPropertyValuesMap[object].find(key) == master->objectToPropertyValuesMap[object].end()) { @@ -179,7 +179,7 @@ static void signalCallback( GDBusConnection *connection, std::map VehicleMaster::get(std::string property, int zone) { - LoggerD("Entered"); + LoggerE("Entered"); std::map returnValue; @@ -189,11 +189,11 @@ std::map VehicleMaster::get(std::string property, int zo 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", @@ -207,7 +207,7 @@ std::map VehicleMaster::get(std::string property, int zo 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; @@ -228,10 +228,129 @@ std::map VehicleMaster::get(std::string property, int zo 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(user_data); + + if(!cbObj) + { + return; + } + + GVariantIter* iter; + char* key; + GVariant *value; + + std::map 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<<"\""<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); @@ -265,7 +384,7 @@ void VehicleMaster::subscribe(std::string objectName, JSObjectRef successCallbac if(error) { - LoggerD("failed to call GetAll on interface " << interfaceName<< " "<message); + LoggerE("failed to call GetAll on interface " << interfaceName<< " "<message); ///TODO: call error callback return; } @@ -278,7 +397,7 @@ void VehicleMaster::subscribe(std::string objectName, JSObjectRef successCallbac 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; } @@ -290,7 +409,7 @@ void VehicleMaster::subscribe(std::string objectName, JSObjectRef successCallbac } else { - LoggerD("Already subscribed to " << objectName); + LoggerE("Already subscribed to " << objectName); } VehicleSubscribeCB cb; @@ -299,12 +418,12 @@ void VehicleMaster::subscribe(std::string objectName, JSObjectRef successCallbac objectToFunctionListMap[object].push_back(cb); - LoggerD("Successfully subscribed!"); + LoggerE("Successfully subscribed!"); } GDBusProxy* VehicleMaster::automotiveManager() { - LoggerD("Entered"); + LoggerE("Entered"); if(mAutomotiveManager) return mAutomotiveManager; @@ -320,7 +439,7 @@ GDBusProxy* VehicleMaster::automotiveManager() std::string VehicleMaster::findProperty(std::string objectName, int zone) { - LoggerD("Entered"); + LoggerE("Entered"); GDBusProxy* managerProxy = automotiveManager(); GError *error = nullptr; @@ -329,24 +448,24 @@ std::string VehicleMaster::findProperty(std::string objectName, int zone) 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: " < propertyMap) { - LoggerD("Entered"); + LoggerE("Entered"); std::string json = mapToJSon(propertyMap); @@ -365,7 +484,7 @@ void VehicleMaster::onSignalReceived(ObjectZone objectName, std::mapmessage); + LoggerE("error calling list "<< error->message); g_error_free(error); if(supportedList) @@ -422,13 +541,13 @@ GVariant* VehicleMaster::listObjects() VehicleMaster::ErrorType VehicleMaster::set(std::string objectName, std::map 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; } @@ -442,7 +561,7 @@ VehicleMaster::ErrorType VehicleMaster::set(std::string objectName, std::mapmessage); + 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); @@ -527,7 +646,7 @@ VehicleMaster::ErrorType VehicleMaster::set(std::string objectName, std::mapmessage); - LoggerD("pre-error-callback"); + LoggerE("error getting history: "<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: "< superList; std::map obj; @@ -601,7 +720,7 @@ void VehicleMaster::getHistory(std::string objectName, int zone, double begin, d int i=0; - LoggerD("populating array"); + LoggerE("populating array"); for(auto itr = superList.begin(); itr != superList.end(); itr++) { @@ -614,15 +733,15 @@ void VehicleMaster::getHistory(std::string objectName, int zone, double begin, d 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); @@ -647,7 +766,7 @@ void VehicleMaster::getHistory(std::string objectName, int zone, double begin, d GVariant* VehicleMaster::listZones(std::string objectName) { - LoggerD("Entered"); + LoggerE("Entered"); GDBusProxy* managerProxy = automotiveManager(); @@ -657,7 +776,7 @@ GVariant* VehicleMaster::listZones(std::string objectName) if(error) { - LoggerD("error calling listZones "<< error->message); + LoggerE("error calling listZones "<< error->message); g_error_free(error); if(supportedList) diff --git a/src/Vehicle/Vehicle.h b/src/Vehicle/Vehicle.h index e2698f6..669bfab 100644 --- a/src/Vehicle/Vehicle.h +++ b/src/Vehicle/Vehicle.h @@ -70,6 +70,8 @@ public: VehicleMaster(); std::map get(std::string property, int zone); + + void get(std::string property, JSObjectRef successCallback, JSObjectRef errorCb, JSContextRef context, int zone); void subscribe(std::string objectName, JSObjectRef successCallback, JSContextRef context, int zone); diff --git a/src/Vehicle/Vehicle.idl b/src/Vehicle/Vehicle.idl index 767e049..324b09a 100644 --- a/src/Vehicle/Vehicle.idl +++ b/src/Vehicle/Vehicle.idl @@ -78,6 +78,16 @@ interface Vehicle { **/ any get(DOMString objectType, optional short zone); + + /** + * \brief fetch the current value for 'objectType' + * \param objectType is the requested property to be retrieved. + * \param successCallback is called with the result of the call + * \param errorCallback is called if there is an error + * \param zone specify the zone in which this object type is in + **/ + void getAsync(DOMString objectType, VehiclePropertyCallback successCallback, optional VehiclePropertyErrorCallback errorCb, optional short zone); + /** \brief subscribe to the given property and get callbacks when it changes * \param objectType property to set * \param successCallback callback will be called when the "objectType" changes @@ -880,3 +890,5 @@ interface DrivingMode : VehiclePropertyType { attribute unsigned short drivingMode; }; + + -- 2.7.4