rc_ReturnCode_t swi_sms_Unregister(swi_sms_regId_t regId) { rc_ReturnCode_t res; char *payload, *respPayload; size_t payloadLen; uint32_t respPayloadLen; cb_list_t *entry, *tmp; yajl_gen gen; for (entry = cb_list; entry; entry = entry->next) if (entry == regId) break; if (entry == NULL) return RC_BAD_PARAMETER; YAJL_GEN_ALLOC(gen); YAJL_GEN_INTEGER(entry->regId, "regId"); YAJL_GEN_GET_BUF(payload, payloadLen); res = emp_send_and_wait_response(EMP_UNREGISTERSMSLISTENER, 0, payload, payloadLen, &respPayload, &respPayloadLen); yajl_gen_clear(gen); yajl_gen_free(gen); if (res != RC_OK) { SWI_LOG("SMS", ERROR, "Error while unregister sms, res=%d\n", res); SWI_LOG("SMS", ERROR, "got error msg=%s\n", respPayload); goto quit; } pthread_mutex_lock(&handler_lock); if (cb_list == regId) { free(cb_list); cb_list = NULL; } else { for (entry = cb_list; entry; entry = entry->next) { if (entry->next == regId) { break; } } tmp = entry->next; entry->next = tmp->next; free(tmp->payload); free(tmp); } pthread_mutex_unlock(&handler_lock); quit: free(respPayload); return res; }
rc_ReturnCode_t swi_sms_Register(swi_sms_ReceptionCB_t callback, const char* senderPatternPtr, const char* messagePatternPtr, swi_sms_regId_t *regIdPtr) { rc_ReturnCode_t res; char *payload; size_t payloadLen; const char *senderP, *messageP; cb_list_t *entry; yajl_gen gen; int regId; if (callback == NULL || regIdPtr == NULL) return RC_BAD_PARAMETER; senderP = senderPatternPtr ? senderPatternPtr : ""; messageP = messagePatternPtr ? messagePatternPtr : ""; YAJL_GEN_ALLOC(gen); yajl_gen_array_open(gen); YAJL_GEN_STRING(senderP, "sender pattern"); YAJL_GEN_STRING(messageP, "message pattern"); yajl_gen_array_close(gen); YAJL_GEN_GET_BUF(payload, payloadLen); res = send_reg_payload(payload, payloadLen, ®Id); if (res != RC_OK) goto quit; pthread_mutex_lock(&handler_lock); if (!cb_list) { cb_list = malloc(sizeof(cb_list_t)); entry = cb_list; } else { for (entry = cb_list; entry->next; entry = entry->next) ; entry->next = malloc(sizeof(cb_list_t)); entry = entry->next; } entry->regId = regId; entry->cb = callback; entry->payload = strndup(payload, payloadLen); entry->next = NULL; *regIdPtr = entry; pthread_mutex_unlock(&handler_lock); quit: yajl_gen_clear(gen); yajl_gen_free(gen); return res; }
rc_ReturnCode_t swi_sms_Send(const char *recipientPtr, const char* messagePtr, swi_sms_Format_t format) { rc_ReturnCode_t res; char *payload, *respPayload; const char *smsFormat = ""; size_t payloadLen; uint32_t respPayloadLen; yajl_gen gen; if (recipientPtr == NULL || messagePtr == NULL || format < SWI_SMS_7BITS || format > SWI_SMS_UCS2) return RC_BAD_PARAMETER; switch(format) { case SWI_SMS_7BITS: smsFormat = "7bits"; break; case SWI_SMS_8BITS: smsFormat = "8bits"; break; case SWI_SMS_UCS2: smsFormat = "ucs2"; break; default: break; } YAJL_GEN_ALLOC(gen); yajl_gen_array_open(gen); YAJL_GEN_STRING(recipientPtr, "recipientPtr"); YAJL_GEN_STRING(messagePtr, "messagePtr"); YAJL_GEN_STRING(smsFormat, "smsFormat"); yajl_gen_array_close(gen); YAJL_GEN_GET_BUF(payload, payloadLen); res = emp_send_and_wait_response(EMP_SENDSMS, 0, payload, payloadLen, &respPayload, &respPayloadLen); yajl_gen_clear(gen); yajl_gen_free(gen); if (res != RC_OK) { SWI_LOG("SMS", ERROR, "error while sending sms, res=%d\n", res); SWI_LOG("SMS", ERROR, "got error msg=%s\n", respPayload); } free(respPayload); return res; }
swi_status_t swi_sys_Reboot(const char* reasonPtr) { char *payload = NULL; size_t payloadLen = 0; swi_status_t res; yajl_gen gen; YAJL_GEN_ALLOC(gen); if (reasonPtr == NULL) goto emp_send; YAJL_GEN_STRING(reasonPtr, "reasonPtr"); YAJL_GEN_GET_BUF(payload, payloadLen); emp_send: res = emp_send_and_wait_response(EMP_REBOOT, 0, payload, payloadLen, NULL, NULL); yajl_gen_clear(gen); yajl_gen_free(gen); return res; }