Tuple::toGVariant() consumes the input 71/118071/1
authorMu-Woong Lee <muwoong.lee@samsung.com>
Wed, 8 Mar 2017 12:35:11 +0000 (21:35 +0900)
committerMu-Woong Lee <muwoong.lee@samsung.com>
Wed, 8 Mar 2017 12:35:11 +0000 (21:35 +0900)
Change-Id: I93638b103eeb747047e2a7ca6bb5e57f5353a8fe
Signed-off-by: Mu-Woong Lee <muwoong.lee@samsung.com>
include/Tuple.h
src/shared/Tuple.cpp

index 5c32e7e..2bcce6a 100644 (file)
@@ -31,10 +31,11 @@ namespace ctx {
                bool getAt(unsigned int idx, double* val);
                bool getAt(unsigned int idx, std::string* val);
 
-               GVariant* toGVariant();
+               static Tuple* duplicate(Tuple& tuple);
 
-               static GVariant* toGVariant(Tuple& tuple);
+               static GVariant* toGVariant(Tuple* tuple);
                static GVariant* toGVariant(std::vector<Tuple*>& tuples);
+
                static std::vector<Tuple*> buildFrom(GVariant* gVar);
 
        private:
index aea1050..db61a59 100644 (file)
@@ -102,15 +102,20 @@ bool Tuple::getAt(unsigned int idx, std::string* val)
        return true;
 }
 
-GVariant* Tuple::toGVariant()
+Tuple* Tuple::duplicate(Tuple& tuple)
 {
-       return toGVariant(*this);
+   gchar* printed = g_variant_print(tuple.__gVar, TRUE);
+   GVariant* gv = g_variant_parse(NULL, printed, NULL, NULL, NULL);
+   g_free(printed);
+   return new(std::nothrow) Tuple(gv);
 }
 
-GVariant* Tuple::toGVariant(Tuple& tuple)
+
+GVariant* Tuple::toGVariant(Tuple* tuple)
 {
-       GVariant* gv = tuple.__gVar;
-       tuple.__gVar = NULL;
+       GVariant* gv = tuple->__gVar;
+       tuple->__gVar = NULL;
+       delete tuple;
        return gv;
 }
 
@@ -122,8 +127,7 @@ GVariant* Tuple::toGVariant(std::vector<Tuple*>& tuples)
        g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY);
 
        for (auto& tuple : tuples) {
-               g_variant_builder_add_value(&builder, toGVariant(*tuple));
-               delete tuple;
+               g_variant_builder_add_value(&builder, toGVariant(tuple));
        }
 
        tuples.clear();