Страница 1 из 2

Event от внешней библиотеки

Добавлено: 10 Ноябрь 2015, 18:06
RaFaeL
Как работать с сабжем? Суть задачи - нужен SIP. После молчания в топике http://forum.clarionlife.net/phpbb/view ... f=1&t=3384 я прошерстил весь инет, группы за последние несколько лет, и т.д. и т.п. и нашел ровно ноль на эту тему, нет даже намека хоть на какой-то 3rdparty продукт вида "SIP в Clarion". Видимо придется писать SIP клиент самим. С нуля я конечно такое ни в жисть не напишу, но вот есть несколько SDK различных вариантов, есть даже Native DLL (по мне так идеальный вариант), они конечно не бесплатные но это вторичный вопрос. Так вот, если работа с функциями более менее понятна, то я никогда не работал с событиями из внешних библиотек. Ну например:

Код: Выделить всё

OnAlerting Event
Call has been accepted and the application should alert the end user

C++
__event void OnAlerting(BSTR sFromURI, BSTR sLocalURI, INT nLine);

C#
event void OnAlerting(string sFromURI, string sLocalURI, int nLine);

Parameters
Parameters  Description  
sFromURI  Remote participant SIP URI  
sLocalURI  Local participant SIP URI  
nLine  Phone line number
Ищется пример, как это все описать

Event от внешней библиотеки

Добавлено: 10 Ноябрь 2015, 18:24
PavelNK
Пишешь свою процедуру с прототипом void OnAlerting(string sFromURI, string sLocalURI, int nLine);
Затем ее регистрируешь через SDK. Когда произойдет событие SDK вызовет твою процедуру.
А ты должен будешь разобраться в процедуре, в соответствии с полученными параметрами, какое событие произошло и обработать его в соответствии с твоими потребностями.
Только нужно не забыть отменить регистрацию при выходе из программы, а то может упасть SDK.

Event от внешней библиотеки

Добавлено: 09 Декабрь 2015, 18:08
RaFaeL
PavelNK писал(а): Затем ее регистрируешь через SDK.
Это как? Пример бы
Вот тут прототипы http://sipeksdk.googlecode.com/svn/trun ... pjsipDll.h
Так вроде всё понятно, кроме того, а что передавать ну допустим в onRegStateCallback

Event от внешней библиотеки

Добавлено: 09 Декабрь 2015, 18:22
Дед Пахом
RaFaeL писал(а):
PavelNK писал(а): Затем ее регистрируешь через SDK.
Это как? Пример бы
Вот тут прототипы http://sipeksdk.googlecode.com/svn/trun ... pjsipDll.h
Так вроде всё понятно, кроме того, а что передавать ну допустим в onRegStateCallback
Штудируй труды основоположников, например, libcurl ;-)

Что мы имеем в c++

Код: Выделить всё

typedef int __stdcall fptr_regstate(int, int);				// on registration state changed
extern "C" PJSIPDLL_DLL_API int onRegStateCallback(fptr_regstate cb);	  // register registration notifier
Заводим у себя процедурный тип

Код: Выделить всё

fptr_regstate procedure(long, long), long, pascal, type
И объявляем ивент так

Код: Выделить всё

onRegStateCallback procedure(fptr_regstate cb), long, pascal, name('onRegStateCallback ')
и можем передавать в неё любую процедуру с таким же прототипом, что и fptr_regstate.

Вобщем, как-то так.

Event от внешней библиотеки

Добавлено: 10 Декабрь 2015, 0:49
RaFaeL
Всё равно чего-то не хватает. Еще ведь нужна процедура? С какими параметрами? Иначе регистрировать то что? Нужен пример более понятный, я до этого процедуры как параметр только в 1С передавал ))
libcurl я посмотрел, там есть что-то похожее, но не совсем то, понятнее не стало

Event от внешней библиотеки

Добавлено: 10 Декабрь 2015, 0:57
Дед Пахом
Ну я ж сказал:
Дед Пахом писал(а): и можем передавать в неё любую процедуру с таким же прототипом, что и fptr_regstate.

Код: Выделить всё

  map
my_regstate  procedure(long, long), long, pascal
  end
  
my_regstate  procedure(long, long)
   code
   return 0
   
! ..... где-то в коде
   onRegStateCallback(my_regstate)

Event от внешней библиотеки

Добавлено: 10 Декабрь 2015, 2:12
RaFaeL
А тут точно pascal нужен? Не С?
Хотя все равно не работает. Компилится, на сервере регистрируется (лог есть) и закрывается (без видимой ошибки). Если событие не регистрировать, то валится с ошибкой
Руки видимо кривые у меня. Или библиотека

