int cw_osp_terminate(int handle, int cause, time_t start, time_t duration) { unsigned int dummy = 0; int res = -1; enum OSPEFAILREASON reason; time_t endTime = 0; time_t alertTime = 0; time_t connectTime = 0; unsigned isPddInfoPresent = 0; unsigned pdd = 0; unsigned releaseSource = 0; unsigned char *confId = ""; reason = cause2reason(cause); if (OSPPTransactionRecordFailure(handle, reason)) cw_log(LOG_WARNING, "Failed to record call termination for handle %d\n", handle); else if (OSPPTransactionReportUsage(handle, duration, start, endTime,alertTime,connectTime,isPddInfoPresent,pdd,releaseSource,confId, 0, 0, 0, 0, &dummy, NULL)) cw_log(LOG_WARNING, "Failed to report duration for handle %d\n", handle); else { cw_log(LOG_DEBUG, "Completed recording handle %d\n", handle); OSPPTransactionDelete(handle); res = 0; } return res; }
/* * Report OSP usage thread function * param usagearg OSP usage information * return */ static OSPTTHREADRETURN ospReportUsageWork( void* usagearg) { int i; const int MAX_RETRIES = 5; osp_usage* usage; int errorcode; usage = (osp_usage*)usagearg; OSPPTransactionRecordFailure( usage->transaction, usage->cause); #if 0 OSPPTransactionSetTermCause( usage->transaction, OSPC_TCAUSE_SIP, usage->cause, NULL); #endif for (i = 1; i <= MAX_RETRIES; i++) { errorcode = OSPPTransactionReportUsage( usage->transaction, usage->duration, usage->start, usage->end, usage->alert, usage->connect, usage->haspdd, usage->pdd * 1000, usage->release, NULL, -1, -1, -1, -1, NULL, NULL); if (errorcode == OSPC_ERR_NO_ERROR) { LM_DBG("reporte usage for '%llu'\n", ospGetTransactionId(usage->transaction)); break; } else { LM_ERR("failed to report usage for '%llu' (%d) attempt '%d' of '%d'\n", ospGetTransactionId(usage->transaction), errorcode, i, MAX_RETRIES); } } OSPPTransactionDelete(usage->transaction); free(usage); OSPTTHREADRETURN_NULL(); }