Skip to content

Commit 603a296

Browse files
committed
native service: Listening to power state, stopping daemon on power down
1 parent 3135535 commit 603a296

File tree

1 file changed

+43
-0
lines changed

1 file changed

+43
-0
lines changed

service/src/service.c

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,45 @@ LSMethod methods[] = {
150150
{ 0, 0, 0 }
151151
};
152152

153+
static bool power_callback(LSHandle* sh __attribute__((unused)), LSMessage* msg, void* data)
154+
{
155+
JSchemaInfo schema;
156+
jvalue_ref parsed;
157+
service_t* service = (service_t*)data;
158+
159+
INFO("Power status callback message: %s", LSMessageGetPayload(msg));
160+
161+
jschema_info_init(&schema, jschema_all(), NULL, NULL);
162+
parsed = jdom_parse(j_cstr_to_buffer(LSMessageGetPayload(msg)), DOMOPT_NOOPT, &schema);
163+
164+
// Parsing failed
165+
if (jis_null(parsed)) {
166+
j_release(&parsed);
167+
return true;
168+
}
169+
170+
jvalue_ref state_ref = jobject_get(parsed, j_cstr_to_buffer("state"));
171+
if (!jis_valid(state_ref)) {
172+
DBG("power_callback: luna-reply does not contain 'state'");
173+
j_release(&parsed);
174+
return true;
175+
}
176+
177+
raw_buffer state_buf = jstring_get(state_ref);
178+
const char* state_str = state_buf.m_str;
179+
bool target_state = strcmp(state_str, "Active") == 0;
180+
181+
if (is_running(service->daemon_pid) && !target_state) {
182+
INFO("Shutting down service after power pause...");
183+
daemon_stop(service);
184+
}
185+
186+
jstring_free_buffer(state_buf);
187+
j_release(&parsed);
188+
189+
return true;
190+
}
191+
153192
bool service_destroy(LSHandle *handle, service_t *service, LSError *lserror)
154193
{
155194
DBG("Cleaning up service...");
@@ -193,5 +232,9 @@ bool service_init(LSHandle *handle, GMainLoop* loop, service_t *service, LSError
193232
return false;
194233
}
195234

235+
if (!LSCall(handle, "luna://com.webos.service.tvpower/power/getPowerState", "{\"subscribe\":true}", power_callback, (void*)service, NULL, lserror)) {
236+
WARN("Power state monitoring call failed: %s", lserror->message);
237+
}
238+
196239
return true;
197240
}

0 commit comments

Comments
 (0)