Support additional Coordinates information
authorJihye Kang <jye.kang@samsung.com>
Thu, 26 Sep 2013 04:12:33 +0000 (13:12 +0900)
committerJihye Kang <jye.kang@samsung.com>
Mon, 7 Oct 2013 04:57:55 +0000 (13:57 +0900)
[Title] Support additional Coordinates information
[Issue#] P130914-00015
[Problem] The altitude and the speed data are not displayed.
[Cause] Optional coordinates information - altitude, altitudeAccuracy, heading and spped - is not implemented.
[Solution] Implement for supporting optional coordinates data.
And do minor change on error log.

Change-Id: If508190e930facba452270b37f56f328208fd8cb

Source/WebKit2/Platform/CoreIPC/Arguments.h
Source/WebKit2/Shared/WebGeolocationPosition.cpp
Source/WebKit2/Shared/WebGeolocationPosition.h
Source/WebKit2/UIProcess/API/C/WKGeolocationPosition.cpp
Source/WebKit2/UIProcess/API/C/WKGeolocationPosition.h
Source/WebKit2/UIProcess/API/efl/ewk_geolocation_provider.cpp
Source/WebKit2/WebProcess/Geolocation/WebGeolocationManager.cpp

index 5bd7550..a4853e1 100644 (file)
@@ -447,6 +447,103 @@ template<typename T1, typename T2, typename T3, typename T4, typename T5, typena
     return Arguments10<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&, T9&, T10&>(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10);
 }
 
