IoT-2208: fix IPCA to get device's DMV and PIID
authorSoemin Tjong <stjong@microsoft.com>
Thu, 4 May 2017 01:45:35 +0000 (18:45 -0700)
committerDan Mihai <Daniel.Mihai@microsoft.com>
Thu, 11 May 2017 18:53:17 +0000 (18:53 +0000)
https://jira.iotivity.org/browse/IOT-2208

IPCA should not use OCPlatform::getPropertyValue() to obtain the data
model versions and protocol independent ID of the remote server.

It is incorrect as they return the values of the local server
(i.e. the app's own device info).

Change-Id: I7e8f64d9c7ebebd1b9bb4ec9290fbbdd1e0fa412
Signed-off-by: Soemin Tjong <stjong@microsoft.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/19645
Tested-by: jenkins-iotivity <jenkins@iotivity.org>
Reviewed-by: Dan Mihai <Daniel.Mihai@microsoft.com>
resource/IPCA/src/ocfframework.cpp
resource/IPCA/unittests/mockOC.cpp

index f5751af..e295a99 100644 (file)
@@ -709,13 +709,14 @@ void OCFFramework::OnDeviceInfoCallback(const OCRepresentation& rep)
         }
 
         // Not reading "di" because it's already known in OnResourceFound().
-        std::array<std::string, 3> keys = { {"n", "icv", "dmv"} };
+        std::array<std::string, 4> keys = { {"n", "icv", "dmv", "piid"} };
         std::string dataModelVersion;
         std::vector<std::string*> Values =
         {
             &(deviceDetails->deviceInfo.deviceName),
             &(deviceDetails->deviceInfo.deviceSoftwareVersion),
-            &dataModelVersion
+            &dataModelVersion,
+            &(deviceDetails->deviceInfo.platformIndependentId)
         };
 
         for (size_t i = 0; i < keys.size(); i++)
@@ -734,15 +735,13 @@ void OCFFramework::OnDeviceInfoCallback(const OCRepresentation& rep)
 
         deviceDetails->deviceInfo.deviceUris = deviceDetails->deviceUris;
 
-        OCPlatform::getPropertyValue(
-                        PAYLOAD_TYPE_DEVICE,
-                        OC_RSRVD_DATA_MODEL_VERSION,
-                        deviceDetails->deviceInfo.dataModelVersions);
-
-        OCPlatform::getPropertyValue(
-                        PAYLOAD_TYPE_DEVICE,
-                        OC_RSRVD_PROTOCOL_INDEPENDENT_ID,
-                        deviceDetails->deviceInfo.platformIndependentId);
+        // Convert data model versions returned by server in CSV to array.
+        std::istringstream stringStream(dataModelVersion.c_str());
+        std::string token;
+        while (std::getline(stringStream, token, ','))
+        {
+            deviceDetails->deviceInfo.dataModelVersions.push_back(token);
+        }
 
         deviceDetails->deviceInfoAvailable = true;
     }
index 048b4e2..2dbb124 100644 (file)
@@ -342,7 +342,25 @@ OCStackResult OCPlatform::getDeviceInfo(const std::string& host,
     ocRep.setDevAddr(addr);\r
     ocRep.setValue(OC_RSRVD_DEVICE_NAME, g_deviceInfo.deviceName);\r
     ocRep.setValue(OC_RSRVD_SPEC_VERSION, g_deviceInfo.specVersion);\r
-    ocRep.setValue(OC_RSRVD_DATA_MODEL_VERSION, g_deviceInfo.dataModelVersions);\r
+    ocRep.setValue(OC_RSRVD_PROTOCOL_INDEPENDENT_ID, g_deviceInfo.platformIndependentId);\r
+\r
+    //  DMV is returned in CSV.\r
+    std::ostringstream outputStream;\r
+    bool firstEntry = true;\r
+    for (auto dataModelVersion : g_deviceInfo.dataModelVersions)\r
+    {\r
+        if (!firstEntry)\r
+        {\r
+            outputStream << ',' << dataModelVersion;\r
+        }\r
+        else\r
+        {\r
+            outputStream << dataModelVersion;\r
+            firstEntry = false;\r
+        }\r
+    }\r
+\r
+    ocRep.setValue(OC_RSRVD_DATA_MODEL_VERSION, outputStream.str());\r
 \r
     std::thread getDeviceInfoCallbackThread(deviceInfoHandler, ocRep);\r
     getDeviceInfoCallbackThread.detach();\r