Files
selfcare/proxy_c/selfcare_proxy.c
2025-03-03 11:40:37 +08:00

446 lines
12 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "selfcare_proxy.h"
#include "utils_queue.h"
#include "selfcare_udp.h"
#include "selfcare_endecode.h"
#include "selfcare_res.h"
#include "log.h"
extern int get_proxy_run_mode();
extern int rest_query_recharge_card_proc( struct rest_msg_s *rest_ptr);
extern int rest_query_tariff_proc(struct rest_msg_s *rest_ptr);
extern int rest_update_plan_info_proc(struct rest_msg_s *rest_ptr);
extern int rest_update_ocs_del_result(struct rest_msg_s *rest_ptr);
extern int rest_rent_charge_behalf_on_ocs(struct rest_msg_s *rest_ptr);
extern int rest_update_subs_info_proc(struct rest_msg_s *rest_ptr);
static int _httpserv_handle_udpresp(char *buff, int len)
{
/* ½âÂëocs·¢ËÍÀ´»Ø¸´µÄudpÏûÏ¢ */
int ret;
_rest_msg_s msg;
memset(&msg, 0x00, sizeof(msg));
ret = decode_rest_api_msg((u8*)buff, len, &msg);
if(ret != 1)
{
LOG_E("[udp-handle] decode ocs resp err.ret[%d]\n", ret);
return ret;
}
if(get_proxy_run_mode() == 4)//OCS+CRM mode
{
if(msg.msg_type == REST_UPDATE_RECHARGE_CARD_REQ)
{
LOG_E("[udp-handle] proc ocs REST_UPDATE_RECHARGE_CARD_REQ\n");
rest_query_recharge_card_proc(&msg);
return ret;
}
if(msg.msg_type == REST_CRM_QUERY_TARIFF_REQ)
{
// LOG_E("[udp-handle] proc ocs REST_CRM_QUERY_TARIFF_REQ\n");
rest_query_tariff_proc(&msg);
return ret;
}
if(msg.msg_type == REST_CRM_UPDATE_PLAN_INFO_REQ)
{
// LOG_E("[udp-handle] proc ocs REST_CRM_UPDATE_PLAN_INFO_REQ\n");
rest_update_plan_info_proc( &msg);
return ret;
}
if(msg.msg_type == REST_CRM_DELETE_SUBS_RES)
{
// LOG_E("[udp-handle] proc ocs REST_CRM_DELETE_SUBS_RES\n");
rest_update_ocs_del_result( &msg);
return ret;
}
if(msg.msg_type == REST_CRM_RENT_CHARGE)
{
// LOG_E("[udp-handle] proc ocs REST_CRM_RENT_CHARGE\n");
rest_rent_charge_behalf_on_ocs( &msg);
return ret;
}
if(msg.msg_type == REST_CRM_UPDATE_SUBS_REQ)
{
// LOG_E("[udp-handle] proc ocs REST_CRM_UPDATE_SUBS_INFO_REQ\n");
rest_update_subs_info_proc( &msg);
return ret;
}
}
int res_id = msg.header.dst_ref;
if(res_id >= SELFCARE_RES_NUM)
{
LOG_E("[udp-handle] proc ocs resp err. res_id[%d], msg_type=%d\n", res_id, msg.msg_type);
return FAILURE;
}
if(g_res_arr[res_id].state != SELFCARE_WAIT_OCS_RESP)
{
LOG_E("[udp-handle] recv udp err.res_id[%d] state[%s] expect[%s] \n",
res_id,
selfcare_res_stateprint(g_res_arr[res_id].state),
selfcare_res_stateprint(SELFCARE_WAIT_OCS_RESP) );
return SUCCESS;
}
_rest_msg_s *resp = &g_res_arr[res_id].resp;
memcpy(resp, &msg, sizeof(msg));
if(g_res_arr[res_id].local_init_flag == 1)
g_res_arr[res_id].state = SELFCARE_LOCAL_INIT_RESP;
else
g_res_arr[res_id].state = SELFCARE_WAIT_SEND2SELFCARE_RESP;
LOG_D("[udp-handle] recv udp suc.res_id[%d] state[%s=>%s]\n",
res_id,
selfcare_res_stateprint(SELFCARE_WAIT_OCS_RESP),
selfcare_res_stateprint(g_res_arr[res_id].state) );
return SUCCESS;
}
static int _httpserv_handle_httpreq(struct evhttp_request *req, void *arg, SELFCARE_URL_E req_type)
{
int ret;
ret = selfcare_httpsrv_check(req, arg);
if(ret != SUCCESS)
{
LOG_E("[httpserv] check failed\n");
return ret;
}
int res_id;
ret = selfcare_res_get(&res_id);
if(ret != SUCCESS)
{
LOG_D("[httpserv] no res.\n");
// send http-resp failed
return ret;
}
selfcare_res_s *res = &g_res_arr[res_id];
memset(res, 0x00, sizeof(selfcare_res_s));
res->id = res_id;
res->state = SELFCARE_WAIT_SEND2OCS_REQ;
res->req = req;
res->arg = arg;
res->req_type = req_type;
LOG_D("[httpserv] res_id[%d] get suc. state[%s] for type[%d]\n", res->id, selfcare_res_stateprint(res->state), req_type);
return SUCCESS;
}
selfcare_res_s *selfcare_assign_res()
{
int res_id, ret;
selfcare_res_s *res=NULL;
ret = selfcare_res_get(&res_id);
if(ret != SUCCESS)
{
LOG_D("[httpserv] no res.\n");
return NULL;
}
res = &g_res_arr[res_id];
memset(res, 0x00, sizeof(selfcare_res_s));
res->id = res_id;
LOG_D("[httpserv] res_id[%d] get suc. state[%s]\n", res->id, selfcare_res_stateprint(res->state));
return res;
}
static void _httpserv_handle_authcode(struct evhttp_request *req, void *arg)
{
int ret;
ret = _httpserv_handle_httpreq(req, arg, SELFCARE_AUTHCODE);
if(ret != SUCCESS)
{
LOG_E("[httpserv] handle authcode err.\n");
return ;
}
LOG_D("[httpserv] handle authcode suc.req[%p]\n", req);
return ;
}
static void _httpserv_handle_queryuserdata(struct evhttp_request *req, void *arg)
{
int ret;
ret = _httpserv_handle_httpreq(req, arg, SELFCARE_QUERY_USERDATA);
if(ret != SUCCESS)
{
LOG_E("[httpserv] handle queryuserdata err.\n");
return ;
}
LOG_D("[httpserv] handle queryuserdata suc.\n");
return ;
}
static void _httpserv_handle_bundlesubs(struct evhttp_request *req, void *arg)
{
int ret;
ret = _httpserv_handle_httpreq(req, arg, SELFCARE_BUNDLE_SUBS);
if(ret != SUCCESS)
{
LOG_E("[httpserv] handle bundlesubs err.\n");
return ;
}
LOG_D("[httpserv] handle bundlesubs suc.\n");
return ;
}
static void _httpserv_handle_bundleusage(struct evhttp_request *req, void *arg)
{
int ret;
ret = _httpserv_handle_httpreq(req, arg, SELFCARE_BUNDLE_USAGE);
if(ret != SUCCESS)
{
LOG_E("[httpserv] handle bundleusage err.\n");
return;
}
LOG_D("[httpserv] handle bundleusage suc.\n");
return ;
}
static void _httpserv_handle_recharge(struct evhttp_request *req, void *arg)
{
int ret;
ret = _httpserv_handle_httpreq(req, arg, SELFCARE_RECHARGE);
if(ret != SUCCESS)
{
LOG_E("[httpserv] handle recharge err.\n");
return ;
}
LOG_D("[httpserv] handle recharge suc.\n");
return ;
}
static void _httpserv_handle_transfer(struct evhttp_request *req, void *arg)
{
int ret;
ret = _httpserv_handle_httpreq(req, arg, SELFCARE_TRANSFER);
if(ret != SUCCESS)
{
LOG_E("[httpserv] handle transfer err.\n");
return ;
}
LOG_D("[httpserv] handle transfer suc.\n");
return ;
}
static void _httpserv_handle_rechargecard(struct evhttp_request *req, void *arg)
{
int ret;
ret = _httpserv_handle_httpreq(req, arg, SELFCARE_RECHARGE_CARD );
if(ret != SUCCESS)
{
LOG_E("[httpserv] handle rechargecard err.\n");
return ;
}
LOG_D("[httpserv] handle rechargecard suc.\n");
return ;
}
static void _httpserv_handle_checkbalance(struct evhttp_request *req, void *arg)
{
int ret;
ret = _httpserv_handle_httpreq(req, arg, SELFCARE_CHECK_BALANCE );
if(ret != SUCCESS)
{
LOG_E("[httpserv] handle checkbalance err.\n");
return ;
}
LOG_D("[httpserv] handle checkbalance suc.\n");
return ;
}
static void _httpserv_handle_querybalane(struct evhttp_request *req, void *arg)
{
int ret;
ret = _httpserv_handle_httpreq(req, arg, SELFCARE_QUERY_BALANCE );
if(ret != SUCCESS)
{
LOG_E("[httpserv] handle querybalane err.\n");
return ;
}
LOG_D("[httpserv] handle querybalane suc.\n");
return ;
}
static void _httpserv_handle_payment(struct evhttp_request *req, void *arg)
{
int ret;
ret = _httpserv_handle_httpreq(req, arg, SELFCARE_CRM_PAYMENT );
if(ret != SUCCESS)
{
LOG_E("[httpserv] handle crm payment err.\n");
return ;
}
LOG_D("[httpserv] handle crm payment suc.\n");
return ;
}
static void _httpserv_handle_smsdeliver(struct evhttp_request *req, void *arg)
{
int ret;
ret = _httpserv_handle_httpreq(req, arg, SELFCARE_SMS_DELIVER);
if(ret != SUCCESS)
{
LOG_E("[httpserv] handle sms_deliver err.\n");
return ;
}
LOG_D("[httpserv] handle sms_deliver suc.\n");
return ;
}
static void _httpserv_handle_createaccount(struct evhttp_request *req, void *arg)
{
int ret;
ret = _httpserv_handle_httpreq(req, arg, SELFCARE_CREATE_ACCT);
if(ret != SUCCESS)
{
LOG_E("[httpserv] handle create_account err.\n");
return ;
}
LOG_D("[httpserv] handle create_account suc.\n");
return ;
}
static void _httpserv_handle_updatesubs(struct evhttp_request *req, void *arg)
{
int ret;
ret = _httpserv_handle_httpreq(req, arg, SELFCARE_UPDATE_SUBS);
if(ret != SUCCESS)
{
LOG_E("[httpserv] _httpserv_handle_updatesubs err.\n");
return ;
}
LOG_D("[httpserv] _httpserv_handle_updatesubs suc.\n");
return ;
}
static void _httpserv_handle_deletesubs(struct evhttp_request *req, void *arg)
{
int ret;
ret = _httpserv_handle_httpreq(req, arg, SELFCARE_DELETE_SUBS);
if(ret != SUCCESS)
{
LOG_E("[httpserv] _httpserv_handle_updatesubs err.\n");
return ;
}
LOG_D("[httpserv] _httpserv_handle_updatesubs suc.\n");
return ;
}
static int _selfcare_proxy_reg(const SELFCARE_URL_E url_type,
const char *url_addr,
void (*handle)(struct evhttp_request *req, void *arg) )
{
selfcare_elem_s elem;
memset(&elem, 0x00, sizeof(elem));
elem.url_type = url_type;
strncpy(elem.url_addr, url_addr, SELFCARE_URL_LEN);
elem.handle = handle;
return selfcare_httpsrv_reg(&elem);
}
int selfcare_proxy_init(int argc, char **argv)
{
int ret;
/* ³õʼ»¯ÅäÖà */
ret = selfcare_config_init(NULL);
if(ret != SUCCESS)
{
return ret;
}
/* ³õʼ»¯udp socket */
ret = selfcare_udp_init();
if(ret != SUCCESS)
{
return ret;
}
/* ×¢²áselfcareÇëÇ󻨵÷º¯Êý */
ret = _selfcare_proxy_reg(SELFCARE_AUTHCODE, selfcare_config_get()->authcode_url, _httpserv_handle_authcode);
ret += _selfcare_proxy_reg(SELFCARE_QUERY_USERDATA, selfcare_config_get()->query_userdata_url, _httpserv_handle_queryuserdata);
ret += _selfcare_proxy_reg(SELFCARE_BUNDLE_SUBS, selfcare_config_get()->bundle_subs_url, _httpserv_handle_bundlesubs);
ret += _selfcare_proxy_reg(SELFCARE_BUNDLE_USAGE, selfcare_config_get()->bundle_usage_url, _httpserv_handle_bundleusage);
ret += _selfcare_proxy_reg(SELFCARE_RECHARGE, selfcare_config_get()->recharge_url, _httpserv_handle_recharge);
ret += _selfcare_proxy_reg(SELFCARE_TRANSFER, selfcare_config_get()->transfer_url, _httpserv_handle_transfer);
ret += _selfcare_proxy_reg(SELFCARE_RECHARGE_CARD, selfcare_config_get()->recharge_card_url, _httpserv_handle_rechargecard);
ret += _selfcare_proxy_reg(SELFCARE_CHECK_BALANCE, selfcare_config_get()->check_balance_url, _httpserv_handle_checkbalance);
ret += _selfcare_proxy_reg(SELFCARE_QUERY_BALANCE, selfcare_config_get()->query_balane_url, _httpserv_handle_querybalane);
ret += _selfcare_proxy_reg(SELFCARE_CRM_PAYMENT, selfcare_config_get()->payment_url , _httpserv_handle_payment);
ret += _selfcare_proxy_reg(SELFCARE_SMS_DELIVER, selfcare_config_get()->sms_deliver_url, _httpserv_handle_smsdeliver);
ret += _selfcare_proxy_reg(SELFCARE_CREATE_ACCT, selfcare_config_get()->create_account_url, _httpserv_handle_createaccount);
ret += _selfcare_proxy_reg(SELFCARE_UPDATE_SUBS, selfcare_config_get()->update_subs_url, _httpserv_handle_updatesubs);
ret += _selfcare_proxy_reg(SELFCARE_DELETE_SUBS, selfcare_config_get()->delete_subs_url, _httpserv_handle_deletesubs);
/* ×¢²áocs udpÏûÏ¢»Øµ÷º¯Êý */
selfcare_udp_handle_s handle;
handle.handle = _httpserv_handle_udpresp;
ret = selfcare_udp_reg(&handle);
if(ret != SUCCESS)
{
return ret;
}
ret = selfcare_res_init(argc, argv);
if(ret != SUCCESS)
{
return ret;
}
ret = selfcare_httpsrv_init(argc, argv);
if(ret != SUCCESS)
{
return ret;
}
return SUCCESS;
}
void selfcare_proxy_uninit(void)
{
selfcare_config_uninit();
selfcare_udp_uninit();
selfcare_httpsrv_uninit();
selfcare_res_uninit();
}