+template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11> struct Arguments11 : Arguments10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> {
+    typedef Arguments11<typename WTF::RemoveConst<typename WTF::RemoveReference<T1>::Type>::Type,
+    typename WTF::RemoveConst<typename WTF::RemoveReference<T2>::Type>::Type,
+    typename WTF::RemoveConst<typename WTF::RemoveReference<T3>::Type>::Type,
+    typename WTF::RemoveConst<typename WTF::RemoveReference<T4>::Type>::Type,
+    typename WTF::RemoveConst<typename WTF::RemoveReference<T5>::Type>::Type,
+    typename WTF::RemoveConst<typename WTF::RemoveReference<T6>::Type>::Type,
+    typename WTF::RemoveConst<typename WTF::RemoveReference<T7>::Type>::Type,
+    typename WTF::RemoveConst<typename WTF::RemoveReference<T8>::Type>::Type,
+    typename WTF::RemoveConst<typename WTF::RemoveReference<T9>::Type>::Type,
+    typename WTF::RemoveConst<typename WTF::RemoveReference<T10>::Type>::Type,
+    typename WTF::RemoveConst<typename WTF::RemoveReference<T11>::Type>::Type> ValueType;
+
+    Arguments11() { }
+
+    Arguments11(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9, T10 t10, T11 t11)
+        : Arguments10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10)
+        , argument11(t11)
+    {
+    }
+
+    void encode(ArgumentEncoder* encoder) const
+    {
+        Arguments10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::encode(encoder);
+        encoder->encode(argument11);
+    }
+
+    static bool decode(ArgumentDecoder* decoder, Arguments11& result)
+    {
+        if (!Arguments10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::decode(decoder, result))
+            return false;
+
+        return decoder->decode(result.argument11);
+    }
+
+    T11 argument11;
+};
+
+template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11> Arguments11<const T1&, const T2&, const T3&, const T4&, const T5&, const T6&, const T7&, const T8&, const T9&, const T10&, const T11&> In(const T1& t1, const T2& t2, const T3 &t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11)
+{
+    return Arguments11<const T1&, const T2&, const T3&, const T4&, const T5&, const T6&, const T7&, const T8&, const T9&, const T10&, const T11&>(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11);
+}
+
+template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11> Arguments11<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&, T9&, T10&, T11&> Out(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7, T8& t8, T9& t9, T10& t10, T11& t11)
+{
+    return Arguments11<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&, T9&, T10&, T11&>(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11);
+}
+
+template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12> struct Arguments12 : Arguments11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> {
+    typedef Arguments12<typename WTF::RemoveConst<typename WTF::RemoveReference<T1>::Type>::Type,
+    typename WTF::RemoveConst<typename WTF::RemoveReference<T2>::Type>::Type,
+    typename WTF::RemoveConst<typename WTF::RemoveReference<T3>::Type>::Type,
+    typename WTF::RemoveConst<typename WTF::RemoveReference<T4>::Type>::Type,
+    typename WTF::RemoveConst<typename WTF::RemoveReference<T5>::Type>::Type,
+    typename WTF::RemoveConst<typename WTF::RemoveReference<T6>::Type>::Type,
+    typename WTF::RemoveConst<typename WTF::RemoveReference<T7>::Type>::Type,
+    typename WTF::RemoveConst<typename WTF::RemoveReference<T8>::Type>::Type,
+    typename WTF::RemoveConst<typename WTF::RemoveReference<T9>::Type>::Type,
+    typename WTF::RemoveConst<typename WTF::RemoveReference<T10>::Type>::Type,
+    typename WTF::RemoveConst<typename WTF::RemoveReference<T11>::Type>::Type,
+    typename WTF::RemoveConst<typename WTF::RemoveReference<T12>::Type>::Type> ValueType;
+
+    Arguments12() { }
+
+    Arguments12(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9, T10 t10, T11 t11, T12 t12)
+        : Arguments11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11)
+        , argument12(t12)
+    {
+    }
+
+    void encode(ArgumentEncoder* encoder) const
+    {
+        Arguments11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>::encode(encoder);
+        encoder->encode(argument12);
+    }
+
+    static bool decode(ArgumentDecoder* decoder, Arguments12& result)
+    {
+        if (!Arguments11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>::decode(decoder, result))
+            return false;
+
+        return decoder->decode(result.argument12);
+    }
+
+    T12 argument12;
+};
+
+template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12> Arguments12<const T1&, const T2&, const T3&, const T4&, const T5&, const T6&, const T7&, const T8&, const T9&, const T10&, const T11&, const T12&> In(const T1& t1, const T2& t2, const T3 &t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12)
+{
+    return Arguments12<const T1&, const T2&, const T3&, const T4&, const T5&, const T6&, const T7&, const T8&, const T9&, const T10&, const T11&, const T12&>(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12);
+}
+
+template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12> Arguments12<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&, T9&, T10&, T11&, T12&> Out(T1& t1, T2& t2, T3& t3, T4& t4, T5& t5, T6& t6, T7& t7, T8& t8, T9& t9, T10& t10, T11& t11, T12& t12)
+{
+    return Arguments12<T1&, T2&, T3&, T4&, T5&, T6&, T7&, T8&, T9&, T10&, T11&, T12&>(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12);
+}
+
 } // namespace CoreIPC
 
 #endif // Arguments_h
