Fixed installer couldn't add account to manifest file
[platform/framework/web/wrt-installer.git] / src / jobs / widget_install / manifest.cpp
index 039bbb4..977f58e 100644 (file)
 
 namespace Jobs {
 namespace WidgetInstall {
-
 void writeElement(xmlTextWriterPtr writer, const char * name, DPL::String body)
 {
     int state = xmlTextWriterWriteElement(writer, BAD_CAST name,
-            BAD_CAST DPL::ToUTF8String(body).c_str());
-    if (state < 0)
-    {
+                                          BAD_CAST DPL::ToUTF8String(
+                                              body).c_str());
+    if (state < 0) {
         ThrowMsg(LibxmlUtils::Libxml2Error, "xmlTextWriterWriteElement failed");
     }
 }
@@ -39,9 +38,8 @@ void writeElement(xmlTextWriterPtr writer, const char * name, DPL::String body)
 void writeText(xmlTextWriterPtr writer, DPL::String text)
 {
     int state = xmlTextWriterWriteString(writer,
-            BAD_CAST DPL::ToUTF8String(text).c_str());
-    if (state < 0)
-    {
+                                         BAD_CAST DPL::ToUTF8String(text).c_str());
+    if (state < 0) {
         ThrowMsg(LibxmlUtils::Libxml2Error, "xmlTextWriterWriteText failed");
     }
 }
@@ -49,15 +47,17 @@ void writeText(xmlTextWriterPtr writer, DPL::String text)
 void writeElement(xmlTextWriterPtr writer, const char * name, const char * body)
 {
     int state = xmlTextWriterWriteElement(writer, BAD_CAST name, BAD_CAST body);
-    if (state < 0)
-    {
+    if (state < 0) {
         ThrowMsg(LibxmlUtils::Libxml2Error, "xmlTextWriterWriteElement failed");
     }
 }
 
-void writeElementWithOneAttribute(xmlTextWriterPtr writer, const char * name,
-        DPL::String body, const char * nameAttr, DPL::String bodyAttr,
-        bool condition = true)
+void writeElementWithOneAttribute(xmlTextWriterPtr writer,
+                                  const char * name,
+                                  DPL::String body,
+                                  const char * nameAttr,
+                                  DPL::String bodyAttr,
+                                  bool condition = true)
 {
     startElement(writer, name);
     writeAttribute(writer, nameAttr, bodyAttr, condition);
@@ -68,8 +68,7 @@ void writeElementWithOneAttribute(xmlTextWriterPtr writer, const char * name,
 void startElement(xmlTextWriterPtr writer, const char * name)
 {
     int state = xmlTextWriterStartElement(writer, BAD_CAST name);
-    if (state < 0)
-    {
+    if (state < 0) {
         ThrowMsg(LibxmlUtils::Libxml2Error, "xmlTextWriterStartElement failed");
     }
 }
@@ -77,34 +76,42 @@ void startElement(xmlTextWriterPtr writer, const char * name)
 void endElement(xmlTextWriterPtr writer)
 {
     int state = xmlTextWriterEndElement(writer);
-    if (state < 0)
-    {
+    if (state < 0) {
         ThrowMsg(LibxmlUtils::Libxml2Error, "xmlTextWriterEndElement failed");
     }
 }
 
-void writeAttribute(xmlTextWriterPtr writer, const char * name, DPL::String body,
-        bool condition = true)
+void writeAttribute(xmlTextWriterPtr writer,
+                    const char * name,
+                    DPL::String body,
+                    bool condition = true)
 {
-    if (!condition)
+    if (!condition) {
         return;
+    }
     int state = xmlTextWriterWriteAttribute(writer, BAD_CAST name,
-            BAD_CAST DPL::ToUTF8String(body).c_str());
-    if (state < 0)
-    {
-        ThrowMsg(LibxmlUtils::Libxml2Error, "xmlTextWriterWriteAttribute failed");
+                                            BAD_CAST DPL::ToUTF8String(
+                                                body).c_str());
+    if (state < 0) {
+        ThrowMsg(LibxmlUtils::Libxml2Error,
+                 "xmlTextWriterWriteAttribute failed");
     }
 }
 
-void writeAttribute(xmlTextWriterPtr writer, const char * name, const char * body,
-        bool condition = true)
+void writeAttribute(xmlTextWriterPtr writer,
+                    const char * name,
+                    const char * body,
+                    bool condition = true)
 {
-    if (!condition)
+    if (!condition) {
         return;
-    int state = xmlTextWriterWriteAttribute(writer, BAD_CAST name, BAD_CAST body);
-    if (state < 0)
-    {
-        ThrowMsg(LibxmlUtils::Libxml2Error, "xmlTextWriterWriteAttribute failed");
+    }
+    int state = xmlTextWriterWriteAttribute(writer,
+                                            BAD_CAST name,
+                                            BAD_CAST body);
+    if (state < 0) {
+        ThrowMsg(LibxmlUtils::Libxml2Error,
+                 "xmlTextWriterWriteAttribute failed");
     }
 }
 
@@ -112,22 +119,28 @@ void Manifest::generate(DPL::String filename)
 {
     xmlTextWriterPtr writer;
     int state;
-    writer = xmlNewTextWriterFilename(DPL::ToUTF8String(filename).c_str(), 0); //compression set to 0
-    if (writer == NULL)
+
+    //compression set to 0
+    writer = xmlNewTextWriterFilename(DPL::ToUTF8String(filename).c_str(), 0);
+
+    if (writer == NULL) {
         ThrowMsg(LibxmlUtils::Libxml2Error, "xmlNewTextWriterFilename failed");
+    }
+    state = xmlTextWriterSetIndent(writer, 1);
+    if (state < 0) {
+        ThrowMsg(LibxmlUtils::Libxml2Error, "xmlTextWriterSetIndent failed");
+    }
+
     state = xmlTextWriterStartDocument(writer, NULL, "utf-8", NULL);
-    if (state < 0)
-    {
+    if (state < 0) {
         ThrowMsg(LibxmlUtils::Libxml2Error, "xmlTextWriterStartDocument failed");
     }
     this->serialize(writer);
     state = xmlTextWriterEndDocument(writer);
-    if (state < 0)
-    {
+    if (state < 0) {
         ThrowMsg(LibxmlUtils::Libxml2Error, "xmlTextWriterEndDocument failed");
     }
-    if (writer != NULL)
-    {
+    if (writer != NULL) {
         xmlFreeTextWriter(writer);
         writer = NULL;
     }
@@ -141,19 +154,21 @@ void Manifest::serialize(xmlTextWriterPtr writer)
         writeAttribute(writer, "package", this->package);
         writeAttribute(writer, "type", this->type);
         writeAttribute(writer, "version", this->version);
-        if (!this->installLocation.IsNull())
-            writeAttribute(writer, "install-location", (*this->installLocation),
-                    (*this->installLocation).empty());
+        if (!this->installLocation.IsNull()) {
+            writeAttribute(writer, "install-location", (*this->installLocation));
+        }
+        writeAttribute(writer, "storeclient-id", this->storeClientId,
+                !this->storeClientId.empty());
 
         FOREACH(l, this->label)
         {
             writeElementWithOneAttribute(writer, "label", l->getString(),
-                    "xml:lang", l->getLang(), l->hasLang());
+                                         "xml:lang", l->getLang(), l->hasLang());
         }
         FOREACH(i, this->icon)
         {
             writeElementWithOneAttribute(writer, "icon", i->getString(),
-                    "xml:lang", i->getLang(), i->hasLang());
+                                         "xml:lang", i->getLang(), i->hasLang());
         }
         FOREACH(a, this->author)
         {
@@ -162,15 +177,31 @@ void Manifest::serialize(xmlTextWriterPtr writer)
         FOREACH(d, this->description)
         {
             writeElementWithOneAttribute(writer, "description", d->getString(),
-                    "xml:lang", d->getLang(), d->hasLang());
+                                         "xml:lang", d->getLang(), d->hasLang());
         }
         //FOREACH(c, this->compatibility) { c->serialize(writer); }
         //FOREACH(d, this->deviceProfile) { d->serialize(writer); }
-        FOREACH(s, this->serviceApplication) { s->serialize(writer); }
-        FOREACH(u, this->uiApplication) { u->serialize(writer); }
-        FOREACH(i, this->imeApplication) { i->serialize(writer); }
+        FOREACH(s, this->serviceApplication) {
+            s->serialize(writer);
+        }
+        FOREACH(u, this->uiApplication) {
+            u->serialize(writer);
+        }
+        FOREACH(i, this->imeApplication) {
+            i->serialize(writer);
+        }
         //FOREACH(f, this->font) { f->serialize(writer); }
-        //FOREACH(l, this->livebox) { l->serialize(writer); }
+        FOREACH(l, this->livebox) {
+            l->serialize(writer);
+        }
+        FOREACH(acc, this->account)
+        {
+            acc->serialize(writer);
+        }
+
+        if (!this->privileges.isEmpty()) {
+            this->privileges.serialize(writer);
+        }
     }
     endElement(writer);
 }
@@ -189,23 +220,26 @@ void ServiceApplication::serialize(xmlTextWriterPtr writer)
 {
     startElement(writer, "service-application");
     writeAttribute(writer, "appid", this->appid);
-    writeAttribute(writer, "auto-restart", (!this->autoRestart.IsNull() &&
-            (*this->autoRestart)) ? "true" : "false");
+    writeAttribute(writer, "auto-restart",
+                   (!this->autoRestart.IsNull() &&
+                    (*this->autoRestart)) ? "true" :
+                   "false");
     writeAttribute(writer, "exec", this->exec);
     writeAttribute(writer, "on-boot", (!this->onBoot.IsNull() &&
-            (*this->onBoot)) ? "true" : "false");
+                                       (*this->onBoot)) ? "true" : "false");
     writeAttribute(writer, "type", this->type);
     FOREACH(l, this->label)
     {
-        writeElementWithOneAttribute(writer, "label", l->getString(), "xml:lang",
-                l->getLang(), l->hasLang());
+        writeElementWithOneAttribute(writer, "label",
+                                     l->getString(), "xml:lang",
+                                     l->getLang(), l->hasLang());
     }
     FOREACH(i, this->icon)
     {
         writeElementWithOneAttribute(writer, "icon", i->getString(), "xml:lang",
-                i->getLang(), i->hasLang());
+                                     i->getLang(), i->hasLang());
     }
-    FOREACH(a, this->applicationService)
+    FOREACH(a, this->appControl)
     {
         a->serialize(writer);
     }
@@ -217,30 +251,48 @@ void UiApplication::serialize(xmlTextWriterPtr writer)
     startElement(writer, "ui-application");
     writeAttribute(writer, "appid", this->appid);
     writeAttribute(writer, "exec", this->exec);
-    if (!this->multiple.IsNull())
+    if (!this->multiple.IsNull()) {
         writeAttribute(writer, "multiple", (*this->multiple) ? "true" : "false");
-    if (!this->nodisplay.IsNull())
-        writeAttribute(writer, "nodisplay", (*this->nodisplay) ? "true" : "false");
-    if (!this->taskmanage.IsNull())
-        writeAttribute(writer, "taskmanage", (*this->taskmanage) ? "true" : "false");
+    }
+    if (!this->nodisplay.IsNull()) {
+        writeAttribute(writer,
+                       "nodisplay",
+                       (*this->nodisplay) ? "true" : "false");
+    }
+    if (!this->taskmanage.IsNull()) {
+        writeAttribute(writer,
+                       "taskmanage",
+                       (*this->taskmanage) ? "true" : "false");
+    }
     writeAttribute(writer, "type", this->type);
     writeAttribute(writer, "extraid", this->extraid);
-    if (!this->categories.IsNull())
+    if (!this->categories.IsNull()) {
         writeAttribute(writer, "categories", (*this->categories));
+    }
     FOREACH(l, this->label)
     {
-        writeElementWithOneAttribute(writer, "label", l->getString(), "xml:lang",
-                l->getLang(), l->hasLang());
+        writeElementWithOneAttribute(writer, "label",
+                                     l->getString(), "xml:lang",
+                                     l->getLang(), l->hasLang());
     }
     FOREACH(i, this->icon)
     {
         writeElementWithOneAttribute(writer, "icon", i->getString(), "xml:lang",
-                i->getLang(), i->hasLang());
+                                     i->getLang(), i->hasLang());
     }
-    FOREACH(a, this->applicationService)
+    FOREACH(a, this->appControl)
     {
         a->serialize(writer);
     }
+    FOREACH(c, this->appCategory)
+    {
+        startElement(writer, "category");
+        writeAttribute(writer, "name", *c);
+        endElement(writer);
+    }
+    FOREACH(m, this->metadata) {
+        m->serialize(writer);
+    }
     endElement(writer);
 }
 
@@ -249,27 +301,32 @@ void ImeApplication::serialize(xmlTextWriterPtr writer)
     startElement(writer, "ime-application");
     writeAttribute(writer, "appid", this->appid);
     writeAttribute(writer, "exec", this->exec);
-    if (!this->multiple.IsNull())
+    if (!this->multiple.IsNull()) {
         writeAttribute(writer, "multiple", (*this->multiple) ? "true" : "false");
-    if (!this->nodisplay.IsNull())
-        writeAttribute(writer, "nodisplay", (*this->nodisplay) ? "true" : "false");
+    }
+    if (!this->nodisplay.IsNull()) {
+        writeAttribute(writer,
+                       "nodisplay",
+                       (*this->nodisplay) ? "true" : "false");
+    }
     writeAttribute(writer, "type", this->type);
     FOREACH(l, this->label)
     {
-        writeElementWithOneAttribute(writer, "label", l->getString(), "xml:lang",
-                l->getLang(), l->hasLang());
+        writeElementWithOneAttribute(writer, "label",
+                                     l->getString(), "xml:lang",
+                                     l->getLang(), l->hasLang());
     }
     FOREACH(i, this->icon)
     {
         writeElementWithOneAttribute(writer, "icon", i->getString(), "xml:lang",
-                i->getLang(), i->hasLang());
+                                     i->getLang(), i->hasLang());
     }
     endElement(writer);
 }
 
-void ApplicationService::serialize(xmlTextWriterPtr writer)
+void AppControl::serialize(xmlTextWriterPtr writer)
 {
-    startElement(writer, "application-service");
+    startElement(writer, "app-control");
     FOREACH(o, this->operation)
     {
         startElement(writer, "operation");
@@ -291,5 +348,168 @@ void ApplicationService::serialize(xmlTextWriterPtr writer)
     endElement(writer);
 }
 
+void LiveBox::serialize(xmlTextWriterPtr writer)
+{
+    startElement(writer, "livebox");
+    if (!this->liveboxId.empty()) {
+        writeAttribute(writer, "appid", this->liveboxId);
+    }
+
+    if (!this->primary.empty()) {
+        writeAttribute(writer, "primary", this->primary);
+    }
+
+    if (!this->updatePeriod.empty()) {
+        writeAttribute(writer, "period", this->updatePeriod);
+    }
+
+    writeAttribute(writer, "abi", "html");
+    writeAttribute(writer, "network", "true");
+    writeAttribute(writer, "nodisplay", "false");
+
+    if (!this->label.empty()) {
+        int defaultLabelChk = 0;
+        FOREACH(m, this->label)
+        {
+            std::pair<DPL::String, DPL::String> boxLabel = *m;
+            startElement(writer, "label");
+            if (!boxLabel.first.empty()) {
+                writeAttribute(writer, "xml:lang", boxLabel.first);
+            } else {
+                defaultLabelChk++;
+            }
+            writeText(writer, boxLabel.second);
+            endElement(writer);
+        }
+        if(!defaultLabelChk) {
+            startElement(writer, "label");
+            writeText(writer, DPL::FromUTF8String("NO NAME"));
+            endElement(writer);
+        }
+    }
+    if (!this->icon.empty()) {
+        startElement(writer, "icon");
+        writeText(writer, this->icon);
+        endElement(writer);
+    }
+
+    if (!this->autoLaunch.empty()) {
+        startElement(writer, "launch");
+        writeText(writer, this->autoLaunch);
+        endElement(writer);
+    }
+
+    if (!this->box.boxSrc.empty() &&
+        !this->box.boxMouseEvent.empty() &&
+        !this->box.boxSize.empty())
+    {
+        startElement(writer, "box");
+        writeAttribute(writer, "type", "buffer");
+        writeAttribute(writer, "mouse_event", this->box.boxMouseEvent);
+        writeAttribute(writer, "touch_effect", this->box.boxTouchEffect);
+
+        FOREACH(it, this->box.boxSize)
+        {
+            startElement(writer, "size");
+            if (!(*it).m_preview.empty()) {
+                writeAttribute(writer, "preview", (*it).m_preview);
+            }
+            if (!(*it).m_useDecoration.empty()) {
+                writeAttribute(writer, "need_frame", (*it).m_useDecoration);
+            } else {
+                // default value of use-decoration is "true"
+                writeAttribute(writer, "need_frame", DPL::String(L"true"));
+            }
+
+            writeText(writer, (*it).m_size);
+            endElement(writer);
+        }
+
+        startElement(writer, "script");
+        writeAttribute(writer, "src", this->box.boxSrc);
+        endElement(writer);
+
+        endElement(writer);
+
+        if (!this->box.pdSrc.empty() &&
+            !this->box.pdWidth.empty() &&
+            !this->box.pdHeight.empty())
+        {
+            startElement(writer, "pd");
+            writeAttribute(writer, "type", "buffer");
+
+            startElement(writer, "size");
+            DPL::String pdSize = this->box.pdWidth + DPL::String(L"x") +
+                this->box.pdHeight;
+            writeText(writer, pdSize);
+            endElement(writer);
+
+            startElement(writer, "script");
+            writeAttribute(writer, "src", this->box.pdSrc);
+            endElement(writer);
+
+            endElement(writer);
+        }
+    }
+
+    endElement(writer);
+}
+
+void Account::serialize(xmlTextWriterPtr writer)
+{
+    startElement(writer, "account");
+    {
+        startElement(writer, "account-provider");
+        writeAttribute(writer, "appid", this->provider.appid);
+        writeAttribute(writer, "multiple-accounts-support",
+                this->provider.multiAccount);
+
+        FOREACH(i, this->provider.icon)
+        {
+            startElement(writer, "icon");
+            writeAttribute(writer, "section", i->first);
+            writeText(writer, i->second);
+            endElement(writer);
+        }
+        FOREACH(n, this->provider.name)
+        {
+            writeElementWithOneAttribute(writer, "label",
+                    n->getString(), "xml:lang",
+                    n->getLang(), n->hasLang());
+        }
+        FOREACH(c, this->provider.capability)
+        {
+            startElement(writer, "capability");
+            writeText(writer, *c);
+            endElement(writer);
+        }
+        endElement(writer);
+    }
+    endElement(writer);
+}
+
+void Privilege::serialize(xmlTextWriterPtr writer)
+{
+    startElement(writer, "privileges");
+    {
+        FOREACH(it, this->name)
+        {
+            startElement(writer, "privilege");
+            writeText(writer, *it);
+            endElement(writer);
+        }
+    }
+    endElement(writer);
+}
+
+void Metadata::serialize(xmlTextWriterPtr writer)
+{
+    startElement(writer, "metadata");
+    writeAttribute(writer, "key", *this->key);
+    if (!this->value.IsNull()) {
+        writeAttribute(writer, "value", *this->value);
+    }
+    endElement(writer);
+}
 } //namespace Jobs
 } //namespace WidgetInstall