#include "restapi.h" #define ENCODE_HEADER() \ do{ \ buf[len++] = ptr->msg_type; \ buf[len++] = IE_SRC_REF; \ buf[len++] = 0x02; \ *(u16*)(&buf[len]) = htons(ptr->header.src_ref); \ len += 2; \ buf[len++] = IE_DST_REF; \ buf[len++] = 0x02; \ *(u16*)(&buf[len]) = htons(ptr->header.dst_ref); \ len += 2; \ }while(0) #define DECODE_HEADER() \ do{ \ ptr->msg_type = buf[len++]; \ len += 2; \ ptr->header.src_ref = ntohs(*(u16*)(&buf[len]));\ len += 2; \ len += 2; \ ptr->header.dst_ref = ntohs(*(u16*)(&buf[len]));\ len += 2; \ }while(0) static void _encode_u64(u8 *buf, int *len, const u64 val) { *(u32*)(&buf[*len]) = htonl((val >> 32) & 0xFFFFFFFF); *len += 0x04; *(u32*)(&buf[*len]) = htonl(val & 0xFFFFFFFF); *len += 0x04; //htonll()? } static u64 _decode_u64(u8 *buf) { u64 val = 0; val = ntohl( *(u32*)(&buf[0]) ); val = val << 32; val += ntohl( *(u32*)(&buf[4]) ) & 0xffffffff; return val; } int encode_rest_query(_rest_msg_s *ptr, u8 *buf) { int len=0, vallen=0; ENCODE_HEADER(); buf[len++] = IE_MSISDN; vallen = strlen(ptr->msg.query.msisdn); buf[len++] = vallen; strcpy((char*)( &buf[len] ), ptr->msg.query.msisdn); len += vallen; return len; } static int decode_rest_query(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_MSISDN: memcpy(ptr->msg.query.msisdn, &buf[offset], vallen); ptr->msg.query.msisdn[vallen] = '\0'; break; case IE_RESULT: ptr->msg.query_res.result = buf[offset]; break; case IE_ERROR_CODE: ptr->msg.query_res.error_code = buf[offset]; break; case IE_BALANCE: ptr->msg.query_res.balance = ntohl( *(u32*)(&buf[offset]) ); break; case IE_MO_EXPIRY: ptr->msg.query_res.mo_expiry = ntohl( *(u32*)(&buf[offset]) ); break; case IE_MT_EXPIRY: ptr->msg.query_res.mt_expiry = ntohl( *(u32*)(&buf[offset]) ); break; case IE_USERNAME: { memcpy(ptr->msg.topup.username, &buf[offset], vallen); ptr->msg.topup.username[vallen] = '\0'; } break; case IE_PASSWORD: { memcpy(ptr->msg.topup.password, &buf[offset], vallen); ptr->msg.topup.password[vallen] = '\0'; } break; } offset += vallen; } return retval; } int encode_rest_query_res(_rest_msg_s *ptr, u8 *buf) { int len=0/*, vallen=0*/; ENCODE_HEADER(); buf[len++] = IE_RESULT; buf[len++] = 0x01; buf[len++] = ptr->msg.query_res.result; if(ptr->msg.query_res.result == 1) { buf[len++] = IE_ERROR_CODE; buf[len++] = 0x01; buf[len++] = ptr->msg.query_res.error_code; return len; } buf[len++] = IE_BALANCE; buf[len++] = 0x04; // memcpy(&buf[len], &ptr->msg.query_res.balance, 0x04); *(u32*)(&buf[len]) = htonl(ptr->msg.query_res.balance); len += 0x04; buf[len++] = IE_MO_EXPIRY; buf[len++] = 0x04; // memcpy(&buf[len], &ptr->msg.query_res.mo_expiry, 0x04); *(u32*)(&buf[len]) = htonl(ptr->msg.query_res.mo_expiry); len += 0x04; buf[len++] = IE_MT_EXPIRY; buf[len++] = 0x04; // memcpy(&buf[len], &ptr->msg.query_res.mt_expiry, 0x04); *(u32*)(&buf[len]) = htonl(ptr->msg.query_res.mt_expiry); len += 0x04; return len; } int encode_rest_topup(_rest_msg_s *ptr, u8 *buf) { int len=0, vallen=0; ENCODE_HEADER(); buf[len++] = IE_MSISDN; vallen = strlen(ptr->msg.topup.msisdn); buf[len++] = vallen; strcpy((char*)( &buf[len] ), ptr->msg.topup.msisdn); len += vallen; buf[len++] = IE_USERNAME; vallen = strlen(ptr->msg.topup.username); buf[len++] = vallen; strcpy((char*)( &buf[len] ), ptr->msg.topup.username); len += vallen; buf[len++] = IE_PASSWORD; vallen = strlen(ptr->msg.topup.password); buf[len++] = vallen; strcpy((char*)( &buf[len] ), ptr->msg.topup.password); len += vallen; if((ptr->msg.topup.optional_flag & 0x01) == 0x01) { buf[len++] = IE_ACCOUNT_ID; vallen = 4; buf[len++] = vallen; *(u32*)(&buf[len]) = htonl(ptr->msg.topup.account_id); len += vallen; } if((ptr->msg.topup.optional_flag & 0x02) == 0x02) { buf[len++] = IE_BALANCE_AVAILABLE; vallen = 4; buf[len++] = vallen; *(u32*)(&buf[len]) = htonl(ptr->msg.topup.balance); len += vallen; } return len; } static int decode_rest_topup(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_MSISDN: { memcpy(ptr->msg.topup.msisdn, &buf[offset], vallen); ptr->msg.topup.msisdn[vallen] = '\0'; } break; case IE_ACCOUNT_ID: { ptr->msg.topup.account_id = ntohl( *(u32*)(&buf[offset]) ); ptr->msg.topup.optional_flag |= 0x01; } break; case IE_BALANCE_AVAILABLE: { ptr->msg.topup.balance = ntohl( *(u32*)(&buf[offset]) ); ptr->msg.topup.optional_flag |= 0x02; } break; case IE_RESULT: { ptr->msg.topup_res.result = buf[offset]; } break; case IE_ERROR_CODE: { ptr->msg.topup_res.error_code = buf[offset]; } break; case IE_BALANCE: { ptr->msg.topup_res.balance = ntohl( *(u32*)(&buf[offset]) ); } break; case IE_MO_EXPIRY: { ptr->msg.topup_res.mo_expiry = ntohl( *(u32*)(&buf[offset]) ); } break; case IE_MT_EXPIRY: { ptr->msg.topup_res.mt_expiry = ntohl( *(u32*)(&buf[offset]) ); } break; case IE_USERNAME: { memcpy(ptr->msg.topup.username, &buf[offset], vallen); ptr->msg.topup.username[vallen] = '\0'; } break; case IE_PASSWORD: { memcpy(ptr->msg.topup.password, &buf[offset], vallen); ptr->msg.topup.password[vallen] = '\0'; } break; } offset += vallen; } return retval; } int encode_rest_topup_res(_rest_msg_s *ptr, u8 *buf) { return encode_rest_query_res(ptr, buf); } // for selfcare====================================== int encode_rest_send_authcode(_rest_msg_s *ptr, u8 *buf) { int len=0, vallen=0; ENCODE_HEADER(); // IE_MSISDN buf[len++] = IE_MSISDN; vallen = strlen(ptr->msg.send_authcode.msisdn); buf[len++] = vallen; strcpy((char*)( &buf[len] ), ptr->msg.send_authcode.msisdn); len += vallen; // IE_MSG_CONTENT buf[len++] = IE_MSG_CONTENT; vallen = strlen(ptr->msg.send_authcode.sms_content); buf[len++] = vallen>>8; buf[len++] = vallen & 0xff; strcpy((char*)( &buf[len] ), ptr->msg.send_authcode.sms_content); len += vallen; return len; } int encode_rest_send_authcode_res(_rest_msg_s *ptr, u8 *buf) { int len=0/*, vallen=0*/; ENCODE_HEADER(); // IE_RESULT buf[len++] = IE_RESULT; buf[len++] = 0x01; buf[len++] = ptr->msg.send_authcode_res.result; if(ptr->msg.send_authcode_res.result == RES_FAILED) { buf[len++] = IE_ERROR_CODE; buf[len++] = 0x01; buf[len++] = ptr->msg.send_authcode_res.error_code; return len; } return len; } int encode_rest_query_user_data(_rest_msg_s *ptr, u8 *buf) { int len=0, vallen=0; ENCODE_HEADER(); buf[len++] = IE_MSISDN; vallen = strlen(ptr->msg.query_user_data.msisdn); buf[len++] = vallen; strcpy((char*)( &buf[len] ), ptr->msg.query_user_data.msisdn); len += vallen; return len; } int encode_rest_query_user_data_res(_rest_msg_s *ptr, u8 *buf) { int len=0, vallen=0; ENCODE_HEADER(); // IE_RESULT buf[len++] = IE_RESULT; buf[len++] = 0x01; buf[len++] = ptr->msg.query_user_data_res.result; if(ptr->msg.query_user_data_res.result == RES_FAILED) { buf[len++] = IE_ERROR_CODE; buf[len++] = 0x01; buf[len++] = ptr->msg.query_user_data_res.error_code; return len; } // // IE_MSISDN buf[len++] = IE_MSISDN; vallen = strlen(ptr->msg.query_user_data_res.msisdn); buf[len++] = vallen; strcpy((char*)( &buf[len] ), ptr->msg.query_user_data_res.msisdn); len += vallen; // // IE_REMARK buf[len++] = IE_REMARK; vallen = strlen(ptr->msg.query_user_data_res.remark); buf[len++] = vallen; strcpy((char*)( &buf[len] ), ptr->msg.query_user_data_res.remark); len += vallen; // // IE_GROUP_NAME buf[len++] = IE_GROUP_NAME; vallen = strlen(ptr->msg.query_user_data_res.usrGrpName); buf[len++] = vallen; strcpy((char*)( &buf[len] ), ptr->msg.query_user_data_res.usrGrpName); len += vallen; // // IE_STATUS buf[len++] = IE_STATUS; buf[len++] = 0x01; buf[len++] = ptr->msg.query_user_data_res.status; // // IE_BALANCE buf[len++] = IE_BALANCE; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.query_user_data_res.balance); len += 0x04; // // IE_EXPIRY_TIME buf[len++] = IE_EXPIRY_TIME; buf[len++] = 0x08; _encode_u64(buf, &len, ptr->msg.query_user_data_res.mo_expiry); // IE_REMAIN_MO_VOICE_MIN buf[len++] = IE_REMAIN_MO_VOICE_MIN; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.query_user_data_res.remain_mo_voc_min); len += 0x04; // // IE_REMAIN_MT_VOICE_MIN buf[len++] = IE_REMAIN_MT_VOICE_MIN; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.query_user_data_res.remain_mt_voc_min); len += 0x04; // // IE_REMAIN_SMS_NUM buf[len++] = IE_REMAIN_SMS_NUM; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.query_user_data_res.remain_sms_num); len += 0x04; // // IE_REMAIN_DATA_VOL_MB buf[len++] = IE_REMAIN_DATA_VOL_MB; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.query_user_data_res.remain_data_vol); len += 0x04; // return len; } int encode_rest_bundle_subs(_rest_msg_s *ptr, u8 *buf) { int len=0, vallen=0; ENCODE_HEADER(); buf[len++] = IE_MSISDN; vallen = strlen(ptr->msg.bundle_subs.msisdn); buf[len++] = vallen; strcpy((char*)( &buf[len] ), ptr->msg.bundle_subs.msisdn); len += vallen; // IE_PAY_TYPE buf[len++] = IE_PAY_TYPE; buf[len++] = 0x01; buf[len++] = ptr->msg.bundle_subs.payType; // // IE_AMOUNT buf[len++] = IE_AMOUNT; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.bundle_subs.charge); len += 0x04; // // IE_MO_VOICE_MIN buf[len++] = IE_MO_VOICE_MIN; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.bundle_subs.moVoiceMinute); len += 0x04; // // IE_MT_VOICE_MIN buf[len++] = IE_MT_VOICE_MIN; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.bundle_subs.mtVoiceMinute); len += 0x04; // // IE_SMS_NUM buf[len++] = IE_SMS_NUM; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.bundle_subs.smsNum); len += 0x04; // // IE_DATA_VOL_MB buf[len++] = IE_DATA_VOL_MB; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.bundle_subs.dataVolume); len += 0x04; // // IE_VALID_DAYS buf[len++] = IE_VALID_DAYS; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.bundle_subs.validDays); len += 0x04; // return len; } int encode_rest_bundle_subs_res(_rest_msg_s *ptr, u8 *buf) { int len=0/*, vallen=0*/; ENCODE_HEADER(); // IE_RESULT buf[len++] = IE_RESULT; buf[len++] = 0x01; buf[len++] = ptr->msg.bundle_subs_res.result; if(ptr->msg.bundle_subs_res.result == RES_FAILED) { buf[len++] = IE_ERROR_CODE; buf[len++] = 0x01; buf[len++] = ptr->msg.bundle_subs_res.error_code; return len; } // return len; } int encode_rest_bundle_usage(_rest_msg_s *ptr, u8 *buf) { int len=0, vallen=0; ENCODE_HEADER(); buf[len++] = IE_MSISDN; vallen = strlen(ptr->msg.bundle_usage.msisdn); buf[len++] = vallen; strcpy((char*)( &buf[len] ), ptr->msg.bundle_usage.msisdn); len += vallen; return len; } int encode_rest_bundle_usage_res(_rest_msg_s *ptr, u8 *buf) { int len=0/*, vallen=0*/; ENCODE_HEADER(); // IE_RESULT buf[len++] = IE_RESULT; buf[len++] = 0x01; buf[len++] = ptr->msg.bundle_usage_res.result; if(ptr->msg.bundle_usage_res.result == RES_FAILED) { buf[len++] = IE_ERROR_CODE; buf[len++] = 0x01; buf[len++] = ptr->msg.bundle_usage_res.error_code; return len; } // // IE_REMAIN_MO_VOICE_MIN buf[len++] = IE_REMAIN_MO_VOICE_SEC; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.bundle_usage_res.moVoiceInSec); len += 0x04; // // IE_REMAIN_MT_VOICE_MIN buf[len++] = IE_REMAIN_MT_VOICE_SEC; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.bundle_usage_res.mtVoiceInSec); len += 0x04; // // IE_REMAIN_SMS_NUM buf[len++] = IE_REMAIN_SMS_NUM; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.bundle_usage_res.smsNum); len += 0x04; // // IE_REMAIN_DATA_VOL_MB buf[len++] = IE_REMAIN_DATA_VOL_KB; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.bundle_usage_res.dataVolInKB); len += 0x04; // // IE_EXPIRY_TIME buf[len++] = IE_EXPIRY_TIME; buf[len++] = 0x08; _encode_u64(buf, &len, ptr->msg.bundle_usage_res.expiredTime); // return len; } int encode_rest_recharge(_rest_msg_s *ptr, u8 *buf) { int len=0, vallen=0; ENCODE_HEADER(); buf[len++] = IE_MSISDN; vallen = strlen(ptr->msg.recharge.msisdn); buf[len++] = vallen; strcpy((char*)( &buf[len] ), ptr->msg.recharge.msisdn); len += vallen; buf[len++] = IE_AMOUNT; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.recharge.amount); len += 0x04; buf[len++] = IE_RECHARGE_TYPE; buf[len++] = 0x01; buf[len] = ptr->msg.recharge.op_type; len += 0x01; buf[len++] = IE_VALID_DAYS; buf[len++] = 0x02; *(u16*)(&buf[len]) = htons(ptr->msg.recharge.valid_days); len += 0x02; return len; } int encode_rest_recharge_res(_rest_msg_s *ptr, u8 *buf) { int len=0/*, vallen=0*/; ENCODE_HEADER(); // IE_RESULT buf[len++] = IE_RESULT; buf[len++] = 0x01; buf[len++] = ptr->msg.recharge_res.result; if(ptr->msg.recharge_res.result == RES_FAILED) { buf[len++] = IE_ERROR_CODE; buf[len++] = 0x01; buf[len++] = ptr->msg.recharge_res.error_code; return len; } // // IE_STATUS buf[len++] = IE_STATUS; buf[len++] = 0x01; buf[len] = ptr->msg.recharge_res.status; len += 0x01; // // IE_BALANCE buf[len++] = IE_BALANCE; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.recharge_res.balance); len += 0x04; // // IE_EXPIRY_TIME buf[len++] = IE_EXPIRY_TIME; buf[len++] = 0x08; _encode_u64(buf, &len, ptr->msg.recharge_res.expiredTime); // return len; } int encode_rest_transfer(_rest_msg_s *ptr, u8 *buf) { int len=0, vallen=0; ENCODE_HEADER(); buf[len++] = IE_MSISDN_TRANS_OUT; vallen = strlen(ptr->msg.transfer.transferOutMsisdn); buf[len++] = vallen; strcpy((char*)( &buf[len] ), ptr->msg.transfer.transferOutMsisdn); len += vallen; buf[len++] = IE_MSISDN_TRANS_IN; vallen = strlen(ptr->msg.transfer.transferInMsisdn); buf[len++] = vallen; strcpy((char*)( &buf[len] ), ptr->msg.transfer.transferInMsisdn); len += vallen; buf[len++] = IE_AMOUNT; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.transfer.amount); len += 0x04; return len; } int encode_rest_transfer_res(_rest_msg_s *ptr, u8 *buf) { int len=0/*, vallen=0*/; ENCODE_HEADER(); // IE_RESULT buf[len++] = IE_RESULT; buf[len++] = 0x01; buf[len++] = ptr->msg.transfer_res.result; if(ptr->msg.transfer_res.result == RES_FAILED) { buf[len++] = IE_ERROR_CODE; buf[len++] = 0x01; buf[len++] = ptr->msg.transfer_res.error_code; } // buf[len++] = IE_AMOUNT; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.transfer_res.balance); len += 0x04; return len; } int encode_rest_recharge_card(_rest_msg_s *ptr, u8 *buf) { int len=0, vallen=0; ENCODE_HEADER(); buf[len++] = IE_MSISDN; vallen = strlen(ptr->msg.recharge_card.msisdn); buf[len++] = vallen; strcpy((char*)( &buf[len] ), ptr->msg.recharge_card.msisdn); len += vallen; buf[len++] = IE_PASSWORD; vallen = strlen(ptr->msg.recharge_card.cardPwd); buf[len++] = vallen; strcpy((char*)( &buf[len] ), ptr->msg.recharge_card.cardPwd); len += vallen; return len; } int encode_rest_recharge_card_res(_rest_msg_s *ptr, u8 *buf) { int len=0/*, vallen=0*/; ENCODE_HEADER(); // IE_RESULT buf[len++] = IE_RESULT; buf[len++] = 0x01; buf[len++] = ptr->msg.recharge_card_res.result; if(ptr->msg.recharge_card_res.result == RES_FAILED) { buf[len++] = IE_ERROR_CODE; buf[len++] = 0x01; buf[len++] = ptr->msg.recharge_card_res.error_code; return len; } // buf[len++] = IE_RECHARGE_AMOUNT; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.recharge_card_res.rechargeAmount); len += 0x04; // IE_BALANCE buf[len++] = IE_BALANCE; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.recharge_card_res.balance); len += 0x04; // // IE_EXPIRY_TIME buf[len++] = IE_EXPIRY_TIME; buf[len++] = 0x08; _encode_u64(buf, &len, ptr->msg.recharge_card_res.expiredTime); // return len; } int encode_rest_query_recharge_card(_rest_msg_s *ptr, u8 *buf) { int len=0, vallen=0; ENCODE_HEADER(); buf[len++] = IE_PASSWORD; vallen = strlen(ptr->msg.query_recharge_card.cardPwd); buf[len++] = vallen; strcpy((char*)( &buf[len] ), ptr->msg.query_recharge_card.cardPwd); len += vallen; return len; } int encode_rest_query_recharge_card_res(_rest_msg_s *ptr, u8 *buf) { int len=0/*, vallen=0*/; ENCODE_HEADER(); // IE_RESULT buf[len++] = IE_RESULT; buf[len++] = 0x01; buf[len++] = ptr->msg.query_recharge_card_res.result; if(ptr->msg.query_recharge_card_res.result == RES_FAILED) { buf[len++] = IE_ERROR_CODE; buf[len++] = 0x01; buf[len++] = ptr->msg.query_recharge_card_res.error_code; return len; } // buf[len++] = IE_RECHARGE_CARD_STATUS; buf[len++] = 0x04; buf[len] = ptr->msg.query_recharge_card_res.status; len += 0x01; // IE_BALANCE buf[len++] = IE_RECHARGE_CARD_FACE_VALUE; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.query_recharge_card_res.face_value); len += 0x04; // // IE_EXPIRY_TIME buf[len++] = IE_RECHARGE_CARD_EXPIRED_TS; buf[len++] = 0x08; _encode_u64(buf, &len, ptr->msg.query_recharge_card_res.expiredTime); // return len; } int encode_rest_update_recharge_card(_rest_msg_s *ptr, u8 *buf) { int len=0, vallen=0; ENCODE_HEADER(); buf[len++] = IE_PASSWORD; vallen = strlen(ptr->msg.update_recharge_card.cardPwd); buf[len++] = vallen; strcpy((char*)( &buf[len] ), ptr->msg.update_recharge_card.cardPwd); len += vallen; buf[len++] = IE_RECHARGE_CARD_STATUS; buf[len++] = 0x04; buf[len] = ptr->msg.update_recharge_card.status; len += 0x01; // IE_EXPIRY_TIME buf[len++] = IE_RECHARGE_CARD_UPDATED_TS; buf[len++] = 0x08; _encode_u64(buf, &len, ptr->msg.update_recharge_card.updatedTime); // buf[len++] = IE_MSISDN; vallen = strlen(ptr->msg.update_recharge_card.msisdn); buf[len++] = vallen; strcpy((char*)( &buf[len] ), ptr->msg.update_recharge_card.msisdn); len += vallen; return len; } int encode_rest_update_recharge_card_res(_rest_msg_s *ptr, u8 *buf) { int len=0/*, vallen=0*/; ENCODE_HEADER(); // IE_RESULT buf[len++] = IE_RESULT; buf[len++] = 0x01; buf[len++] = ptr->msg.query_recharge_card_res.result; if(ptr->msg.query_recharge_card_res.result == RES_FAILED) { buf[len++] = IE_ERROR_CODE; buf[len++] = 0x01; buf[len++] = ptr->msg.query_recharge_card_res.error_code; } // return len; } int encode_rest_check_balance(_rest_msg_s *ptr, u8 *buf) { int len=0, vallen=0; ENCODE_HEADER(); buf[len++] = IE_MSISDN; vallen = strlen(ptr->msg.check_balance.msisdn); buf[len++] = vallen; strcpy((char*)( &buf[len] ), ptr->msg.check_balance.msisdn); len += vallen; buf[len++] = IE_AMOUNT; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.check_balance.amount); len += 0x04; return len; } int encode_rest_check_balance_res(_rest_msg_s *ptr, u8 *buf) { int len=0/*, vallen=0*/; ENCODE_HEADER(); // IE_RESULT buf[len++] = IE_RESULT; buf[len++] = 0x01; buf[len++] = ptr->msg.check_balance_res.result; if(ptr->msg.check_balance_res.result == RES_FAILED) { buf[len++] = IE_ERROR_CODE; buf[len++] = 0x01; buf[len++] = ptr->msg.check_balance_res.error_code; return len; } // // IE_BALANCE_AVAILABLE buf[len++] = IE_BALANCE_AVAILABLE; buf[len++] = 0x01; buf[len++] = ptr->msg.check_balance_res.available; // return len; } int encode_rest_query_balance(_rest_msg_s *ptr, u8 *buf) { int len=0, vallen=0; ENCODE_HEADER(); buf[len++] = IE_MSISDN; vallen = strlen(ptr->msg.query_balance.msisdn); buf[len++] = vallen; strcpy((char*)( &buf[len] ), ptr->msg.query_balance.msisdn); len += vallen; return len; } int encode_rest_query_balance_res(_rest_msg_s *ptr, u8 *buf) { int len=0/*, vallen=0*/; ENCODE_HEADER(); // IE_RESULT buf[len++] = IE_RESULT; buf[len++] = 0x01; buf[len++] = ptr->msg.query_balance_res.result; if(ptr->msg.query_balance_res.result == RES_FAILED) { buf[len++] = IE_ERROR_CODE; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.query_balance_res.error_code); len += 0x04; return len; } // // IE_STATUS buf[len++] = IE_STATUS; buf[len++] = 0x01; buf[len] = ptr->msg.query_balance_res.status; len += 0x01; // IE_BALANCE buf[len++] = IE_BALANCE; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.query_balance_res.balance); len += 0x04; // // IE_BALANCE buf[len++] = IE_MO_EXPIRY; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.query_balance_res.mo_expiry); len += 0x04; // return len; } int encode_rest_payment(_rest_msg_s *ptr, u8 *buf) { int len=0, vallen=0; ENCODE_HEADER(); buf[len++] = IE_MSISDN; vallen = strlen(ptr->msg.payment.msisdn); buf[len++] = vallen; strcpy((char*)( &buf[len] ), ptr->msg.payment.msisdn); len += vallen; buf[len++] = IE_AMOUNT; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.payment.amount); len += 0x04; return len; } int encode_rest_payment_res(_rest_msg_s *ptr, u8 *buf) { int len=0/*, vallen=0*/; ENCODE_HEADER(); // IE_RESULT buf[len++] = IE_RESULT; buf[len++] = 0x01; buf[len++] = ptr->msg.recharge_res.result; if(ptr->msg.recharge_res.result == RES_FAILED) { buf[len++] = IE_ERROR_CODE; buf[len++] = 0x01; buf[len++] = ptr->msg.recharge_res.error_code; return len; } // // IE_BALANCE buf[len++] = IE_BALANCE; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.recharge_res.balance); len += 0x04; // // IE_EXPIRY_TIME buf[len++] = IE_EXPIRY_TIME; buf[len++] = 0x08; _encode_u64(buf, &len, ptr->msg.recharge_res.expiredTime); // return len; } int encode_rest_sms_deliver(_rest_msg_s *ptr, u8 *buf) { int len=0, vallen=0; if(ptr == NULL || buf == NULL) return 0; ENCODE_HEADER(); buf[len++] = IE_MSISDN; vallen = strlen(ptr->msg.sms_deliver.msisdn); buf[len++] = vallen; strcpy((char*)( &buf[len] ), ptr->msg.sms_deliver.msisdn); len += vallen; buf[len++] = IE_SMS_CONTENT; vallen = strlen(ptr->msg.sms_deliver.sms_content); buf[len++] = vallen>>8; buf[len++] = vallen & 0xff; strcpy((char*)( &buf[len] ), ptr->msg.sms_deliver.sms_content); len += vallen; return len; } int encode_rest_sms_deliver_res(_rest_msg_s *ptr, u8 *buf) { int len=0/*, vallen=0*/; ENCODE_HEADER(); // IE_RESULT buf[len++] = IE_RESULT; buf[len++] = 0x01; buf[len++] = ptr->msg.sms_deliver_res.result; buf[len++] = IE_ERROR_CODE; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.sms_deliver_res.error_code); len += 0x04; return len; } int encode_rest_create_account(_rest_msg_s *ptr, u8 *buf) { int len=0, vallen=0; if(ptr == NULL || buf == NULL) return 0; ENCODE_HEADER(); buf[len++] = IE_MSISDN; vallen = strlen(ptr->msg.create_acct.msisdn); buf[len++] = vallen; strcpy((char*)( &buf[len] ), ptr->msg.create_acct.msisdn); len += vallen; buf[len++] = IE_CUSTOMER_ID; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.create_acct.customer_id); len += 0x04; buf[len++] = IE_ACCOUNT_ID; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.create_acct.account_id); len += 0x04; buf[len++] = IE_PRODUCT_ID; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.create_acct.product_id); len += 0x04; buf[len++] = IE_PLAN_ID; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.create_acct.plan_id); len += 0x04; buf[len++] = IE_BALANCE; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.create_acct.balance); len += 0x04; buf[len++] = IE_EXPIRY_TIME; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.create_acct.expiry_date); len += 0x04; buf[len++] = IE_RENT_CHARGE; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.create_acct.rent_charge); len += 0x04; buf[len++] = IE_BIRTHDAY; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.create_acct.birthday); len += 0x04; buf[len++] = IE_CUG_ID; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.create_acct.cug_id); len += 0x04; buf[len++] = IE_USER_CLASS; buf[len++] = 0x01; buf[len] = ptr->msg.create_acct.user_class; len += 0x01; return len; } int encode_rest_create_account_res(_rest_msg_s *ptr, u8 *buf) { int len=0/*, vallen=0*/; ENCODE_HEADER(); // IE_RESULT buf[len++] = IE_RESULT; buf[len++] = 0x01; buf[len++] = ptr->msg.create_acct_res.result; buf[len++] = IE_ERROR_CODE; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.create_acct_res.error_code); len += 0x04; return len; } int encode_rest_query_tariff(_rest_msg_s *ptr, u8 *buf) { int len=0, vallen=0; if(ptr == NULL || buf == NULL) return 0; ENCODE_HEADER(); buf[len++] = IE_MSISDN; vallen = strlen(ptr->msg.query_tariff.msisdn); buf[len++] = vallen; strcpy((char *)&buf[len], ptr->msg.query_tariff.msisdn); len += vallen; buf[len++] = IE_SERVICE_TYPE; vallen = 1; buf[len++] = vallen; buf[len]= ptr->msg.query_tariff.service_type; len += vallen; buf[len++] = IE_TARIIFF_PREFIX; vallen = strlen(ptr->msg.query_tariff.called_number); buf[len++] = vallen; strcpy((char *)&buf[len], ptr->msg.query_tariff.called_number); len += vallen; return len; } int encode_rest_query_tariff_res(_rest_msg_s *ptr, u8 *buf) { int len= 0, vallen=0; ENCODE_HEADER(); // IE_RESULT buf[len++] = IE_RESULT; buf[len++] = 0x01; buf[len++] = ptr->msg.query_tariff_res.result; if(ptr->msg.query_tariff_res.result == RES_FAILED) { buf[len++] = IE_ERROR_CODE; buf[len++] = 0x01; buf[len++] = ptr->msg.query_tariff_res.error_code; return len; } buf[len++] = IE_TARIIFF_PREFIX; vallen = strlen(ptr->msg.query_tariff_res.prefix); buf[len++] = vallen; strcpy((char *)&buf[len], ptr->msg.query_tariff_res.prefix); len += vallen; buf[len++] = IE_TARIFF_UNIT; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.query_tariff_res.unit_time); len += 0x04; buf[len++] = IE_TARIFF_CHARGE; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.query_tariff_res.unit_charge); len += 0x04; buf[len++] = IE_TARIFF_DISCOUNT; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.query_tariff_res.discount); len += 0x04; buf[len++] = IE_PLAN_ID; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.query_tariff_res.plan_id); len += 0x04; buf[len++] = IE_PLAN_VALUE; buf[len++] = 0x08; _encode_u64(buf, &len, ptr->msg.query_tariff_res.total_plan_value); buf[len++] = IE_PLAN_USED_VALUE; buf[len++] = 0x08; _encode_u64(buf, &len, ptr->msg.query_tariff_res.used_plan_value); buf[len++] = IE_BUNDLE_ID; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.query_tariff_res.bundle_plan_id); len += 0x04; return len; } int encode_rest_update_subs(_rest_msg_s *ptr, u8 *buf) { int len=0, vallen=0; if(ptr == NULL || buf == NULL) return 0; ENCODE_HEADER(); buf[len++] = IE_MSISDN; vallen = strlen(ptr->msg.update_subs.msisdn); buf[len++] = vallen; strcpy((char *)&buf[len], ptr->msg.update_subs.msisdn); len += vallen; { buf[len++] = IE_ACCOUNT_ID; vallen = 4; buf[len++] = vallen; *(u32*)(&buf[len]) = htonl(ptr->msg.update_subs.account_id); len += vallen; } if((ptr->msg.update_subs.optional_flag & 0x01) == 0x01) { buf[len++] = IE_STATUS; vallen = 1; buf[len++] = vallen; buf[len]= ptr->msg.update_subs.status; len += vallen; } if((ptr->msg.update_subs.optional_flag & 0x02) == 0x02) { buf[len++] = IE_BALANCE; vallen = 4; buf[len++] = vallen; *(u32*)(&buf[len]) = htonl(ptr->msg.update_subs.balance); len += vallen; } if((ptr->msg.update_subs.optional_flag & 0x04) == 0x04) { buf[len++] = IE_EXPIRY_TIME; vallen = 4; buf[len++] = vallen; *(u32*)(&buf[len]) = htonl(ptr->msg.update_subs.balance_expiry_date); len += vallen; } if((ptr->msg.update_subs.optional_flag & 0x08) == 0x08) { buf[len++] = IE_PLAN_ID; vallen = 4; buf[len++] = vallen; *(u32*)(&buf[len]) = htonl(ptr->msg.update_subs.basic_plan_id); len += vallen; } if((ptr->msg.update_subs.optional_flag & 0x10) == 0x10) { buf[len++] = IE_RENT_CHARGE; vallen = 4; buf[len++] = vallen; *(u32*)(&buf[len]) = htonl(ptr->msg.update_subs.basic_plan_rent); len += vallen; } if((ptr->msg.update_subs.optional_flag & 0x20) == 0x20) { buf[len++] = IE_VAS_CUG_STATUS; vallen = 1; buf[len++] = vallen; buf[len]= ptr->msg.update_subs.vas_cug_status; len += vallen; } return len; } int encode_rest_update_subs_res(_rest_msg_s *ptr, u8 *buf) { int len= 0;//, vallen=0; ENCODE_HEADER(); // IE_RESULT buf[len++] = IE_RESULT; buf[len++] = 0x01; buf[len++] = ptr->msg.update_subs_res.result; buf[len++] = IE_ERROR_CODE; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.update_subs_res.error_code); len += 0x04; return len; } int encode_rest_delete_subs(_rest_msg_s *ptr, u8 *buf) { int len=0, vallen=0; if(ptr == NULL || buf == NULL) return 0; ENCODE_HEADER(); buf[len++] = IE_MSISDN; vallen = strlen(ptr->msg.delete_subs.msisdn); buf[len++] = vallen; strcpy((char *)&buf[len], ptr->msg.delete_subs.msisdn); len += vallen; buf[len++] = IE_CAUSE; vallen = 1; buf[len++] = vallen; buf[len]= ptr->msg.delete_subs.cause; len += vallen; return len; } int encode_rest_delete_subs_res(_rest_msg_s *ptr, u8 *buf) { int len= 0;//, vallen=0; ENCODE_HEADER(); // IE_RESULT buf[len++] = IE_RESULT; buf[len++] = 0x01; buf[len++] = ptr->msg.delete_subs_res.result; buf[len++] = IE_ERROR_CODE; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.delete_subs_res.error_code); len += 0x04; return len; } int encode_rest_update_sess_info(_rest_msg_s *ptr, u8 *buf) { int len=0, vallen=0; if(ptr == NULL || buf == NULL) return 0; ENCODE_HEADER(); buf[len++] = IE_MSISDN; vallen = strlen(ptr->msg.update_sess_info.msisdn); buf[len++] = vallen; strcpy((char *)&buf[len], ptr->msg.update_sess_info.msisdn); len += vallen; buf[len++] = IE_SESS_FLAG; vallen = 1; buf[len++] = vallen; buf[len]= ptr->msg.update_sess_info.first_sess; len += vallen; buf[len++] = IE_SERVICE_TYPE; vallen = 1; buf[len++] = vallen; buf[len]= ptr->msg.update_sess_info.service_type; len += vallen; buf[len++] = IE_TIMESTAMP; vallen = 4; buf[len++] = vallen; *(u32*)(&buf[len]) = htonl(ptr->msg.update_sess_info.start_time); len += vallen; { buf[len++] = IE_CONSUME_VALUE; vallen = 4; buf[len++] = vallen; *(u32*)(&buf[len]) = htonl(ptr->msg.update_sess_info.consumed_value); len += vallen; } if((ptr->msg.update_sess_info.optional_flag & 0x01) == 0x01) { buf[len++] = IE_CALLED_NUMBER; vallen = strlen(ptr->msg.update_sess_info.called); buf[len++] = vallen; strcpy((char *)&buf[len] ,ptr->msg.update_sess_info.called); len += vallen; } if((ptr->msg.update_sess_info.optional_flag & 0x02) == 0x02) { buf[len++] = IE_UE_IP; vallen = 0x04; buf[len++] = vallen; memcpy(&buf[len], (u8 *)&ptr->msg.update_sess_info.ue_ip, vallen); len += vallen; } if((ptr->msg.update_sess_info.optional_flag & 0x04) == 0x04) { buf[len++] = IE_GW_IP; vallen = 0x04; buf[len++] = vallen; memcpy(&buf[len], (u8 *)&ptr->msg.update_sess_info.gw_ip, vallen); len += vallen; } return len; } int encode_rest_update_plan_info(_rest_msg_s *ptr, u8 *buf) { int len=0, vallen=0; if(ptr == NULL || buf == NULL) return 0; ENCODE_HEADER(); buf[len++] = IE_MSISDN; vallen = strlen(ptr->msg.update_plan_info.msisdn); buf[len++] = vallen; strcpy((char *)&buf[len], ptr->msg.update_plan_info.msisdn); len += vallen; buf[len++] = IE_SERVICE_TYPE; vallen = 1; buf[len++] = vallen; buf[len]= ptr->msg.update_plan_info.service_type; len += vallen; buf[len++] = IE_ACCOUNT_ID; vallen = 0x04; buf[len++] = vallen; *(u32*)(&buf[len]) = htonl(ptr->msg.update_plan_info.account_id); len += vallen; buf[len++] = IE_PLAN_ID; vallen = 0x04; buf[len++] = vallen; *(u32*)(&buf[len]) = htonl(ptr->msg.update_plan_info.plan_id); len += vallen; buf[len++] = IE_BUNDLE_ID; vallen = 0x04; buf[len++] = vallen; *(u32*)(&buf[len]) = htonl(ptr->msg.update_plan_info.bundle_id); len += vallen; buf[len++] = IE_PLAN_VALUE; buf[len++] = 0x08; _encode_u64(buf, &len, ptr->msg.update_plan_info.plan_total_value); buf[len++] = IE_PLAN_USED_VALUE; vallen = 0x08; buf[len++] = vallen; _encode_u64(buf, &len, ptr->msg.update_plan_info.plan_used_value); buf[len++] = IE_SESS_UPDATE_TIME; vallen = 0x04; buf[len++] = vallen; *(u32*)(&buf[len]) = htonl(ptr->msg.update_plan_info.sess_update_times); len += vallen; buf[len++] = IE_PLAN_VALUE_ADD_THIS_TIME; buf[len++] = 0x08; _encode_u64(buf, &len, ptr->msg.update_plan_info.this_time_add_value); return len; } int encode_rest_rent_charge(_rest_msg_s *ptr, u8 *buf) { int len=0, vallen=0; if(ptr == NULL || buf == NULL) return 0; ENCODE_HEADER(); buf[len++] = IE_MSISDN; vallen = strlen(ptr->msg.rent_charge.msisdn); buf[len++] = vallen; strcpy((char *)&buf[len], ptr->msg.rent_charge.msisdn); len += vallen; if((ptr->msg.update_subs.optional_flag & 0x01) == 0x01) { buf[len++] = IE_BALANCE; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.rent_charge.balance); len += 0x04; } if((ptr->msg.update_subs.optional_flag & 0x02) == 0x02) { buf[len++] = IE_RENT_CHARGE; buf[len++] = 0x04; *(u32*)(&buf[len]) = htonl(ptr->msg.rent_charge.rent_charge); len += 0x04; } return len; } int encode_rest(_rest_msg_s *ptr, u8 *buf) { int len = 0; switch(ptr->msg_type) { case REST_SEND_AUTHCODE_REQ: len = encode_rest_send_authcode(ptr, buf); break; case REST_QUERY_USERDATA_REQ: len = encode_rest_query_user_data(ptr, buf); break; case REST_BUNDLE_SUBS_REQ: len = encode_rest_bundle_subs(ptr, buf); break; case REST_BUNDLE_USAGE_REQ: len = encode_rest_bundle_usage(ptr, buf); break; case REST_RECHARGE_REQ: len = encode_rest_recharge(ptr, buf); break; case REST_TRANSFER_REQ: len = encode_rest_transfer(ptr, buf); break; case REST_RECHARGE_CARD_REQ: len = encode_rest_recharge_card(ptr, buf); break; case REST_CHECK_BALANCE_REQ: len = encode_rest_check_balance(ptr, buf); break; case REST_QUERY_BALANCE_REQ: len = encode_rest_query_balance(ptr, buf); break; case REST_QUERY_RECHARGE_CARD_REQ: len = encode_rest_query_recharge_card(ptr, buf); break; case REST_CRM_PAYMENT_REQ: len = encode_rest_payment(ptr, buf); break; case REST_CRM_SMS_DELIVER_REQ: len = encode_rest_sms_deliver(ptr, buf); break; case REST_CRM_CREATE_ACCT_REQ: len = encode_rest_create_account(ptr, buf); break; case REST_CRM_QUERY_TARIFF_REQ: len = encode_rest_query_tariff(ptr, buf); break; case REST_CRM_QUERY_TARIFF_RES: len = encode_rest_query_tariff_res(ptr, buf); break; case REST_CRM_UPDATE_SUBS_REQ: len = encode_rest_update_subs(ptr, buf); break; case REST_CRM_UPDATE_SUBS_RES: encode_rest_update_subs_res(ptr, buf); break; case REST_CRM_DELETE_SUBS_REQ: len = encode_rest_delete_subs(ptr, buf); break; case REST_CRM_DELETE_SUBS_RES: encode_rest_delete_subs_res(ptr, buf); break; case REST_CRM_UPDATE_SESS_INFO_REQ: encode_rest_update_sess_info(ptr, buf); break; case REST_CRM_UPDATE_PLAN_INFO_REQ: encode_rest_update_plan_info(ptr, buf); break; case REST_CRM_RENT_CHARGE: encode_rest_rent_charge(ptr, buf); break; } return len; } static int decode_rest_send_authcode(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_MSISDN: memcpy(ptr->msg.send_authcode.msisdn, &buf[offset], vallen); ptr->msg.send_authcode.msisdn[vallen] = '\0'; break; case IE_MSG_CONTENT: { vallen = vallen * 256 + buf[offset++]; memcpy(ptr->msg.send_authcode.sms_content, &buf[offset], vallen); ptr->msg.send_authcode.sms_content[vallen] = '\0'; } break; default: break; } offset += vallen; } return retval; } static int decode_rest_send_authcoderesp(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_RESULT: ptr->msg.send_authcode_res.result = buf[offset]; break; case IE_ERROR_CODE: ptr->msg.send_authcode_res.error_code = ntohl( *(u32*)(&buf[offset]) ); break; default: break; } offset += vallen; } return retval; } static int decode_rest_query_user_data(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_MSISDN: memcpy(ptr->msg.query_user_data.msisdn, &buf[offset], vallen); ptr->msg.query_user_data.msisdn[vallen] = '\0'; break; default: break; } offset += vallen; } return retval; } static int decode_rest_query_user_data_res(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_RESULT: ptr->msg.query_user_data_res.result = buf[offset]; break; case IE_ERROR_CODE: ptr->msg.query_user_data_res.error_code = ntohl( *(u32*)(&buf[offset]) ); break; case IE_MSISDN: memcpy(ptr->msg.query_user_data_res.msisdn, &buf[offset], vallen); ptr->msg.query_user_data_res.msisdn[vallen] = '\0'; break; case IE_REMARK: memcpy(ptr->msg.query_user_data_res.remark, &buf[offset], vallen); ptr->msg.query_user_data_res.remark[vallen] = '\0'; break; case IE_GROUP_NAME: memcpy(ptr->msg.query_user_data_res.usrGrpName, &buf[offset], vallen); ptr->msg.query_user_data_res.usrGrpName[vallen] = '\0'; break; case IE_STATUS: ptr->msg.query_user_data_res.status = buf[offset]; break; case IE_BALANCE: ptr->msg.query_user_data_res.balance = ntohl( *(u32*)(&buf[offset]) ); break; case IE_EXPIRY_TIME: ptr->msg.query_user_data_res.mo_expiry = _decode_u64(&buf[offset]); break; case IE_REMAIN_MO_VOICE_MIN: ptr->msg.query_user_data_res.remain_mo_voc_min = ntohl( *(u32*)(&buf[offset]) ); break; break; case IE_REMAIN_MT_VOICE_MIN: ptr->msg.query_user_data_res.remain_mt_voc_min = ntohl( *(u32*)(&buf[offset]) ); break; case IE_REMAIN_SMS_NUM: ptr->msg.query_user_data_res.remain_sms_num = ntohl( *(u32*)(&buf[offset]) ); break; case IE_REMAIN_DATA_VOL_MB: ptr->msg.query_user_data_res.remain_data_vol = ntohl( *(u32*)(&buf[offset]) ); break; default: break; } offset += vallen; } return retval; } static int decode_rest_bundle_subs(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_MSISDN: memcpy(ptr->msg.bundle_subs.msisdn, &buf[offset], vallen); ptr->msg.bundle_subs.msisdn[vallen] = '\0'; break; case IE_PAY_TYPE: ptr->msg.bundle_subs.payType = buf[offset]; break; case IE_AMOUNT: ptr->msg.bundle_subs.charge = ntohl( *(u32*)(&buf[offset]) ); break; case IE_MO_VOICE_MIN: ptr->msg.bundle_subs.moVoiceMinute = ntohl( *(u32*)(&buf[offset]) ); break; case IE_MT_VOICE_MIN: ptr->msg.bundle_subs.mtVoiceMinute = ntohl( *(u32*)(&buf[offset]) ); break; case IE_DATA_VOL_MB: ptr->msg.bundle_subs.dataVolume = ntohl( *(u32*)(&buf[offset]) ); break; case IE_SMS_NUM: ptr->msg.bundle_subs.smsNum = ntohl( *(u32*)(&buf[offset]) ); break; case IE_VALID_DAYS: ptr->msg.bundle_subs.validDays = ntohl( *(u32*)(&buf[offset]) ); break; default: break; } offset += vallen; } return retval; } static int decode_rest_bundle_subs_res(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_RESULT: ptr->msg.bundle_subs_res.result = buf[offset]; break; case IE_ERROR_CODE: ptr->msg.bundle_subs_res.error_code = ntohl( *(u32*)(&buf[offset]) ); break; default: break; } offset += vallen; } return retval; } static int decode_rest_bundle_usage(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_MSISDN: memcpy(ptr->msg.bundle_usage.msisdn, &buf[offset], vallen); ptr->msg.bundle_usage.msisdn[vallen] = '\0'; break; default: break; } offset += vallen; } return retval; } static int decode_rest_bundle_usage_res(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_RESULT: ptr->msg.bundle_usage_res.result = buf[offset]; break; case IE_ERROR_CODE: ptr->msg.bundle_usage_res.error_code = ntohl( *(u32*)(&buf[offset]) ); break; case IE_REMAIN_MO_VOICE_SEC: ptr->msg.bundle_usage_res.moVoiceInSec = ntohl( *(u32*)(&buf[offset]) ); break; case IE_REMAIN_MT_VOICE_SEC: ptr->msg.bundle_usage_res.mtVoiceInSec = ntohl( *(u32*)(&buf[offset]) ); break; case IE_REMAIN_SMS_NUM: ptr->msg.bundle_usage_res.smsNum = ntohl( *(u32*)(&buf[offset]) ); break; case IE_REMAIN_DATA_VOL_KB: ptr->msg.bundle_usage_res.dataVolInKB = ntohl( *(u32*)(&buf[offset]) ); break; case IE_EXPIRY_TIME: ptr->msg.bundle_usage_res.expiredTime = _decode_u64(&buf[offset]); break; default: break; } offset += vallen; } return retval; } static int decode_rest_recharge(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_MSISDN: memcpy(ptr->msg.recharge.msisdn, &buf[offset], vallen); ptr->msg.recharge.msisdn[vallen] = '\0'; break; case IE_AMOUNT: ptr->msg.recharge.amount = ntohl( *(u32*)(&buf[offset]) ); break; case IE_RECHARGE_TYPE: ptr->msg.recharge.op_type = buf[offset]; break; case IE_VALID_DAYS: ptr->msg.recharge.valid_days = ntohs( *(u16*)(&buf[offset]) ); break; default: break; } offset += vallen; } return retval; } static int decode_rest_recharge_res(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_RESULT: ptr->msg.recharge_res.result = buf[offset]; break; case IE_ERROR_CODE: ptr->msg.recharge_res.error_code = ntohl( *(u32*)(&buf[offset]) ); break; case IE_STATUS: ptr->msg.recharge_res.status = buf[offset]; break; case IE_BALANCE: ptr->msg.recharge_res.balance = ntohl( *(u32*)(&buf[offset]) ); break; case IE_EXPIRY_TIME: ptr->msg.recharge_res.expiredTime = _decode_u64(&buf[offset]); break; default: break; } offset += vallen; } return retval; } static int decode_rest_transfer(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_MSISDN_TRANS_OUT: memcpy(ptr->msg.transfer.transferOutMsisdn, &buf[offset], vallen); ptr->msg.transfer.transferOutMsisdn[vallen] = '\0'; break; case IE_MSISDN_TRANS_IN: memcpy(ptr->msg.transfer.transferInMsisdn, &buf[offset], vallen); ptr->msg.transfer.transferInMsisdn[vallen] = '\0'; break; case IE_AMOUNT: ptr->msg.transfer.amount = ntohl( *(u32*)(&buf[offset]) ); break; default: break; } offset += vallen; } return retval; } static int decode_rest_transfer_res(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_RESULT: ptr->msg.transfer_res.result = buf[offset]; break; case IE_ERROR_CODE: ptr->msg.transfer_res.error_code = ntohl( *(u32*)(&buf[offset]) ); break; case IE_AMOUNT: ptr->msg.transfer_res.balance = ntohl( *(u32*)(&buf[offset]) ); break; default: break; } offset += vallen; } return retval; } static int decode_rest_recharge_card(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_MSISDN: memcpy(ptr->msg.recharge_card.msisdn, &buf[offset], vallen); ptr->msg.recharge_card.msisdn[vallen] = '\0'; break; case IE_PASSWORD: { memcpy(ptr->msg.recharge_card.cardPwd, &buf[offset], vallen); ptr->msg.recharge_card.cardPwd[vallen] = '\0'; } break; default: break; } offset += vallen; } return retval; } static int decode_rest_recharge_card_res(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_RESULT: ptr->msg.recharge_card_res.result = buf[offset]; break; case IE_ERROR_CODE: ptr->msg.recharge_card_res.error_code = ntohl( *(u32*)(&buf[offset]) ); break; case IE_RECHARGE_AMOUNT: ptr->msg.recharge_card_res.rechargeAmount = ntohl( *(u32*)(&buf[offset]) ); break; case IE_BALANCE: ptr->msg.recharge_card_res.balance = ntohl( *(u32*)(&buf[offset]) ); break; case IE_EXPIRY_TIME: ptr->msg.recharge_card_res.expiredTime = _decode_u64(&buf[offset]); break; default: break; } offset += vallen; } return retval; } static int decode_rest_query_recharge_card(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_PASSWORD: { memcpy(ptr->msg.query_recharge_card.cardPwd, &buf[offset], vallen); ptr->msg.recharge_card.cardPwd[vallen] = '\0'; } break; default: break; } offset += vallen; } return retval; } static int decode_rest_query_recharge_card_res(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_RESULT: ptr->msg.query_recharge_card_res.result = buf[offset]; break; case IE_ERROR_CODE: ptr->msg.query_recharge_card_res.error_code = ntohl( *(u32*)(&buf[offset]) ); break; case IE_RECHARGE_CARD_STATUS: ptr->msg.query_recharge_card_res.status = ntohl( *(u32*)(&buf[offset]) ); break; case IE_RECHARGE_CARD_FACE_VALUE: ptr->msg.query_recharge_card_res.face_value = ntohl( *(u32*)(&buf[offset]) ); break; case IE_RECHARGE_CARD_EXPIRED_TS: ptr->msg.query_recharge_card_res.expiredTime = _decode_u64(&buf[offset]); break; default: break; } offset += vallen; } return retval; } static int decode_rest_update_recharge_card(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_PASSWORD: { memcpy(ptr->msg.update_recharge_card.cardPwd, &buf[offset], vallen); ptr->msg.recharge_card.cardPwd[vallen] = '\0'; } break; case IE_RECHARGE_CARD_STATUS: ptr->msg.update_recharge_card.status = buf[offset]; break; case IE_RECHARGE_CARD_UPDATED_TS: ptr->msg.update_recharge_card.updatedTime = _decode_u64(&buf[offset]); break; case IE_MSISDN: memcpy(ptr->msg.update_recharge_card.msisdn, &buf[offset], vallen); ptr->msg.update_recharge_card.msisdn[vallen] = '\0'; break; default: break; } offset += vallen; } return retval; } static int decode_rest_update_recharge_card_res(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_RESULT: ptr->msg.update_recharge_card_res.result = buf[offset]; break; case IE_ERROR_CODE: ptr->msg.update_recharge_card_res.error_code = ntohl( *(u32*)(&buf[offset]) ); break; default: break; } offset += vallen; } return retval; } /* static int decode_rest_recharge_card(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_PASSWORD: { memcpy(ptr->msg.query_recharge_card.cardPwd, &buf[offset], vallen); ptr->msg.recharge_card.cardPwd[vallen] = '\0'; } break; default: break; } offset += vallen; } return retval; } */ /* static int decode_rest_query_recharge_card_res(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_RESULT: ptr->msg.query_recharge_card_res.result = buf[offset]; break; case IE_ERROR_CODE: ptr->msg.query_recharge_card_res.error_code = ntohl( *(u32*)(&buf[offset]) ); break; case IE_RECHARGE_CARD_STATUS: ptr->msg.query_recharge_card_res.staus = ntohl( *(u32*)(&buf[offset]) ); break; case IE_RECHARGE_CARD_FACE_VALUE: ptr->msg.query_recharge_card_res.face_value = ntohl( *(u32*)(&buf[offset]) ); break; case IE_RECHARGE_CARD_EXPIRED_TS: ptr->msg.query_recharge_card_res.expiredTime = _decode_u64(&buf[offset]); break; default: break; } offset += vallen; } return retval; } */ static int decode_rest_check_balance(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_MSISDN: memcpy(ptr->msg.check_balance.msisdn, &buf[offset], vallen); ptr->msg.check_balance.msisdn[vallen] = '\0'; break; case IE_AMOUNT: ptr->msg.check_balance.amount = ntohl( *(u32*)(&buf[offset]) ); break; default: break; } offset += vallen; } return retval; } static int decode_rest_check_balance_res(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_RESULT: ptr->msg.check_balance_res.result = buf[offset]; break; case IE_ERROR_CODE: ptr->msg.check_balance_res.error_code = ntohl( *(u32*)(&buf[offset]) ); break; case IE_BALANCE_AVAILABLE: ptr->msg.check_balance_res.available = buf[offset]; break; default: break; } offset += vallen; } return retval; } static int decode_rest_query_balance(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_MSISDN: memcpy(ptr->msg.query_balance.msisdn, &buf[offset], vallen); ptr->msg.query_balance.msisdn[vallen] = '\0'; break; default: break; } offset += vallen; } return retval; } static int decode_rest_query_balance_res(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; ptr->msg.query_balance_res.error_code = 2001; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_RESULT: ptr->msg.query_balance_res.result = buf[offset]; break; case IE_ERROR_CODE: ptr->msg.query_balance_res.error_code = ntohl( *(u32*)(&buf[offset]) ); break; case IE_STATUS: ptr->msg.query_balance_res.status = buf[offset]; break; case IE_BALANCE: ptr->msg.query_balance_res.balance = ntohl( *(u32*)(&buf[offset]) ); break; case IE_MO_EXPIRY: ptr->msg.query_balance_res.mo_expiry = ntohl( *(u32*)(&buf[offset]) ); break; default: break; } offset += vallen; } return retval; } static int decode_rest_payment_res(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_RESULT: ptr->msg.payment_res.result = buf[offset]; break; case IE_ERROR_CODE: ptr->msg.payment_res.error_code = ntohl( *(u32*)(&buf[offset]) ); break; case IE_BALANCE: ptr->msg.payment_res.balance = ntohl( *(u32*)(&buf[offset]) ); break; case IE_EXPIRY_TIME: ptr->msg.payment_res.expiredTime = _decode_u64(&buf[offset]); break; default: break; } offset += vallen; } return retval; } static int decode_rest_sms_deliver(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_MSISDN: memcpy(ptr->msg.sms_deliver.msisdn, &buf[offset], vallen); ptr->msg.sms_deliver.msisdn[vallen] = '\0'; break; case IE_SMS_CONTENT: vallen = vallen * 256 + buf[offset++]; ptr->msg.sms_deliver.sms_len = vallen; memcpy(ptr->msg.sms_deliver.sms_content, &buf[offset], vallen); ptr->msg.sms_deliver.sms_content[vallen] = '\0'; break; default: break; } offset += vallen; } return retval; } static int decode_rest_sms_deliver_res(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_RESULT: ptr->msg.sms_deliver_res.result = buf[offset]; break; case IE_ERROR_CODE: ptr->msg.sms_deliver_res.error_code = ntohl( *(u32*)(&buf[offset]) ); break; default: break; } offset += vallen; } return retval; } static int decode_rest_create_account(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_MSISDN: memcpy(ptr->msg.create_acct.msisdn, &buf[offset], vallen); ptr->msg.create_acct.msisdn[vallen] = '\0'; break; case IE_CUSTOMER_ID: ptr->msg.create_acct.customer_id = ntohl( *(u32*)(&buf[offset]) ); break; case IE_ACCOUNT_ID: ptr->msg.create_acct.account_id = ntohl( *(u32*)(&buf[offset]) ); break; case IE_PRODUCT_ID: ptr->msg.create_acct.customer_id = ntohl( *(u32*)(&buf[offset]) ); break; case IE_PLAN_ID: ptr->msg.create_acct.plan_id = ntohl( *(u32*)(&buf[offset]) ); break; case IE_BALANCE: ptr->msg.create_acct.balance= ntohl( *(u32*)(&buf[offset]) ); break; case IE_EXPIRY_TIME: ptr->msg.create_acct.expiry_date = ntohl( *(u32*)(&buf[offset]) ); break; case IE_RENT_CHARGE: ptr->msg.create_acct.rent_charge = ntohl( *(u32*)(&buf[offset]) ); break; case IE_BIRTHDAY: ptr->msg.create_acct.birthday = ntohl( *(u32*)(&buf[offset]) ); break; case IE_CUG_ID: ptr->msg.create_acct.cug_id = ntohl( *(u32*)(&buf[offset]) ); break; case IE_USER_CLASS: ptr->msg.create_acct.user_class = buf[offset]; break; default: break; } offset += vallen; } return retval; } static int decode_rest_create_account_res(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_RESULT: ptr->msg.create_acct_res.result = buf[offset]; break; case IE_ERROR_CODE: ptr->msg.create_acct_res.error_code = ntohl( *(u32*)(&buf[offset]) ); break; default: break; } offset += vallen; } return retval; } static int decode_rest_query_tariff(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_SERVICE_TYPE: ptr->msg.query_tariff.service_type = buf[offset]; break; case IE_MSISDN: strcpy(ptr->msg.query_tariff.msisdn, (char *)&buf[offset]); ptr->msg.query_tariff.msisdn[vallen] = 0; break; case IE_TARIIFF_PREFIX: strcpy(ptr->msg.query_tariff.called_number, (char *)&buf[offset]); ptr->msg.query_tariff.called_number[vallen] = 0; break; default: break; } offset += vallen; } return retval; } static int decode_rest_query_tariff_res(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_RESULT: ptr->msg.query_tariff_res.result = buf[offset]; break; case IE_ERROR_CODE: ptr->msg.query_tariff_res.error_code = ntohl( *(u32*)(&buf[offset]) ); break; case IE_TARIIFF_PREFIX: strcpy(ptr->msg.query_tariff_res.prefix, (char *)&buf[offset]); break; case IE_TARIFF_UNIT: ptr->msg.query_tariff_res.unit_time = ntohl( *(u32*)(&buf[offset]) ); break; case IE_TARIFF_CHARGE: ptr->msg.query_tariff_res.unit_charge = ntohl( *(u32*)(&buf[offset]) ); break; case IE_TARIFF_DISCOUNT: ptr->msg.query_tariff_res.discount = ntohl( *(u32*)(&buf[offset]) ); break; case IE_PLAN_ID: ptr->msg.query_tariff_res.plan_id = ntohl( *(u32*)(&buf[offset]) ); break; case IE_PLAN_VALUE: ptr->msg.query_tariff_res.total_plan_value = _decode_u64(&buf[offset] ); break; case IE_PLAN_USED_VALUE: ptr->msg.query_tariff_res.used_plan_value = _decode_u64(&buf[offset] ); break; case IE_BUNDLE_ID: ptr->msg.query_tariff_res.bundle_plan_id = ntohl( *(u32*)(&buf[offset]) ); break; default: break; } offset += vallen; } return retval; } static int decode_rest_update_subs(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; ptr->msg.update_subs.optional_flag = 0x00; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_MSISDN: strcpy(ptr->msg.update_subs.msisdn, (char *)&buf[offset]); ptr->msg.update_subs.msisdn[vallen] = 0; break; case IE_ACCOUNT_ID: ptr->msg.update_subs.account_id = ntohl( *(u32*)(&buf[offset]) ); break; case IE_STATUS: ptr->msg.update_subs.status = buf[offset]; ptr->msg.update_subs.optional_flag |= 0x01; break; case IE_BALANCE: ptr->msg.update_subs.balance = ntohl( *(u32*)(&buf[offset]) ); ptr->msg.update_subs.optional_flag |= 0x02; break; case IE_EXPIRY_TIME: ptr->msg.update_subs.balance_expiry_date = ntohl( *(u32*)(&buf[offset]) ); ptr->msg.update_subs.optional_flag |= 0x04; break; case IE_PLAN_ID: ptr->msg.update_subs.basic_plan_id = ntohl( *(u32*)(&buf[offset]) ); ptr->msg.update_subs.optional_flag |= 0x08; break; case IE_RENT_CHARGE: ptr->msg.update_subs.basic_plan_rent = ntohl( *(u32*)(&buf[offset]) ); ptr->msg.update_subs.optional_flag |= 0x10; break; case IE_VAS_CUG_STATUS: ptr->msg.update_subs.vas_cug_status = buf[offset]; ptr->msg.update_subs.optional_flag |= 0x20; break; default: break; } offset += vallen; } return retval; } static int decode_rest_update_subs_res(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_RESULT: ptr->msg.update_subs_res.result = buf[offset]; break; case IE_ERROR_CODE: ptr->msg.update_subs_res.error_code = ntohl( *(u32*)(&buf[offset]) ); break; default: break; } offset += vallen; } return retval; } static int decode_rest_delete_subs(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_MSISDN: strcpy(ptr->msg.delete_subs.msisdn, (char *)&buf[offset]); ptr->msg.delete_subs.msisdn[vallen] = 0; break; case IE_CAUSE: ptr->msg.delete_subs.cause = buf[offset]; break; default: break; } offset += vallen; } return retval; } static int decode_rest_delete_subs_res(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_RESULT: ptr->msg.delete_subs_res.result = buf[offset]; break; case IE_ERROR_CODE: ptr->msg.delete_subs_res.error_code = ntohl( *(u32*)(&buf[offset]) ); break; default: break; } offset += vallen; } return retval; } static int decode_rest_update_sess_info(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_MSISDN: strcpy(ptr->msg.update_sess_info.msisdn, (char *)&buf[offset]); ptr->msg.update_sess_info.msisdn[vallen] = 0; break; case IE_SESS_FLAG: ptr->msg.update_sess_info.first_sess = buf[offset]; break; case IE_SERVICE_TYPE: ptr->msg.update_sess_info.first_sess = buf[offset]; break; case IE_TIMESTAMP: ptr->msg.update_sess_info.start_time = ntohl( *(u32*)(&buf[offset]) ); break; case IE_CONSUME_VALUE: ptr->msg.update_sess_info.consumed_value = ntohl( *(u32*)(&buf[offset]) ); break; case IE_CALLED_NUMBER: strcpy(ptr->msg.update_sess_info.called, (char *)&buf[offset]); ptr->msg.update_sess_info.called[vallen] = 0; ptr->msg.update_sess_info.optional_flag |= 0x01; break; case IE_UE_IP: memcpy((u8 *)&ptr->msg.update_sess_info.ue_ip, &buf[offset], 4); ptr->msg.update_sess_info.optional_flag |= 0x02; break; case IE_GW_IP: memcpy((u8 *)&ptr->msg.update_sess_info.gw_ip, &buf[offset], 4); ptr->msg.update_sess_info.optional_flag |= 0x04; break; default: break; } offset += vallen; } return retval; } static int decode_rest_update_plan_info(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_MSISDN: strcpy(ptr->msg.update_plan_info.msisdn, (char *)&buf[offset]); ptr->msg.update_plan_info.msisdn[vallen] = 0; break; case IE_SERVICE_TYPE: ptr->msg.update_plan_info.service_type = buf[offset]; break; case IE_ACCOUNT_ID: ptr->msg.update_plan_info.account_id = ntohl( *(u32*)(&buf[offset]) ); break; case IE_PLAN_ID: ptr->msg.update_plan_info.plan_id = ntohl( *(u32*)(&buf[offset]) ); break; case IE_BUNDLE_ID: ptr->msg.update_plan_info.bundle_id = ntohl( *(u32*)(&buf[offset]) ); break; case IE_PLAN_VALUE: ptr->msg.update_plan_info.plan_total_value = _decode_u64(&buf[offset]); break; case IE_PLAN_USED_VALUE: ptr->msg.update_plan_info.plan_used_value = _decode_u64(&buf[offset]); break; case IE_SESS_UPDATE_TIME: ptr->msg.update_plan_info.sess_update_times = ntohl( *(u32*)(&buf[offset]) ); break; case IE_PLAN_VALUE_ADD_THIS_TIME: ptr->msg.update_plan_info.this_time_add_value = _decode_u64(&buf[offset]); break; default: break; } offset += vallen; } return retval; } int decode_rest_rent_charge(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; int tag = 0, vallen=0; while(offsetheader.src_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_DST_REF: ptr->header.dst_ref = ntohs( *(u16*)(&buf[offset]) ); break; case IE_MSISDN: memcpy(ptr->msg.rent_charge.msisdn, &buf[offset], vallen); ptr->msg.rent_charge.msisdn[vallen] = '\0'; break; case IE_BALANCE: ptr->msg.rent_charge.balance = ntohl( *(u32*)(&buf[offset]) ); break; case IE_RENT_CHARGE: ptr->msg.rent_charge.rent_charge = ntohl( *(u32*)(&buf[offset]) ); break; default: break; } offset += vallen; } return retval; } int decode_rest_api_msg(u8 *buf, int len, _rest_msg_s *ptr) { int retval = 1; int offset = 0; if (len <= 9) { return -1; } ptr->msg_type = buf[offset++]; switch (ptr->msg_type) { case REST_QUERY: decode_rest_query(buf+1, len-1, ptr); break; case REST_TOPUP: case REST_UPDATE_RECHARGE_CARD_REQ: decode_rest_topup(buf+1, len-1, ptr); break; case REST_TRANSFER: decode_rest_transfer(buf+1, len-1, ptr); break; // for selfcare case REST_SEND_AUTHCODE_REQ: decode_rest_send_authcode(buf+1, len-1, ptr); break; case REST_SEND_AUTHCODE_RSP: decode_rest_send_authcoderesp(buf+1, len - 1, ptr); break; case REST_QUERY_USERDATA_REQ: decode_rest_query_user_data(buf+1, len-1, ptr); break; case REST_QUERY_USERDATA_RSP: decode_rest_query_user_data_res(buf+1, len-1, ptr); break; case REST_BUNDLE_SUBS_REQ: decode_rest_bundle_subs(buf+1, len-1, ptr); break; case REST_BUNDLE_SUBS_RSP: decode_rest_bundle_subs_res(buf+1, len-1, ptr); break; case REST_BUNDLE_USAGE_REQ: decode_rest_bundle_usage(buf+1, len-1, ptr); break; case REST_BUNDLE_USAGE_RSP: decode_rest_bundle_usage_res(buf+1, len-1, ptr); break; case REST_RECHARGE_REQ: decode_rest_recharge(buf+1, len-1, ptr); break; case REST_RECHARGE_RSP: decode_rest_recharge_res(buf+1, len-1, ptr); break; case REST_TRANSFER_REQ: decode_rest_transfer(buf+1, len-1, ptr); break; case REST_TRANSFER_RSP: decode_rest_transfer_res(buf+1, len-1, ptr); break; case REST_RECHARGE_CARD_REQ: decode_rest_recharge_card(buf+1, len-1, ptr); break; case REST_RECHARGE_CARD_RSP: decode_rest_recharge_card_res(buf+1, len-1, ptr); break; case REST_CHECK_BALANCE_REQ: decode_rest_check_balance(buf+1, len-1, ptr); break; case REST_CHECK_BALANCE_RSP: decode_rest_check_balance_res(buf+1, len-1, ptr); break; case REST_QUERY_BALANCE_REQ: decode_rest_query_balance(buf+1, len-1, ptr); break; case REST_QUERY_BALANCE_RSP: decode_rest_query_balance_res(buf+1, len-1, ptr); break; case REST_QUERY_RECHARGE_CARD_REQ: decode_rest_query_recharge_card(buf+1, len-1, ptr); break; case REST_QUERY_RECHARGE_CARD_RSP: decode_rest_query_recharge_card_res(buf+1, len-1, ptr); break; /* case REST_UPDATE_RECHARGE_CARD_REQ: decode_rest_update_recharge_card(buf+1, len-1, ptr); break; case REST_UPDATE_RECHARGE_CARD_RSP: decode_rest_update_recharge_card_res(buf+1, len-1, ptr); break; */ case REST_CRM_PAYMENT_RES: decode_rest_payment_res(buf+1, len-1, ptr); break; case REST_CRM_SMS_DELIVER_REQ: decode_rest_sms_deliver(buf+1, len-1, ptr); break; case REST_CRM_SMS_DELIVER_RES: decode_rest_sms_deliver_res(buf+1, len-1, ptr); break; case REST_CRM_CREATE_ACCT_REQ: decode_rest_create_account(buf+1, len-1, ptr); break; case REST_CRM_CREATE_ACCT_RES: decode_rest_create_account_res(buf+1, len-1, ptr); break; case REST_CRM_QUERY_TARIFF_REQ: decode_rest_query_tariff(buf+1, len-1, ptr); break; case REST_CRM_QUERY_TARIFF_RES: decode_rest_query_tariff_res(buf+1, len-1, ptr); break; case REST_CRM_UPDATE_SUBS_REQ: decode_rest_update_subs(buf+1, len-1, ptr); break; case REST_CRM_UPDATE_SUBS_RES: decode_rest_update_subs_res(buf+1, len-1, ptr); break; case REST_CRM_DELETE_SUBS_REQ: decode_rest_delete_subs(buf+1, len-1, ptr); break; case REST_CRM_DELETE_SUBS_RES: decode_rest_delete_subs_res(buf+1, len-1, ptr); break; case REST_CRM_UPDATE_PLAN_INFO_REQ: decode_rest_update_plan_info(buf+1, len-1, ptr); break; case REST_CRM_RENT_CHARGE: decode_rest_rent_charge(buf+1, len-1, ptr); break; default: break; } return retval; }