index 01fdfb8..d094770 100644 (file)
 
 namespace WebKit {
 
+#if ENABLE(TIZEN_GEOLOCATION)
+WebGeolocationPosition::WebGeolocationPosition(double timestamp, double latitude, double longitude, double accuracy, bool providesAltitude, double altitude, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed)
+#else
 WebGeolocationPosition::WebGeolocationPosition(double timestamp, double latitude, double longitude, double accuracy)
+#endif
 {
     m_data.timestamp = timestamp;
     m_data.latitude = latitude;
     m_data.longitude = longitude;
     m_data.accuracy = accuracy;
+
+#if ENABLE(TIZEN_GEOLOCATION)
+    m_data.canProvideAltitude = providesAltitude;
+    m_data.altitude = altitude;
+    m_data.canProvideAltitudeAccuracy = providesAltitudeAccuracy;
+    m_data.altitudeAccuracy = altitudeAccuracy;
+    m_data.canProvideHeading = providesHeading;
+    m_data.heading = heading;
+    m_data.canProvideSpeed = providesSpeed;
+    m_data.speed = speed;
+#endif
 }
 
 WebGeolocationPosition::~WebGeolocationPosition()
@@ -45,12 +60,20 @@ WebGeolocationPosition::~WebGeolocationPosition()
 
 void WebGeolocationPosition::Data::encode(CoreIPC::ArgumentEncoder* encoder) const
 {
+#if ENABLE(TIZEN_GEOLOCATION)
+    encoder->encode(CoreIPC::In(timestamp, latitude, longitude, accuracy, canProvideAltitude, altitude, canProvideAltitudeAccuracy, altitudeAccuracy, canProvideHeading, heading, canProvideSpeed, speed));
+#else
     encoder->encode(CoreIPC::In(timestamp, latitude, longitude, accuracy));
+#endif
 }
 
 bool WebGeolocationPosition::Data::decode(CoreIPC::ArgumentDecoder* decoder, Data& data)
 {
+#if ENABLE(TIZEN_GEOLOCATION)
+    return decoder->decode(CoreIPC::Out(data.timestamp, data.latitude, data.longitude, data.accuracy, data.canProvideAltitude, data.altitude, data.canProvideAltitudeAccuracy, data.altitudeAccuracy, data.canProvideHeading, data.heading, data.canProvideSpeed, data.speed));
+#else
     return decoder->decode(CoreIPC::Out(data.timestamp, data.latitude, data.longitude, data.accuracy));
+#endif
 }
 
 } // namespace WebKit
index 6b268fb..0a41771 100644 (file)
@@ -45,12 +45,31 @@ public:
         double latitude;
         double longitude;
         double accuracy;
+
+#if ENABLE(TIZEN_GEOLOCATION)
+        double altitude;
+        double altitudeAccuracy;
+        double heading;
+        double speed;
+
+        bool canProvideAltitude;
+        bool canProvideAltitudeAccuracy;
+        bool canProvideHeading;
+        bool canProvideSpeed;
+#endif
     };
 
+#if ENABLE(TIZEN_GEOLOCATION)
+    static PassRefPtr<WebGeolocationPosition> create(double timestamp, double latitude, double longitude, double accuracy, bool providesAltitude, double altitude, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed)
+    {
+        return adoptRef(new WebGeolocationPosition(timestamp, latitude, longitude, accuracy, providesAltitude, altitude, providesAltitudeAccuracy, altitudeAccuracy, providesHeading, heading, providesSpeed, speed));
+    }
+#else
     static PassRefPtr<WebGeolocationPosition> create(double timestamp, double latitude, double longitude, double accuracy)
     {
         return adoptRef(new WebGeolocationPosition(timestamp, latitude, longitude, accuracy));
     }
+#endif
 
     virtual ~WebGeolocationPosition();
 
@@ -62,7 +81,11 @@ public:
     const Data& data() const { return m_data; }
 
 private:
+#if ENABLE(TIZEN_GEOLOCATION)
+    WebGeolocationPosition(double timestamp, double latitude, double longitude, double accuracy, bool providesAltitude, double altitude, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed);
+#else
     WebGeolocationPosition(double timestamp, double latitude, double longitude, double accuracy);
+#endif
 
     virtual Type type() const { return APIType; }
 
