Merge "Fixed widget install fail when using partner privilege"
[platform/framework/web/wrt-installer.git] / src / jobs / widget_install / manifest.cpp
1 /*
2  * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  *    Licensed under the Apache License, Version 2.0 (the "License");
5  *    you may not use this file except in compliance with the License.
6  *    You may obtain a copy of the License at
7  *
8  *        http://www.apache.org/licenses/LICENSE-2.0
9  *
10  *    Unless required by applicable law or agreed to in writing, software
11  *    distributed under the License is distributed on an "AS IS" BASIS,
12  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  *    See the License for the specific language governing permissions and
14  *    limitations under the License.
15  */
16 /**
17  * @file    manifest.cpp
18  * @author  Mariusz Domanski (m.domanski@samsung.com)
19  */
20
21 #include "manifest.h"
22 #include "libxml_utils.h"
23 #include <widget_install/task_manifest_file.h>
24 #include <dpl/foreach.h>
25
26 namespace Jobs {
27 namespace WidgetInstall {
28 void writeElement(xmlTextWriterPtr writer, const char * name, DPL::String body)
29 {
30     int state = xmlTextWriterWriteElement(writer, BAD_CAST name,
31                                           BAD_CAST DPL::ToUTF8String(
32                                               body).c_str());
33     if (state < 0) {
34         ThrowMsg(LibxmlUtils::Libxml2Error, "xmlTextWriterWriteElement failed");
35     }
36 }
37
38 void writeText(xmlTextWriterPtr writer, DPL::String text)
39 {
40     int state = xmlTextWriterWriteString(writer,
41                                          BAD_CAST DPL::ToUTF8String(text).c_str());
42     if (state < 0) {
43         ThrowMsg(LibxmlUtils::Libxml2Error, "xmlTextWriterWriteText failed");
44     }
45 }
46
47 void writeElement(xmlTextWriterPtr writer, const char * name, const char * body)
48 {
49     int state = xmlTextWriterWriteElement(writer, BAD_CAST name, BAD_CAST body);
50     if (state < 0) {
51         ThrowMsg(LibxmlUtils::Libxml2Error, "xmlTextWriterWriteElement failed");
52     }
53 }
54
55 void writeElementWithOneAttribute(xmlTextWriterPtr writer,
56                                   const char * name,
57                                   DPL::String body,
58                                   const char * nameAttr,
59                                   DPL::String bodyAttr,
60                                   bool condition = true)
61 {
62     startElement(writer, name);
63     writeAttribute(writer, nameAttr, bodyAttr, condition);
64     writeText(writer, body);
65     endElement(writer);
66 }
67
68 void startElement(xmlTextWriterPtr writer, const char * name)
69 {
70     int state = xmlTextWriterStartElement(writer, BAD_CAST name);
71     if (state < 0) {
72         ThrowMsg(LibxmlUtils::Libxml2Error, "xmlTextWriterStartElement failed");
73     }
74 }
75
76 void endElement(xmlTextWriterPtr writer)
77 {
78     int state = xmlTextWriterEndElement(writer);
79     if (state < 0) {
80         ThrowMsg(LibxmlUtils::Libxml2Error, "xmlTextWriterEndElement failed");
81     }
82 }
83
84 void writeAttribute(xmlTextWriterPtr writer,
85                     const char * name,
86                     DPL::String body,
87                     bool condition = true)
88 {
89     if (!condition) {
90         return;
91     }
92     int state = xmlTextWriterWriteAttribute(writer, BAD_CAST name,
93                                             BAD_CAST DPL::ToUTF8String(
94                                                 body).c_str());
95     if (state < 0) {
96         ThrowMsg(LibxmlUtils::Libxml2Error,
97                  "xmlTextWriterWriteAttribute failed");
98     }
99 }
100
101 void writeAttribute(xmlTextWriterPtr writer,
102                     const char * name,
103                     const char * body,
104                     bool condition = true)
105 {
106     if (!condition) {
107         return;
108     }
109     int state = xmlTextWriterWriteAttribute(writer,
110                                             BAD_CAST name,
111                                             BAD_CAST body);
112     if (state < 0) {
113         ThrowMsg(LibxmlUtils::Libxml2Error,
114                  "xmlTextWriterWriteAttribute failed");
115     }
116 }
117
118 void Manifest::generate(DPL::String filename)
119 {
120     xmlTextWriterPtr writer;
121     int state;
122
123     //compression set to 0
124     writer = xmlNewTextWriterFilename(DPL::ToUTF8String(filename).c_str(), 0);
125
126     if (writer == NULL) {
127         ThrowMsg(LibxmlUtils::Libxml2Error, "xmlNewTextWriterFilename failed");
128     }
129     state = xmlTextWriterSetIndent(writer, 1);
130     if (state < 0) {
131         ThrowMsg(LibxmlUtils::Libxml2Error, "xmlTextWriterSetIndent failed");
132     }
133
134     state = xmlTextWriterStartDocument(writer, NULL, "utf-8", NULL);
135     if (state < 0) {
136         ThrowMsg(LibxmlUtils::Libxml2Error, "xmlTextWriterStartDocument failed");
137     }
138     this->serialize(writer);
139     state = xmlTextWriterEndDocument(writer);
140     if (state < 0) {
141         ThrowMsg(LibxmlUtils::Libxml2Error, "xmlTextWriterEndDocument failed");
142     }
143     if (writer != NULL) {
144         xmlFreeTextWriter(writer);
145         writer = NULL;
146     }
147 }
148
149 void Manifest::serialize(xmlTextWriterPtr writer)
150 {
151     startElement(writer, "manifest");
152     {
153         writeAttribute(writer, "xmlns", "http://tizen.org/ns/packages");
154         writeAttribute(writer, "package", this->package);
155         writeAttribute(writer, "type", this->type);
156         writeAttribute(writer, "version", this->version);
157         if (!this->installLocation.IsNull()) {
158             writeAttribute(writer, "install-location", (*this->installLocation),
159                            (*this->installLocation).empty());
160         }
161
162         FOREACH(l, this->label)
163         {
164             writeElementWithOneAttribute(writer, "label", l->getString(),
165                                          "xml:lang", l->getLang(), l->hasLang());
166         }
167         FOREACH(i, this->icon)
168         {
169             writeElementWithOneAttribute(writer, "icon", i->getString(),
170                                          "xml:lang", i->getLang(), i->hasLang());
171         }
172         FOREACH(a, this->author)
173         {
174             a->serialize(writer);
175         }
176         FOREACH(d, this->description)
177         {
178             writeElementWithOneAttribute(writer, "description", d->getString(),
179                                          "xml:lang", d->getLang(), d->hasLang());
180         }
181         //FOREACH(c, this->compatibility) { c->serialize(writer); }
182         //FOREACH(d, this->deviceProfile) { d->serialize(writer); }
183         FOREACH(s, this->serviceApplication) {
184             s->serialize(writer);
185         }
186         FOREACH(u, this->uiApplication) {
187             u->serialize(writer);
188         }
189         FOREACH(i, this->imeApplication) {
190             i->serialize(writer);
191         }
192         //FOREACH(f, this->font) { f->serialize(writer); }
193         FOREACH(l, this->livebox) {
194             l->serialize(writer);
195         }
196     }
197     endElement(writer);
198 }
199
200 void Author::serialize(xmlTextWriterPtr writer)
201 {
202     startElement(writer, "author");
203     writeAttribute(writer, "email", this->email, !this->email.empty());
204     writeAttribute(writer, "href", this->href, !this->href.empty());
205     writeAttribute(writer, "xml:lang", this->lang, !this->lang.empty());
206     writeText(writer, body);
207     endElement(writer);
208 }
209
210 void ServiceApplication::serialize(xmlTextWriterPtr writer)
211 {
212     startElement(writer, "service-application");
213     writeAttribute(writer, "appid", this->appid);
214     writeAttribute(writer, "auto-restart",
215                    (!this->autoRestart.IsNull() &&
216                     (*this->autoRestart)) ? "true" :
217                    "false");
218     writeAttribute(writer, "exec", this->exec);
219     writeAttribute(writer, "on-boot", (!this->onBoot.IsNull() &&
220                                        (*this->onBoot)) ? "true" : "false");
221     writeAttribute(writer, "type", this->type);
222     FOREACH(l, this->label)
223     {
224         writeElementWithOneAttribute(writer, "label",
225                                      l->getString(), "xml:lang",
226                                      l->getLang(), l->hasLang());
227     }
228     FOREACH(i, this->icon)
229     {
230         writeElementWithOneAttribute(writer, "icon", i->getString(), "xml:lang",
231                                      i->getLang(), i->hasLang());
232     }
233     FOREACH(a, this->appControl)
234     {
235         a->serialize(writer);
236     }
237     endElement(writer);
238 }
239
240 void UiApplication::serialize(xmlTextWriterPtr writer)
241 {
242     startElement(writer, "ui-application");
243     writeAttribute(writer, "appid", this->appid);
244     writeAttribute(writer, "exec", this->exec);
245     if (!this->multiple.IsNull()) {
246         writeAttribute(writer, "multiple", (*this->multiple) ? "true" : "false");
247     }
248     if (!this->nodisplay.IsNull()) {
249         writeAttribute(writer,
250                        "nodisplay",
251                        (*this->nodisplay) ? "true" : "false");
252     }
253     if (!this->taskmanage.IsNull()) {
254         writeAttribute(writer,
255                        "taskmanage",
256                        (*this->taskmanage) ? "true" : "false");
257     }
258     writeAttribute(writer, "type", this->type);
259     writeAttribute(writer, "extraid", this->extraid);
260     if (!this->categories.IsNull()) {
261         writeAttribute(writer, "categories", (*this->categories));
262     }
263     FOREACH(l, this->label)
264     {
265         writeElementWithOneAttribute(writer, "label",
266                                      l->getString(), "xml:lang",
267                                      l->getLang(), l->hasLang());
268     }
269     FOREACH(i, this->icon)
270     {
271         writeElementWithOneAttribute(writer, "icon", i->getString(), "xml:lang",
272                                      i->getLang(), i->hasLang());
273     }
274     FOREACH(a, this->appControl)
275     {
276         a->serialize(writer);
277     }
278     FOREACH(c, this->appCategory)
279     {
280         startElement(writer, "category");
281         writeAttribute(writer, "name", *c);
282         endElement(writer);
283     }
284     endElement(writer);
285 }
286
287 void ImeApplication::serialize(xmlTextWriterPtr writer)
288 {
289     startElement(writer, "ime-application");
290     writeAttribute(writer, "appid", this->appid);
291     writeAttribute(writer, "exec", this->exec);
292     if (!this->multiple.IsNull()) {
293         writeAttribute(writer, "multiple", (*this->multiple) ? "true" : "false");
294     }
295     if (!this->nodisplay.IsNull()) {
296         writeAttribute(writer,
297                        "nodisplay",
298                        (*this->nodisplay) ? "true" : "false");
299     }
300     writeAttribute(writer, "type", this->type);
301     FOREACH(l, this->label)
302     {
303         writeElementWithOneAttribute(writer, "label",
304                                      l->getString(), "xml:lang",
305                                      l->getLang(), l->hasLang());
306     }
307     FOREACH(i, this->icon)
308     {
309         writeElementWithOneAttribute(writer, "icon", i->getString(), "xml:lang",
310                                      i->getLang(), i->hasLang());
311     }
312     endElement(writer);
313 }
314
315 void AppControl::serialize(xmlTextWriterPtr writer)
316 {
317     startElement(writer, "app-control");
318     FOREACH(o, this->operation)
319     {
320         startElement(writer, "operation");
321         writeAttribute(writer, "name", *o);
322         endElement(writer);
323     }
324     FOREACH(u, this->uri)
325     {
326         startElement(writer, "uri");
327         writeAttribute(writer, "name", *u);
328         endElement(writer);
329     }
330     FOREACH(m, this->mime)
331     {
332         startElement(writer, "mime");
333         writeAttribute(writer, "name", *m);
334         endElement(writer);
335     }
336     endElement(writer);
337 }
338
339 void LiveBox::serialize(xmlTextWriterPtr writer)
340 {
341     startElement(writer, "livebox");
342     if (!this->liveboxId.empty()) {
343         writeAttribute(writer, "appid", this->liveboxId);
344     }
345
346     if (!this->primary.empty()) {
347         writeAttribute(writer, "primary", this->primary);
348     }
349
350     if (!this->updatePeriod.empty()) {
351         writeAttribute(writer, "period", this->updatePeriod);
352     }
353
354     writeAttribute(writer, "abi", "html");
355     writeAttribute(writer, "network", "true");
356     writeAttribute(writer, "nodisplay", "false");
357
358     if (!this->label.empty()) {
359         startElement(writer, "label");
360         writeText(writer, this->label);
361         endElement(writer);
362     }
363
364     if (!this->icon.empty()) {
365         startElement(writer, "icon");
366         writeText(writer, this->icon);
367         endElement(writer);
368     }
369
370     if (!this->autoLaunch.empty()) {
371         startElement(writer, "launch");
372         writeText(writer, this->autoLaunch);
373         endElement(writer);
374     }
375
376     if (!this->box.boxSrc.empty() &&
377         !this->box.boxMouseEvent.empty() &&
378         !this->box.boxSize.empty())
379     {
380         startElement(writer, "box");
381         writeAttribute(writer, "type", "buffer");
382         writeAttribute(writer, "mouse_event", this->box.boxMouseEvent);
383         writeAttribute(writer, "touch_effect", this->box.boxTouchEffect);
384
385         FOREACH(m, this->box.boxSize)
386         {
387             std::pair<DPL::String, DPL::String> boxSize = *m;
388             startElement(writer, "size");
389             if (!boxSize.second.empty()) {
390                 writeAttribute(writer, "preview", boxSize.second);
391             }
392             writeText(writer, boxSize.first);
393             endElement(writer);
394         }
395
396         startElement(writer, "script");
397         writeAttribute(writer, "src", this->box.boxSrc);
398         endElement(writer);
399
400         endElement(writer);
401
402         if (!this->box.pdSrc.empty() &&
403             !this->box.pdWidth.empty() &&
404             !this->box.pdHeight.empty())
405         {
406             startElement(writer, "pd");
407             writeAttribute(writer, "type", "buffer");
408
409             startElement(writer, "size");
410             DPL::String pdSize = this->box.pdWidth + DPL::String(L"x") +
411                 this->box.pdHeight;
412             writeText(writer, pdSize);
413             endElement(writer);
414
415             startElement(writer, "script");
416             writeAttribute(writer, "src", this->box.pdSrc);
417             endElement(writer);
418
419             endElement(writer);
420         }
421     }
422
423     endElement(writer);
424 }
425 } //namespace Jobs
426 } //namespace WidgetInstall