Implemented utility for efficient extra data array creation. 98/88298/1
authorEugene Kurzberg <i.kurtsberg@samsung.com>
Thu, 15 Sep 2016 11:50:23 +0000 (14:50 +0300)
committerEugene Kurzberg <i.kurtsberg@samsung.com>
Fri, 16 Sep 2016 06:40:15 +0000 (09:40 +0300)
Change-Id: I7576fe423c18de12373f20b6dba334d907f98c78
Signed-off-by: Eugene Kurzberg <i.kurtsberg@samsung.com>
contacts-app/src/OperationPickController.cpp
lib-apps-common/inc/App/AppControlUtils.h
lib-apps-common/src/App/AppControlUtils.cpp

index 4951c64..0f15276 100644 (file)
@@ -23,8 +23,6 @@
 #include "App/AppControlRequest.h"
 #include "Ui/Navigator.h"
 
-#include <vector>
-
 #define ID_BUFFER_SIZE 16
 
 using namespace Common;
@@ -64,18 +62,17 @@ bool OperationPickController::onSelected(SelectResults results)
 void OperationPickController::replyIds(SelectResults results)
 {
        size_t count = results.size();
-       std::vector<char[ID_BUFFER_SIZE]> buffers(count);
-       std::vector<const char *> ids(count);
+       char **ids = App::createExtraDataArray(ID_BUFFER_SIZE, count);
 
        for (size_t i = 0; i < count; ++i) {
-               snprintf(buffers[i], sizeof(buffers[i]), "%d", results[i].value.id);
-               ids[i] = buffers[i];
+               snprintf(ids[i], ID_BUFFER_SIZE, "%d", results[i].value.id);
        }
 
        const char *type = (m_ResultType == ResultAction)
                        ? getActionTypeString(ActionType(results.begin()->type))
                        : getResultTypeString(m_ResultType);
-       replyResults(type, ids.data(), ids.size());
+       replyResults(type, (const char **) ids, count);
+       free(ids);
 }
 
 void OperationPickController::replyPath(SelectResults results)
index 4ad19b4..61a35f0 100644 (file)
@@ -47,6 +47,17 @@ namespace App
         * @return Vector of integer values on success, otherwise empty vector.
         */
        std::vector<int> EXPORT_API getIntExtraDataArray(app_control_h appControl, const char *key);
+
+       /**
+        * @brief Create array of strings of equal size.
+        * @details Both array and strings are created in a contiguous memory
+        *          so it can be released all at once.
+        * @param[in]   dataSize    Maximum size of array element
+        * @param[in]   count       Number of array elements
+        * @remark Array elements MUST NOT be released.
+        * @return Array of pointers to strings, MUST be released using free().
+        */
+       EXPORT_API char **createExtraDataArray(size_t dataSize, size_t count);
 }
 
 #endif /* APP_APP_CONTROL_UTILS_H */
index b02dd69..8fb0130 100644 (file)
@@ -76,3 +76,17 @@ std::vector<int> App::getIntExtraDataArray(app_control_h appControl, const char
 
        return result;
 }
+
+char **App::createExtraDataArray(size_t dataSize, size_t count)
+{
+       typedef char ExtraData[dataSize];
+
+       char **array = (char **) malloc((sizeof(char *) + dataSize) * count);
+       ExtraData *extraData = (ExtraData *) (array + count);
+
+       for (size_t i = 0; i < count; ++i) {
+               array[i] = extraData[i];
+       }
+
+       return array;
+}