index 99195c7..84bdafe 100644 (file)
@@ -38,6 +38,18 @@ WKTypeID WKGeolocationPositionGetTypeID()
 
 WKGeolocationPositionRef WKGeolocationPositionCreate(double timestamp, double latitude, double longitude, double accuracy)
 {
+#if ENABLE(TIZEN_GEOLOCATION)
+    return WKGeolocationPositionCreate_b(timestamp, latitude, longitude, accuracy, false, 0., false, 0., false, 0., false, 0.);
+#else
     RefPtr<WebGeolocationPosition> position = WebGeolocationPosition::create(timestamp, latitude, longitude, accuracy);
     return toAPI(position.release().leakRef());
+#endif
+}
+
+WKGeolocationPositionRef WKGeolocationPositionCreate_b(double timestamp, double latitude, double longitude, double accuracy, bool providesAltitude, double altitude, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed)
+{
+#if ENABLE(TIZEN_GEOLOCATION)
+    RefPtr<WebGeolocationPosition> position = WebGeolocationPosition::create(timestamp, latitude, longitude, accuracy, providesAltitude, altitude, providesAltitudeAccuracy, altitudeAccuracy, providesHeading, heading, providesSpeed, speed);
+    return toAPI(position.release().leakRef());
+#endif
 }
index 85183fd..1742f68 100644 (file)
@@ -36,6 +36,9 @@ WK_EXPORT WKTypeID WKGeolocationPositionGetTypeID();
 
 WK_EXPORT WKGeolocationPositionRef WKGeolocationPositionCreate(double timestamp, double latitude, double longitude, double accuracy);
 
+// #if ENABLE(TIZEN_GEOLOCATION)
+WK_EXPORT WKGeolocationPositionRef WKGeolocationPositionCreate_b(double timestamp, double latitude, double longitude, double accuracy, bool providesAltitude, double altitude, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed);
+// #endif
 #ifdef __cplusplus
 }
 #endif
index d614d00..e623683 100644 (file)
@@ -82,12 +82,25 @@ static void ewkGeolocationProviderPositionChangedCallback(double latitude, doubl
         return;
 
     location_accuracy_level_e level;
-    double horizontal;
-    double vertical;
-
-    location_manager_get_last_accuracy(ewkGeolocationProvider->locationManager(), &level, &horizontal, &vertical);
-
-    WKRetainPtr<WKGeolocationPositionRef> position(AdoptWK, WKGeolocationPositionCreate(timestamp, latitude, longitude, horizontal));
+    double horizontal = 0;
+    double vertical = 0;
+    double climb = 0;
+    double direction = std::numeric_limits<double>::quiet_NaN();
+    double speed = 0;
+    time_t velocityTimestamp;
+
+    location_error_e ret = static_cast<location_error_e>(location_manager_get_last_accuracy(ewkGeolocationProvider->locationManager(), &level, &horizontal, &vertical));
+    if (ret != LOCATIONS_ERROR_NONE)
+        TIZEN_LOGE("location_manager_get_last_accuracy error(0x%08x)", ret);
+    ret = static_cast<location_error_e>(location_manager_get_velocity(ewkGeolocationProvider->locationManager(), &climb, &direction, &speed, &velocityTimestamp));
+    if (ret != LOCATIONS_ERROR_NONE)
+        TIZEN_LOGE("location_manager_get_velocity error(0x%08x)", ret);
+    if (speed)
+        speed = speed * 5.0 / 18.0;
+    else
+        direction = std::numeric_limits<double>::quiet_NaN();
+
+    WKRetainPtr<WKGeolocationPositionRef> position(AdoptWK, WKGeolocationPositionCreate_b(timestamp, latitude, longitude, horizontal, true, altitude, true, vertical, true, direction, true, speed));
     WKGeolocationManagerProviderDidChangePosition(ewkGeolocationProvider->wkGeolocationManager(), position.get());
 }
 