Event от внешней библиотеки

Добавлено: 10 Декабрь 2015, 2:33
Дед Пахом
pascal я написал, т.к. увидел stdcall, сам разбирайся в подробностях.

Event от внешней библиотеки

Добавлено: 10 Декабрь 2015, 2:36
Дед Пахом
надеюсь, ты не 1 в 1 переписал, может быть "return 0" означает завершение работы :idied:

Event от внешней библиотеки

Добавлено: 10 Декабрь 2015, 3:08
RaFaeL
Заработало, оказывается нельзя stop ставить внутрь событий )) я ж не знал )

Event от внешней библиотеки

Добавлено: 10 Декабрь 2015, 15:12
RaFaeL
Исходящие звонки заработали, я даже удивился
Теперь входящие

Объявляем

Код: Выделить всё

fptr_regstate(long l1, long l2),long,C,type
my_regstate(long l1, long l2),long,C
fptr_callstate(long l1, long l2),long,C,type
my_callstate(long l1, long l2),long,C
fptr_callincoming(long l1, *cstring uri2),long,C,type
my_callincoming(long l1, *cstring uri2),long,C

   MODULE('pjsipdll.dll')
     SIP_init(),LONG,RAW,C,NAME('dll_init')
     SIP_registerAccount(*CSTRING uri, *CSTRING reguri, *CSTRING nam, *CSTRING username, *CSTRING pass, *CSTRING proxy, bool isdefault),LONG,RAW,C,NAME('dll_registerAccount')
     SIP_onRegStateCallback(fptr_regstate cb),long,RAW,C,name('onRegStateCallback')
     SIP_onCallStateCallback(fptr_callstate cb),long,RAW,C,name('onCallStateCallback')
     SIP_onCallIncoming(fptr_callincoming cb),long,RAW,C,name('onCallIncoming')
     SIP_Main(),long,RAW,C,name('dll_Main')
     SIP_makeCall(long accountId, *CSTRING uri),LONG,RAW,C,NAME('dll_makeCall')
   END
Добавляем процедуры

Код: Выделить всё

my_regstate  procedure(LONG l1, LONG l2)
 code
 state1=l1
 state2=l2
 return 0

my_callstate  procedure(LONG l1, LONG l2)
 code
 call1=l1
 call2=l2
 return 0

my_callincoming  procedure(LONG l1, *CSTRING uri2)
 code
 call1=l1
 calluri=uri2
 return 0
Логинимся

Код: Выделить всё

 SIP_onRegStateCallback(my_regstate)
 SIP_onCallStateCallback(my_callstate)
 SIP_onCallIncoming(my_callincoming)
 a#=SIP_init()
 c#=SIP_Main()
 uri='sip:'&clip(username)&'@'&clip(hostname)
 reguri='sip:'&clip(hostname)&':5060;transport=tcp'
 nam='*'
 proxy=''
 isdefault=0
 account=SIP_registerAccount(uri,reguri,nam,username,pass,proxy,isdefault)
Что имеем:
Если прототипы С то на входящем звонке идёт вылет
Если меняю прототипы на Pascal то просто ничего не происходит
calluri, call2 и state2 это глобальные переменные которые выведены на окно которое для простоты обновляется по таймеру
call2 и state2 при логине и исходящем звонке отображаются нормально

Event от внешней библиотеки

Добавлено: 10 Декабрь 2015, 15:18
Yufil
Надо ещё глянуть в Help на операторы UnlockThread - LockThread. Когда вызывается сишный модуль, надо предварительно исполнить UnlockThread, а внутри Handler'а - активировать LockThread. Наверное... По крайней мере, в интерфейсе List&Label пришлось....

Event от внешней библиотеки

Добавлено: 10 Декабрь 2015, 16:51
RaFaeL
Если строку calluri=uri2 убрать то не вылетает и звонок принять можно, но о нем не известно...
Т.е. проблема с *CSTRING
Еще у кого какие идеи?

Неужели больше никому SIP-звонилка из клариона не нужна?

Event от внешней библиотеки

Добавлено: 10 Декабрь 2015, 16:56
Дед Пахом
RaFaeL писал(а): calluri=uri2
А так:

Код: Выделить всё

calluri=clip(uri2)

Event от внешней библиотеки

Добавлено: 10 Декабрь 2015, 17:00
RaFaeL
И так вылетает