56d3c5f3bae9720ef752d0108e1ed54ec1879af5
[platform/core/system/system-popup.git] / src / crash / crash.c
1 /*
2  *  system-popup
3  *
4  * Copyright (c) 2016 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18 */
19
20 #include "popup-common.h"
21 #include <pkgmgr-info.h>
22
23 #define BUF_MAX 256
24
25 static int appinfo_get_appname_func(pkgmgrinfo_appinfo_h handle, void *data)
26 {
27         char *str = NULL;
28         char *label;
29         int ret;
30
31         _D("appinfo_get_appname_func() is entered");
32         if (!data)
33                 return PMINFO_R_ERROR;
34
35         ret = pkgmgrinfo_appinfo_get_label(handle, &str);
36         if (ret != PMINFO_R_OK)
37                 return ret;
38
39         if (!str)
40                 return PMINFO_R_ERROR;
41
42         label = strdup(str);
43         if (!label)
44                 return PMINFO_R_ERROR;
45
46         (*(char**)data) = label;
47
48         _D("appinfo_get_appname_func() is finished");
49         return PMINFO_R_OK;
50 }
51
52 static int get_app_name(char *exepath, char *tname, unsigned int len)
53 {
54         pkgmgrinfo_appinfo_filter_h handle = NULL;
55         int count, ret;
56         char *name = NULL;
57
58         _D("get_app_name() is entered");
59         ret = pkgmgrinfo_appinfo_filter_create(&handle);
60         if (ret != PMINFO_R_OK)
61                 goto out;
62
63         ret = pkgmgrinfo_appinfo_filter_add_string(handle,
64                         PMINFO_APPINFO_PROP_APP_EXEC, exepath);
65         if (ret != PMINFO_R_OK)
66                 goto out;
67
68         ret = pkgmgrinfo_appinfo_filter_count(handle, &count);
69         if (ret != PMINFO_R_OK)
70                 goto out;
71
72         if (count < 1)
73                 goto out;
74
75         ret = pkgmgrinfo_appinfo_filter_foreach_appinfo(handle,
76                         appinfo_get_appname_func, &name);
77         if (ret != PMINFO_R_OK) {
78                 name = NULL;
79                 goto out;
80         }
81
82 out:
83         if (handle)
84                 pkgmgrinfo_appinfo_filter_destroy(handle);
85         if (!name)
86                 return -ENOENT;
87
88         snprintf(tname, len, "%s", name);
89         free(name);
90         _D("get_app_name() is finished");
91         return 0;
92 }
93
94 static int crash_get_content(const struct popup_ops *ops, char *content, unsigned int len)
95 {
96         int ret;
97         unsigned int l;
98         struct object_ops *obj;
99         char *text, *name, *path;
100         char tname[BUF_MAX];
101
102         if (!ops || !content)
103                 return -EINVAL;
104
105         ret = get_object_by_ops(ops, &obj);
106         if (ret < 0) {
107                 _E("Failed to get object (%d)", ret);
108                 return -ENOENT;
109         }
110
111         name = (char *)bundle_get_val(obj->b, "_PROCESS_NAME_");
112         if (!name) {
113                 _E("Failed to get process name");
114                 return -ENOENT;
115         }
116
117         path = (char *)bundle_get_val(obj->b, "_EXEPATH_");
118         if (!path) {
119                 _E("Failed to get execution path");
120                 return -ENOENT;
121         }
122
123         l = sizeof(tname);
124         ret = get_app_name(path, tname, l);
125         if (ret < 0)
126                 snprintf(tname, l, "%s", name);
127
128         _I("name(%s), path(%s), tname(%s)", name, path, tname);
129
130         text = _("WDS_TPLATFORM_BODY_PS_HAS_STOPPED");
131         snprintf(content, len, text, tname);
132
133         return 0;
134 }
135
136 static const struct popup_ops crash_ops = {
137         .name                   = "crash",
138         .pattern                = FEEDBACK_PATTERN_LOWBATT,
139         .show                   = load_simple_popup,
140         .title                  = "IDS_IDLE_HEADER_ERROR_OCCURRED",
141         .get_content    = crash_get_content,
142         .left_text              = "IDS_COM_SK_OK",
143 };
144
145 static __attribute__ ((constructor)) void crash_register_popup(void)
146 {
147         register_popup(&crash_ops);
148 }