@@ -114,14 +127,14 @@ void Ewk_Geolocation_Provider::startUpdating(WKGeolocationManagerRef, const void
 
     location_error_e ret = static_cast<location_error_e>(location_manager_create(LOCATIONS_METHOD_HYBRID, &ewkGeolocationProvider->m_locationManager));
     if (ret != LOCATIONS_ERROR_NONE) {
-        TIZEN_LOGE("location_manager_create error (%d)", ret);
+        TIZEN_LOGE("location_manager_create error (0x%08x)", ret);
         WKGeolocationManagerProviderDidFailToDeterminePosition(ewkGeolocationProvider->wkGeolocationManager());
         return;
     }
 
     ret = static_cast<location_error_e>(location_manager_set_position_updated_cb(ewkGeolocationProvider->m_locationManager, ewkGeolocationProviderPositionChangedCallback, 1, const_cast<Ewk_Geolocation_Provider*>(ewkGeolocationProvider)));
     if (ret != LOCATIONS_ERROR_NONE){
-        TIZEN_LOGE("location_manager_set_position_updated_cb error(%d)", ret);
+        TIZEN_LOGE("location_manager_set_position_updated_cb error(0x%08x)", ret);
         location_manager_destroy(ewkGeolocationProvider->m_locationManager);
         WKGeolocationManagerProviderDidFailToDeterminePosition(ewkGeolocationProvider->wkGeolocationManager());
         return;
@@ -129,7 +142,7 @@ void Ewk_Geolocation_Provider::startUpdating(WKGeolocationManagerRef, const void
 
     ret = static_cast<location_error_e>(location_manager_start(ewkGeolocationProvider->m_locationManager));
     if (ret != LOCATIONS_ERROR_NONE) {
-        TIZEN_LOGE("location_manager_start error(%d)", ret);
+        TIZEN_LOGE("location_manager_start error(0x%08x)", ret);
         location_manager_unset_position_updated_cb(ewkGeolocationProvider->m_locationManager);
         location_manager_destroy(ewkGeolocationProvider->m_locationManager);
         WKGeolocationManagerProviderDidFailToDeterminePosition(ewkGeolocationProvider->wkGeolocationManager());
@@ -151,19 +164,19 @@ void Ewk_Geolocation_Provider::stopUpdating(WKGeolocationManagerRef, const void*
 
     location_error_e ret = static_cast<location_error_e>(location_manager_stop(ewkGeolocationProvider->m_locationManager));
     if (ret != LOCATIONS_ERROR_NONE) {
-        TIZEN_LOGE("location_manager_stop error(%d)", ret);
+        TIZEN_LOGE("location_manager_stop error(0x%08x)", ret);
         location_manager_destroy(ewkGeolocationProvider->m_locationManager);
     }
 
     ret = static_cast<location_error_e>(location_manager_unset_position_updated_cb(ewkGeolocationProvider->m_locationManager));
     if (ret != LOCATIONS_ERROR_NONE) {
-        TIZEN_LOGE("location_manager_unset_position_updated_cb error(%d)", ret);
+        TIZEN_LOGE("location_manager_unset_position_updated_cb error(0x%08x)", ret);
         return;
     }
 
     ret = static_cast<location_error_e>(location_manager_destroy(ewkGeolocationProvider->m_locationManager));
     if (ret != LOCATIONS_ERROR_NONE) {
-        TIZEN_LOGE("location_manager_destroy error(%d)", ret);
+        TIZEN_LOGE("location_manager_destroy error(0x%08x)", ret);
         return;
     }
 
index 2b97676..87ba4e9 100644 (file)
@@ -74,7 +74,11 @@ void WebGeolocationManager::unregisterWebPage(WebPage* page)
 void WebGeolocationManager::didChangePosition(const WebGeolocationPosition::Data& data)
 {
 #if ENABLE(GEOLOCATION)
+#if ENABLE(TIZEN_GEOLOCATION)
+    RefPtr<GeolocationPosition> position = GeolocationPosition::create(data.timestamp, data.latitude, data.longitude, data.accuracy, data.canProvideAltitude, data.altitude, data.canProvideAltitudeAccuracy, data.altitudeAccuracy, data.canProvideHeading, data.heading, data.canProvideSpeed, data.speed);
+#else
     RefPtr<GeolocationPosition> position = GeolocationPosition::create(data.timestamp, data.latitude, data.longitude, data.accuracy);
+#endif
 
     HashSet<WebPage*>::const_iterator it = m_pageSet.begin();
     HashSet<WebPage*>::const_iterator end = m_pageSet.end();