mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-02-05 10:34:54 +00:00
Thanks to Phil Zimmermann for the code and for the license exception we needed to include it. There remains some build system integration work to be done before this code will build properly in the FreeSWITCH tree.
337 lines
7.8 KiB
C++
337 lines
7.8 KiB
C++
/*
|
|
* Copyright (c) 2006-2009 Philip R. Zimmermann. All rights reserved.
|
|
* Contact: http://philzimmermann.com
|
|
* For licensing and other legal details, see the file zrtp_legal.c.
|
|
*/
|
|
|
|
#include <charconv.h>
|
|
#include <stdarg.h>
|
|
#include <sys/time.h>
|
|
|
|
#include <e32msgqueue.h>
|
|
|
|
#include <UNISTD.H>
|
|
#include <e32base.h>
|
|
#include <e32math.h>
|
|
|
|
#include <zrtp.h>
|
|
|
|
extern "C"
|
|
{
|
|
/**
|
|
* @brief Get kernel-generated random number
|
|
* @bug seems not work
|
|
* @return 32 random bits
|
|
*/
|
|
uint32_t zrtp_symbian_kernel_random();
|
|
|
|
/**
|
|
* @brief Pseudo random number: sum of pid's shifted and xored by number of precceses
|
|
* @return
|
|
*/
|
|
uint32_t zrtp_sum_of_pid_and_number_of_poccesses();
|
|
|
|
/**
|
|
* @brief Number of milisecond past from particular date and time
|
|
* @return
|
|
*/
|
|
uint64_t zrtp_get_system_time_crazy();
|
|
|
|
/**
|
|
* @brief Current procces PID
|
|
* @return PID
|
|
*/
|
|
unsigned int zrtp_get_pid();
|
|
|
|
/**
|
|
* @brief Availible memory
|
|
* @return memory availible on heap
|
|
*/
|
|
uint32_t zrtp_get_availible_heap();
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
zrtp_status_t zrtp_mutex_init(zrtp_mutex_t **mutex) {
|
|
RMutex *rmutex = new RMutex();
|
|
//rmutex->CreateLocal(); was before
|
|
rmutex->CreateGlobal(KNullDesC);
|
|
*mutex = (zrtp_mutex_t*) rmutex;
|
|
return zrtp_status_ok;
|
|
}
|
|
|
|
zrtp_status_t zrtp_mutex_lock(zrtp_mutex_t* mutex) {
|
|
RMutex *rmutex = (RMutex *) mutex;
|
|
rmutex->Wait();
|
|
return zrtp_status_ok;
|
|
}
|
|
|
|
zrtp_status_t zrtp_mutex_unlock(zrtp_mutex_t* mutex) {
|
|
RMutex *rmutex = (RMutex *) mutex;
|
|
rmutex->Signal();
|
|
return zrtp_status_ok;
|
|
}
|
|
|
|
zrtp_status_t zrtp_mutex_destroy(zrtp_mutex_t* mutex) {
|
|
RMutex *rmutex = (RMutex *) mutex;
|
|
if (rmutex) {
|
|
rmutex->Close();
|
|
delete rmutex;
|
|
}
|
|
return zrtp_status_ok;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
zrtp_status_t zrtp_sem_init(zrtp_sem_t** sem, uint32_t value, uint32_t limit) {
|
|
RSemaphore *rsem = new RSemaphore();
|
|
//rsem->CreateLocal(value);
|
|
rsem->CreateGlobal(KNullDesC,value);
|
|
*sem = (zrtp_sem_t*) rsem;
|
|
return zrtp_status_ok;
|
|
}
|
|
|
|
zrtp_status_t zrtp_sem_destroy(zrtp_sem_t* sem) {
|
|
RSemaphore *rsem = (RSemaphore *) sem;
|
|
if (rsem) {
|
|
rsem->Close();
|
|
delete rsem;
|
|
}
|
|
return zrtp_status_ok;
|
|
}
|
|
|
|
zrtp_status_t zrtp_sem_wait(zrtp_sem_t* sem) {
|
|
RSemaphore *rsem = (RSemaphore *) sem;
|
|
rsem->Wait();
|
|
return zrtp_status_ok;
|
|
}
|
|
|
|
zrtp_status_t zrtp_sem_trtwait(zrtp_sem_t* sem) {
|
|
RSemaphore *rsem = (RSemaphore *) sem;
|
|
rsem->Wait(1000);
|
|
return zrtp_status_ok;
|
|
}
|
|
|
|
zrtp_status_t zrtp_sem_post(zrtp_sem_t* sem) {
|
|
RSemaphore *rsem = (RSemaphore *) sem;
|
|
rsem->Signal();
|
|
return zrtp_status_ok;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
int zrtp_sleep(unsigned int msec) {
|
|
TTimeIntervalMicroSeconds32 i(msec *1000);
|
|
User::After(i);
|
|
return 0;
|
|
}
|
|
|
|
int zrtp_thread_create(zrtp_thread_routine_t start_routine, void *arg) {
|
|
RThread h;
|
|
TBuf<64> thName=_L("zrtp_thread");
|
|
|
|
h.Create(thName, start_routine, KDefaultStackSize*2, NULL, arg) ;
|
|
h.Resume();
|
|
h.Close();
|
|
|
|
return NULL;
|
|
}
|
|
//-----------------------------------------------------------------------------
|
|
// For Scheduler
|
|
#if (defined(ZRTP_USE_BUILTIN_SCEHDULER) && (ZRTP_USE_BUILTIN_SCEHDULER ==1))
|
|
|
|
#include "DelayRuner.h"
|
|
#include "zrtp_error.h"
|
|
mlist_t tasks_head_s;
|
|
static uint8_t inited = 0 ;
|
|
static uint8_t is_running = 0;
|
|
|
|
typedef struct {
|
|
zrtp_stream_t *ctx; /** ZRTP stream context associated with the task */
|
|
zrtp_retry_task_t *ztask; /** ZRTP stream associated with the task */
|
|
mlist_t _mlist;
|
|
CDelayRuner* ao; // Active object
|
|
} zrtp_sched_task_s_t;
|
|
|
|
zrtp_status_t zrtp_def_scheduler_init(zrtp_global_t* zrtp)
|
|
{
|
|
zrtp_status_t status = zrtp_status_ok;
|
|
ZRTP_LOG(3,("symbian","Init start"));
|
|
if (inited) {
|
|
return zrtp_status_ok;
|
|
}
|
|
|
|
do {
|
|
init_mlist(&tasks_head_s);
|
|
is_running = 1;
|
|
inited = 1;
|
|
} while (0);
|
|
|
|
ZRTP_LOG(3,("symbian","Init end"));
|
|
return status;
|
|
}
|
|
|
|
void zrtp_def_scheduler_down()
|
|
{
|
|
ZRTP_LOG(3,("symbian","Down start"));
|
|
mlist_t *node = 0, *tmp = 0;
|
|
|
|
if (!inited) {
|
|
return;
|
|
}
|
|
|
|
/* Stop main thread */
|
|
is_running = 0;
|
|
// zrtp_sem_post(count);
|
|
|
|
/* Then destroy tasks queue and realease all other resources */
|
|
//zrtp_mutex_lock(protector);
|
|
|
|
mlist_for_each_safe(node, tmp, &tasks_head_s) {
|
|
zrtp_sched_task_s_t* task = mlist_get_struct(zrtp_sched_task_s_t, _mlist, node);
|
|
if (task->ao!=NULL)
|
|
{
|
|
delete task->ao;
|
|
}
|
|
zrtp_sys_free(task);
|
|
}
|
|
init_mlist(&tasks_head_s);
|
|
|
|
// zrtp_mutex_unlock(protector);
|
|
|
|
// zrtp_mutex_destroy(protector);
|
|
// zrtp_sem_destroy(count);
|
|
|
|
ZRTP_LOG(3,("symbian","Down end"));
|
|
inited = 0;
|
|
}
|
|
|
|
|
|
void zrtp_def_scheduler_call_later(zrtp_stream_t *ctx, zrtp_retry_task_t* ztask)
|
|
{
|
|
// ZRTP_LOG(3,("symbian","CallLater start"));
|
|
//mlist_t *node=0, *tmp=0;
|
|
mlist_t* last = &tasks_head_s;
|
|
|
|
//zrtp_mutex_lock(protector);
|
|
|
|
if (!ztask->_is_enabled) {
|
|
//zrtp_mutex_unlock(protector);
|
|
return;
|
|
}
|
|
|
|
do {
|
|
zrtp_sched_task_s_t* new_task = (zrtp_sched_task_s_t*)zrtp_sys_alloc(sizeof(zrtp_sched_task_s_t));
|
|
if (!new_task) {
|
|
break;
|
|
}
|
|
|
|
new_task->ctx = ctx;
|
|
new_task->ztask = ztask;
|
|
new_task->ao = CDelayRuner::NewL();
|
|
|
|
mlist_insert(last, &new_task->_mlist);
|
|
|
|
new_task->ao->StartL(ctx,ztask);
|
|
//zrtp_sem_post(count);
|
|
} while (0);
|
|
|
|
//ZRTP_LOG(3,("symbian","CallLater end"));
|
|
//zrtp_mutex_unlock(protector);
|
|
}
|
|
|
|
void zrtp_def_scheduler_cancel_call_later(zrtp_stream_t* ctx, zrtp_retry_task_t* ztask)
|
|
{
|
|
mlist_t *node=0, *tmp=0;
|
|
ZRTP_LOG(3,("symbian","CancelcallLater start"));
|
|
// zrtp_mutex_lock(protector);
|
|
|
|
mlist_for_each_safe(node, tmp, &tasks_head_s) {
|
|
zrtp_sched_task_s_t* task = mlist_get_struct(zrtp_sched_task_s_t, _mlist, node);
|
|
if ((task->ctx == ctx) && ((task->ztask == ztask) || !ztask)) {
|
|
task->ao->Cancel();
|
|
delete task->ao; // Cancel and delete task
|
|
mlist_del(&task->_mlist);
|
|
zrtp_sys_free(task);
|
|
//zrtp_sem_trtwait(count);
|
|
if (ztask) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
ZRTP_LOG(3,("symbian","CancelCallLater done"));
|
|
// zrtp_mutex_unlock(protector);
|
|
}
|
|
|
|
void zrtp_internal_delete_task_from_list(zrtp_stream_t* ctx, zrtp_retry_task_t* ztask)
|
|
{
|
|
mlist_t *node=0, *tmp=0;
|
|
ZRTP_LOG(3,("symbian","DelTask begin"));
|
|
mlist_for_each_safe(node, tmp, &tasks_head_s)
|
|
{
|
|
zrtp_sched_task_s_t* task = mlist_get_struct(zrtp_sched_task_s_t, _mlist, node);
|
|
if ((task->ctx == ctx) && ((task->ztask == ztask) || !ztask))
|
|
{
|
|
delete task->ao; // Cancel and delete task
|
|
mlist_del(&task->_mlist);
|
|
zrtp_sys_free(task);
|
|
ZRTP_LOG(3,("symbian","DelTask Del"));
|
|
//zrtp_sem_trtwait(count);
|
|
if (ztask)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
ZRTP_LOG(3,("symbian","DelTask end"));
|
|
}
|
|
|
|
void zrtp_def_scheduler_wait_call_later(zrtp_stream_t* ctx)
|
|
{
|
|
}
|
|
#endif // ZRTP_USE_BUILTIN_SCEHDULER
|
|
//-----------------------------------------------------------------------------
|
|
|
|
unsigned int zrtp_get_pid()
|
|
{
|
|
return getpid();
|
|
}
|
|
|
|
uint64_t zrtp_get_system_time_crazy()
|
|
{
|
|
TTime time;
|
|
|
|
return time.MicroSecondsFrom(TTime(TDateTime (491,EAugust,7,3,37,17,347))).Int64();
|
|
}
|
|
|
|
uint32_t zrtp_sum_of_pid_and_number_of_poccesses()
|
|
{
|
|
TFindProcess fp;
|
|
RProcess procces;
|
|
TFullName proccesName;
|
|
uint_32t idsum=1;
|
|
uint_32t proccesCount=0;
|
|
fp.Find(KNullDesC);
|
|
while (fp.Next(proccesName)==KErrNone)
|
|
{
|
|
if (procces.Open(proccesName,EOwnerProcess)==KErrNone)
|
|
{
|
|
idsum+=procces.Id();
|
|
proccesCount++;
|
|
procces.Close();
|
|
}
|
|
}
|
|
idsum = (idsum << 3) xor proccesCount;
|
|
return idsum;
|
|
}
|
|
|
|
uint32_t zrtp_get_availible_heap()
|
|
{
|
|
return User::Heap().MaxLength();
|
|
}
|
|
|
|
uint32_t zrtp_symbian_kernel_random()
|
|
{
|
|
return Math::Random();
|
|
}
|