freeswitch-svn
Threads by month
- ----- 2026 -----
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
May 2008
- 10 participants
- 495 discussions
[Freeswitch-svn] [commit] r8240 - freeswitch/trunk/src/mod/endpoints/mod_sofia
by Freeswitch SVN 01 May '08
by Freeswitch SVN 01 May '08
01 May '08
Author: anthm
Date: Thu May 1 16:22:53 2008
New Revision: 8240
Modified:
freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c
Log:
update
Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c
==============================================================================
--- freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c (original)
+++ freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c Thu May 1 16:22:53 2008
@@ -1517,7 +1517,7 @@
{
sofia_gateway_t *gateway = NULL;
- if (sofia_private->gateway_name) {
+ if (sofia_private && !switch_strlen_zero(sofia_private->gateway_name)) {
gateway = sofia_reg_find_gateway(sofia_private->gateway_name);
}
1
0
[Freeswitch-svn] [commit] r8239 - in freeswitch/trunk/src: . include mod/languages/mod_java mod/languages/mod_java/src/org/freeswitch/swig mod/languages/mod_lua mod/languages/mod_perl
by Freeswitch SVN 01 May '08
by Freeswitch SVN 01 May '08
01 May '08
Author: brian
Date: Thu May 1 15:14:33 2008
New Revision: 8239
Modified:
freeswitch/trunk/src/include/switch_cpp.h
freeswitch/trunk/src/mod/languages/mod_java/src/org/freeswitch/swig/CoreSession.java
freeswitch/trunk/src/mod/languages/mod_java/src/org/freeswitch/swig/freeswitchJNI.java
freeswitch/trunk/src/mod/languages/mod_java/switch_swig_wrap.cpp
freeswitch/trunk/src/mod/languages/mod_lua/mod_lua_wrap.cpp
freeswitch/trunk/src/mod/languages/mod_perl/mod_perl_wrap.cpp
freeswitch/trunk/src/switch_cpp.cpp
Log:
switch_size_t to int
Modified: freeswitch/trunk/src/include/switch_cpp.h
==============================================================================
--- freeswitch/trunk/src/include/switch_cpp.h (original)
+++ freeswitch/trunk/src/include/switch_cpp.h Thu May 1 15:14:33 2008
@@ -221,7 +221,7 @@
* receiving dtmf digits. For that, use collectDigits.
*/
SWITCH_DECLARE(char *) getDigits(
- switch_size_t maxdigits,
+ int maxdigits,
char *terminators,
char *terminator,
int timeout);
Modified: freeswitch/trunk/src/mod/languages/mod_java/src/org/freeswitch/swig/CoreSession.java
==============================================================================
--- freeswitch/trunk/src/mod/languages/mod_java/src/org/freeswitch/swig/CoreSession.java (original)
+++ freeswitch/trunk/src/mod/languages/mod_java/src/org/freeswitch/swig/CoreSession.java Thu May 1 15:14:33 2008
@@ -161,8 +161,8 @@
return freeswitchJNI.CoreSession_collectDigits(swigCPtr, this, timeout);
}
- public String getDigits(SWIGTYPE_p_switch_size_t maxdigits, String terminators, byte[] terminator, int timeout) {
- return freeswitchJNI.CoreSession_getDigits(swigCPtr, this, SWIGTYPE_p_switch_size_t.getCPtr(maxdigits), terminators, terminator, timeout);
+ public String getDigits(int maxdigits, String terminators, byte[] terminator, int timeout) {
+ return freeswitchJNI.CoreSession_getDigits(swigCPtr, this, maxdigits, terminators, terminator, timeout);
}
public int transfer(String extensions, String dialplan, String context) {
Modified: freeswitch/trunk/src/mod/languages/mod_java/src/org/freeswitch/swig/freeswitchJNI.java
==============================================================================
--- freeswitch/trunk/src/mod/languages/mod_java/src/org/freeswitch/swig/freeswitchJNI.java (original)
+++ freeswitch/trunk/src/mod/languages/mod_java/src/org/freeswitch/swig/freeswitchJNI.java Thu May 1 15:14:33 2008
@@ -87,7 +87,7 @@
public final static native int CoreSession_speak(long jarg1, CoreSession jarg1_, String jarg2);
public final static native void CoreSession_set_tts_parms(long jarg1, CoreSession jarg1_, String jarg2, String jarg3);
public final static native int CoreSession_collectDigits(long jarg1, CoreSession jarg1_, int jarg2);
- public final static native String CoreSession_getDigits(long jarg1, CoreSession jarg1_, long jarg2, String jarg3, byte[] jarg4, int jarg5);
+ public final static native String CoreSession_getDigits(long jarg1, CoreSession jarg1_, int jarg2, String jarg3, byte[] jarg4, int jarg5);
public final static native int CoreSession_transfer(long jarg1, CoreSession jarg1_, String jarg2, String jarg3, String jarg4);
public final static native String CoreSession_playAndGetDigits(long jarg1, CoreSession jarg1_, int jarg2, int jarg3, int jarg4, int jarg5, String jarg6, String jarg7, String jarg8, String jarg9);
public final static native int CoreSession_streamFile__SWIG_0(long jarg1, CoreSession jarg1_, String jarg2, int jarg3);
Modified: freeswitch/trunk/src/mod/languages/mod_java/switch_swig_wrap.cpp
==============================================================================
--- freeswitch/trunk/src/mod/languages/mod_java/switch_swig_wrap.cpp (original)
+++ freeswitch/trunk/src/mod/languages/mod_java/switch_swig_wrap.cpp Thu May 1 15:14:33 2008
@@ -1576,26 +1576,20 @@
}
-SWIGEXPORT jstring JNICALL Java_org_freeswitch_swig_freeswitchJNI_CoreSession_1getDigits(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jstring jarg3, jbyteArray jarg4, jint jarg5) {
+SWIGEXPORT jstring JNICALL Java_org_freeswitch_swig_freeswitchJNI_CoreSession_1getDigits(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jint jarg2, jstring jarg3, jbyteArray jarg4, jint jarg5) {
jstring jresult = 0 ;
CoreSession *arg1 = (CoreSession *) 0 ;
- switch_size_t arg2 ;
+ int arg2 ;
char *arg3 = (char *) 0 ;
char *arg4 = (char *) 0 ;
int arg5 ;
char *result = 0 ;
- switch_size_t *argp2 ;
(void)jenv;
(void)jcls;
(void)jarg1_;
arg1 = *(CoreSession **)&jarg1;
- argp2 = *(switch_size_t **)&jarg2;
- if (!argp2) {
- SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null switch_size_t");
- return 0;
- }
- arg2 = *argp2;
+ arg2 = (int)jarg2;
arg3 = 0;
if (jarg3) {
arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0);
Modified: freeswitch/trunk/src/mod/languages/mod_lua/mod_lua_wrap.cpp
==============================================================================
--- freeswitch/trunk/src/mod/languages/mod_lua/mod_lua_wrap.cpp (original)
+++ freeswitch/trunk/src/mod/languages/mod_lua/mod_lua_wrap.cpp Thu May 1 15:14:33 2008
@@ -1499,12 +1499,11 @@
#define SWIGTYPE_p_switch_input_args_t swig_types[12]
#define SWIGTYPE_p_switch_input_type_t swig_types[13]
#define SWIGTYPE_p_switch_priority_t swig_types[14]
-#define SWIGTYPE_p_switch_size_t swig_types[15]
-#define SWIGTYPE_p_switch_status_t swig_types[16]
-#define SWIGTYPE_p_switch_stream_handle_t swig_types[17]
-#define SWIGTYPE_p_void swig_types[18]
-static swig_type_info *swig_types[20];
-static swig_module_info swig_module = {swig_types, 19, 0, 0, 0, 0};
+#define SWIGTYPE_p_switch_status_t swig_types[15]
+#define SWIGTYPE_p_switch_stream_handle_t swig_types[16]
+#define SWIGTYPE_p_void swig_types[17]
+static swig_type_info *swig_types[19];
+static swig_module_info swig_module = {swig_types, 18, 0, 0, 0, 0};
#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
@@ -4097,16 +4096,15 @@
static int _wrap_CoreSession_getDigits(lua_State* L) {
int SWIG_arg = -1;
CoreSession *arg1 = (CoreSession *) 0 ;
- switch_size_t arg2 ;
+ int arg2 ;
char *arg3 = (char *) 0 ;
char *arg4 = (char *) 0 ;
int arg5 ;
char *result = 0 ;
- switch_size_t *argp2 ;
SWIG_check_num_args("getDigits",5,5)
if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("getDigits",1,"CoreSession *");
- if(!lua_isuserdata(L,2)) SWIG_fail_arg("getDigits",2,"switch_size_t");
+ if(!lua_isnumber(L,2)) SWIG_fail_arg("getDigits",2,"int");
if(!lua_isstring(L,3)) SWIG_fail_arg("getDigits",3,"char *");
if(!lua_isstring(L,4)) SWIG_fail_arg("getDigits",4,"char *");
if(!lua_isnumber(L,5)) SWIG_fail_arg("getDigits",5,"int");
@@ -4115,12 +4113,7 @@
SWIG_fail_ptr("CoreSession_getDigits",1,SWIGTYPE_p_CoreSession);
}
-
- if (!SWIG_IsOK(SWIG_ConvertPtr(L,2,(void**)&argp2,SWIGTYPE_p_switch_size_t,0))){
- SWIG_fail_ptr("CoreSession_getDigits",2,SWIGTYPE_p_switch_size_t);
- }
- arg2 = *argp2;
-
+ arg2 = (int)lua_tonumber(L, 2);
arg3 = (char *)lua_tostring(L, 3);
arg4 = (char *)lua_tostring(L, 4);
arg5 = (int)lua_tonumber(L, 5);
@@ -5493,7 +5486,6 @@
static swig_type_info _swigt__p_switch_input_args_t = {"_p_switch_input_args_t", "switch_input_args_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_switch_input_type_t = {"_p_switch_input_type_t", "switch_input_type_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_switch_priority_t = {"_p_switch_priority_t", "switch_priority_t *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_switch_size_t = {"_p_switch_size_t", "switch_size_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_switch_status_t = {"_p_switch_status_t", "switch_status_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_switch_stream_handle_t = {"_p_switch_stream_handle_t", "switch_stream_handle_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_void = {"_p_void", "void *", 0, 0, (void*)0, 0};
@@ -5514,7 +5506,6 @@
&_swigt__p_switch_input_args_t,
&_swigt__p_switch_input_type_t,
&_swigt__p_switch_priority_t,
- &_swigt__p_switch_size_t,
&_swigt__p_switch_status_t,
&_swigt__p_switch_stream_handle_t,
&_swigt__p_void,
@@ -5535,7 +5526,6 @@
static swig_cast_info _swigc__p_switch_input_args_t[] = { {&_swigt__p_switch_input_args_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_switch_input_type_t[] = { {&_swigt__p_switch_input_type_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_switch_priority_t[] = { {&_swigt__p_switch_priority_t, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_switch_size_t[] = { {&_swigt__p_switch_size_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_switch_status_t[] = { {&_swigt__p_switch_status_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_switch_stream_handle_t[] = { {&_swigt__p_switch_stream_handle_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_void[] = { {&_swigt__p_void, 0, 0, 0},{0, 0, 0, 0}};
@@ -5556,7 +5546,6 @@
_swigc__p_switch_input_args_t,
_swigc__p_switch_input_type_t,
_swigc__p_switch_priority_t,
- _swigc__p_switch_size_t,
_swigc__p_switch_status_t,
_swigc__p_switch_stream_handle_t,
_swigc__p_void,
Modified: freeswitch/trunk/src/mod/languages/mod_perl/mod_perl_wrap.cpp
==============================================================================
--- freeswitch/trunk/src/mod/languages/mod_perl/mod_perl_wrap.cpp (original)
+++ freeswitch/trunk/src/mod/languages/mod_perl/mod_perl_wrap.cpp Thu May 1 15:14:33 2008
@@ -1461,12 +1461,11 @@
#define SWIGTYPE_p_switch_input_args_t swig_types[12]
#define SWIGTYPE_p_switch_input_type_t swig_types[13]
#define SWIGTYPE_p_switch_priority_t swig_types[14]
-#define SWIGTYPE_p_switch_size_t swig_types[15]
-#define SWIGTYPE_p_switch_status_t swig_types[16]
-#define SWIGTYPE_p_switch_stream_handle_t swig_types[17]
-#define SWIGTYPE_p_void swig_types[18]
-static swig_type_info *swig_types[20];
-static swig_module_info swig_module = {swig_types, 19, 0, 0, 0, 0};
+#define SWIGTYPE_p_switch_status_t swig_types[15]
+#define SWIGTYPE_p_switch_stream_handle_t swig_types[16]
+#define SWIGTYPE_p_void swig_types[17]
+static swig_type_info *swig_types[19];
+static swig_module_info swig_module = {swig_types, 18, 0, 0, 0, 0};
#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
@@ -5223,15 +5222,15 @@
XS(_wrap_CoreSession_getDigits) {
{
CoreSession *arg1 = (CoreSession *) 0 ;
- switch_size_t arg2 ;
+ int arg2 ;
char *arg3 = (char *) 0 ;
char *arg4 = (char *) 0 ;
int arg5 ;
char *result = 0 ;
void *argp1 = 0 ;
int res1 = 0 ;
- void *argp2 ;
- int res2 = 0 ;
+ int val2 ;
+ int ecode2 = 0 ;
int res3 ;
char *buf3 = 0 ;
int alloc3 = 0 ;
@@ -5251,17 +5250,11 @@
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CoreSession_getDigits" "', argument " "1"" of type '" "CoreSession *""'");
}
arg1 = reinterpret_cast< CoreSession * >(argp1);
- {
- res2 = SWIG_ConvertPtr(ST(1), &argp2, SWIGTYPE_p_switch_size_t, 0 );
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CoreSession_getDigits" "', argument " "2"" of type '" "switch_size_t""'");
- }
- if (!argp2) {
- SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CoreSession_getDigits" "', argument " "2"" of type '" "switch_size_t""'");
- } else {
- arg2 = *(reinterpret_cast< switch_size_t * >(argp2));
- }
- }
+ ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2);
+ if (!SWIG_IsOK(ecode2)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CoreSession_getDigits" "', argument " "2"" of type '" "int""'");
+ }
+ arg2 = static_cast< int >(val2);
res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3);
if (!SWIG_IsOK(res3)) {
SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "CoreSession_getDigits" "', argument " "3"" of type '" "char *""'");
@@ -5280,12 +5273,14 @@
result = (char *)(arg1)->getDigits(arg2,arg3,arg4,arg5);
ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ;
+
if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
if (alloc4 == SWIG_NEWOBJ) delete[] buf4;
XSRETURN(argvi);
fail:
+
if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
if (alloc4 == SWIG_NEWOBJ) delete[] buf4;
@@ -6612,7 +6607,6 @@
static swig_type_info _swigt__p_switch_input_args_t = {"_p_switch_input_args_t", "switch_input_args_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_switch_input_type_t = {"_p_switch_input_type_t", "switch_input_type_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_switch_priority_t = {"_p_switch_priority_t", "switch_priority_t *", 0, 0, (void*)0, 0};
-static swig_type_info _swigt__p_switch_size_t = {"_p_switch_size_t", "switch_size_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_switch_status_t = {"_p_switch_status_t", "switch_status_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_switch_stream_handle_t = {"_p_switch_stream_handle_t", "switch_stream_handle_t *", 0, 0, (void*)0, 0};
static swig_type_info _swigt__p_void = {"_p_void", "void *", 0, 0, (void*)0, 0};
@@ -6633,7 +6627,6 @@
&_swigt__p_switch_input_args_t,
&_swigt__p_switch_input_type_t,
&_swigt__p_switch_priority_t,
- &_swigt__p_switch_size_t,
&_swigt__p_switch_status_t,
&_swigt__p_switch_stream_handle_t,
&_swigt__p_void,
@@ -6654,7 +6647,6 @@
static swig_cast_info _swigc__p_switch_input_args_t[] = { {&_swigt__p_switch_input_args_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_switch_input_type_t[] = { {&_swigt__p_switch_input_type_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_switch_priority_t[] = { {&_swigt__p_switch_priority_t, 0, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_switch_size_t[] = { {&_swigt__p_switch_size_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_switch_status_t[] = { {&_swigt__p_switch_status_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_switch_stream_handle_t[] = { {&_swigt__p_switch_stream_handle_t, 0, 0, 0},{0, 0, 0, 0}};
static swig_cast_info _swigc__p_void[] = { {&_swigt__p_void, 0, 0, 0},{0, 0, 0, 0}};
@@ -6675,7 +6667,6 @@
_swigc__p_switch_input_args_t,
_swigc__p_switch_input_type_t,
_swigc__p_switch_priority_t,
- _swigc__p_switch_size_t,
_swigc__p_switch_status_t,
_swigc__p_switch_stream_handle_t,
_swigc__p_void,
Modified: freeswitch/trunk/src/switch_cpp.cpp
==============================================================================
--- freeswitch/trunk/src/switch_cpp.cpp (original)
+++ freeswitch/trunk/src/switch_cpp.cpp Thu May 1 15:14:33 2008
@@ -470,7 +470,7 @@
return SWITCH_STATUS_SUCCESS;
}
-SWITCH_DECLARE(char *) CoreSession::getDigits(switch_size_t maxdigits,
+SWITCH_DECLARE(char *) CoreSession::getDigits(int maxdigits,
char *terminators,
char *terminator,
int timeout)
1
0
[Freeswitch-svn] [commit] r8238 - in freeswitch/trunk: scripts/lua src src/include src/mod/languages/mod_java src/mod/languages/mod_java/src/org/freeswitch/swig src/mod/languages/mod_lua src/mod/languages/mod_perl src/mod/languages/mod_python
by Freeswitch SVN 01 May '08
by Freeswitch SVN 01 May '08
01 May '08
Author: anthm
Date: Thu May 1 15:03:57 2008
New Revision: 8238
Modified:
freeswitch/trunk/scripts/lua/mwi_event.lua
freeswitch/trunk/scripts/lua/originate.lua
freeswitch/trunk/src/include/switch_cpp.h
freeswitch/trunk/src/mod/languages/mod_java/src/org/freeswitch/swig/CoreSession.java
freeswitch/trunk/src/mod/languages/mod_java/src/org/freeswitch/swig/freeswitchJNI.java
freeswitch/trunk/src/mod/languages/mod_java/switch_swig_wrap.cpp
freeswitch/trunk/src/mod/languages/mod_lua/mod_lua_wrap.cpp
freeswitch/trunk/src/mod/languages/mod_perl/mod_perl_wrap.cpp
freeswitch/trunk/src/mod/languages/mod_python/mod_python_wrap.cpp
freeswitch/trunk/src/switch_cpp.cpp
freeswitch/trunk/src/switch_ivr_play_say.c
Log:
fix bad pointer memory snafu in wrapped language libs
Modified: freeswitch/trunk/scripts/lua/mwi_event.lua
==============================================================================
--- freeswitch/trunk/scripts/lua/mwi_event.lua (original)
+++ freeswitch/trunk/scripts/lua/mwi_event.lua Thu May 1 15:03:57 2008
@@ -3,6 +3,6 @@
freeswitch.console_log("info", "Lua in da house!!!\n");
local event = freeswitch.Event("message_waiting");
-event:addHeader("MWI-Messages-Waiting", "yes");
+event:addHeader("MWI-Messages-Waiting", "no");
event:addHeader("MWI-Message-Account", "sip:1000@10.0.1.100");
event:fire();
Modified: freeswitch/trunk/scripts/lua/originate.lua
==============================================================================
--- freeswitch/trunk/scripts/lua/originate.lua (original)
+++ freeswitch/trunk/scripts/lua/originate.lua Thu May 1 15:03:57 2008
@@ -1,6 +1,6 @@
-- Example Lua script to originate. luarun
freeswitch.console_log("info", "Lua in da house!!!\n");
-local session = freeswitch.Session("sofia/10.0.1.100/1002");
+local session = freeswitch.Session("sofia/10.0.1.100/1001");
session:execute("playback", "/sr8k.wav");
session:hangup();
Modified: freeswitch/trunk/src/include/switch_cpp.h
==============================================================================
--- freeswitch/trunk/src/include/switch_cpp.h (original)
+++ freeswitch/trunk/src/include/switch_cpp.h Thu May 1 15:03:57 2008
@@ -140,6 +140,7 @@
void *on_hangup; // language specific callback function, cast as void *
switch_file_handle_t local_fh;
switch_file_handle_t *fhp;
+ char dtmf_buf[512];
SWITCH_DECLARE(switch_status_t) process_callback_result(char *ret);
public:
SWITCH_DECLARE_CONSTRUCTOR CoreSession();
@@ -219,13 +220,12 @@
* (see mod_python.i). This does NOT call any callbacks upon
* receiving dtmf digits. For that, use collectDigits.
*/
- SWITCH_DECLARE(int) getDigits(char *dtmf_buf,
- switch_size_t buflen,
- switch_size_t maxdigits,
- char *terminators,
- char *terminator,
- int timeout);
-
+ SWITCH_DECLARE(char *) getDigits(
+ switch_size_t maxdigits,
+ char *terminators,
+ char *terminator,
+ int timeout);
+
SWITCH_DECLARE(int) transfer(char *extensions, char *dialplan, char *context);
/** \brief Play a file into channel and collect dtmfs
@@ -236,14 +236,13 @@
* setDTMFCallback(..) as it uses its own internal callback
* handler.
*/
- SWITCH_DECLARE(int) playAndGetDigits(int min_digits,
+ SWITCH_DECLARE(char *) playAndGetDigits(int min_digits,
int max_digits,
int max_tries,
int timeout,
char *terminators,
char *audio_files,
char *bad_input_audio_files,
- char *dtmf_buf,
char *digits_regex);
/** \brief Play a file that resides on disk into the channel
Modified: freeswitch/trunk/src/mod/languages/mod_java/src/org/freeswitch/swig/CoreSession.java
==============================================================================
--- freeswitch/trunk/src/mod/languages/mod_java/src/org/freeswitch/swig/CoreSession.java (original)
+++ freeswitch/trunk/src/mod/languages/mod_java/src/org/freeswitch/swig/CoreSession.java Thu May 1 15:03:57 2008
@@ -161,16 +161,16 @@
return freeswitchJNI.CoreSession_collectDigits(swigCPtr, this, timeout);
}
- public int getDigits(byte[] dtmf_buf, SWIGTYPE_p_switch_size_t buflen, SWIGTYPE_p_switch_size_t maxdigits, String terminators, byte[] terminator, int timeout) {
- return freeswitchJNI.CoreSession_getDigits(swigCPtr, this, dtmf_buf, SWIGTYPE_p_switch_size_t.getCPtr(buflen), SWIGTYPE_p_switch_size_t.getCPtr(maxdigits), terminators, terminator, timeout);
+ public String getDigits(SWIGTYPE_p_switch_size_t maxdigits, String terminators, byte[] terminator, int timeout) {
+ return freeswitchJNI.CoreSession_getDigits(swigCPtr, this, SWIGTYPE_p_switch_size_t.getCPtr(maxdigits), terminators, terminator, timeout);
}
public int transfer(String extensions, String dialplan, String context) {
return freeswitchJNI.CoreSession_transfer(swigCPtr, this, extensions, dialplan, context);
}
- public int playAndGetDigits(int min_digits, int max_digits, int max_tries, int timeout, String terminators, String audio_files, String bad_input_audio_files, byte[] dtmf_buf, String digits_regex) {
- return freeswitchJNI.CoreSession_playAndGetDigits(swigCPtr, this, min_digits, max_digits, max_tries, timeout, terminators, audio_files, bad_input_audio_files, dtmf_buf, digits_regex);
+ public String playAndGetDigits(int min_digits, int max_digits, int max_tries, int timeout, String terminators, String audio_files, String bad_input_audio_files, String digits_regex) {
+ return freeswitchJNI.CoreSession_playAndGetDigits(swigCPtr, this, min_digits, max_digits, max_tries, timeout, terminators, audio_files, bad_input_audio_files, digits_regex);
}
public int streamFile(String file, int starting_sample_count) {
Modified: freeswitch/trunk/src/mod/languages/mod_java/src/org/freeswitch/swig/freeswitchJNI.java
==============================================================================
--- freeswitch/trunk/src/mod/languages/mod_java/src/org/freeswitch/swig/freeswitchJNI.java (original)
+++ freeswitch/trunk/src/mod/languages/mod_java/src/org/freeswitch/swig/freeswitchJNI.java Thu May 1 15:03:57 2008
@@ -87,9 +87,9 @@
public final static native int CoreSession_speak(long jarg1, CoreSession jarg1_, String jarg2);
public final static native void CoreSession_set_tts_parms(long jarg1, CoreSession jarg1_, String jarg2, String jarg3);
public final static native int CoreSession_collectDigits(long jarg1, CoreSession jarg1_, int jarg2);
- public final static native int CoreSession_getDigits(long jarg1, CoreSession jarg1_, byte[] jarg2, long jarg3, long jarg4, String jarg5, byte[] jarg6, int jarg7);
+ public final static native String CoreSession_getDigits(long jarg1, CoreSession jarg1_, long jarg2, String jarg3, byte[] jarg4, int jarg5);
public final static native int CoreSession_transfer(long jarg1, CoreSession jarg1_, String jarg2, String jarg3, String jarg4);
- public final static native int CoreSession_playAndGetDigits(long jarg1, CoreSession jarg1_, int jarg2, int jarg3, int jarg4, int jarg5, String jarg6, String jarg7, String jarg8, byte[] jarg9, String jarg10);
+ public final static native String CoreSession_playAndGetDigits(long jarg1, CoreSession jarg1_, int jarg2, int jarg3, int jarg4, int jarg5, String jarg6, String jarg7, String jarg8, String jarg9);
public final static native int CoreSession_streamFile__SWIG_0(long jarg1, CoreSession jarg1_, String jarg2, int jarg3);
public final static native int CoreSession_streamFile__SWIG_1(long jarg1, CoreSession jarg1_, String jarg2);
public final static native int CoreSession_flushEvents(long jarg1, CoreSession jarg1_);
Modified: freeswitch/trunk/src/mod/languages/mod_java/switch_swig_wrap.cpp
==============================================================================
--- freeswitch/trunk/src/mod/languages/mod_java/switch_swig_wrap.cpp (original)
+++ freeswitch/trunk/src/mod/languages/mod_java/switch_swig_wrap.cpp Thu May 1 15:03:57 2008
@@ -1576,59 +1576,42 @@
}
-SWIGEXPORT jint JNICALL Java_org_freeswitch_swig_freeswitchJNI_CoreSession_1getDigits(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jbyteArray jarg2, jlong jarg3, jlong jarg4, jstring jarg5, jbyteArray jarg6, jint jarg7) {
- jint jresult = 0 ;
+SWIGEXPORT jstring JNICALL Java_org_freeswitch_swig_freeswitchJNI_CoreSession_1getDigits(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jstring jarg3, jbyteArray jarg4, jint jarg5) {
+ jstring jresult = 0 ;
CoreSession *arg1 = (CoreSession *) 0 ;
- char *arg2 = (char *) 0 ;
- switch_size_t arg3 ;
- switch_size_t arg4 ;
- char *arg5 = (char *) 0 ;
- char *arg6 = (char *) 0 ;
- int arg7 ;
- int result;
- switch_size_t *argp3 ;
- switch_size_t *argp4 ;
+ switch_size_t arg2 ;
+ char *arg3 = (char *) 0 ;
+ char *arg4 = (char *) 0 ;
+ int arg5 ;
+ char *result = 0 ;
+ switch_size_t *argp2 ;
(void)jenv;
(void)jcls;
(void)jarg1_;
arg1 = *(CoreSession **)&jarg1;
- {
- arg2 = (char*) jenv->GetByteArrayElements(jarg2, 0);
- if (!arg2) return 0;
- }
- argp3 = *(switch_size_t **)&jarg3;
- if (!argp3) {
- SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null switch_size_t");
- return 0;
- }
- arg3 = *argp3;
- argp4 = *(switch_size_t **)&jarg4;
- if (!argp4) {
+ argp2 = *(switch_size_t **)&jarg2;
+ if (!argp2) {
SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null switch_size_t");
return 0;
}
- arg4 = *argp4;
- arg5 = 0;
- if (jarg5) {
- arg5 = (char *)jenv->GetStringUTFChars(jarg5, 0);
- if (!arg5) return 0;
- }
- {
- arg6 = (char*) jenv->GetByteArrayElements(jarg6, 0);
- if (!arg6) return 0;
+ arg2 = *argp2;
+ arg3 = 0;
+ if (jarg3) {
+ arg3 = (char *)jenv->GetStringUTFChars(jarg3, 0);
+ if (!arg3) return 0;
}
- arg7 = (int)jarg7;
- result = (int)(arg1)->getDigits(arg2,arg3,arg4,arg5,arg6,arg7);
- jresult = (jint)result;
{
- jenv->ReleaseByteArrayElements(jarg2, (jbyte*) arg2, 0);
+ arg4 = (char*) jenv->GetByteArrayElements(jarg4, 0);
+ if (!arg4) return 0;
}
+ arg5 = (int)jarg5;
+ result = (char *)(arg1)->getDigits(arg2,arg3,arg4,arg5);
+ if(result) jresult = jenv->NewStringUTF((const char *)result);
{
- jenv->ReleaseByteArrayElements(jarg6, (jbyte*) arg6, 0);
+ jenv->ReleaseByteArrayElements(jarg4, (jbyte*) arg4, 0);
}
-
- if (arg5) jenv->ReleaseStringUTFChars(jarg5, (const char *)arg5);
+ if (arg3) jenv->ReleaseStringUTFChars(jarg3, (const char *)arg3);
return jresult;
}
@@ -1670,8 +1653,8 @@
}
-SWIGEXPORT jint JNICALL Java_org_freeswitch_swig_freeswitchJNI_CoreSession_1playAndGetDigits(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jint jarg2, jint jarg3, jint jarg4, jint jarg5, jstring jarg6, jstring jarg7, jstring jarg8, jbyteArray jarg9, jstring jarg10) {
- jint jresult = 0 ;
+SWIGEXPORT jstring JNICALL Java_org_freeswitch_swig_freeswitchJNI_CoreSession_1playAndGetDigits(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jint jarg2, jint jarg3, jint jarg4, jint jarg5, jstring jarg6, jstring jarg7, jstring jarg8, jstring jarg9) {
+ jstring jresult = 0 ;
CoreSession *arg1 = (CoreSession *) 0 ;
int arg2 ;
int arg3 ;
@@ -1681,8 +1664,7 @@
char *arg7 = (char *) 0 ;
char *arg8 = (char *) 0 ;
char *arg9 = (char *) 0 ;
- char *arg10 = (char *) 0 ;
- int result;
+ char *result = 0 ;
(void)jenv;
(void)jcls;
@@ -1707,25 +1689,17 @@
arg8 = (char *)jenv->GetStringUTFChars(jarg8, 0);
if (!arg8) return 0;
}
- {
- arg9 = (char*) jenv->GetByteArrayElements(jarg9, 0);
+ arg9 = 0;
+ if (jarg9) {
+ arg9 = (char *)jenv->GetStringUTFChars(jarg9, 0);
if (!arg9) return 0;
}
- arg10 = 0;
- if (jarg10) {
- arg10 = (char *)jenv->GetStringUTFChars(jarg10, 0);
- if (!arg10) return 0;
- }
- result = (int)(arg1)->playAndGetDigits(arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10);
- jresult = (jint)result;
- {
- jenv->ReleaseByteArrayElements(jarg9, (jbyte*) arg9, 0);
- }
+ result = (char *)(arg1)->playAndGetDigits(arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9);
+ if(result) jresult = jenv->NewStringUTF((const char *)result);
if (arg6) jenv->ReleaseStringUTFChars(jarg6, (const char *)arg6);
if (arg7) jenv->ReleaseStringUTFChars(jarg7, (const char *)arg7);
if (arg8) jenv->ReleaseStringUTFChars(jarg8, (const char *)arg8);
-
- if (arg10) jenv->ReleaseStringUTFChars(jarg10, (const char *)arg10);
+ if (arg9) jenv->ReleaseStringUTFChars(jarg9, (const char *)arg9);
return jresult;
}
Modified: freeswitch/trunk/src/mod/languages/mod_lua/mod_lua_wrap.cpp
==============================================================================
--- freeswitch/trunk/src/mod/languages/mod_lua/mod_lua_wrap.cpp (original)
+++ freeswitch/trunk/src/mod/languages/mod_lua/mod_lua_wrap.cpp Thu May 1 15:03:57 2008
@@ -4097,48 +4097,36 @@
static int _wrap_CoreSession_getDigits(lua_State* L) {
int SWIG_arg = -1;
CoreSession *arg1 = (CoreSession *) 0 ;
- char *arg2 = (char *) 0 ;
- switch_size_t arg3 ;
- switch_size_t arg4 ;
- char *arg5 = (char *) 0 ;
- char *arg6 = (char *) 0 ;
- int arg7 ;
- int result;
- switch_size_t *argp3 ;
- switch_size_t *argp4 ;
+ switch_size_t arg2 ;
+ char *arg3 = (char *) 0 ;
+ char *arg4 = (char *) 0 ;
+ int arg5 ;
+ char *result = 0 ;
+ switch_size_t *argp2 ;
- SWIG_check_num_args("getDigits",7,7)
+ SWIG_check_num_args("getDigits",5,5)
if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("getDigits",1,"CoreSession *");
- if(!lua_isstring(L,2)) SWIG_fail_arg("getDigits",2,"char *");
- if(!lua_isuserdata(L,3)) SWIG_fail_arg("getDigits",3,"switch_size_t");
- if(!lua_isuserdata(L,4)) SWIG_fail_arg("getDigits",4,"switch_size_t");
- if(!lua_isstring(L,5)) SWIG_fail_arg("getDigits",5,"char *");
- if(!lua_isstring(L,6)) SWIG_fail_arg("getDigits",6,"char *");
- if(!lua_isnumber(L,7)) SWIG_fail_arg("getDigits",7,"int");
+ if(!lua_isuserdata(L,2)) SWIG_fail_arg("getDigits",2,"switch_size_t");
+ if(!lua_isstring(L,3)) SWIG_fail_arg("getDigits",3,"char *");
+ if(!lua_isstring(L,4)) SWIG_fail_arg("getDigits",4,"char *");
+ if(!lua_isnumber(L,5)) SWIG_fail_arg("getDigits",5,"int");
if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_CoreSession,0))){
SWIG_fail_ptr("CoreSession_getDigits",1,SWIGTYPE_p_CoreSession);
}
- arg2 = (char *)lua_tostring(L, 2);
-
- if (!SWIG_IsOK(SWIG_ConvertPtr(L,3,(void**)&argp3,SWIGTYPE_p_switch_size_t,0))){
- SWIG_fail_ptr("CoreSession_getDigits",3,SWIGTYPE_p_switch_size_t);
- }
- arg3 = *argp3;
-
- if (!SWIG_IsOK(SWIG_ConvertPtr(L,4,(void**)&argp4,SWIGTYPE_p_switch_size_t,0))){
- SWIG_fail_ptr("CoreSession_getDigits",4,SWIGTYPE_p_switch_size_t);
+ if (!SWIG_IsOK(SWIG_ConvertPtr(L,2,(void**)&argp2,SWIGTYPE_p_switch_size_t,0))){
+ SWIG_fail_ptr("CoreSession_getDigits",2,SWIGTYPE_p_switch_size_t);
}
- arg4 = *argp4;
+ arg2 = *argp2;
- arg5 = (char *)lua_tostring(L, 5);
- arg6 = (char *)lua_tostring(L, 6);
- arg7 = (int)lua_tonumber(L, 7);
- result = (int)(arg1)->getDigits(arg2,arg3,arg4,arg5,arg6,arg7);
+ arg3 = (char *)lua_tostring(L, 3);
+ arg4 = (char *)lua_tostring(L, 4);
+ arg5 = (int)lua_tonumber(L, 5);
+ result = (char *)(arg1)->getDigits(arg2,arg3,arg4,arg5);
SWIG_arg=0;
- lua_pushnumber(L, (lua_Number) result); SWIG_arg++;
+ lua_pushstring(L,(const char*)result); SWIG_arg++;
return SWIG_arg;
if(0) SWIG_fail;
@@ -4194,10 +4182,9 @@
char *arg7 = (char *) 0 ;
char *arg8 = (char *) 0 ;
char *arg9 = (char *) 0 ;
- char *arg10 = (char *) 0 ;
- int result;
+ char *result = 0 ;
- SWIG_check_num_args("playAndGetDigits",10,10)
+ SWIG_check_num_args("playAndGetDigits",9,9)
if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("playAndGetDigits",1,"CoreSession *");
if(!lua_isnumber(L,2)) SWIG_fail_arg("playAndGetDigits",2,"int");
if(!lua_isnumber(L,3)) SWIG_fail_arg("playAndGetDigits",3,"int");
@@ -4207,7 +4194,6 @@
if(!lua_isstring(L,7)) SWIG_fail_arg("playAndGetDigits",7,"char *");
if(!lua_isstring(L,8)) SWIG_fail_arg("playAndGetDigits",8,"char *");
if(!lua_isstring(L,9)) SWIG_fail_arg("playAndGetDigits",9,"char *");
- if(!lua_isstring(L,10)) SWIG_fail_arg("playAndGetDigits",10,"char *");
if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_CoreSession,0))){
SWIG_fail_ptr("CoreSession_playAndGetDigits",1,SWIGTYPE_p_CoreSession);
@@ -4221,10 +4207,9 @@
arg7 = (char *)lua_tostring(L, 7);
arg8 = (char *)lua_tostring(L, 8);
arg9 = (char *)lua_tostring(L, 9);
- arg10 = (char *)lua_tostring(L, 10);
- result = (int)(arg1)->playAndGetDigits(arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10);
+ result = (char *)(arg1)->playAndGetDigits(arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9);
SWIG_arg=0;
- lua_pushnumber(L, (lua_Number) result); SWIG_arg++;
+ lua_pushstring(L,(const char*)result); SWIG_arg++;
return SWIG_arg;
if(0) SWIG_fail;
Modified: freeswitch/trunk/src/mod/languages/mod_perl/mod_perl_wrap.cpp
==============================================================================
--- freeswitch/trunk/src/mod/languages/mod_perl/mod_perl_wrap.cpp (original)
+++ freeswitch/trunk/src/mod/languages/mod_perl/mod_perl_wrap.cpp Thu May 1 15:03:57 2008
@@ -5223,96 +5223,71 @@
XS(_wrap_CoreSession_getDigits) {
{
CoreSession *arg1 = (CoreSession *) 0 ;
- char *arg2 = (char *) 0 ;
- switch_size_t arg3 ;
- switch_size_t arg4 ;
- char *arg5 = (char *) 0 ;
- char *arg6 = (char *) 0 ;
- int arg7 ;
- int result;
+ switch_size_t arg2 ;
+ char *arg3 = (char *) 0 ;
+ char *arg4 = (char *) 0 ;
+ int arg5 ;
+ char *result = 0 ;
void *argp1 = 0 ;
int res1 = 0 ;
- int res2 ;
- char *buf2 = 0 ;
- int alloc2 = 0 ;
- void *argp3 ;
- int res3 = 0 ;
- void *argp4 ;
- int res4 = 0 ;
- int res5 ;
- char *buf5 = 0 ;
- int alloc5 = 0 ;
- int res6 ;
- char *buf6 = 0 ;
- int alloc6 = 0 ;
- int val7 ;
- int ecode7 = 0 ;
+ void *argp2 ;
+ int res2 = 0 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ int res4 ;
+ char *buf4 = 0 ;
+ int alloc4 = 0 ;
+ int val5 ;
+ int ecode5 = 0 ;
int argvi = 0;
dXSARGS;
- if ((items < 7) || (items > 7)) {
- SWIG_croak("Usage: CoreSession_getDigits(self,dtmf_buf,buflen,maxdigits,terminators,terminator,timeout);");
+ if ((items < 5) || (items > 5)) {
+ SWIG_croak("Usage: CoreSession_getDigits(self,maxdigits,terminators,terminator,timeout);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_CoreSession, 0 | 0 );
if (!SWIG_IsOK(res1)) {
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CoreSession_getDigits" "', argument " "1"" of type '" "CoreSession *""'");
}
arg1 = reinterpret_cast< CoreSession * >(argp1);
- res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CoreSession_getDigits" "', argument " "2"" of type '" "char *""'");
- }
- arg2 = reinterpret_cast< char * >(buf2);
{
- res3 = SWIG_ConvertPtr(ST(2), &argp3, SWIGTYPE_p_switch_size_t, 0 );
- if (!SWIG_IsOK(res3)) {
- SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "CoreSession_getDigits" "', argument " "3"" of type '" "switch_size_t""'");
+ res2 = SWIG_ConvertPtr(ST(1), &argp2, SWIGTYPE_p_switch_size_t, 0 );
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CoreSession_getDigits" "', argument " "2"" of type '" "switch_size_t""'");
}
- if (!argp3) {
- SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CoreSession_getDigits" "', argument " "3"" of type '" "switch_size_t""'");
+ if (!argp2) {
+ SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CoreSession_getDigits" "', argument " "2"" of type '" "switch_size_t""'");
} else {
- arg3 = *(reinterpret_cast< switch_size_t * >(argp3));
+ arg2 = *(reinterpret_cast< switch_size_t * >(argp2));
}
}
- {
- res4 = SWIG_ConvertPtr(ST(3), &argp4, SWIGTYPE_p_switch_size_t, 0 );
- if (!SWIG_IsOK(res4)) {
- SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "CoreSession_getDigits" "', argument " "4"" of type '" "switch_size_t""'");
- }
- if (!argp4) {
- SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CoreSession_getDigits" "', argument " "4"" of type '" "switch_size_t""'");
- } else {
- arg4 = *(reinterpret_cast< switch_size_t * >(argp4));
- }
- }
- res5 = SWIG_AsCharPtrAndSize(ST(4), &buf5, NULL, &alloc5);
- if (!SWIG_IsOK(res5)) {
- SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "CoreSession_getDigits" "', argument " "5"" of type '" "char *""'");
+ res3 = SWIG_AsCharPtrAndSize(ST(2), &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "CoreSession_getDigits" "', argument " "3"" of type '" "char *""'");
}
- arg5 = reinterpret_cast< char * >(buf5);
- res6 = SWIG_AsCharPtrAndSize(ST(5), &buf6, NULL, &alloc6);
- if (!SWIG_IsOK(res6)) {
- SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "CoreSession_getDigits" "', argument " "6"" of type '" "char *""'");
+ arg3 = reinterpret_cast< char * >(buf3);
+ res4 = SWIG_AsCharPtrAndSize(ST(3), &buf4, NULL, &alloc4);
+ if (!SWIG_IsOK(res4)) {
+ SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "CoreSession_getDigits" "', argument " "4"" of type '" "char *""'");
}
- arg6 = reinterpret_cast< char * >(buf6);
- ecode7 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(6), &val7);
- if (!SWIG_IsOK(ecode7)) {
- SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "CoreSession_getDigits" "', argument " "7"" of type '" "int""'");
+ arg4 = reinterpret_cast< char * >(buf4);
+ ecode5 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(4), &val5);
+ if (!SWIG_IsOK(ecode5)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "CoreSession_getDigits" "', argument " "5"" of type '" "int""'");
}
- arg7 = static_cast< int >(val7);
- result = (int)(arg1)->getDigits(arg2,arg3,arg4,arg5,arg6,arg7);
- ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ;
+ arg5 = static_cast< int >(val5);
+ result = (char *)(arg1)->getDigits(arg2,arg3,arg4,arg5);
+ ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ;
- if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
- if (alloc5 == SWIG_NEWOBJ) delete[] buf5;
- if (alloc6 == SWIG_NEWOBJ) delete[] buf6;
+ if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
+ if (alloc4 == SWIG_NEWOBJ) delete[] buf4;
XSRETURN(argvi);
fail:
- if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
- if (alloc5 == SWIG_NEWOBJ) delete[] buf5;
- if (alloc6 == SWIG_NEWOBJ) delete[] buf6;
+ if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
+ if (alloc4 == SWIG_NEWOBJ) delete[] buf4;
SWIG_croak_null();
}
@@ -5391,8 +5366,7 @@
char *arg7 = (char *) 0 ;
char *arg8 = (char *) 0 ;
char *arg9 = (char *) 0 ;
- char *arg10 = (char *) 0 ;
- int result;
+ char *result = 0 ;
void *argp1 = 0 ;
int res1 = 0 ;
int val2 ;
@@ -5415,14 +5389,11 @@
int res9 ;
char *buf9 = 0 ;
int alloc9 = 0 ;
- int res10 ;
- char *buf10 = 0 ;
- int alloc10 = 0 ;
int argvi = 0;
dXSARGS;
- if ((items < 10) || (items > 10)) {
- SWIG_croak("Usage: CoreSession_playAndGetDigits(self,min_digits,max_digits,max_tries,timeout,terminators,audio_files,bad_input_audio_files,dtmf_buf,digits_regex);");
+ if ((items < 9) || (items > 9)) {
+ SWIG_croak("Usage: CoreSession_playAndGetDigits(self,min_digits,max_digits,max_tries,timeout,terminators,audio_files,bad_input_audio_files,digits_regex);");
}
res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_CoreSession, 0 | 0 );
if (!SWIG_IsOK(res1)) {
@@ -5469,13 +5440,8 @@
SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "CoreSession_playAndGetDigits" "', argument " "9"" of type '" "char *""'");
}
arg9 = reinterpret_cast< char * >(buf9);
- res10 = SWIG_AsCharPtrAndSize(ST(9), &buf10, NULL, &alloc10);
- if (!SWIG_IsOK(res10)) {
- SWIG_exception_fail(SWIG_ArgError(res10), "in method '" "CoreSession_playAndGetDigits" "', argument " "10"" of type '" "char *""'");
- }
- arg10 = reinterpret_cast< char * >(buf10);
- result = (int)(arg1)->playAndGetDigits(arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10);
- ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ;
+ result = (char *)(arg1)->playAndGetDigits(arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9);
+ ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ;
@@ -5485,7 +5451,6 @@
if (alloc7 == SWIG_NEWOBJ) delete[] buf7;
if (alloc8 == SWIG_NEWOBJ) delete[] buf8;
if (alloc9 == SWIG_NEWOBJ) delete[] buf9;
- if (alloc10 == SWIG_NEWOBJ) delete[] buf10;
XSRETURN(argvi);
fail:
@@ -5497,7 +5462,6 @@
if (alloc7 == SWIG_NEWOBJ) delete[] buf7;
if (alloc8 == SWIG_NEWOBJ) delete[] buf8;
if (alloc9 == SWIG_NEWOBJ) delete[] buf9;
- if (alloc10 == SWIG_NEWOBJ) delete[] buf10;
SWIG_croak_null();
}
}
Modified: freeswitch/trunk/src/mod/languages/mod_python/mod_python_wrap.cpp
==============================================================================
--- freeswitch/trunk/src/mod/languages/mod_python/mod_python_wrap.cpp (original)
+++ freeswitch/trunk/src/mod/languages/mod_python/mod_python_wrap.cpp Thu May 1 15:03:57 2008
@@ -5631,112 +5631,77 @@
SWIGINTERN PyObject *_wrap_CoreSession_getDigits(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
CoreSession *arg1 = (CoreSession *) 0 ;
- char *arg2 = (char *) 0 ;
- switch_size_t arg3 ;
- switch_size_t arg4 ;
- char *arg5 = (char *) 0 ;
- char *arg6 = (char *) 0 ;
- int arg7 ;
- int result;
+ switch_size_t arg2 ;
+ char *arg3 = (char *) 0 ;
+ char *arg4 = (char *) 0 ;
+ int arg5 ;
+ char *result = 0 ;
void *argp1 = 0 ;
int res1 = 0 ;
- int res2 ;
- char temp2[128+1] ;
- char *t2 = 0 ;
- size_t n2 = 0 ;
- int alloc2 = 0 ;
- void *argp3 ;
- int res3 = 0 ;
- void *argp4 ;
- int res4 = 0 ;
- int res5 ;
- char *buf5 = 0 ;
- int alloc5 = 0 ;
- int res6 ;
- char temp6[8+1] ;
- char *t6 = 0 ;
- size_t n6 = 0 ;
- int alloc6 = 0 ;
- int val7 ;
- int ecode7 = 0 ;
+ void *argp2 ;
+ int res2 = 0 ;
+ int res3 ;
+ char *buf3 = 0 ;
+ int alloc3 = 0 ;
+ int res4 ;
+ char temp4[8+1] ;
+ char *t4 = 0 ;
+ size_t n4 = 0 ;
+ int alloc4 = 0 ;
+ int val5 ;
+ int ecode5 = 0 ;
PyObject * obj0 = 0 ;
PyObject * obj1 = 0 ;
PyObject * obj2 = 0 ;
PyObject * obj3 = 0 ;
PyObject * obj4 = 0 ;
- PyObject * obj5 = 0 ;
- PyObject * obj6 = 0 ;
- if (!PyArg_ParseTuple(args,(char *)"OOOOOOO:CoreSession_getDigits",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail;
+ if (!PyArg_ParseTuple(args,(char *)"OOOOO:CoreSession_getDigits",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_CoreSession, 0 | 0 );
if (!SWIG_IsOK(res1)) {
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CoreSession_getDigits" "', argument " "1"" of type '" "CoreSession *""'");
}
arg1 = reinterpret_cast< CoreSession * >(argp1);
- res2 = SWIG_AsCharPtrAndSize(obj1, &t2, &n2, &alloc2);
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CoreSession_getDigits" "', argument " "2"" of type '" "char *dtmf_buf""'");
- }
- if ( n2 > (size_t) 128 ) n2 = (size_t) 128;
- memcpy(temp2, t2, sizeof(char)*n2);
- if (alloc2 == SWIG_NEWOBJ) delete[] t2;
- temp2[n2 - 1] = 0;
- arg2 = (char *) temp2;
{
- res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_switch_size_t, 0 | 0);
- if (!SWIG_IsOK(res3)) {
- SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "CoreSession_getDigits" "', argument " "3"" of type '" "switch_size_t""'");
+ res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_switch_size_t, 0 | 0);
+ if (!SWIG_IsOK(res2)) {
+ SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CoreSession_getDigits" "', argument " "2"" of type '" "switch_size_t""'");
}
- if (!argp3) {
- SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CoreSession_getDigits" "', argument " "3"" of type '" "switch_size_t""'");
+ if (!argp2) {
+ SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CoreSession_getDigits" "', argument " "2"" of type '" "switch_size_t""'");
} else {
- switch_size_t * temp = reinterpret_cast< switch_size_t * >(argp3);
- arg3 = *temp;
- if (SWIG_IsNewObj(res3)) delete temp;
+ switch_size_t * temp = reinterpret_cast< switch_size_t * >(argp2);
+ arg2 = *temp;
+ if (SWIG_IsNewObj(res2)) delete temp;
}
}
- {
- res4 = SWIG_ConvertPtr(obj3, &argp4, SWIGTYPE_p_switch_size_t, 0 | 0);
- if (!SWIG_IsOK(res4)) {
- SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "CoreSession_getDigits" "', argument " "4"" of type '" "switch_size_t""'");
- }
- if (!argp4) {
- SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CoreSession_getDigits" "', argument " "4"" of type '" "switch_size_t""'");
- } else {
- switch_size_t * temp = reinterpret_cast< switch_size_t * >(argp4);
- arg4 = *temp;
- if (SWIG_IsNewObj(res4)) delete temp;
- }
- }
- res5 = SWIG_AsCharPtrAndSize(obj4, &buf5, NULL, &alloc5);
- if (!SWIG_IsOK(res5)) {
- SWIG_exception_fail(SWIG_ArgError(res5), "in method '" "CoreSession_getDigits" "', argument " "5"" of type '" "char *""'");
+ res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
+ if (!SWIG_IsOK(res3)) {
+ SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "CoreSession_getDigits" "', argument " "3"" of type '" "char *""'");
}
- arg5 = reinterpret_cast< char * >(buf5);
- res6 = SWIG_AsCharPtrAndSize(obj5, &t6, &n6, &alloc6);
- if (!SWIG_IsOK(res6)) {
- SWIG_exception_fail(SWIG_ArgError(res6), "in method '" "CoreSession_getDigits" "', argument " "6"" of type '" "char *terminator""'");
+ arg3 = reinterpret_cast< char * >(buf3);
+ res4 = SWIG_AsCharPtrAndSize(obj3, &t4, &n4, &alloc4);
+ if (!SWIG_IsOK(res4)) {
+ SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "CoreSession_getDigits" "', argument " "4"" of type '" "char *terminator""'");
}
- if ( n6 > (size_t) 8 ) n6 = (size_t) 8;
- memcpy(temp6, t6, sizeof(char)*n6);
- if (alloc6 == SWIG_NEWOBJ) delete[] t6;
- temp6[n6 - 1] = 0;
- arg6 = (char *) temp6;
- ecode7 = SWIG_AsVal_int(obj6, &val7);
- if (!SWIG_IsOK(ecode7)) {
- SWIG_exception_fail(SWIG_ArgError(ecode7), "in method '" "CoreSession_getDigits" "', argument " "7"" of type '" "int""'");
+ if ( n4 > (size_t) 8 ) n4 = (size_t) 8;
+ memcpy(temp4, t4, sizeof(char)*n4);
+ if (alloc4 == SWIG_NEWOBJ) delete[] t4;
+ temp4[n4 - 1] = 0;
+ arg4 = (char *) temp4;
+ ecode5 = SWIG_AsVal_int(obj4, &val5);
+ if (!SWIG_IsOK(ecode5)) {
+ SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "CoreSession_getDigits" "', argument " "5"" of type '" "int""'");
}
- arg7 = static_cast< int >(val7);
- result = (int)(arg1)->getDigits(arg2,arg3,arg4,arg5,arg6,arg7);
- resultobj = SWIG_From_int(static_cast< int >(result));
- arg2[128] = 0;
- resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_FromCharPtr(arg2));
- arg6[8] = 0;
- resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_FromCharPtr(arg6));
- if (alloc5 == SWIG_NEWOBJ) delete[] buf5;
+ arg5 = static_cast< int >(val5);
+ result = (char *)(arg1)->getDigits(arg2,arg3,arg4,arg5);
+ resultobj = SWIG_FromCharPtr((const char *)result);
+ arg4[8] = 0;
+ resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_FromCharPtr(arg4));
+ if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
return resultobj;
fail:
- if (alloc5 == SWIG_NEWOBJ) delete[] buf5;
+ if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
return NULL;
}
@@ -5810,8 +5775,7 @@
char *arg7 = (char *) 0 ;
char *arg8 = (char *) 0 ;
char *arg9 = (char *) 0 ;
- char *arg10 = (char *) 0 ;
- int result;
+ char *result = 0 ;
void *argp1 = 0 ;
int res1 = 0 ;
int val2 ;
@@ -5832,13 +5796,8 @@
char *buf8 = 0 ;
int alloc8 = 0 ;
int res9 ;
- char temp9[128+1] ;
- char *t9 = 0 ;
- size_t n9 = 0 ;
+ char *buf9 = 0 ;
int alloc9 = 0 ;
- int res10 ;
- char *buf10 = 0 ;
- int alloc10 = 0 ;
PyObject * obj0 = 0 ;
PyObject * obj1 = 0 ;
PyObject * obj2 = 0 ;
@@ -5848,9 +5807,8 @@
PyObject * obj6 = 0 ;
PyObject * obj7 = 0 ;
PyObject * obj8 = 0 ;
- PyObject * obj9 = 0 ;
- if (!PyArg_ParseTuple(args,(char *)"OOOOOOOOOO:CoreSession_playAndGetDigits",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8,&obj9)) SWIG_fail;
+ if (!PyArg_ParseTuple(args,(char *)"OOOOOOOOO:CoreSession_playAndGetDigits",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7,&obj8)) SWIG_fail;
res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_CoreSession, 0 | 0 );
if (!SWIG_IsOK(res1)) {
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CoreSession_playAndGetDigits" "', argument " "1"" of type '" "CoreSession *""'");
@@ -5891,34 +5849,23 @@
SWIG_exception_fail(SWIG_ArgError(res8), "in method '" "CoreSession_playAndGetDigits" "', argument " "8"" of type '" "char *""'");
}
arg8 = reinterpret_cast< char * >(buf8);
- res9 = SWIG_AsCharPtrAndSize(obj8, &t9, &n9, &alloc9);
+ res9 = SWIG_AsCharPtrAndSize(obj8, &buf9, NULL, &alloc9);
if (!SWIG_IsOK(res9)) {
- SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "CoreSession_playAndGetDigits" "', argument " "9"" of type '" "char *dtmf_buf""'");
+ SWIG_exception_fail(SWIG_ArgError(res9), "in method '" "CoreSession_playAndGetDigits" "', argument " "9"" of type '" "char *""'");
}
- if ( n9 > (size_t) 128 ) n9 = (size_t) 128;
- memcpy(temp9, t9, sizeof(char)*n9);
- if (alloc9 == SWIG_NEWOBJ) delete[] t9;
- temp9[n9 - 1] = 0;
- arg9 = (char *) temp9;
- res10 = SWIG_AsCharPtrAndSize(obj9, &buf10, NULL, &alloc10);
- if (!SWIG_IsOK(res10)) {
- SWIG_exception_fail(SWIG_ArgError(res10), "in method '" "CoreSession_playAndGetDigits" "', argument " "10"" of type '" "char *""'");
- }
- arg10 = reinterpret_cast< char * >(buf10);
- result = (int)(arg1)->playAndGetDigits(arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10);
- resultobj = SWIG_From_int(static_cast< int >(result));
- arg9[128] = 0;
- resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_FromCharPtr(arg9));
+ arg9 = reinterpret_cast< char * >(buf9);
+ result = (char *)(arg1)->playAndGetDigits(arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9);
+ resultobj = SWIG_FromCharPtr((const char *)result);
if (alloc6 == SWIG_NEWOBJ) delete[] buf6;
if (alloc7 == SWIG_NEWOBJ) delete[] buf7;
if (alloc8 == SWIG_NEWOBJ) delete[] buf8;
- if (alloc10 == SWIG_NEWOBJ) delete[] buf10;
+ if (alloc9 == SWIG_NEWOBJ) delete[] buf9;
return resultobj;
fail:
if (alloc6 == SWIG_NEWOBJ) delete[] buf6;
if (alloc7 == SWIG_NEWOBJ) delete[] buf7;
if (alloc8 == SWIG_NEWOBJ) delete[] buf8;
- if (alloc10 == SWIG_NEWOBJ) delete[] buf10;
+ if (alloc9 == SWIG_NEWOBJ) delete[] buf9;
return NULL;
}
Modified: freeswitch/trunk/src/switch_cpp.cpp
==============================================================================
--- freeswitch/trunk/src/switch_cpp.cpp (original)
+++ freeswitch/trunk/src/switch_cpp.cpp Thu May 1 15:03:57 2008
@@ -470,20 +470,19 @@
return SWITCH_STATUS_SUCCESS;
}
-SWITCH_DECLARE(int) CoreSession::getDigits(char *dtmf_buf,
- switch_size_t buflen,
- switch_size_t maxdigits,
- char *terminators,
- char *terminator,
- int timeout)
+SWITCH_DECLARE(char *) CoreSession::getDigits(switch_size_t maxdigits,
+ char *terminators,
+ char *terminator,
+ int timeout)
{
switch_status_t status;
- sanity_check(-1);
+ sanity_check("");
begin_allow_threads();
+ memset(dtmf_buf, 0, sizeof(dtmf_buf));
status = switch_ivr_collect_digits_count(session,
dtmf_buf,
- buflen,
+ sizeof(dtmf_buf),
maxdigits,
terminators,
terminator,
@@ -491,7 +490,7 @@
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "getDigits dtmf_buf: %s\n", dtmf_buf);
end_allow_threads();
- return status == SWITCH_STATUS_SUCCESS ? 1 : 0;
+ return dtmf_buf;
}
SWITCH_DECLARE(int) CoreSession::transfer(char *extension, char *dialplan, char *context)
@@ -505,19 +504,19 @@
return status == SWITCH_STATUS_SUCCESS ? 1 : 0;
}
-SWITCH_DECLARE(int) CoreSession::playAndGetDigits(int min_digits,
- int max_digits,
- int max_tries,
- int timeout,
- char *terminators,
- char *audio_files,
- char *bad_input_audio_files,
- char *dtmf_buf,
- char *digits_regex)
+SWITCH_DECLARE(char *) CoreSession::playAndGetDigits(int min_digits,
+ int max_digits,
+ int max_tries,
+ int timeout,
+ char *terminators,
+ char *audio_files,
+ char *bad_input_audio_files,
+ char *digits_regex)
{
switch_status_t status;
- sanity_check(-1);
+ sanity_check("");
begin_allow_threads();
+ memset(dtmf_buf, 0, sizeof(dtmf_buf));
status = switch_play_and_get_digits( session,
(uint32_t) min_digits,
(uint32_t) max_digits,
@@ -527,13 +526,13 @@
audio_files,
bad_input_audio_files,
dtmf_buf,
- 128,
+ sizeof(dtmf_buf),
digits_regex);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "playAndGetDigits dtmf_buf: %s\n", dtmf_buf);
end_allow_threads();
- return status == SWITCH_STATUS_SUCCESS ? 1 : 0;
+ return dtmf_buf;
}
SWITCH_DECLARE(int) CoreSession::streamFile(char *file, int starting_sample_count) {
Modified: freeswitch/trunk/src/switch_ivr_play_say.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr_play_say.c (original)
+++ freeswitch/trunk/src/switch_ivr_play_say.c Thu May 1 15:03:57 2008
@@ -1239,7 +1239,7 @@
switch_channel_pre_answer(channel);
//Start pestering the user for input
- for (; (switch_channel_get_state(channel) == CS_EXECUTE) && max_tries > 0; max_tries--) {
+ for (; switch_channel_ready(channel) && max_tries > 0; max_tries--) {
switch_input_args_t args = { 0 };
//make the buffer so fresh and so clean clean
memset(digit_buffer, 0, digit_buffer_length);
1
0
[Freeswitch-svn] [commit] r8237 - in freeswitch/trunk/src: include mod/endpoints/mod_sofia
by Freeswitch SVN 01 May '08
by Freeswitch SVN 01 May '08
01 May '08
Author: anthm
Date: Thu May 1 14:35:45 2008
New Revision: 8237
Modified:
freeswitch/trunk/src/include/switch_types.h
freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c
freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c
Log:
let sip calls pass the exact response status across a bridge
Modified: freeswitch/trunk/src/include/switch_types.h
==============================================================================
--- freeswitch/trunk/src/include/switch_types.h (original)
+++ freeswitch/trunk/src/include/switch_types.h Thu May 1 14:35:45 2008
@@ -102,6 +102,7 @@
#define SWITCH_PATH_SEPARATOR "/"
#endif
#define SWITCH_URL_SEPARATOR "://"
+#define SWITCH_PROTO_SPECIFIC_HANGUP_CAUSE_VARIABLE "proto_specific_hangup_cause"
#define SWITCH_CHANNEL_EXECUTE_ON_ANSWER_VARIABLE "execute_on_answer"
#define SWITCH_CALL_TIMEOUT_VARIABLE "call_timeout"
#define SWITCH_HOLDING_UUID_VARIABLE "holding_uuid"
Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c
==============================================================================
--- freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c (original)
+++ freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c Thu May 1 14:35:45 2008
@@ -222,7 +222,14 @@
switch_channel_t *channel = switch_core_session_get_channel(session);
switch_call_cause_t cause = switch_channel_get_cause(channel);
int sip_cause = hangup_cause_to_sip(cause);
-
+ const char *ps_cause = switch_channel_get_variable(channel, SWITCH_PROTO_SPECIFIC_HANGUP_CAUSE_VARIABLE);
+
+ if (!switch_strlen_zero(ps_cause) && !strncasecmp(ps_cause, "sip:", 4)) {
+ int new_cause = atoi(ps_cause + 4);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s Overriding SIP cause %d with %d from the other leg\n",
+ switch_channel_get_name(channel), sip_cause, new_cause);
+ sip_cause = new_cause;
+ }
if (switch_test_flag(tech_pvt, TFLAG_SIP_HOLD) && cause != SWITCH_CAUSE_ATTENDED_TRANSFER) {
const char *buuid;
Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c
==============================================================================
--- freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c (original)
+++ freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c Thu May 1 14:35:45 2008
@@ -2106,6 +2106,8 @@
}
switch_snprintf(st, sizeof(st), "%d", status);
switch_channel_set_variable(channel, "sip_term_status", st);
+ switch_snprintf(st, sizeof(st), "sip:%d", status);
+ switch_channel_set_variable_partner(channel, SWITCH_PROTO_SPECIFIC_HANGUP_CAUSE_VARIABLE, st);
switch_snprintf(st, sizeof(st), "%d", cause);
switch_channel_set_variable(channel, "sip_term_cause", st);
switch_channel_hangup(channel, cause);
1
0
Author: verifier
Date: Thu May 1 14:27:39 2008
New Revision: 8236
Added:
freeswitch/trunk/scripts/contrib/verifier/EventSocket/
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Call.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/CallManager.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/CallStateEvent.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/EventWatcher.csproj
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Extension.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Form1.Designer.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Form1.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Form1.resx
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/LabelTextBox.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Program.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Properties/
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Properties/AssemblyInfo.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Properties/Resources.Designer.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Properties/Resources.resx
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Properties/Settings.Designer.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Properties/Settings.settings
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/ReadMePlease.txt
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitch.EventSocket.Test/
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitch.EventSocket.Test/EventSocket.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitch.EventSocket.Test/FreeSwitch.EventSocket.Test.csproj
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitch.EventSocket.Test/ParserTest.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitch.EventSocket.Test/Program.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitch.EventSocket.Test/Properties/
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitch.EventSocket.Test/Properties/AssemblyInfo.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitch.EventSocket.sln
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/ChannelEvent.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelAnswer.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelApplication.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelBridge.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelCreate.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelDestroy.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelExecute.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelExecuteComplete.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelHangup.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelOriginate.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelOutgoing.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelProgress.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelState.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelUnbridge.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelUnpark.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventCodec.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventDtmf.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventDtmfStatus.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelInfo.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/AnyCommand.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/Api.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/AuthCommand.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/CmdBase.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/CommandReply.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/ExecuteJavascript.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/GetVariable.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/HoldCmd.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/Originate.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/ParkCmd.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/Playback.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/RecordCmd.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/SendMsg.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/SetVariable.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/SleepCmd.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/TransferCmd.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/EventManager.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/EventParser.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/EventSocket.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/EventSocket.pfx (contents, props changed)
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events/
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events/EventApiCommand.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events/EventBase.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events/EventHeartbeat.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events/EventMessageQuery.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events/EventMessageWaiting.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events/EventReSchedule.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/FreeSwitch.EventSocket.csproj
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/General/
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/General/Address.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/General/ChannelVariable.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/General/SipAddress.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/General/SofiaSipAddress.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Ivr/
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Ivr/IvrInterface.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/PartyInfo.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/PlainEventMsg.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Program.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Properties/
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Properties/AssemblyInfo.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/SipEvents/
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/SipEvents/EventPresence.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/SipEvents/EventPresenceIn.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/SipEvents/EventPresenceOut.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/SipEvents/EventPresenceProbe.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/SipEvents/EventRoster.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/SipEvents/EventSofiaExpire.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/SipEvents/EventSofiaRegister.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/SipEvents/SipEvent.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/StringHelper.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/StringParser.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/IvrSocket/
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/IvrSocket/IvrSocket.csproj
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/IvrSocket/Program.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/IvrSocket/Properties/
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/IvrSocket/Properties/AssemblyInfo.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/IvrSocket/Voicemail.cs
Log:
Initial version
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Call.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Call.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,52 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace EventWatcher
+{
+ public class Call
+ {
+ private CallState _currentState = CallState.Disconnected;
+ private CallState _previousState = CallState.Disconnected;
+ private string _id;
+ private string _destination;
+
+ public Call(string id)
+ {
+ _id = id;
+ }
+
+ public string Id
+ {
+ get { return _id; }
+ set { _id = value; }
+ }
+
+ public string Destination
+ {
+ get { return _destination; }
+ }
+
+ public CallState State
+ {
+ get { return _currentState; }
+ }
+
+ public CallState PreviousState
+ {
+ get { return _previousState; }
+ }
+
+ internal void SetCallState(CallState state)
+ {
+ _previousState = _currentState;
+ _currentState = state;
+ }
+
+ internal void SetDestination(string dest)
+ {
+ _destination = dest;
+ }
+
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/CallManager.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/CallManager.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,251 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using FreeSwitch.EventSocket;
+using FreeSwitch.EventSocket.Commands;
+
+namespace EventWatcher
+{
+ internal class CallManager
+ {
+ #region Delegates
+
+ public delegate void CallStateHandler(CallManager mgr, CallStateEvent callEvent);
+
+ #endregion
+
+ private EventManager _eventMgr;
+ private IDictionary<string, CallStateEvent> _events = new Dictionary<string, CallStateEvent>();
+
+ private IDictionary<string, ExtensionMapper> _extensions = new Dictionary<string, ExtensionMapper>();
+ private int _lastCallId = 0;
+
+ public CallManager(EventManager eventSocket)
+ {
+ _eventMgr = eventSocket;
+ }
+
+ public event ExtensionHandler ExtensionAdded;
+ public event CallHandler ExtensionChanged;
+ public event ExtensionHandler ExtensionDisconnected;
+ public event CallStateHandler OnCallState;
+
+ private ExtensionMapper GetMapper(string address)
+ {
+ if (_extensions.ContainsKey(address))
+ return _extensions[address];
+ else
+ {
+ ExtensionMapper em = new ExtensionMapper();
+ em.setter = new ExtensionSetters();
+ em.extension = new Extension(address, em.setter);
+ _extensions.Add(address, em);
+ if (ExtensionAdded != null)
+ ExtensionAdded(em.extension);
+
+ return em;
+ }
+ }
+
+ private string ChannelDestination(string channelName)
+ {
+ //Check.Require(channelName, "Channel name must be set.");
+ string[] parts = channelName.Split('/');
+ //Check.Require(parts.Length == 3, "Channel must be sofia/<domain>/<user>");
+ return parts[2];
+ }
+
+ public void OnSwitchEvents(EventBase theEvent)
+ {
+ if (theEvent is EventPresenceIn)
+ {
+ EventPresenceIn ep = (EventPresenceIn) theEvent;
+ //Channel-State: CS_RING
+ //Channel-Name: sofia/default/jonas%40192.168.1.102%3A5070
+ //Unique-ID: 2f87ba27-2f71-d64d-8c64-9966ee894eac
+ //Call-Direction: inbound
+ //Answer-State: ringing
+ //Event-Name: PRESENCE_IN
+ CallState state = CallState.Unknown;
+ string destination = string.Empty;
+ if (ep.ChannelState.ChannelInfo.State == ChannelState.Ring)
+ {
+ if (IsInbound(ep))
+ {
+ state = CallState.Alerting;
+ destination = ep.Caller.DestinationNumber;
+ }
+ else
+ {
+ state = CallState.Offering;
+ destination = ep.Caller.UserName;
+ }
+ }
+ else if (ep.ChannelState.ChannelInfo.State == ChannelState.Hangup)
+ {
+ state = CallState.Disconnected;
+ if (IsInbound(ep))
+ destination = ep.Caller.DestinationNumber;
+ else
+ destination = ep.Caller.UserName;
+ }
+ if (state != CallState.Unknown)
+ TriggerCallState(ep.ChannelState.ChannelInfo.Address, ep.ChannelState.UniqueId, state, destination);
+ }
+ else if (theEvent is EventChannelAnswer)
+ {
+ EventChannelAnswer ea = (EventChannelAnswer) theEvent;
+ string destination;
+ if (IsInbound(ea))
+ destination = ea.Caller.DestinationNumber;
+ else
+ destination = ea.Caller.UserName;
+
+ TriggerCallState(ea.ChannelInfo.Address, ea.UniqueId, CallState.Connected, destination);
+ }
+
+ else if (theEvent is EventChannelDestroy)
+ {
+ EventChannelDestroy e = (EventChannelDestroy) theEvent;
+ Debug.WriteLine("triggering CallState.Disconnected");
+ TriggerCallState(e.ChannelInfo.Address, e.UniqueId, CallState.Disconnected,
+ e.Originator.DestinationNumber);
+ }
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="evt"></param>
+ /// <returns>true if it's inbound to pbx (not to user)</returns>
+ private bool IsInbound(EventBase evt)
+ {
+ return evt.Parameters["Call-Direction"] == "inbound";
+ }
+
+
+ public void OnSwitchEvents2(EventBase theEvent)
+ {
+ ChannelEvent evt = theEvent as ChannelEvent;
+ EventChannelState channelState = theEvent as EventChannelState;
+ if (channelState != null)
+ Debug.WriteLine("ChannelState: " + channelState.ChannelInfo.State + " " + channelState.Caller.UserName +
+ " " + channelState.Caller.DestinationNumber);
+ else if (evt != null && evt.ChannelInfo != null)
+ Debug.WriteLine("ChannelEvent: " + evt.Name + " " + evt.ChannelInfo.Address);
+ if (evt != null)
+ {
+ // CHANNEL_ANSWER, No originator = new outgoing call.
+ // ChannelName = the one who makes the call
+ if (evt is EventChannelAnswer)
+ {
+ EventChannelAnswer e = (EventChannelAnswer) evt;
+ if (e.Originator.CallerIdName != string.Empty)
+ {
+ Debug.WriteLine("Skipping emoty ChannelAnswer");
+ return; // We do only want empty ones.
+ }
+
+ if (!IsExternalNumber(evt.ChannelInfo.Address))
+ {
+ Debug.WriteLine("triggering CallState.Alerting");
+ TriggerCallState(evt.ChannelInfo.Address, e.UniqueId, CallState.Alerting,
+ e.Caller.DestinationNumber);
+ }
+ }
+
+ // CHANNEL_OUTGOING, Event for Alerting/Offering
+ // Originator = the one calling
+ // ChannelName = the one getting called.
+ else if (evt is EventChannelOutgoing)
+ {
+ EventChannelOutgoing e = (EventChannelOutgoing) evt;
+ if (!IsExternalNumber(evt.ChannelInfo.Address))
+ {
+ Debug.WriteLine("triggering CallState.Offering");
+ TriggerCallState(evt.ChannelInfo.Address, e.UniqueId, CallState.Offering, e.Originator.UserName);
+ }
+ if (!IsExternalNumber(e.Originator.UserName))
+ {
+ Debug.WriteLine("triggering CallState.Alerting");
+ TriggerCallState(e.Originator.UserName, e.Originator.UniqueId, CallState.Alerting,
+ e.ChannelInfo.Address);
+ }
+ }
+
+ else if (evt is EventChannelBridge)
+ {
+ EventChannelBridge e = (EventChannelBridge) evt;
+ if (!IsExternalNumber(evt.ChannelInfo.Address))
+ {
+ Debug.WriteLine("triggering CallState.Connected");
+ TriggerCallState(evt.ChannelInfo.Address, e.UniqueId, CallState.Connected,
+ e.Caller.DestinationNumber);
+ }
+
+ // Trigger destination
+ if (!IsExternalNumber(e.Caller.DestinationNumber) && e.Originator.ChannelName != string.Empty)
+ {
+ Debug.WriteLine("triggering CallState.Connected");
+ TriggerCallState(ChannelDestination(e.Originator.ChannelName), e.UniqueId, CallState.Connected,
+ e.ChannelInfo.Address);
+ }
+ }
+
+ else if (evt is EventChannelDestroy)
+ {
+ EventChannelDestroy e = (EventChannelDestroy) evt;
+ Debug.WriteLine("triggering CallState.Disconnected");
+ TriggerCallState(evt.ChannelInfo.Address, e.UniqueId, CallState.Disconnected,
+ e.Originator.DestinationNumber);
+ }
+ }
+ }
+
+ private bool IsExternalNumber(string number)
+ {
+ if (number == null || number == string.Empty)
+ return false;
+ return number[0] == '+';
+ }
+
+ private void TriggerCallState(string extensionOrUserName, string id, CallState state, string destination)
+ {
+ ExtensionMapper em = GetMapper(extensionOrUserName);
+ Debug.WriteLine(String.Format("{0} -> {1}, {2} id: {3}", extensionOrUserName, destination, state, id));
+ Call call = em.setter.callState(id, state, destination);
+ if (ExtensionChanged != null)
+ ExtensionChanged(em.extension, call);
+ }
+
+ private void OnBridgeCallId(CmdBase command, CommandReply reply)
+ {
+ GetVariableReply gvr = (GetVariableReply) reply;
+ if (!gvr.Success)
+ Debug.WriteLine("OnBridgeCallId " + reply.ErrCode);
+
+ string otherChannelId = (string) command.ContextData;
+ SetVariable sv = new SetVariable(otherChannelId, "gate_callid", gvr.Value);
+ sv.OnReply += OnCallIdReply;
+ _eventMgr.Send(sv);
+ command.OnReply -= OnBridgeCallId;
+ }
+
+ private void OnCallIdReply(CmdBase command, CommandReply reply)
+ {
+ if (!reply.Success)
+ Debug.WriteLine("OnCallIdReply " + reply.ErrCode);
+ command.OnReply -= OnCallIdReply;
+ }
+
+ #region Nested type: ExtensionMapper
+
+ private class ExtensionMapper
+ {
+ public Extension extension;
+ public ExtensionSetters setter;
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/CallStateEvent.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/CallStateEvent.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,158 @@
+using System;
+
+namespace EventWatcher
+{
+ public enum CallState
+ {
+ Unknown,
+
+ /// <summary>
+ /// The call has been created, but Connect has not been called yet.
+ /// A call can never transition into the idle state.
+ /// This is the initial state for both incoming and outgoing calls.
+ /// </summary>
+ Idle,
+ /// <summary>
+ /// Connect has been called, and the service provider is working on
+ /// making a connection. This state is valid only on outgoing calls.
+ /// This message is optional, because a service provider may have a
+ /// call transition directly to the connected state.
+ /// </summary>
+ InProgress,
+ /// <summary>
+ /// Call has been connected to the remote end and communication can take place.
+ /// </summary>
+ Connected,
+ /// <summary>
+ /// Call has been disconnected. There are several causes for disconnection.
+ /// See the table of valid call state transitions below.
+ /// </summary>
+ Disconnected,
+ /// <summary>
+ /// A new call has appeared, and is being offered to an application.
+ /// If the application has owner privileges on the call, it can either
+ /// call Answer or Disconnect while the call is in the offering state.
+ /// </summary>
+ Offering,
+ Alerting,
+ /// <summary>
+ /// The call is in the hold state.
+ /// </summary>
+ Held,
+ }
+
+ public enum HangupCause
+ {
+ Success,
+ NormalClearing,
+ NoRouteTransitNet,
+ NoRouteDestination,
+ Busy,
+ Noanswer,
+ Rejected,
+ NumberChanged,
+ Congestion,
+ }
+ /// <summary>
+ /// Subclass for all call events.
+ /// The events are sent as commands through the
+ /// Command Dispatcher.
+ /// </summary>
+ [Serializable]
+ public class CallStateEvent
+ {
+ private string _callId;
+ private string _pbxId;
+ private string _destination;
+ private string _from;
+ private CallState _state = CallState.Idle;
+ private bool _isIncoming = true;
+ private bool _isInternal;
+ private HangupCause _hangupCause;
+
+ public CallStateEvent()
+ {
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="callId">Call identification string</param>
+ /// <param name="pbxId">Id used internally in the pbx to identify the call.</param>
+ /// <param name="from">Sip-Address to the one that made the call</param>
+ /// <param name="destination">Sip-address to where the call was made.</param>
+ public CallStateEvent(string callId, string pbxId, string from, string destination)
+ {
+ _callId = callId;
+ _from = from;
+ PbxId = pbxId;
+ _destination = destination;
+ }
+
+ /// <summary>
+ /// Call identification string.
+ /// </summary>
+ public string CallId
+ {
+ get { return _callId; }
+ set { _callId = value; }
+ }
+
+ /// <summary>
+ /// User that made the call.
+ /// </summary>
+ public string From
+ {
+ get { return _from; }
+ set { _from = value; }
+ }
+
+ /// <summary>
+ /// To whom the call was made.
+ /// </summary>
+ public string Destination
+ {
+ get { return _destination; }
+ set { _destination = value; }
+ }
+
+ /// <summary>
+ /// Current CallState.
+ /// </summary>
+ public CallState State
+ {
+ get { return _state; }
+ set { _state = value; }
+ }
+
+ /// <summary>
+ /// This is an incoming call.
+ /// </summary>
+ public bool Incoming
+ {
+ get { return _isIncoming; }
+ set { _isIncoming = value; }
+ }
+
+ /// <summary>
+ /// This is an internal call in the pbx.
+ /// </summary>
+ public bool Internal
+ {
+ get { return _isInternal; }
+ set { _isInternal = value; }
+ }
+
+ public HangupCause HangupCause
+ {
+ get { return _hangupCause; }
+ set { _hangupCause = value; }
+ }
+
+ internal string PbxId
+ {
+ get { return _pbxId; }
+ set { _pbxId = value; }
+ }
+ }
+}
\ No newline at end of file
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/EventWatcher.csproj
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/EventWatcher.csproj Thu May 1 14:27:39 2008
@@ -0,0 +1,96 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>8.0.50727</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{E65ABA5F-A578-4E3C-989D-0FE4E459C03D}</ProjectGuid>
+ <OutputType>WinExe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>EventWatcher</RootNamespace>
+ <AssemblyName>EventWatcher</AssemblyName>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ <Reference Include="System.Data" />
+ <Reference Include="System.Deployment" />
+ <Reference Include="System.Design" />
+ <Reference Include="System.Drawing" />
+ <Reference Include="System.Windows.Forms" />
+ <Reference Include="System.Xml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="Call.cs" />
+ <Compile Include="CallManager.cs" />
+ <Compile Include="CallStateEvent.cs" />
+ <Compile Include="Extension.cs" />
+ <Compile Include="Form1.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="Form1.Designer.cs">
+ <DependentUpon>Form1.cs</DependentUpon>
+ </Compile>
+ <Compile Include="LabelTextBox.cs">
+ <SubType>Component</SubType>
+ </Compile>
+ <Compile Include="Program.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <EmbeddedResource Include="Form1.resx">
+ <SubType>Designer</SubType>
+ <DependentUpon>Form1.cs</DependentUpon>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Properties\Resources.resx">
+ <Generator>ResXFileCodeGenerator</Generator>
+ <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <Compile Include="Properties\Resources.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DependentUpon>Resources.resx</DependentUpon>
+ <DesignTime>True</DesignTime>
+ </Compile>
+ <None Include="Properties\Settings.settings">
+ <Generator>SettingsSingleFileGenerator</Generator>
+ <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+ </None>
+ <Compile Include="Properties\Settings.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DependentUpon>Settings.settings</DependentUpon>
+ <DesignTimeSharedInput>True</DesignTimeSharedInput>
+ </Compile>
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\FreeSwitchEventSocket\FreeSwitch.EventSocket.csproj">
+ <Project>{3F8895F6-F710-4323-B96A-4EFB6BC97E08}</Project>
+ <Name>FreeSwitch.EventSocket</Name>
+ </ProjectReference>
+ </ItemGroup>
+ <ItemGroup>
+ <Content Include="ReadMePlease.txt" />
+ </ItemGroup>
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+</Project>
\ No newline at end of file
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Extension.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Extension.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,162 @@
+using System;
+using System.Collections.Generic;
+
+namespace EventWatcher
+{
+ public delegate void ExtensionHandler(Extension extension);
+ public delegate void CallHandler(Extension extension, Call call);
+ public delegate Call CallStateSetter(string id, CallState state, string destination);
+
+ /// <summary>
+ /// Used to set states for the extension.
+ /// We are using this method since we do not want anything else
+ /// but the CallMgr to be able to set stuff.
+ /// </summary>
+ /// <param name="forwardAll">null if it has changed, else the new forward destination</param>
+ /// <param name="forwardBusy">null if it has changed, else the new forward destination</param>
+ /// <param name="forwardNoAnswer">null if it has changed, else the new forward destination</param>
+ public delegate void ForwardSetter(string forwardAll, string forwardBusy, string forwardNoAnswer);
+
+ public class ExtensionSetters
+ {
+ public CallStateSetter callState;
+ public ForwardSetter forwardSetter;
+ }
+
+ /// <summary>
+ /// Class representing an extension.
+ /// </summary>
+ [Serializable]
+ public class Extension
+ {
+ private readonly string _address = string.Empty;
+ private readonly IDictionary<string, Call> _calls = new Dictionary<string, Call>();
+ private readonly string _destination = string.Empty;
+ private string _forwardAll = string.Empty;
+ private string _forwardBusy = string.Empty;
+ private string _forwardNoAnswer = string.Empty;
+ private ExtensionSetters _handler;
+
+ public Extension(string address)
+ {
+ _address = address;
+ }
+
+ public Extension(string address, ExtensionSetters setters)
+ {
+ _address = address;
+ Handler = setters;
+ }
+
+ public bool IsBusy
+ {
+ get
+ {
+ foreach (KeyValuePair<string, Call> pair in _calls)
+ {
+ if (pair.Value.State != CallState.Disconnected
+ && pair.Value.State != CallState.Held)
+ return false;
+ }
+ return true;
+ }
+ }
+
+ /// <summary>
+ /// Determines if this extension is forwarded in any way
+ /// </summary>
+ public bool IsForwarded
+ {
+ get
+ {
+ return _forwardNoAnswer != string.Empty
+ || _forwardBusy != string.Empty
+ || _forwardAll != string.Empty;
+ }
+ }
+
+ public string ForwardAll
+ {
+ get { return _forwardAll; }
+ }
+
+ public string ForwardBusy
+ {
+ get { return _forwardBusy; }
+ }
+
+ public string ForwardNoAnswer
+ {
+ get { return _forwardNoAnswer; }
+ }
+
+ public string Destination
+ {
+ get { return _destination; }
+ }
+
+ public string Address
+ {
+ get { return _address; }
+ }
+
+ public ExtensionSetters Handler
+ {
+ get { return _handler; }
+ set
+ {
+ if (value != null)
+ //Check.Require(_handler == null, "Handler can only be assigned one time.");
+
+ _handler = value;
+ if (value != null)
+ {
+ value.callState = SetCallState;
+ value.forwardSetter = SetForward;
+ }
+ }
+ }
+
+ private Call SetCallState(string id, CallState state, string destination)
+ {
+ bool wasBusy = IsBusy;
+
+ Call call;
+ if (!_calls.ContainsKey(id))
+ call = new Call(id);
+ else
+ call = _calls[id];
+
+ call.SetCallState(state);
+ call.SetDestination(destination);
+
+ if (CallChanged != null)
+ CallChanged(this, call);
+
+ if (state == CallState.Disconnected)
+ _calls.Remove(id);
+
+
+ if (wasBusy != IsBusy && BusyStateChanged != null)
+ BusyStateChanged(this);
+
+ return call;
+ }
+
+ private void SetForward(string forwardAll, string forwardBusy, string forwardNoAnswer)
+ {
+ if (forwardAll != null)
+ _forwardAll = forwardAll;
+ if (forwardBusy != null)
+ _forwardBusy = forwardBusy;
+ if (forwardNoAnswer != null)
+ _forwardNoAnswer = forwardNoAnswer;
+ if (ForwardChanged != null)
+ ForwardChanged(this);
+ }
+
+ public event ExtensionHandler BusyStateChanged;
+ public event CallHandler CallChanged;
+ public event ExtensionHandler ForwardChanged;
+ }
+}
\ No newline at end of file
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Form1.Designer.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Form1.Designer.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,212 @@
+namespace EventWatcher
+{
+ partial class Form1
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.panel1 = new System.Windows.Forms.Panel();
+ this.log = new System.Windows.Forms.TextBox();
+ this.info = new System.Windows.Forms.RichTextBox();
+ this.lv = new System.Windows.Forms.ListView();
+ this.colAddress = new System.Windows.Forms.ColumnHeader();
+ this.colId = new System.Windows.Forms.ColumnHeader();
+ this.colPbxId = new System.Windows.Forms.ColumnHeader();
+ this.colState = new System.Windows.Forms.ColumnHeader();
+ this.colCaller = new System.Windows.Forms.ColumnHeader();
+ this.colOriginator = new System.Windows.Forms.ColumnHeader();
+ this.colOrginatee = new System.Windows.Forms.ColumnHeader();
+ this.lvAll = new System.Windows.Forms.ListView();
+ this.from = new System.Windows.Forms.ColumnHeader();
+ this.To = new System.Windows.Forms.ColumnHeader();
+ this.ChannelId = new System.Windows.Forms.ColumnHeader();
+ this.SessionId = new System.Windows.Forms.ColumnHeader();
+ this.State = new System.Windows.Forms.ColumnHeader();
+ this.panel1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // panel1
+ //
+ this.panel1.Controls.Add(this.log);
+ this.panel1.Controls.Add(this.info);
+ this.panel1.Dock = System.Windows.Forms.DockStyle.Right;
+ this.panel1.Location = new System.Drawing.Point(627, 0);
+ this.panel1.Name = "panel1";
+ this.panel1.Size = new System.Drawing.Size(293, 546);
+ this.panel1.TabIndex = 11;
+ //
+ // log
+ //
+ this.log.Dock = System.Windows.Forms.DockStyle.Bottom;
+ this.log.Location = new System.Drawing.Point(0, 526);
+ this.log.Name = "log";
+ this.log.Size = new System.Drawing.Size(293, 20);
+ this.log.TabIndex = 11;
+ //
+ // info
+ //
+ this.info.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.info.Location = new System.Drawing.Point(0, 0);
+ this.info.Name = "info";
+ this.info.Size = new System.Drawing.Size(293, 546);
+ this.info.TabIndex = 10;
+ this.info.Text = "";
+ //
+ // lv
+ //
+ this.lv.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+ this.colAddress,
+ this.colId,
+ this.colPbxId,
+ this.colState,
+ this.colCaller,
+ this.colOriginator,
+ this.colOrginatee});
+ this.lv.Dock = System.Windows.Forms.DockStyle.Top;
+ this.lv.Location = new System.Drawing.Point(0, 0);
+ this.lv.Name = "lv";
+ this.lv.Size = new System.Drawing.Size(627, 152);
+ this.lv.TabIndex = 12;
+ this.lv.UseCompatibleStateImageBehavior = false;
+ this.lv.View = System.Windows.Forms.View.Details;
+ //
+ // colAddress
+ //
+ this.colAddress.Text = "Anknytning";
+ this.colAddress.Width = 65;
+ //
+ // colId
+ //
+ this.colId.Text = "Id";
+ this.colId.Width = 26;
+ //
+ // colPbxId
+ //
+ this.colPbxId.Text = "PbxId";
+ this.colPbxId.Width = 230;
+ //
+ // colState
+ //
+ this.colState.Text = "Status";
+ this.colState.Width = 50;
+ //
+ // colCaller
+ //
+ this.colCaller.Text = "Caller";
+ this.colCaller.Width = 62;
+ //
+ // colOriginator
+ //
+ this.colOriginator.Text = "Originator";
+ this.colOriginator.Width = 72;
+ //
+ // colOrginatee
+ //
+ this.colOrginatee.Text = "Orginatee";
+ this.colOrginatee.Width = 116;
+ //
+ // lvAll
+ //
+ this.lvAll.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+ this.from,
+ this.To,
+ this.ChannelId,
+ this.SessionId,
+ this.State});
+ this.lvAll.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.lvAll.Location = new System.Drawing.Point(0, 152);
+ this.lvAll.Name = "lvAll";
+ this.lvAll.Size = new System.Drawing.Size(627, 394);
+ this.lvAll.TabIndex = 13;
+ this.lvAll.UseCompatibleStateImageBehavior = false;
+ this.lvAll.View = System.Windows.Forms.View.Details;
+ this.lvAll.SelectedIndexChanged += new System.EventHandler(this.lvAll_SelectedIndexChanged);
+ this.lvAll.ItemSelectionChanged += new System.Windows.Forms.ListViewItemSelectionChangedEventHandler(this.lvAll_ItemSelectionChanged);
+ //
+ // from
+ //
+ this.from.Text = "Fr�n";
+ //
+ // To
+ //
+ this.To.Text = "Till";
+ this.To.Width = 84;
+ //
+ // ChannelId
+ //
+ this.ChannelId.Text = "ChannelId";
+ this.ChannelId.Width = 282;
+ //
+ // SessionId
+ //
+ this.SessionId.Text = "SessionId";
+ this.SessionId.Width = 318;
+ //
+ // State
+ //
+ this.State.Text = "State";
+ this.State.Width = 99;
+ //
+ // Form1
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(920, 546);
+ this.Controls.Add(this.lvAll);
+ this.Controls.Add(this.lv);
+ this.Controls.Add(this.panel1);
+ this.Name = "Form1";
+ this.Text = "Form1";
+ this.Load += new System.EventHandler(this.Form1_Load);
+ this.panel1.ResumeLayout(false);
+ this.panel1.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Panel panel1;
+ private System.Windows.Forms.TextBox log;
+ private System.Windows.Forms.RichTextBox info;
+ private System.Windows.Forms.ListView lv;
+ private System.Windows.Forms.ColumnHeader colAddress;
+ private System.Windows.Forms.ColumnHeader colId;
+ private System.Windows.Forms.ColumnHeader colPbxId;
+ private System.Windows.Forms.ColumnHeader colState;
+ private System.Windows.Forms.ColumnHeader colCaller;
+ private System.Windows.Forms.ColumnHeader colOriginator;
+ private System.Windows.Forms.ColumnHeader colOrginatee;
+ private System.Windows.Forms.ListView lvAll;
+ private System.Windows.Forms.ColumnHeader from;
+ private System.Windows.Forms.ColumnHeader To;
+ private System.Windows.Forms.ColumnHeader ChannelId;
+ private System.Windows.Forms.ColumnHeader SessionId;
+ private System.Windows.Forms.ColumnHeader State;
+
+ }
+}
+
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Form1.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Form1.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,235 @@
+using System;
+using System.Diagnostics;
+using System.Drawing;
+using System.Reflection;
+using System.Windows.Forms;
+using FreeSwitch.EventSocket;
+using FreeSwitch.EventSocket.Commands;
+using FreeSwitch.EventSocket.General;
+
+namespace EventWatcher
+{
+ public partial class Form1 : Form
+ {
+ private EventManager _eventMgr;
+ private CallManager _callMgr;
+
+ public Form1()
+ {
+ InitializeComponent();
+ _eventMgr = new EventManager();
+ _callMgr = new CallManager(_eventMgr);
+ _callMgr.OnCallState += OnCallState;
+ _callMgr.ExtensionAdded += OnExtensionAdded;
+ _callMgr.ExtensionChanged += OnExtensionChanged;
+
+
+ }
+
+ private void OnExtensionAdded(Extension extension)
+ {
+ //throw new NotImplementedException();
+ }
+
+ private void OnExtensionChanged(Extension extension, Call call)
+ {
+ if (lv.InvokeRequired)
+ BeginInvoke((MethodInvoker)delegate { OnExtensionChangedX(extension, call); });
+ else
+ OnExtensionChangedX(extension, call);
+ }
+
+ private void OnExtensionChangedX(Extension extension, Call call)
+ {
+ ListViewItem item = null;
+ foreach (ListViewItem item2 in lv.Items)
+ {
+ if (String.Compare(item2.Name, extension.Address, true) == 0)
+ {
+ item = item2;
+ break;
+ }
+ }
+ if (item == null)//(!lv.Items.ContainsKey(extension.Address))
+ {
+ item = lv.Items.Add(extension.Address, extension.Address, 0);
+ item.Tag = extension;
+ item.SubItems.Add(call.Id);
+ item.SubItems.Add(call.State.ToString());
+ item.SubItems.Add(call.PreviousState.ToString());
+ item.SubItems.Add("");
+ item.SubItems.Add(extension.Destination);
+ }
+ else
+ {
+ item.SubItems[2].Text = call.State.ToString();
+ item.SubItems[3].Text = call.PreviousState.ToString();
+ }
+ }
+
+ private void OnExtensionCallState(Extension e)
+ {
+
+ }
+ private void OnCallState(CallManager mgr, CallStateEvent cs)
+ {
+ if (lv.InvokeRequired)
+ BeginInvoke((MethodInvoker)delegate { OnCallStateX(mgr, cs); });
+ else
+ OnCallStateX(mgr, cs);
+ }
+
+ private void OnCallStateX(CallManager mgr, CallStateEvent cs)
+ {
+ ListViewItem item;
+ if (!lv.Items.ContainsKey(cs.PbxId))
+ {
+ item = lv.Items.Add(cs.PbxId, cs.From, 0);
+ item.Tag = cs;
+ item.SubItems.Add(cs.CallId);
+ item.SubItems.Add(cs.PbxId);
+ item.SubItems.Add(cs.State.ToString());
+ item.SubItems.Add(cs.From);
+ item.SubItems.Add(cs.Destination);
+ }
+ else
+ item = lv.Items[cs.PbxId];
+
+ item.SubItems[1].Text = cs.CallId;
+ item.SubItems[3].Text = cs.State.ToString();
+ item.SubItems[4].Text = cs.Destination;
+
+ if (cs.State == CallState.Disconnected)
+ lv.Items.RemoveByKey(cs.PbxId);
+ }
+
+ private void Form1_Load(object sender, EventArgs e)
+ {
+ _eventMgr.Password = "ClueCon";
+ _eventMgr.Start("localhost");
+ _eventMgr.Subscribe(new Events(Event.All));
+ _eventMgr.EventReceived += OnPreSwitchEvent;
+ }
+
+ private void OnPreSwitchEvent(EventBase theEvent)
+ {
+ _callMgr.OnSwitchEvents(theEvent);
+ if (lvAll.InvokeRequired)
+ BeginInvoke((MethodInvoker)delegate { OnSwitchEvent(theEvent); });
+ else
+ OnSwitchEvent(theEvent);
+ }
+
+
+ private string DisplayProperties(object o)
+ {
+ return DisplayProperties(o, 0);
+ }
+
+ private string DisplayProperties(object o, int spaces)
+ {
+ PropertyInfo[] pis = o.GetType().GetProperties();
+ string info = string.Empty;
+ foreach (PropertyInfo pi in pis)
+ {
+ if (pi.PropertyType == typeof (ChannelInfo) || pi.PropertyType == typeof (PartyInfo))
+ {
+ info += pi.Name.PadLeft(spaces + pi.Name.Length) + "\r\n";
+ info += DisplayProperties(pi.GetValue(o, null), spaces + 2);
+ }
+ else
+ info += pi.Name.PadLeft(spaces + pi.Name.Length) + ": " + pi.GetValue(o, null) + "\r\n";
+ }
+ return info;
+ }
+
+ private void OnSwitchEvent(EventBase theEvent)
+ {
+ EventChannelState e = theEvent as EventChannelState;
+ if (e != null)
+ {
+
+ EventChannelState channelEvent = theEvent as EventChannelState;
+ if (channelEvent == null)
+ return;
+
+ //OnSwitchEvents(theEvent);
+
+ ListViewItem item;
+ item = lvAll.Items.Add(channelEvent.ChannelInfo.Address);
+ item.Tag = channelEvent;
+ item.SubItems.Add(channelEvent.Originator.UserName);
+ item.SubItems.Add(channelEvent.UniqueId);
+ item.SubItems.Add(channelEvent.Caller.UniqueId);
+ if (channelEvent.Name == "CHANNEL_STATE")
+ item.SubItems.Add(e.ChannelInfo.State.ToString());
+ else
+ item.SubItems.Add(e.Name);
+
+ if (e.GetType() == typeof(EventCodec) || theEvent.GetType() == typeof(EventChannelExecute)
+ || e.Originator.DestinationNumber == string.Empty)
+ {
+ item.ForeColor = Color.Gray;
+ }
+
+ }
+ log.Text = theEvent.Name;
+ }
+
+ private void AddEvent(ListBox box, ChannelEvent e)
+ {
+ box.Items.Insert(0, new Wrapper(e));
+ }
+
+ private void lvAll_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ /*
+ if (lvAll.SelectedItems.Count == 0)
+ return;
+ ListViewItem itm = lvAll.SelectedItems[0];
+ MessageBox.Show(DisplayProperties(itm.Tag));
+ * */
+ }
+
+ private void lvAll_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
+ {
+ if (lvAll.SelectedItems.Count == 0)
+ return;
+ ListViewItem itm = lvAll.SelectedItems[0];
+ info.Text = DisplayProperties(itm.Tag);
+ }
+
+ #region Nested type: SwitchEventHandler
+
+ private delegate void SwitchEventHandler(EventBase theEvent);
+
+ #endregion
+
+ #region Nested type: Wrapper
+
+ private class Wrapper
+ {
+ public ChannelEvent e;
+
+ public Wrapper(ChannelEvent e)
+ {
+ this.e = e;
+ }
+
+ public override string ToString()
+ {
+ return "[" + e.Name + "] " + e.ChannelInfo.State;
+ }
+ }
+
+ #endregion
+
+ private void btnOriginate_Click(object sender, EventArgs e)
+ {
+ //Originate org = new Originate();
+ //org.Caller = new SofiaSipAddress("gauffin.com");
+ //from_id.Text
+ }
+
+ }
+}
\ No newline at end of file
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Form1.resx
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Form1.resx Thu May 1 14:27:39 2008
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root>
\ No newline at end of file
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/LabelTextBox.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/LabelTextBox.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,59 @@
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace EventWatcher
+{
+ class LabelTextBox : TextBox
+ {
+ private string _label;
+
+ public string Label
+ {
+ get { return _label; }
+ set
+ {
+ _label = value;
+ if (Text == string.Empty)
+ SetLabel();
+ }
+ }
+
+ public void test()
+ {
+ TextBox x = new TextBox();
+ x.KeyDown += tb_KeyDown;
+ x.TextChanged += tb_TextChanged;
+ }
+
+ private void tb_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
+ {
+ if (ForeColor == Color.FromKnownColor(KnownColor.InactiveCaptionText))
+ RemoveLabel();
+ }
+
+ private void tb_TextChanged(object sender, EventArgs e)
+ {
+ if (Text == string.Empty)
+ SetLabel();
+ else if (Text != _label && Text != string.Empty)
+ RemoveLabel();
+ }
+
+ private void RemoveLabel()
+ {
+ ForeColor = Color.FromKnownColor(KnownColor.WindowText);
+ Text = string.Empty;
+
+ }
+ private void SetLabel()
+ {
+ ForeColor = Color.FromKnownColor(KnownColor.InactiveCaptionText);
+ Text = _label;
+
+ }
+
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Program.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Program.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+
+namespace EventWatcher
+{
+ static class Program
+ {
+ /// <summary>
+ /// The main entry point for the application.
+ /// </summary>
+ [STAThread]
+ static void Main()
+ {
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new Form1());
+ }
+ }
+}
\ No newline at end of file
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Properties/AssemblyInfo.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Properties/AssemblyInfo.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,33 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("EventWatcher")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("EventWatcher")]
+[assembly: AssemblyCopyright("Copyright © 2007")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("e6a71f21-6833-455f-a398-a0d6a54c1359")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Properties/Resources.Designer.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Properties/Resources.Designer.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,63 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+// This code was generated by a tool.
+// Runtime Version:2.0.50727.312
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace EventWatcher.Properties {
+ using System;
+
+
+ /// <summary>
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ /// </summary>
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ /// <summary>
+ /// Returns the cached ResourceManager instance used by this class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("EventWatcher.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ /// <summary>
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Properties/Resources.resx
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Properties/Resources.resx Thu May 1 14:27:39 2008
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root>
\ No newline at end of file
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Properties/Settings.Designer.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Properties/Settings.Designer.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+// This code was generated by a tool.
+// Runtime Version:2.0.50727.312
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace EventWatcher.Properties
+{
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+ {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default
+ {
+ get
+ {
+ return defaultInstance;
+ }
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Properties/Settings.settings
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/Properties/Settings.settings Thu May 1 14:27:39 2008
@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
+ <Profiles>
+ <Profile Name="(Default)" />
+ </Profiles>
+ <Settings />
+</SettingsFile>
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/ReadMePlease.txt
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/ReadMePlease.txt Thu May 1 14:27:39 2008
@@ -0,0 +1,3 @@
+This is just a test project that I used to develop the event socket lib.
+
+It could in the future be an application that keep track on all channels and their current state.
\ No newline at end of file
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitch.EventSocket.Test/EventSocket.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitch.EventSocket.Test/EventSocket.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using FreeSwitch.EventSocket;
+using FreeSwitch.EventSocket.Commands;
+using FreeSwitch.EventSocket.General;
+
+namespace FreeSwitch.EventSocket.Test
+{
+ class EventSocket
+ {
+ private FreeSwitch.EventSocket.EventSocket m_es = new FreeSwitch.EventSocket.EventSocket();
+
+ public void Setup()
+ {
+ m_es.Connect("192.168.1.102");
+ m_es.Subscribe(new Events(Event.All));
+ //m_es.SendApi(new Originate(new SofiaSipAddress("gauffin.com", "arne"), new Address("8888")));
+ System.Threading.Thread.Sleep(500000);
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitch.EventSocket.Test/FreeSwitch.EventSocket.Test.csproj
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitch.EventSocket.Test/FreeSwitch.EventSocket.Test.csproj Thu May 1 14:27:39 2008
@@ -0,0 +1,55 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>8.0.50727</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{3679225D-79A3-4B6C-BCA1-E2DC265E423A}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>FreeSwitch.EventSocket.Test</RootNamespace>
+ <AssemblyName>FreeSwitch.EventSocket.Test</AssemblyName>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ <Reference Include="System.Data" />
+ <Reference Include="System.Xml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="EventSocket.cs" />
+ <Compile Include="ParserTest.cs" />
+ <Compile Include="Program.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\FreeSwitchEventSocket\FreeSwitch.EventSocket.csproj">
+ <Project>{3F8895F6-F710-4323-B96A-4EFB6BC97E08}</Project>
+ <Name>FreeSwitch.EventSocket</Name>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+</Project>
\ No newline at end of file
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitch.EventSocket.Test/ParserTest.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitch.EventSocket.Test/ParserTest.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,10 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace FreeSwitch.EventSocket.Test
+{
+ class ParserTest
+ {
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitch.EventSocket.Test/Program.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitch.EventSocket.Test/Program.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+using System.Text;
+
+namespace FreeSwitch.EventSocket.Test
+{
+ class Program
+ {
+ static void Main(string[] args)
+ {
+ EventManager mgr = new EventManager();
+ mgr.Subscribe(Events.GetChannelEvents());
+ mgr.Start("localhost");
+ Console.ReadLine();
+
+ string buffer = File.ReadAllText("..\\..\\..\\watcherRaw.log");
+ int bufLen = buffer.Length;
+
+ EventParser ep = new EventParser(buffer);
+ //int cnt = 0;
+ EventSocket es = new EventSocket();
+ es.Setup();
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitch.EventSocket.Test/Properties/AssemblyInfo.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitch.EventSocket.Test/Properties/AssemblyInfo.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,33 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("FreeSwitch.EventSocket.Test")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("FreeSwitch.EventSocket.Test")]
+[assembly: AssemblyCopyright("Copyright © 2007")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("b496f9be-f1be-457d-b8c8-fae97c43df8e")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitch.EventSocket.sln
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitch.EventSocket.sln Thu May 1 14:27:39 2008
@@ -0,0 +1,38 @@
+
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FreeSwitch.EventSocket", "FreeSwitchEventSocket\FreeSwitch.EventSocket.csproj", "{3F8895F6-F710-4323-B96A-4EFB6BC97E08}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FreeSwitch.EventSocket.Test", "FreeSwitch.EventSocket.Test\FreeSwitch.EventSocket.Test.csproj", "{3679225D-79A3-4B6C-BCA1-E2DC265E423A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventWatcher", "EventWatcher\EventWatcher.csproj", "{E65ABA5F-A578-4E3C-989D-0FE4E459C03D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IvrSocket", "IvrSocket\IvrSocket.csproj", "{22F26D13-0A0E-4345-9FEC-CE13FC8F37FD}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {3F8895F6-F710-4323-B96A-4EFB6BC97E08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3F8895F6-F710-4323-B96A-4EFB6BC97E08}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3F8895F6-F710-4323-B96A-4EFB6BC97E08}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3F8895F6-F710-4323-B96A-4EFB6BC97E08}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3679225D-79A3-4B6C-BCA1-E2DC265E423A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3679225D-79A3-4B6C-BCA1-E2DC265E423A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3679225D-79A3-4B6C-BCA1-E2DC265E423A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3679225D-79A3-4B6C-BCA1-E2DC265E423A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E65ABA5F-A578-4E3C-989D-0FE4E459C03D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E65ABA5F-A578-4E3C-989D-0FE4E459C03D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E65ABA5F-A578-4E3C-989D-0FE4E459C03D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E65ABA5F-A578-4E3C-989D-0FE4E459C03D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {22F26D13-0A0E-4345-9FEC-CE13FC8F37FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {22F26D13-0A0E-4345-9FEC-CE13FC8F37FD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {22F26D13-0A0E-4345-9FEC-CE13FC8F37FD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {22F26D13-0A0E-4345-9FEC-CE13FC8F37FD}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/ChannelEvent.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/ChannelEvent.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,66 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace FreeSwitch.EventSocket
+{
+ public class ChannelEvent : EventBase
+ {
+ private ChannelInfo _channelInfo;
+ private string _uniqueId = string.Empty;
+ private string _answerState;
+ private string _callDirection;
+
+ public override bool IsChannelEvent
+ {
+ get { return true; }
+ }
+
+ /// <summary>
+ /// Information about the used channel and it's state.
+ /// </summary>
+ public ChannelInfo ChannelInfo
+ {
+ get { return _channelInfo; }
+ set { _channelInfo = value; }
+ }
+
+ public string UniqueId
+ {
+ get { return _uniqueId; }
+ set { _uniqueId = value; }
+ }
+
+ public string AnswerState
+ {
+ get { return _answerState; }
+ set { _answerState = value; }
+ }
+
+ public string CallDirection
+ {
+ get { return _callDirection; }
+ set { _callDirection = value; }
+ }
+
+ public override bool ParseCommand(string name, string value)
+ {
+ if (name == "unique-id")
+ _uniqueId = value;
+ else if (name == "answer-state")
+ _answerState = value;
+ else if (name == "call-direction")
+ _callDirection = value;
+ else if (name.Length > 8 && name.Substring(0, 8) == "channel-")
+ {
+ if (_channelInfo == null)
+ _channelInfo = new ChannelInfo();
+ return _channelInfo.Parse(name, value);
+ }
+ else
+ return base.ParseCommand(name, value);
+
+ return true;
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelAnswer.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelAnswer.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,6 @@
+namespace FreeSwitch.EventSocket
+{
+ public class EventChannelAnswer : EventChannelState
+ {
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelApplication.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelApplication.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,10 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace FreeSwitch.EventSocket
+{
+ public class EventChannelApplication : EventChannelState
+ {
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelBridge.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelBridge.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,10 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace FreeSwitch.EventSocket
+{
+ public class EventChannelBridge : EventChannelState
+ {
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelCreate.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelCreate.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,6 @@
+namespace FreeSwitch.EventSocket
+{
+ public class EventChannelCreate : ChannelEvent
+ {
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelDestroy.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelDestroy.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,10 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace FreeSwitch.EventSocket
+{
+ public class EventChannelDestroy : EventChannelState
+ {
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelExecute.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelExecute.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,10 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace FreeSwitch.EventSocket
+{
+ public class EventChannelExecute : EventChannelState
+ {
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelExecuteComplete.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelExecuteComplete.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,7 @@
+namespace FreeSwitch.EventSocket
+{
+ public class EventChannelExecuteComplete : EventChannelState
+ {
+ }
+}
+
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelHangup.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelHangup.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,91 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace FreeSwitch.EventSocket
+{
+ public class EventChannelHangup : EventChannelState
+ {
+ private Causes m_hangupCause;
+
+ public enum Causes
+ {
+ Success,
+ NoRouteTransitNet,
+ NoRouteDestination,
+ ChannelUnacceptable,
+ CallAwardedDelivered,
+ NormalClearing,
+ UserBusy,
+ NoUserResponse,
+ NoAnswer,
+ SubscriberAbsent,
+ CallRejected,
+ NumberChanged,
+ RedirectionToNewDestination,
+ ExchangeRoutingError,
+ DestinationOutOfOrder,
+ InvalidNumberFormat,
+ FacilityRejected,
+ ResponseToStatusEnquiry,
+ NormalUnspecified,
+ NormalCircuitCongestion,
+ NetworkOutOfOrder,
+ NormalTemporaryFailure,
+ SwitchCongestion,
+ AccessInfoDiscarded,
+ RequestedChanUnavail,
+ PreEmpted,
+ FacilityNotSubscribed,
+ OutgoingCallBarred,
+ IncomingCallBarred,
+ BearercapabilityNotauth,
+ BearercapabilityNotavail,
+ ServiceUnavailable,
+ ChanNotImplemented,
+ FacilityNotImplemented,
+ ServiceNotImplemented,
+ InvalidCallReference,
+ IncompatibleDestination,
+ InvalidMsgUnspecified,
+ MandatoryIeMissing,
+ MessageTypeNonexist,
+ WrongMessage,
+ IeNonexist,
+ InvalidIeContents,
+ WrongCallState,
+ RecoveryOnTimerExpire,
+ MandatoryIeLengthError,
+ ProtocolError,
+ Interworking,
+ OriginatorCancel,
+ Crash,
+ SystemShutdown,
+ LoseRace,
+ ManagerRequest,
+ BlindTransfer,
+ AttendedTransfer,
+ AllottedTimeout
+ }
+
+ public Causes Cause
+ {
+ get { return m_hangupCause; }
+ set { m_hangupCause = value; }
+ }
+
+ public override bool ParseCommand(string name, string value)
+ {
+ if (name == "hangupcause" || name == "hangup-cause")
+ {
+ string cause = StringHelper.UpperCaseToCamelCase(value);
+ m_hangupCause = (Causes)Enum.Parse(typeof(Causes), cause);
+ }
+ else
+ return base.ParseCommand(name, value);
+
+ return true;
+ }
+
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelOriginate.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelOriginate.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace FreeSwitch.EventSocket
+{
+ public class EventChannelOriginate : ChannelEvent
+ {
+
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelOutgoing.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelOutgoing.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace FreeSwitch.EventSocket
+{
+ public class EventChannelOutgoing : EventChannelState
+ {
+
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelProgress.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelProgress.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,10 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace FreeSwitch.EventSocket
+{
+ public class EventChannelProgress : EventChannelState
+ {
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelState.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelState.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,63 @@
+namespace FreeSwitch.EventSocket
+{
+ public class EventChannelState : ChannelEvent
+ {
+ private PartyInfo _caller = new PartyInfo();
+ private PartyInfo _originator = new PartyInfo();
+ private bool _screenBit = false;
+
+ /// <summary>
+ /// Information about the called party.
+ /// This property is null for certain channel states,
+ /// depending on if freeswitch sends it or not.
+ /// </summary>
+ public PartyInfo Caller
+ {
+ get { return _caller; }
+ set { _caller = value; }
+ }
+
+ /// <summary>
+ /// Information about the destination (place that the caller want to reach).
+ /// This property is null for certain channel states,
+ /// depending on if freeswitch sends it or not.
+ /// </summary>
+ public PartyInfo Originator
+ {
+ get { return _originator; }
+ set { _originator = value; }
+ }
+
+ public bool ScreenBit
+ {
+ get { return _screenBit; }
+ set { _screenBit = value; }
+ }
+
+ public override bool ParseCommand(string name, string value)
+ {
+ if (name == "screen-bit")
+ {
+ ScreenBit = value == "yes";
+ return true;
+ }
+ else if (name.Length > 11 && name.Substring(0, 11) == "originator-"
+ || name.Length > 11 && name.Substring(0, 11) == "originatee-")
+ {
+ if (_originator == null)
+ _originator = new PartyInfo();
+
+ return _originator.Parse(name.Substring(11), value);
+ }
+ else if (name.Length > 7 && name.Substring(0, 7) == "caller-")
+ {
+ if (_caller == null)
+ _caller = new PartyInfo();
+
+ return _caller.Parse(name.Substring(7), value);
+ }
+ else
+ return base.ParseCommand(name, value);
+ }
+ }
+}
\ No newline at end of file
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelUnbridge.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelUnbridge.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,10 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace FreeSwitch.EventSocket
+{
+ public class EventChannelUnbridge : EventChannelState
+ {
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelUnpark.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelUnpark.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,10 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace FreeSwitch.EventSocket
+{
+ public class EventChannelUnpark : EventChannelState
+ {
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventCodec.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventCodec.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,6 @@
+namespace FreeSwitch.EventSocket
+{
+ public class EventCodec : EventChannelState
+ {
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventDtmf.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventDtmf.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,35 @@
+namespace FreeSwitch.EventSocket
+{
+ public class EventDtmf : ChannelEvent
+ {
+ private char _digit;
+ private int _duration;
+
+ public char Digit
+ {
+ get { return _digit; }
+ set { _digit = value; }
+ }
+
+ public int Duration
+ {
+ get { return _duration; }
+ set { _duration = value; }
+ }
+
+ public override bool ParseCommand(string name, string value)
+ {
+ switch(name)
+ {
+ case "dtmf-digit":
+ _digit = value[0];
+ break;
+ case "dtmf-duration":
+ int.TryParse(value, out _duration);
+ break;
+ }
+
+ return base.ParseCommand(name, value);
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventDtmfStatus.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventDtmfStatus.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,31 @@
+namespace FreeSwitch.EventSocket
+{
+ /// <summary>
+ /// Reports when DTMF digits have been pressed
+ /// </summary>
+ public class EventDtmfStatus : ChannelEvent
+ {
+ private int _count;
+
+ /// <summary>
+ /// Number of digits in the buffer.
+ /// </summary>
+ public int Count
+ {
+ get { return _count; }
+ }
+
+
+ public override bool ParseCommand(string name, string value)
+ {
+ switch (name)
+ {
+ case "dtmf-count":
+ int.TryParse(value, out _count);
+ break;
+ }
+
+ return base.ParseCommand(name, value);
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelInfo.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelInfo.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,225 @@
+namespace FreeSwitch.EventSocket
+{
+ #region enum ChannelState
+ public enum ChannelState
+ {
+ New, // Channel is newly created
+ Init, // Channel has been initilized
+ Ring, // Channel is looking for a dialplan
+ Transmit, // Channel is in a passive transmit state
+ Execute, // Channel is executing it's dialplan
+ Loopback, // Channel is in loopback
+ Hold, // Channel is on hold
+ Hibernate, // Channel is in a sleep state
+ Hangup, // Channel is flagged for hangup and ready to end
+ Done, // Channel is ready to be destroyed and out of the state machine
+ Unknown
+ }
+ #endregion
+
+ public class ChannelInfo
+ {
+ private ChannelState m_state;
+ private int m_stateNumber;
+ private string _profile;
+ private string m_address;
+ private string _hostName;
+ private string m_protocol = string.Empty;
+ private string m_readCodecName;
+ private int m_readCodecRate;
+ private string m_writeCodecName;
+ private int m_writeCodecRate;
+
+ /// <summary>
+ /// Coded used to read information from the channel.
+ /// Example: L16
+ /// </summary>
+ public string ReadCodecName
+ {
+ get { return m_readCodecName; }
+ set { m_readCodecName = value; }
+ }
+
+ /// <summary>
+ /// Bitrate of the read coded that is used.
+ /// Example: 8000
+ /// </summary>
+ public int ReadCodecRate
+ {
+ get { return m_readCodecRate; }
+ set { m_readCodecRate = value; }
+ }
+
+ /// <summary>
+ /// Codec used for writing to the channel.
+ /// Example: L16
+ /// </summary>
+ public string WriteCodecName
+ {
+ get { return m_writeCodecName; }
+ set { m_writeCodecName = value; }
+ }
+
+ /// <summary>
+ /// Bitrate of the codec.
+ /// Example: 8000
+ /// </summary>
+ public int WriteCodecRate
+ {
+ get { return m_writeCodecRate; }
+ set { m_writeCodecRate = value; }
+ }
+
+ /// <summary>
+ /// State that the channel is in. Check ChannelState enum for more information.
+ /// </summary>
+ public ChannelState State
+ {
+ get { return m_state; }
+ set { m_state = value; }
+ }
+
+ /// <summary>
+ /// Number of the state (from the enum in FreeSwitch)
+ /// </summary>
+ public int StateNumber
+ {
+ get { return m_stateNumber; }
+ set { m_stateNumber = value; }
+ }
+
+ /// <summary>
+ /// Name of the channel.
+ /// </summary>
+ /// <example>sofia/mydomain.com/1234@conference.freeswitch.org</example>
+ /// <seealso cref="ChannelInfo.Protocol"/>
+ /// <seealso cref="ProfileName"/>
+ /// <seealso cref="Address"/>
+ /// <seealso cref="HostName"/>
+ public string Name
+ {
+ get { return m_protocol + "/" + _profile + "/" + m_address + "@" + _hostName; }
+ set
+ {
+ string[] bits = value.Split('/');
+ if (bits.Length == 3)
+ {
+ m_protocol = bits[0];
+ _profile = bits[1];
+ string[] userParts = bits[2].Split('@');
+ if (userParts.Length == 2)
+ {
+ m_address = userParts[0];
+ HostName = userParts[1];
+ }
+ else
+ m_address = bits[2];
+ }
+
+ }
+ }
+
+ /// <summary>
+ /// ProfileName for the diaplan/sip.
+ /// </summary>
+ public string ProfileName
+ {
+ get { return _profile; }
+ set { _profile = value; }
+ }
+
+ /// <summary>
+ /// Extension/Username for the channel
+ /// </summary>
+ public string Address
+ {
+ get { return m_address; }
+ set { m_address = value; }
+ }
+
+ /// <summary>
+ /// Where the extension/user is calling from.
+ /// </summary>
+ public string HostName
+ {
+ get { return _hostName; }
+ set
+ {
+ if (value == null)
+ {
+ _hostName = string.Empty;
+ return;
+ }
+
+ int pos = value.IndexOf(':');
+ if (pos == -1)
+ _hostName = value;
+ else
+ _hostName = value.Substring(0, pos);
+ }
+ }
+
+ /// <summary>
+ /// Protocol used for communication.
+ /// "sofia" = sip.
+ /// </summary>
+ public string Protocol
+ {
+ get { return m_protocol; }
+ }
+
+ public bool Parse(string name, string value)
+ {
+ switch (name)
+ {
+ case "channel-state":
+ m_state = StateFromString(value);
+ break;
+ case "channel-state-number":
+ int.TryParse(value, out m_stateNumber);
+ break;
+ case "channel-name":
+ Name = value;
+ break;
+ case "channel-read-codec-name":
+ m_readCodecName = value;
+ break;
+ case "channel-read-codec-rate":
+ int.TryParse(value, out m_readCodecRate);
+ break;
+ case "channel-write-codec-name":
+ m_writeCodecName = value;
+ break;
+ case "channel-write-codec-rate":
+ int.TryParse(value, out m_writeCodecRate);
+ break;
+ default:
+ return false;
+ }
+ return true;
+ }
+
+ public ChannelState StateFromString(string state)
+ {
+ switch (state)
+ {
+ case "CS_NEW": return ChannelState.New;
+ case "CS_INIT": return ChannelState.Init;
+ case "CS_RING": return ChannelState.Ring;
+ case "CS_TRANSMIT": return ChannelState.Transmit;
+ case "CS_EXECUTE": return ChannelState.Execute;
+ case "CS_LOOPBACK": return ChannelState.Loopback;
+ case "CS_HOLD": return ChannelState.Hold;
+ case "CS_HIBERNATE": return ChannelState.Hibernate;
+ case "CS_HANGUP": return ChannelState.Hangup;
+ case "CS_DONE": return ChannelState.Done;
+ default: return ChannelState.Unknown;
+ }
+ }
+
+ public string StateToString(ChannelState state)
+ {
+ return "Unknown";
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/AnyCommand.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/AnyCommand.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,36 @@
+namespace FreeSwitch.EventSocket.Commands
+{
+ public class AnyCommand : Api
+ {
+ private readonly string _name;
+ private readonly string _value;
+
+ public AnyCommand(string name, string arguments)
+ {
+ _name = name;
+ _value = arguments;
+ }
+
+ public override string Command
+ {
+ get { return _name; }
+ }
+
+ public override string Arguments
+ {
+ get { return _value; }
+ }
+
+ public override CommandReply CreateReply(string dataToParse)
+ {
+ if (dataToParse.Length > 0 && (dataToParse[0] == '+') || dataToParse == "OK")
+ return new CommandReply(true);
+ else
+ {
+ CommandReply reply = new CommandReply(false);
+ reply.ErrCode = dataToParse;
+ return reply;
+ }
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/Api.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/Api.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,10 @@
+namespace FreeSwitch.EventSocket.Commands
+{
+ public abstract class Api : CmdBase
+ {
+ public override string ToString()
+ {
+ return string.Format("api {0} {1}", Command, Arguments);
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/AuthCommand.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/AuthCommand.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,34 @@
+namespace FreeSwitch.EventSocket.Commands
+{
+ public class AuthCommand : CmdBase
+ {
+ private readonly string _password;
+
+ public AuthCommand(string password)
+ {
+ _password = password;
+ }
+
+ public override string Command
+ {
+ get { return "auth"; }
+ }
+
+ public override string Arguments
+ {
+ get { return _password; }
+ }
+
+ public override CommandReply CreateReply(string dataToParse)
+ {
+ if (dataToParse.Contains("+OK"))
+ return new CommandReply(true);
+ else
+ {
+ CommandReply reply = new CommandReply(false);
+ reply.ErrCode = dataToParse;
+ return reply;
+ }
+ }
+ }
+}
\ No newline at end of file
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/CmdBase.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/CmdBase.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,55 @@
+namespace FreeSwitch.EventSocket.Commands
+{
+ #region Delegates
+
+ public delegate void ReplyHandler(CmdBase command, CommandReply reply);
+
+ #endregion
+
+ public abstract class CmdBase
+ {
+ public event ReplyHandler OnReply;
+
+ private object _contextData;
+
+ public abstract string Command
+ {
+ get;
+ }
+
+ public abstract string Arguments
+ {
+ get;
+ }
+
+ /// <summary>
+ /// You can attach something that you need to
+ /// identify the command.
+ /// </summary>
+ public object ContextData
+ {
+ get { return _contextData; }
+ set { _contextData = value; }
+ }
+
+ public virtual void HandleReply(CommandReply reply)
+ {
+ // a command is only invoked once.
+ if (OnReply != null)
+ {
+ OnReply(this, reply);
+ OnReply = null;
+ }
+ }
+
+ public virtual CommandReply CreateReply(string dataToParse)
+ {
+ return null;
+ }
+
+ public override string ToString()
+ {
+ return string.Format("{0} {1}", Command, Arguments);
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/CommandReply.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/CommandReply.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,35 @@
+namespace FreeSwitch.EventSocket.Commands
+{
+ /// <summary>
+ /// Baseclass for replies that commands get.
+ /// </summary>
+ public class CommandReply
+ {
+ private bool _success;
+ private string _errCode;
+
+ public CommandReply(bool success)
+ {
+ _success = success;
+ }
+
+ public bool Success
+ {
+ get { return _success; }
+ }
+
+ public string ErrCode
+ {
+ get { return _errCode; }
+ set { _errCode = value; }
+ }
+
+ public override string ToString()
+ {
+ if (_success)
+ return "Success";
+ else
+ return "Failed: " + _errCode;
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/ExecuteJavascript.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/ExecuteJavascript.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,63 @@
+using System.Collections.Generic;
+
+namespace FreeSwitch.EventSocket.Commands
+{
+ public class ExecuteJavascript : Api
+ {
+ private readonly string _scriptName;
+ private readonly IList<string> _arguments = new List<string>();
+
+ public ExecuteJavascript()
+ {
+
+ }
+
+ public ExecuteJavascript(string scriptName)
+ {
+ _scriptName = scriptName;
+ }
+
+ /// <summary>
+ /// Arguments to javascript
+ /// </summary>
+ /// <seealso cref="Arguments"/>
+ public IList<string> Args
+ {
+ get { return _arguments; }
+ }
+
+ public override string Command
+ {
+ get { return "jsrun"; }
+ }
+
+ /// <summary>
+ /// Args to the CmdBase api
+ /// </summary>
+ /// <seealso cref="Args"/>
+ public override string Arguments
+ {
+ get { return _scriptName + " " + JoinArguments(); }
+ }
+
+ public override CommandReply CreateReply(string dataToParse)
+ {
+ if (dataToParse == "OK")
+ return new CommandReply(true);
+ else
+ {
+ CommandReply reply = new CommandReply(false);
+ reply.ErrCode = dataToParse;
+ return reply;
+ }
+ }
+
+ private string JoinArguments()
+ {
+ string args = string.Empty;
+ foreach (string arg in Args)
+ args += arg + " ";
+ return args;
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/GetVariable.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/GetVariable.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,69 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace FreeSwitch.EventSocket.Commands
+{
+ public class GetVariable : Api
+ {
+ private readonly string _channelId;
+ private readonly string _name;
+
+ public GetVariable()
+ {
+
+ }
+
+ public GetVariable(string uuid, string name)
+ {
+ _channelId = uuid;
+ _name = name;
+ }
+
+ public override string Command
+ {
+ get { return "uuid_getvar"; }
+ }
+
+ public override string Arguments
+ {
+ get { return _channelId + " " + _name; }
+ }
+
+ public override CommandReply CreateReply(string dataToParse)
+ {
+ if (dataToParse.Substring(0, 2) == "OK")
+ {
+ return new GetVariableReply(true, dataToParse.Substring(3));
+ }
+ else
+ {
+ GetVariableReply reply = new GetVariableReply(false, string.Empty);
+ reply.ErrCode = dataToParse;
+ return reply;
+ }
+ }
+ }
+
+
+ public class GetVariableReply : CommandReply
+ {
+ private string _value;
+
+ public GetVariableReply(bool success, string value)
+ : base(success)
+ {
+ _value = value;
+ }
+
+ public string SessionId
+ {
+ get { return _value; }
+ }
+
+ public string Value
+ {
+ get { return _value; }
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/HoldCmd.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/HoldCmd.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,29 @@
+namespace FreeSwitch.EventSocket.Commands
+{
+ public class HoldCmd : Api
+ {
+ private readonly string _sessionId;
+ private readonly bool _activate;
+
+ public HoldCmd(string sessionId, bool activate)
+ {
+ _sessionId = sessionId;
+ _activate = activate;
+ }
+
+ public override string Command
+ {
+ get { return "hold"; }
+ }
+
+ public override string Arguments
+ {
+ get { return (_activate ? string.Empty : "off ") + _sessionId; }
+ }
+
+ public override CommandReply CreateReply(string dataToParse)
+ {
+ return base.CreateReply(dataToParse);
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/Originate.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/Originate.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,108 @@
+using System.Collections.Generic;
+using FreeSwitch.EventSocket.General;
+
+namespace FreeSwitch.EventSocket.Commands
+{
+ public class OriginateReply : CommandReply
+ {
+ private readonly string _sessionId;
+
+ public OriginateReply(bool success, string sessionId) : base(success)
+ {
+ _sessionId = sessionId;
+ }
+
+ public string SessionId
+ {
+ get { return _sessionId; }
+ }
+ }
+
+ public class Originate : Api
+ {
+ private SofiaSipAddress _caller;
+ private Address _destination;
+ private readonly IList<ChannelVariable> _variables = new List<ChannelVariable>();
+ private string _callerIdName = null;
+ private string _callerIdNumber = null;
+
+ public Originate()
+ {}
+
+ public Originate(SofiaSipAddress caller, Address destination)
+ {
+ _caller = caller;
+ _destination = destination;
+ }
+
+ public SofiaSipAddress Caller
+ {
+ get { return _caller; }
+ set { _caller = value; }
+ }
+
+ public Address Destination
+ {
+ get { return _destination; }
+ set { _destination = value; }
+ }
+
+ public IList<ChannelVariable> Variables
+ {
+ get { return _variables; }
+ }
+
+ public string CallerIdNumber
+ {
+ get { return _callerIdNumber; }
+ set { _callerIdNumber = value; }
+ }
+
+ public string CallerIdName
+ {
+ get { return _callerIdName; }
+ set { _callerIdName = value; }
+ }
+
+ public override string Command
+ {
+ get { return "originate"; }
+ }
+
+ public override string Arguments
+ {
+ get
+ {
+ _variables.Add(new ChannelVariable("origination_caller_id_name", CallerIdName ?? _caller.Extension));
+ if (!string.IsNullOrEmpty(_callerIdNumber))
+ _variables.Add(new ChannelVariable("origination_caller_id_number", _callerIdNumber));
+
+ string variables = string.Empty;
+ foreach (ChannelVariable var in _variables)
+ variables += var + ",";
+ if (variables.Length > 0)
+ variables = "{" + variables.Remove(variables.Length - 1, 1) + "}";
+
+ return variables + Caller + " " + Destination;
+ }
+ }
+
+ public override CommandReply CreateReply(string dataToParse)
+ {
+ dataToParse = dataToParse.Replace(" ", string.Empty);
+ string[] nameValue = dataToParse.Split(':');
+ if (nameValue[0].ToLower() == "success")
+ return new OriginateReply(true, nameValue[1]);
+ else
+ {
+ OriginateReply reply = new OriginateReply(false, string.Empty);
+ if (nameValue.Length > 1)
+ reply.ErrCode = nameValue[1];
+ else
+ reply.ErrCode = dataToParse;
+ return reply;
+ }
+ }
+
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/ParkCmd.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/ParkCmd.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,22 @@
+namespace FreeSwitch.EventSocket.Commands
+{
+ public class ParkCmd : Api
+ {
+ private readonly string _uuid;
+
+ public ParkCmd(string uuid)
+ {
+ _uuid = uuid;
+ }
+
+ public override string Command
+ {
+ get { return "uuid_park"; }
+ }
+
+ public override string Arguments
+ {
+ get { return _uuid; }
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/Playback.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/Playback.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,34 @@
+namespace FreeSwitch.EventSocket.Commands
+{
+ /// <summary>
+ /// Play a file
+ /// </summary>
+ public class PlaybackCmd : SendMsg
+ {
+ private readonly string _fileName;
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="uuid">channel identifier</param>
+ /// <param name="fileName">Path and filename to sound file</param>
+ /// <remarks>Path should be relative to FS path.</remarks>
+ /// <example>
+ /// mgr.SendApi(new PlaybackCmd(evt.UniqueId, "sounds\\sv\\welcome.wav", PlaybackCmd.All));
+ /// </example>
+ public PlaybackCmd(string uuid, string fileName) : base(uuid)
+ {
+ _fileName = fileName;
+ }
+
+ public override string Command
+ {
+ get { return "playback"; }
+ }
+
+ public override string Arguments
+ {
+ get { return _fileName; }
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/RecordCmd.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/RecordCmd.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,72 @@
+using System;
+
+namespace FreeSwitch.EventSocket.Commands
+{
+ public class RecordCmd : Api
+ {
+ //<uuid> [start|stop] <path> [<limit>]
+ private readonly string _uuid;
+ private readonly bool _start;
+ private readonly string _path;
+ private readonly int _limit;
+
+ /// <param name="uuid">channel id</param>
+ /// <param name="path">FS relative path to sound file</param>
+ public RecordCmd(string uuid, string path)
+ {
+ if (string.IsNullOrEmpty(uuid))
+ throw new ArgumentException("uuid");
+ if (string.IsNullOrEmpty(path))
+ throw new ArgumentException("path");
+
+ _uuid = uuid;
+ _path = path;
+ }
+
+ /// <param name="uuid">channel id</param>
+ /// <param name="path">FS relative path to sound file</param>
+ /// <param name="limit">number of seconds that maximum can be recorded.</param>
+ public RecordCmd(string uuid, string path, int limit)
+ {
+ if (string.IsNullOrEmpty(uuid))
+ throw new ArgumentException("uuid");
+ if (string.IsNullOrEmpty(path))
+ throw new ArgumentException("path");
+
+ _uuid = uuid;
+ _path = path;
+ _limit = limit;
+ }
+
+ /// <param name="uuid">channel id</param>
+ /// <param name="path">FS relative path to sound file</param>
+ /// <param name="stop">stop the recording if true</param>
+ public RecordCmd(string uuid, string path, bool stop) : this(uuid, path)
+ {
+ _start = !stop;
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="uuid">channel id</param>
+ /// <param name="path">FS relative path to sound file</param>
+ /// <param name="stop">stop the recording if true</param>
+ /// <param name="limit">number of seconds that maximum can be recorded.</param>
+ public RecordCmd(string uuid, string path, bool stop, int limit)
+ : this(uuid, path, limit)
+ {
+ _start = !stop;
+ }
+
+ public override string Command
+ {
+ get { return "uuid_record"; }
+ }
+
+ public override string Arguments
+ {
+ get { return _uuid + (_start ? "start" : "stop") + " " + _path + " " + _limit; }
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/SendMsg.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/SendMsg.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,26 @@
+namespace FreeSwitch.EventSocket.Commands
+{
+ public abstract class SendMsg : CmdBase
+ {
+ private readonly string _uuid;
+ private readonly string _callCommand = "execute";
+
+ public SendMsg(string uuid)
+ {
+ _uuid = uuid;
+ }
+
+ public SendMsg(string uuid, string callCommand)
+ {
+ _callCommand = callCommand;
+ _uuid = uuid;
+ }
+
+ public override string ToString()
+ {
+ return
+ string.Format("SendMsg {0}\ncall-command: {1}\nexecute-app-name: {2}\nexecute-app-arg: {3}\n", _uuid,
+ _callCommand, Command, Arguments);
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/SetVariable.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/SetVariable.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,44 @@
+namespace FreeSwitch.EventSocket.Commands
+{
+ public class SetVariable : Api
+ {
+ private readonly string _channelId;
+ private readonly string _name;
+ private readonly string _value;
+
+ public SetVariable()
+ {
+
+ }
+
+ public SetVariable(string uuid, string name, string value)
+ {
+ _channelId = uuid;
+ _name = name;
+ _value = value;
+ }
+
+ public override string Command
+ {
+ get { return "uuid_setvar"; }
+ }
+
+ public override string Arguments
+ {
+ get { return _channelId + " " + _name + " " + _value; }
+ }
+
+ public override CommandReply CreateReply(string dataToParse)
+ {
+ if (dataToParse == "OK")
+ return new CommandReply(true);
+ else
+ {
+ CommandReply reply = new CommandReply(false);
+ reply.ErrCode = dataToParse;
+ return reply;
+ }
+ }
+
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/SleepCmd.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/SleepCmd.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,22 @@
+namespace FreeSwitch.EventSocket.Commands
+{
+ public class SleepCmd : SendMsg
+ {
+ private readonly int _ms;
+
+ public SleepCmd(string uuid, int ms) : base(uuid)
+ {
+ _ms = ms;
+ }
+
+ public override string Command
+ {
+ get { return "sleep"; }
+ }
+
+ public override string Arguments
+ {
+ get { return _ms.ToString(); }
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/TransferCmd.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/TransferCmd.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,36 @@
+namespace FreeSwitch.EventSocket.Commands
+{
+ public class TransferCmd : PbxCommand
+ {
+ private readonly string _sessionId;
+ private readonly string _destination;
+
+ /// <summary>
+ /// Transfer a call to somewhere.
+ /// </summary>
+ /// <param name="sessionId"></param>
+ /// <param name="destination"></param>
+ public TransferCmd(string sessionId, string destination)
+ {
+ _sessionId = sessionId;
+ _destination = destination;
+ }
+
+ public override PbxCommandReply CreateReply(string dataToParse)
+ {
+ if (dataToParse == "OK")
+ return new PbxCommandReply(true);
+ else
+ {
+ PbxCommandReply reply = new PbxCommandReply(false);
+ reply.ErrCode = dataToParse;
+ return reply;
+ }
+ }
+
+ public override string ToString()
+ {
+ return "transfer " + _sessionId + " " + _destination;
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/EventManager.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/EventManager.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,143 @@
+using System;
+using System.Collections.Specialized;
+using System.IO;
+using FreeSwitch.EventSocket.Commands;
+
+namespace FreeSwitch.EventSocket
+{
+ public delegate void EventHandler(EventBase receivedEvent);
+
+ public delegate void EventsWriter(string text);
+
+ public class EventManager
+ {
+ private readonly EventSocket _socket = new EventSocket();
+ public event EventHandler EventReceived;
+ private EventsWriter _writer;
+ private TextWriter _myWriter;
+ public string Password
+ {
+ set { _socket.Password = value; }
+ }
+
+ public EventManager()
+ {
+ _writer = MyWriter;
+ _myWriter = new StreamWriter(new FileStream("C:\\temp\\WatcherRow.log", FileMode.Create, FileAccess.Write, FileShare.ReadWrite));
+ }
+
+ private void MyWriter(string text)
+ {
+ _myWriter.Write(text);
+ }
+
+
+ public EventManager(EventsWriter writer)
+ {
+ _writer = writer;
+ }
+
+ public void Start(string hostname)
+ {
+ _socket.MessageReceived += OnMessage;
+ _socket.Connect(hostname);
+ _socket.DataReceived += OnData;
+ }
+
+ private void OnData(string data)
+ {
+ _writer(data);
+ }
+
+ /// <summary>
+ /// Send a command to the server.
+ /// </summary>
+ /// <param name="cmd"></param>
+ /// <exception cref="IOException">If socket is not connected</exception>
+ /// <exception cref="InvalidOperationException"></exception>
+ /// <exception cref="ObjectDisposedException"></exception>
+ public void Send(CmdBase cmd)
+ {
+ _socket.Send(cmd);
+ }
+
+ public void Send(SendMsg cmd)
+ {
+ _socket.Send(cmd);
+ }
+
+ protected void OnMessage(PlainEventMsg msg)
+ {
+ NameValueCollection parameters = msg.BodyToNameValue(true);
+ string eventName = parameters["event-name"];
+ if (eventName == null)
+ return;
+
+ if (string.Compare(parameters["event-name"], "custom", true) == 0)
+ eventName = parameters["event-subclass"];
+ else
+ eventName = parameters["event-name"];
+
+ //Quickhack for Sofia::Register (convert to sofia_register)
+ eventName = eventName.Replace("::", "_");
+ eventName = StringHelper.UpperCaseToCamelCase(eventName);
+
+ // Try to load the event (check if we've created an event class for the registered event)
+ EventBase eb = EventBase.CreateEvent(eventName);
+
+ // Yep, we got an event class. Let it parse the event information
+ if (eb != null)
+ {
+ eb.SetParameters(parameters);
+ eb.Parse(parameters);
+ if (EventReceived != null)
+ EventReceived(eb);
+
+ /*
+ EventChannelState channel = eb as EventChannelState;
+ if (channel != null)
+ {
+ Console.WriteLine("[" + eb.Name + "/" + channel.ChannelInfo.State + "] (uid: " +
+ channel.UniqueId + ")");
+ Console.WriteLine(" ChannelInfo:");
+ Console.WriteLine(" Name: " + channel.ChannelInfo.Name);
+ Console.WriteLine(" State: " + channel.ChannelInfo.State);
+ if (channel.Caller != null)
+ {
+ Console.WriteLine(" CallerInfo:");
+ Console.WriteLine(" Id: " + channel.Caller.UniqueId);
+ Console.WriteLine(" UserName: " + channel.Caller.UserName);
+ Console.WriteLine(" CallerId: " + channel.Caller.CallerIdName + "/" +
+ channel.Caller.CallerIdNumber);
+ Console.WriteLine(" ChannelName: " + channel.Caller.ChannelName);
+ Console.WriteLine(" DestinationNumber: " + channel.Caller.DestinationNumber);
+ }
+
+ if (channel.Originator != null)
+ {
+ Console.WriteLine(" Originator:");
+ Console.WriteLine(" Id: " + channel.Originator.UniqueId);
+ Console.WriteLine(" UserName: " + channel.Originator.UserName);
+ Console.WriteLine(" CallerId: " + channel.Originator.CallerIdName + "/" +
+ channel.Originator.CallerIdNumber);
+ Console.WriteLine(" ChannelName: " + channel.Originator.ChannelName);
+ Console.WriteLine(" DestinationNumber: " + channel.Originator.DestinationNumber);
+ }
+ }
+ //}*/
+ }
+ else
+ Console.WriteLine("* Failed to load '" + eventName + "'.");
+ }
+
+ public void Subscribe(Events events)
+ {
+ _socket.Subscribe(events);
+ }
+
+ public void Subscribe(params Event[] events)
+ {
+ _socket.Subscribe(new Events(events));
+ }
+ }
+}
\ No newline at end of file
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/EventParser.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/EventParser.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,99 @@
+using EventSocketParser;
+
+namespace FreeSwitch.EventSocket
+{
+ public class EventParser
+ {
+ private PlainEventMsg _msg;
+ private readonly StringParser _parser;
+
+ public EventParser(string text)
+ {
+ _parser = new StringParser(text);
+ }
+
+ public PlainEventMsg ParseMessage()
+ {
+ _parser.ClearSavedPositions();
+ _msg = new PlainEventMsg();
+
+ // Save pos if we cant parse the whole message
+ _parser.SavePos();
+
+ ReadHeader();
+ if (!_msg.ValidateHeader())
+ {
+ _parser.RestorePos();
+ return null;
+ }
+
+ // skip empty line between body and header
+ _parser.ReadLine(true);
+
+ // we got no body.
+ if (_msg.ContentLength == -1)
+ return _msg;
+
+ // Unfortunately, \n\n doesnt appear after all content.
+ if (_msg.ContentLength != 0)
+ _msg.Body = _parser.Read(_msg.ContentLength);
+ else
+ _msg.Body = _parser.ReadToEmptyLine();
+
+ // assume that we have not got a complete packet yet.
+ if (!_msg.Validate())
+ {
+ _parser.RestorePos();
+ return null;
+ }
+
+ return _msg;
+ }
+
+ public bool ReadHeader()
+ {
+ // skip empty lines
+ while (!_parser.EOF && _parser.PeekWord(true, true) == string.Empty)
+ _parser.ReadLine(false);
+
+ if (_parser.EOF)
+ return false;
+
+ string name = _parser.Read(':', true);
+ while (name != string.Empty)
+ {
+ switch (name)
+ {
+ case "Content-Length":
+ _msg.ContentLength = int.Parse(_parser.ReadLine(true));
+ break;
+ case "Content-Type":
+ _msg.ContentType = _parser.ReadLine(true);
+ break;
+ case "Reply-Text":
+ _msg.Body = _parser.ReadLine();
+ break;
+ }
+
+ // empty line == end of header
+ if (_parser.EOL)
+ break;
+
+ name = _parser.Read(':', true);
+ }
+
+ return _msg.ContentType != string.Empty;
+ }
+
+ public void Append(string value)
+ {
+ _parser.RemoveUsedContent();
+ _parser.Append(value);
+ }
+
+ public void Clear()
+ {
+ _parser.Clear();
+ }
+ }
+}
\ No newline at end of file
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/EventSocket.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/EventSocket.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,298 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Net.Sockets;
+using System.Text;
+using System.Threading;
+using FreeSwitch.EventSocket.Commands;
+
+namespace FreeSwitch.EventSocket
+{
+ public delegate void MessageHandler(PlainEventMsg msg);
+
+ public class EventSocket
+ {
+ #region Delegates
+
+ public delegate void EventSocketHandler(EventSocket client);
+
+ public delegate void DataHandler(string data);
+
+ #endregion
+
+ private readonly Queue<CmdBase> _commands = new Queue<CmdBase>();
+ private bool _autoConnect = true;
+ private Events _events;
+ private string _hostName;
+ private readonly EventParser _parser = new EventParser(string.Empty);
+ public event DataHandler DataReceived;
+ private string _password = "ClueCon";
+ private int _port = 8021;
+ private object _lockobj = new object();
+ private readonly byte[] _readBuffer = new byte[8192];
+ private string _temp = string.Empty;
+ private Socket _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+ private NetworkStream _stream;
+ private Timer _timer;
+ private bool _authed = false;
+ const int RetryTimeout = 5000;
+
+ public string Password
+ {
+ get { return _password; }
+ set { _password = value; }
+ }
+
+ public bool AutoConnect
+ {
+ get { return _autoConnect; }
+ set { _autoConnect = value; }
+ }
+
+ public event MessageHandler MessageReceived;
+
+ public event EventSocketHandler Disconnected;
+ public event EventSocketHandler Connected;
+
+ public void Connect(string server)
+ {
+ int pos = server.IndexOf(':');
+ if (pos == -1)
+ _hostName = server;
+ else
+ {
+ _port = int.Parse(server.Substring(pos + 1));
+ _hostName = server.Substring(0, pos);
+ }
+
+ Connect();
+ }
+
+ public void Connect()
+ {
+ if (_hostName == null)
+ throw new InvalidOperationException("Must call the other Connect method first to set hostname/port.");
+
+ try
+ {
+ TryConnect();
+ }
+ catch (SocketException)
+ {
+ Console.WriteLine("EventSocket: Connect failed");
+ HandleDisconnect();
+ }
+ }
+
+ private void TryConnect()
+ {
+ lock (_lockobj)
+ {
+ Console.WriteLine("EventSocket.TryConnect: Connecting to " + _hostName + ":" + _port);
+
+ _socket.Connect(_hostName, _port);
+ if (_stream == null)
+ _stream = new NetworkStream(_socket, false);
+
+ if (Connected != null)
+ Connected(this);
+ BeginRead();
+
+ if (_timer != null)
+ {
+ Timer tmr = _timer;
+ _timer = null;
+ tmr.Change(Timeout.Infinite, Timeout.Infinite);
+ tmr.Dispose();
+ }
+ }
+ }
+
+ private void BeginRead()
+ {
+ _stream.BeginRead(_readBuffer, 0, _readBuffer.Length, OnReadCompleted, null);
+ }
+
+ private void OnReadCompleted(IAsyncResult ar)
+ {
+ int bytesRead;
+ try
+ {
+ bytesRead = _stream.EndRead(ar);
+ if (bytesRead == 0)
+ {
+ HandleDisconnect();
+ return;
+ }
+ }
+ catch (IOException)
+ {
+ // Remote end disconnected.
+ HandleDisconnect();
+ return;
+ }
+
+ string text = Encoding.ASCII.GetString(_readBuffer, 0, bytesRead);
+ if (DataReceived != null)
+ DataReceived(text);
+ _temp += text;
+ _parser.Append(text);
+ ParseMessages();
+
+ _stream.BeginRead(_readBuffer, 0, _readBuffer.Length, OnReadCompleted, null);
+ }
+
+ /// <summary>
+ /// Subscribe on the specified events.
+ /// </summary>
+ /// <param name="events">The events.</param>
+ public void Subscribe(Events events)
+ {
+ _events = events;
+ if (_socket.Connected && _authed)
+ RequestEvents();
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="s"></param>
+ /// <exception cref="InvalidOperationException"></exception>
+ /// <exception cref="ObjectDisposedException"></exception>
+ private void Write(string s)
+ {
+ if (_socket == null)
+ return;
+ if (!_socket.Connected)
+ {
+ try
+ {
+ Console.WriteLine("EventSocket.Write: Trying to connect eventsocket.");
+ TryConnect();
+ Console.WriteLine("EventSocket.Write: Connected.");
+ }
+ catch (SocketException)
+ {
+ return;
+ }
+ }
+
+ byte[] bytes = Encoding.ASCII.GetBytes(s);
+ _stream.Write(bytes, 0, bytes.Length);
+ }
+
+ private void ParseMessages()
+ {
+ PlainEventMsg msg = _parser.ParseMessage();
+ while (msg != null)
+ {
+ if (msg.ContentType == "auth/request")
+ {
+ AuthCommand cmd = new AuthCommand(_password);
+ cmd.OnReply += OnAuthed;
+ _commands.Enqueue(cmd);
+ Write(cmd + "\n\n");
+ }
+ else if (msg.ContentType == "command/reply"
+ || msg.ContentType == "api/response")
+ {
+ if (_commands.Count > 0)
+ {
+ CmdBase cmd = _commands.Dequeue();
+ Console.WriteLine("Reply to " + cmd.GetType().Name + ": " + msg.Body);
+ cmd.HandleReply(cmd.CreateReply(msg.Body));
+ }
+ else
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.WriteLine("Got command reply or api response, but no actual command/api: " + msg.Body);
+ Console.ForegroundColor = ConsoleColor.Gray;
+ }
+ }
+ else
+ {
+ if (MessageReceived != null)
+ MessageReceived(msg);
+ }
+ msg = _parser.ParseMessage();
+ }
+ }
+
+ private void OnAuthed(CmdBase command, CommandReply reply)
+ {
+ _authed = true;
+ RequestEvents();
+ }
+
+ private void HandleDisconnect()
+ {
+ _parser.Clear();
+ _authed = false;
+ _socket.Close();
+ _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+ if (_stream != null)
+ {
+ _stream.Dispose();
+ _stream = null;
+ }
+
+ if (Disconnected != null)
+ Disconnected.Invoke(this);
+ if (AutoConnect && _timer == null)
+ {
+ Console.WriteLine("EventSocket: Launching timer.");
+ _timer = new Timer(TryConnect, this, RetryTimeout, RetryTimeout);
+ }
+ }
+
+ private void RequestEvents()
+ {
+ if (_events.Count <= 0 && _authed)
+ return;
+
+ Write("event plain " + GetEventString() + "\n\n");
+ }
+
+ private string GetEventString()
+ {
+ string events = string.Empty;
+ for (int i = 0; i < _events.Count; ++i)
+ events += StringHelper.CamelCaseToUpperCase(_events[i].ToString()) + " ";
+ return events;
+ }
+
+ /// <summary>
+ /// Send a command to FreeSwitch.
+ /// Do you want a response? Then use the delegate in the Command class.
+ /// </summary>
+ /// <param name="command">Command to send.</param>
+ /// <exception cref="IOException">If socket is not connected.</exception>
+ /// <exception cref="InvalidOperationException"></exception>
+ /// <exception cref="ObjectDisposedException"></exception>
+ public void Send(CmdBase command)
+ {
+ if (!_socket.Connected)
+ throw new IOException("Socket is not connected.");
+
+ _commands.Enqueue(command);
+
+ // All commands need replies.
+ Write(command + "\n\n");
+ }
+
+ private static void TryConnect(object state)
+ {
+ EventSocket client = (EventSocket) state;
+ try
+ {
+ Console.WriteLine("EventSocket.Timer: Trying to connect eventsocket.");
+ client.TryConnect();
+ Console.WriteLine("EventSocket.Timer: Connected.");
+ }
+ catch (SocketException err)
+ {
+ Console.WriteLine("Eventsocket.TryConnect: " + err.Message);
+ }
+ }
+ }
+}
\ No newline at end of file
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/EventSocket.pfx
==============================================================================
Binary file. No diff available.
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,107 @@
+using System.Collections.Generic;
+
+namespace FreeSwitch.EventSocket
+{
+ #region Event enum
+ public enum Event
+ {
+ Custom,
+ ChannelCreate,
+ ChannelDestroy,
+ ChannelState,
+ ChannelAnswer,
+ ChannelApplication,
+ ChannelHangup,
+ ChannelExecute,
+ ChannelExecuteComplete,
+ ChannelBridge,
+ ChannelUnbridge,
+ ChannelProgress,
+ ChannelOriginate,
+ ChannelOutgoing,
+ ChannelPark,
+ ChannelUnpark,
+ Api,
+ Log,
+ InboundChan,
+ OutboundChan,
+ Startup,
+ Shutdown,
+ Publish,
+ Unpublish,
+ Talk,
+ Notalk,
+ SessionCrash,
+ ModuleLoad,
+ Dtmf,
+ Message,
+ PresenceIn,
+ PresenceOut,
+ PresenceProbe,
+ SofiaRegister,
+ SofiaExpires,
+ Roster,
+ Codec,
+ BackgroundJob,
+ DetectedSpeech,
+ PrivateCommand,
+ Heartbeat,
+ All
+ }
+ #endregion
+
+ #region Events class
+ public class Events
+ {
+ private IList<Event> m_events = new List<Event>();
+
+ public Events() { }
+ public Events(params Event[] parameters)
+ {
+ foreach (Event e in parameters)
+ {
+ Add(e);
+ }
+ }
+
+ public void Add(Event e)
+ {
+ m_events.Add(e);
+ }
+
+ public Event this[int index]
+ {
+ get { return m_events[index]; }
+ }
+
+ public void Clear()
+ {
+ m_events.Clear();
+ }
+
+ public int Count
+ {
+ get { return m_events.Count; }
+ }
+
+ public static Events GetChannelEvents()
+ {
+ Events e = new Events();
+ e.Add(Event.ChannelAnswer);
+ e.Add(Event.ChannelBridge);
+ e.Add(Event.ChannelCreate);
+ e.Add(Event.ChannelDestroy);
+ e.Add(Event.ChannelExecute);
+ e.Add(Event.ChannelHangup);
+ e.Add(Event.ChannelOutgoing);
+ e.Add(Event.ChannelPark);
+ e.Add(Event.ChannelProgress);
+ e.Add(Event.ChannelState);
+ e.Add(Event.ChannelUnbridge);
+ e.Add(Event.ChannelUnpark);
+ return e;
+ }
+ }
+ #endregion
+
+}
\ No newline at end of file
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events/EventApiCommand.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events/EventApiCommand.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace FreeSwitch.EventSocket
+{
+ class EventApiCommand : EventBase
+ {
+ private string m_command;
+
+ public override bool ParseCommand(string name, string value)
+ {
+ switch (name)
+ {
+ case "api-command":
+ m_command = value;
+ break;
+ default:
+ return base.ParseCommand(name, value);
+ }
+
+ return true;
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events/EventBase.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events/EventBase.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,139 @@
+using System;
+using System.Collections.Specialized;
+
+namespace FreeSwitch.EventSocket
+{
+ public class EventBase
+ {
+ private string m_callingFile;
+ private string m_callingFunction;
+ private int m_callingLineNumber;
+ private string m_coreId;
+ private DateTime m_dateGMT;
+ private DateTime m_dateLocal;
+ private string m_name;
+ private readonly NameValueCollection _parameters = new NameValueCollection();
+ private NameValueCollection _allParameters;
+
+ #region Properties
+
+ public string Name
+ {
+ get { return m_name; }
+ set { m_name = value; }
+ }
+
+ public string CoreId
+ {
+ get { return m_coreId; }
+ set { m_coreId = value; }
+ }
+
+ public DateTime DateLocal
+ {
+ get { return m_dateLocal; }
+ set { m_dateLocal = value; }
+ }
+
+ public DateTime DateGMT
+ {
+ get { return m_dateGMT; }
+ set { m_dateGMT = value; }
+ }
+
+ public string CallingFile
+ {
+ get { return m_callingFile; }
+ set { m_callingFile = value; }
+ }
+
+ public string CallingFunction
+ {
+ get { return m_callingFunction; }
+ set { m_callingFunction = value; }
+ }
+
+ public int CallingLineNumber
+ {
+ get { return m_callingLineNumber; }
+ set { m_callingLineNumber = value; }
+ }
+
+ #endregion
+
+ public virtual bool IsChannelEvent
+ {
+ get { return false; }
+ }
+
+ public NameValueCollection Parameters
+ {
+ get { return _parameters; }
+ }
+
+ public NameValueCollection AllParameters
+ {
+ get { return _allParameters; }
+ }
+
+ internal void SetParameters(NameValueCollection allparams)
+ {
+ _allParameters = allparams;
+ }
+
+ public void Parse(NameValueCollection variables)
+ {
+ for (int i = 0; i < variables.Count; ++i)
+ ParseCommand(variables.GetKey(i), variables.Get(i));
+ }
+
+ public static EventBase CreateEvent(string eventName)
+ {
+ try
+ {
+ string eventNamea = "Event" + eventName;
+ Type t = Type.GetType("FreeSwitch.EventSocket.Event" + eventName);
+ if (t == null)
+ return null;
+ return (EventBase) Activator.CreateInstance(t);
+ }
+ catch (TypeLoadException)
+ {
+ return null;
+ }
+ }
+
+ public virtual bool ParseCommand(string name, string value)
+ {
+ switch (name)
+ {
+ case "event-name":
+ m_name = value;
+ break;
+ case "core-uuid":
+ m_coreId = value;
+ break;
+ case "event-date-local":
+ m_dateLocal = DateTime.Parse(value);
+ break;
+ case "event-date-gmt":
+ m_dateGMT = DateTime.Parse(value);
+ break;
+ case "event-calling-file":
+ m_callingFile = value;
+ break;
+ case "event-calling-function":
+ m_callingFunction = value;
+ break;
+ case "event-calling-line-number":
+ int.TryParse(value, out m_callingLineNumber);
+ break;
+ default:
+ Parameters.Add(name, value);
+ //Console.WriteLine(m_name + ", Unhandled parameter: [" + name + "] " + value);
+ return false;
+ }
+ return true;
+ }
+ }
+}
\ No newline at end of file
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events/EventHeartbeat.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events/EventHeartbeat.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,57 @@
+namespace FreeSwitch.EventSocket
+{
+ class EventHeartbeat : EventBase
+ {
+ private string _info;
+ private string _upTime;
+ private int _sessionCount;
+
+ public string Info
+ {
+ get { return _info; }
+ set { _info = value; }
+ }
+
+ public string UpTime
+ {
+ get { return _upTime; }
+ set { _upTime = value; }
+ }
+
+ public int SessionCount
+ {
+ get { return _sessionCount; }
+ set { _sessionCount = value; }
+ }
+
+ public override bool ParseCommand(string name, string value)
+ {
+ switch (name)
+ {
+ case "event-info":
+ Info = value;
+ break;
+ case "up-time":
+ UpTime = value;
+ break;
+ case "session-count":
+ int.TryParse(value, out _sessionCount);
+ break;
+
+ default:
+ return base.ParseCommand(name, value);
+ }
+
+ return true;
+
+ }
+ }
+
+/*
+ Event-Info: System%20Ready
+Up-Time: 0%20years,%200%20days,%201%20hour,%2048%20minutes,%207%20seconds,%20265
+%20milliseconds,%20625%20microseconds%0A
+Session-Count: 0
+Event-Name: HEARTBEAT
+ */
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events/EventMessageQuery.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events/EventMessageQuery.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace FreeSwitch.EventSocket
+{
+ public class EventMessageQuery : EventBase
+ {
+ private string _account;
+
+ public string Account
+ {
+ get { return _account; }
+ set { _account = value; }
+ }
+
+ public override bool ParseCommand(string name, string value)
+ {
+ if (name == "message-account")
+ Account = value;
+ else
+ return base.ParseCommand(name, value);
+
+ return true;
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events/EventMessageWaiting.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events/EventMessageWaiting.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,133 @@
+namespace FreeSwitch.EventSocket
+{
+ public class EventMessageWaiting : EventBase
+ {
+ private string _account;
+ private int _newMessages;
+ private int _newUrgentMessages;
+ private int _totalMessages;
+ private int _totalUrgentMessages;
+
+ /// <summary>
+ /// Messages are for this account
+ /// </summary>
+ public string Account
+ {
+ get { return _account; }
+ set { _account = value; }
+ }
+
+ /// <summary>
+ /// Total count of messages
+ /// </summary>
+ public bool MessagesWaiting
+ {
+ get { return _newMessages != 0 || _newUrgentMessages != 0; }
+ }
+
+ /// <summary>
+ /// Number of new messages
+ /// </summary>
+ public int NewMessages
+ {
+ get { return _newMessages; }
+ set { _newMessages = value; }
+ }
+
+ /// <summary>
+ /// Number of new urgent messages
+ /// </summary>
+ public int NewUrgentMessages
+ {
+ get { return _newUrgentMessages; }
+ set { _newUrgentMessages = value; }
+ }
+
+ /// <summary>
+ /// Total number of new/saved/old messages
+ /// </summary>
+ public int TotalMessages
+ {
+ get { return _totalMessages; }
+ set { _totalMessages = value; }
+ }
+
+ /// <summary>
+ /// Total number of new urgent messages
+ /// </summary>
+ public int TotalUrgentMessages
+ {
+ get { return _totalUrgentMessages; }
+ set { _totalUrgentMessages = value; }
+ }
+
+ public override bool ParseCommand(string name, string value)
+ {
+ switch (name)
+ {
+ case "mwi-messages-waiting":
+ // are calculated by using voice messages
+ break;
+ case "mwi-message-account":
+ _account = value;
+ break;
+ case "mwi-voice-message":
+ return ParseVoiceMessages(value);
+ default:
+ return base.ParseCommand(name, value);
+ }
+
+ return true;
+ }
+
+ private bool ParseVoiceMessages(string value)
+ {
+ /*
+ switch_event_add_header(event, SWITCH_STACK_BOTTOM, "MWI-Voice-Message", "%d/%d (%d/%d)",
+ total_new_messages, total_saved_messages, total_new_urgent_messages, total_saved_urgent_messages);
+ * */
+ int pos = value.IndexOf('/');
+ if (pos == -1)
+ return false;
+ if (!int.TryParse(value.Substring(0, pos), out _newMessages))
+ return false;
+
+ int oldPos = pos + 1;
+ pos = value.IndexOf(' ', pos);
+ if (pos == -1)
+ return false;
+ if (!int.TryParse(value.Substring(oldPos, pos - oldPos), out _totalMessages))
+ return false;
+
+ oldPos = pos + 2;
+ pos = value.IndexOf('/', pos);
+ if (pos == -1)
+ return false;
+ if (!int.TryParse(value.Substring(oldPos, pos - oldPos), out _newUrgentMessages))
+ return false;
+
+ oldPos = pos + 1;
+ pos = value.IndexOf(')', pos);
+ if (pos == -1)
+ return false;
+ if (!int.TryParse(value.Substring(oldPos, pos - oldPos), out _totalUrgentMessages))
+ return false;
+
+ return true;
+ }
+
+ public override string ToString()
+ {
+ string str = base.ToString();
+ str += "WMI-Messages-Waiting: " + (MessagesWaiting ? "yes" : "no") + "\n";
+ str += "WMI-Message-Account: " + _account + "\n";
+ if (_newUrgentMessages != 0 || _newMessages != 0)
+ str += string.Format("WMI-Voice-Message: {0}/{1} ({2}/{3})\n",
+ _newMessages,
+ _totalMessages,
+ _newMessages,
+ _totalUrgentMessages);
+ return str;
+ }
+ }
+}
\ No newline at end of file
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events/EventReSchedule.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events/EventReSchedule.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,62 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace FreeSwitch.EventSocket
+{
+ class EventReSchedule : EventBase
+ {
+ private int m_taskId;
+ private string m_description;
+ private string m_group;
+ private string m_runtime;
+
+ public int TaskId
+ {
+ get { return m_taskId; }
+ set { m_taskId = value; }
+ }
+
+ public string Description
+ {
+ get { return m_description; }
+ set { m_description = value; }
+ }
+
+ public string Group
+ {
+ get { return m_group; }
+ set { m_group = value; }
+ }
+
+ public string Runtime
+ {
+ get { return m_runtime; }
+ set { m_runtime = value; }
+ }
+
+ public override bool ParseCommand(string name, string value)
+ {
+ switch (name)
+ {
+ case "task-id":
+ int.TryParse(value, out m_taskId);
+ break;
+ case "task-desc":
+ m_description = value;
+ break;
+ case "task-group":
+ m_group = value;
+ break;
+ case "task-runtime":
+ m_runtime = value;
+ break;
+ default:
+ return base.ParseCommand(name, value);
+ }
+
+ return true;
+
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/FreeSwitch.EventSocket.csproj
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/FreeSwitch.EventSocket.csproj Thu May 1 14:27:39 2008
@@ -0,0 +1,123 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>8.0.50727</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{3F8895F6-F710-4323-B96A-4EFB6BC97E08}</ProjectGuid>
+ <OutputType>Library</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>FreeSwitch.EventSocket</RootNamespace>
+ <AssemblyName>FreeSwitch.EventSocket</AssemblyName>
+ <StartupObject>
+ </StartupObject>
+ <SignAssembly>true</SignAssembly>
+ <AssemblyOriginatorKeyFile>EventSocket.pfx</AssemblyOriginatorKeyFile>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ <Reference Include="System.Data" />
+ <Reference Include="System.Xml" />
+ <Reference Include="Tiny.Net, Version=1.0.0.1, Culture=neutral, PublicKeyToken=15480ee9e0247fcb, processorArchitecture=MSIL">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>..\..\..\dlls\Debug\Tiny.Net.dll</HintPath>
+ </Reference>
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="ChannelEvents\EventChannelApplication.cs" />
+ <Compile Include="ChannelEvents\EventChannelExecuteComplete.cs" />
+ <Compile Include="ChannelEvents\EventChannelOriginate.cs" />
+ <Compile Include="ChannelEvents\EventChannelBridge.cs" />
+ <Compile Include="ChannelEvents\ChannelEvent.cs" />
+ <Compile Include="ChannelEvents\EventChannelAnswer.cs" />
+ <Compile Include="ChannelEvents\EventChannelProgress.cs" />
+ <Compile Include="ChannelEvents\EventChannelUnbridge.cs" />
+ <Compile Include="ChannelEvents\EventChannelUnpark.cs" />
+ <Compile Include="ChannelEvents\EventCodec.cs" />
+ <Compile Include="ChannelInfo.cs" />
+ <Compile Include="Commands\AnyCommand.cs">
+ </Compile>
+ <Compile Include="Commands\Api.cs" />
+ <Compile Include="Commands\AuthCommand.cs" />
+ <Compile Include="Commands\CmdBase.cs" />
+ <Compile Include="Commands\CommandReply.cs" />
+ <Compile Include="Commands\ExecuteJavascript.cs" />
+ <Compile Include="Commands\GetVariable.cs" />
+ <Compile Include="Commands\HoldCmd.cs" />
+ <Compile Include="Commands\Originate.cs" />
+ <Compile Include="Commands\ParkCmd.cs" />
+ <Compile Include="Commands\Playback.cs" />
+ <Compile Include="Commands\RecordCmd.cs" />
+ <Compile Include="Commands\SendMsg.cs" />
+ <Compile Include="Commands\SetVariable.cs" />
+ <Compile Include="Commands\SleepCmd.cs" />
+ <Compile Include="EventManager.cs" />
+ <Compile Include="ChannelEvents\EventDtmfStatus.cs" />
+ <Compile Include="Ivr\IvrInterface.cs" />
+ <Compile Include="PlainEventMsg.cs" />
+ <Compile Include="EventParser.cs" />
+ <Compile Include="Events.cs" />
+ <Compile Include="Events\EventApiCommand.cs" />
+ <Compile Include="Events\EventBase.cs" />
+ <Compile Include="ChannelEvents\EventChannelCreate.cs" />
+ <Compile Include="ChannelEvents\EventChannelDestroy.cs" />
+ <Compile Include="ChannelEvents\EventChannelExecute.cs" />
+ <Compile Include="ChannelEvents\EventChannelHangup.cs" />
+ <Compile Include="ChannelEvents\EventChannelOutgoing.cs" />
+ <Compile Include="ChannelEvents\EventChannelState.cs" />
+ <Compile Include="EventSocket.cs" />
+ <Compile Include="Events\EventHeartbeat.cs" />
+ <Compile Include="Events\EventReSchedule.cs" />
+ <Compile Include="General\Address.cs" />
+ <Compile Include="General\ChannelVariable.cs" />
+ <Compile Include="General\SipAddress.cs" />
+ <Compile Include="General\SofiaSipAddress.cs" />
+ <Compile Include="PartyInfo.cs" />
+ <Compile Include="Program.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="Events\EventMessageQuery.cs" />
+ <Compile Include="ChannelEvents\EventDtmf.cs" />
+ <Compile Include="SipEvents\EventPresenceIn.cs" />
+ <Compile Include="SipEvents\EventPresenceOut.cs" />
+ <Compile Include="SipEvents\EventPresenceProbe.cs" />
+ <Compile Include="SipEvents\EventRoster.cs" />
+ <Compile Include="Events\EventMessageWaiting.cs" />
+ <Compile Include="SipEvents\SipEvent.cs" />
+ <Compile Include="SipEvents\EventPresence.cs" />
+ <Compile Include="SipEvents\EventSofiaExpire.cs" />
+ <Compile Include="SipEvents\EventSofiaRegister.cs" />
+ <Compile Include="StringHelper.cs" />
+ <Compile Include="StringParser.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="EventSocket.pfx" />
+ </ItemGroup>
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+ <PropertyGroup>
+ <PostBuildEvent>copy $(TargetPath) $(SolutionDir)..\..\dlls\$(ConfigurationName)</PostBuildEvent>
+ </PropertyGroup>
+</Project>
\ No newline at end of file
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/General/Address.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/General/Address.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace FreeSwitch.EventSocket.General
+{
+ public class Address
+ {
+ private string _extension;
+
+ public Address()
+ {
+
+ }
+
+ public Address(string extension)
+ {
+ _extension = extension;
+ }
+
+ public string Extension
+ {
+ get { return _extension; }
+ set { _extension = value; }
+ }
+
+ public override string ToString()
+ {
+ return Extension;
+ }
+ }
+
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/General/ChannelVariable.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/General/ChannelVariable.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,33 @@
+namespace FreeSwitch.EventSocket.General
+{
+ /// <summary>
+ /// Channel variables are used in freeswitch to store information
+ /// that can be used by javascript programs.
+ /// </summary>
+ public class ChannelVariable
+ {
+ private readonly string _name;
+ private readonly string _value;
+
+ public ChannelVariable(string name, string value)
+ {
+ _name = name;
+ _value = value;
+ }
+
+ public string Name
+ {
+ get { return _name; }
+ }
+
+ public string Value
+ {
+ get { return _value; }
+ }
+
+ public override string ToString()
+ {
+ return _name + "=" + _value;
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/General/SipAddress.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/General/SipAddress.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,38 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace FreeSwitch.EventSocket.General
+{
+ public class SipAddress : Address
+ {
+ private string _domain;
+
+ public SipAddress(string domain, string extension)
+ : base(extension)
+ {
+ _domain = domain;
+ }
+
+ public string Domain
+ {
+ get { return _domain; }
+ set { _domain = value; }
+ }
+
+ public override string ToString()
+ {
+ return Extension + "@" + Domain;
+ }
+
+ public static SipAddress Parse(string fullAddress)
+ {
+ string[] parts = fullAddress.Split('@');
+ if (parts.Length == 2)
+ {
+ return new SipAddress(parts[1], parts[0]);
+ }
+ return null;
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/General/SofiaSipAddress.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/General/SofiaSipAddress.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,44 @@
+namespace FreeSwitch.EventSocket.General
+{
+ public class SofiaSipAddress : Address
+ {
+ private readonly string _domain;
+
+ public SofiaSipAddress(string domain, string userName)
+ {
+ Extension = userName;
+ _domain = domain;
+ }
+
+ public SofiaSipAddress(SipAddress address)
+ {
+ _domain = address.Domain;
+ Extension = address.Extension;
+ }
+
+ public override string ToString()
+ {
+ return "sofia/mydomain.com/" + Extension + "%" + _domain;
+ }
+
+ public static SofiaSipAddress Parse(string fullAddress)
+ {
+ string[] parts = fullAddress.Split('@');
+ if (parts.Length == 2)
+ {
+ return new SofiaSipAddress(parts[1], parts[0]);
+ }
+ else
+ {
+ parts = fullAddress.Split('/');
+ if (parts.Length == 3)
+ {
+ return new SofiaSipAddress(parts[1], parts[2]);
+ }
+ }
+
+ return null;
+
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Ivr/IvrInterface.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Ivr/IvrInterface.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,212 @@
+using System;
+using System.Threading;
+using FreeSwitch.EventSocket.Commands;
+
+namespace FreeSwitch.EventSocket.Ivr
+{
+ public class IvrInterface
+ {
+ public const string AllDigits = "*#0123456789";
+ private readonly string _uuid;
+ private readonly string _baseSoundPath = "sounds\\";
+ private string _dtmf = string.Empty;
+ private EventManager _mgr;
+ public event DtmfHandler DtmfReceived;
+ private readonly int _dtmfWaitCount = 0;
+ private ManualResetEvent _dtmfWaitEvent;
+ private bool _abortSpeechOnDtmf;
+ private bool _answered;
+ private IvrInterfaceHandler _handler = null;
+ private string _lastAbortDigits = "*";
+
+ public IvrInterface(EventManager mgr, string uuid)
+ {
+ if (mgr == null)
+ throw new ArgumentNullException("mgr");
+ if (string.IsNullOrEmpty(uuid))
+ throw new ArgumentNullException("uuid");
+
+ _mgr = mgr;
+ mgr.EventReceived += OnEvent;
+ _uuid = uuid;
+
+ mgr.Send(new ParkCmd(uuid));
+ }
+
+ public IAsyncResult BeginInvoke(IvrInterfaceHandler handler, AsyncCallback callback, object state)
+ {
+ _handler = handler;
+ return handler.BeginInvoke(this, callback, state);
+ }
+
+ public void EndInvoke(IAsyncResult result)
+ {
+ if (_handler != null)
+ _handler.EndInvoke(result);
+ }
+
+ /// <summary>
+ /// dont play phrases as long as we have DTMF in the buffer.
+ /// </summary>
+ public bool AbortSpeechOnDtmf
+ {
+ get { return _abortSpeechOnDtmf; }
+ set { _abortSpeechOnDtmf = value; }
+ }
+
+ public bool Answered
+ {
+ get { return _answered; }
+ }
+
+ private void OnEvent(EventBase receivedEvent)
+ {
+ if (receivedEvent is EventChannelAnswer)
+ {
+ _answered = true;
+ }
+/* else if (receivedEvent is EventDtmfStatus)
+ {
+ // Let's always dequeue dtmf.
+ EventDtmfStatus evt = (EventDtmfStatus) receivedEvent;
+ if (evt.UniqueId == _uuid)
+ _mgr.Send(new GetDtmfCmd(_uuid, evt.Count));
+ }*/
+ else if (receivedEvent is EventDtmf)
+ {
+ EventDtmf evt = (EventDtmf) receivedEvent;
+ lock (_dtmf)
+ _dtmf += evt.Digit;
+ if (_dtmfWaitCount >= _dtmf.Length)
+ _dtmfWaitEvent.Set();
+
+ if (DtmfReceived != null)
+ DtmfReceived(this, new DtmfEventArgs(_dtmf));
+ }
+ else if (receivedEvent is EventChannelDestroy || receivedEvent is EventChannelHangup)
+ {
+ if (_mgr != null)
+ {
+ _mgr.EventReceived -= OnEvent;
+ _mgr = null;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Wait on dtmf.
+ /// </summary>
+ /// <param name="count">Number of digits to get</param>
+ /// <param name="timeout">number of seconds to wait on all digits.</param>
+ /// <remarks>You can also used the Dtmf event if you want to use asynchrounous programming.</remarks>
+ /// <seealso cref="DtmfReceived"/>
+ public string GetDtmf(int count, int timeout)
+ {
+ if (_mgr == null)
+ return string.Empty;
+ if (_dtmfWaitEvent != null)
+ throw new InvalidOperationException("Already waiting on an event.");
+
+ if (_dtmf.Length < count)
+ {
+ _dtmfWaitEvent = new ManualResetEvent(false);
+ if (!_dtmfWaitEvent.WaitOne(timeout * 1000, true))
+ {
+ _dtmf = string.Empty;
+ return string.Empty;
+ }
+ }
+
+ lock (_dtmf)
+ {
+ if (_dtmf.Length >= count)
+ {
+ string dtmf = _dtmf.Substring(0, count);
+ _dtmf = _dtmf.Remove(count);
+ return dtmf;
+ }
+ }
+
+ return string.Empty;
+ }
+
+ public void Play(string path, string digitsToAbortOn)
+ {
+ if (_mgr == null)
+ return;
+
+ if (_abortSpeechOnDtmf && _dtmf != string.Empty)
+ return;
+
+ if (digitsToAbortOn != _lastAbortDigits)
+ {
+ _mgr.Send(new SetVariable(_uuid, "playback_terminators", digitsToAbortOn));
+ _lastAbortDigits = digitsToAbortOn;
+ }
+
+ _mgr.Send(new PlaybackCmd(_uuid, _baseSoundPath + path));
+ }
+
+ public void Record(string path, bool stop, int limit)
+ {
+ if (_mgr == null)
+ return;
+ _mgr.Send(new RecordCmd(_uuid, _baseSoundPath + path, stop, limit));
+ }
+
+ public void Record(string path, int limit)
+ {
+ if (_mgr == null)
+ return;
+ _mgr.Send(new RecordCmd(_uuid, _baseSoundPath + path, limit));
+ }
+
+ public void Sleep(int ms)
+ {
+ if (_mgr == null)
+ return;
+ _mgr.Send(new SleepCmd(_uuid, ms));
+ }
+ }
+
+ public class DtmfEventArgs : EventArgs
+ {
+ private string _dtmf;
+ private string _dtmfCopy;
+
+ public DtmfEventArgs(string dtmf)
+ {
+ _dtmf = dtmf;
+ _dtmfCopy = (string) _dtmf.Clone();
+ }
+
+ /// <summary>
+ /// You cannot remove digits from the buffer (since it's a copy of the real buffer).
+ /// </summary>
+ /// <seealso cref="RemoveDigits"/>
+ public string Dtmf
+ {
+ get { return _dtmfCopy; }
+ }
+
+ /// <summary>
+ /// Remove digits from the real buffer.
+ /// </summary>
+ /// <param name="count">number of digits to remove.</param>
+ public void RemoveDigits(int count)
+ {
+ lock (_dtmf)
+ {
+ if (count > _dtmf.Length)
+ _dtmf = string.Empty;
+ else
+ _dtmf = _dtmf.Remove(0, count);
+ _dtmfCopy = (string)_dtmf.Clone();
+ }
+ }
+ }
+
+ public delegate void DtmfHandler(object source, DtmfEventArgs args);
+
+ public delegate void IvrInterfaceHandler(IvrInterface app);
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/PartyInfo.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/PartyInfo.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,150 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace FreeSwitch.EventSocket
+{
+ public class PartyInfo
+ {
+ private string m_userName = string.Empty;
+ private string m_dialplan = string.Empty;
+ private string m_callerIdName = string.Empty;
+ private string m_callerIdNumber = string.Empty;
+ private string m_destinationNumber = string.Empty;
+ private string m_uniqueId = string.Empty;
+ private string m_source = string.Empty;
+ private string m_context = string.Empty;
+ private string m_channelName = string.Empty;
+ private bool m_screenBit;
+ private bool m_privacyHideName;
+ private bool m_privacyHideNumber;
+
+ public PartyInfo()
+ {
+ m_userName = string.Empty;
+ m_dialplan = string.Empty;
+ m_callerIdName = string.Empty;
+ }
+
+ public string Dialplan
+ {
+ get { return m_dialplan; }
+ set { m_dialplan = value; }
+ }
+
+ public string CallerIdName
+ {
+ get { return m_callerIdName; }
+ set { m_callerIdName = value; }
+ }
+
+ public string CallerIdNumber
+ {
+ get { return m_callerIdNumber; }
+ set { m_callerIdNumber = value; }
+ }
+
+ public string DestinationNumber
+ {
+ get { return m_destinationNumber; }
+ set { m_destinationNumber = value; }
+ }
+
+ public string UniqueId
+ {
+ get { return m_uniqueId; }
+ set { m_uniqueId = value; }
+ }
+
+ public string Source
+ {
+ get { return m_source; }
+ set { m_source = value; }
+ }
+
+ public string Context
+ {
+ get { return m_context; }
+ set { m_context = value; }
+ }
+
+ public string ChannelName
+ {
+ get { return m_channelName; }
+ set { m_channelName = value; }
+ }
+
+ public bool ScreenBit
+ {
+ get { return m_screenBit; }
+ set { m_screenBit = value; }
+ }
+
+ public bool PrivacyHideName
+ {
+ get { return m_privacyHideName; }
+ set { m_privacyHideName = value; }
+ }
+
+ public bool PrivacyHideNumber
+ {
+ get { return m_privacyHideNumber; }
+ set { m_privacyHideNumber = value; }
+ }
+
+ public string UserName
+ {
+ get { return m_userName; }
+ set { m_userName = value; }
+ }
+
+ public bool Parse(string name, string value)
+ {
+ switch (name)
+ {
+ case "username":
+ m_userName = value;
+ break;
+ case "dialplan":
+ Dialplan = value;
+ break;
+ case "caller-id-name":
+ CallerIdName = value;
+ break;
+ case "caller-id-number":
+ CallerIdNumber = value;
+ break;
+ case "destination-number":
+ DestinationNumber = value;
+ break;
+ case "unique-id":
+ UniqueId = value;
+ break;
+ case "source":
+ Source = value;
+ break;
+ case "context":
+ Context = value;
+ break;
+ case "channel-name":
+ ChannelName = value;
+ break;
+ case "screen-bit":
+ ScreenBit = value == "yes";
+ break;
+ case "privacy-hide-name":
+ PrivacyHideName = value == "yes";
+ break;
+ case "privacy-hide-number":
+ PrivacyHideNumber = value == "yes";
+ break;
+ default:
+ return false;
+ }
+
+ return true;
+
+ }
+
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/PlainEventMsg.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/PlainEventMsg.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,80 @@
+using System;
+using System.Collections.Specialized;
+using EventSocketParser;
+
+namespace FreeSwitch.EventSocket
+{
+ public class PlainEventMsg
+ {
+ private string _contentType = string.Empty;
+ private int _contentLength = -1;
+ private string _body = string.Empty;
+
+ public string ContentType
+ {
+ get { return _contentType; }
+ set { _contentType = value; }
+ }
+
+ public int ContentLength
+ {
+ get { return _contentLength; }
+ set { _contentLength = value; }
+ }
+
+ public string Body
+ {
+ get { return _body; }
+ set { _body = value; }
+ }
+
+ public bool ValidateHeader()
+ {
+ if (_contentType == string.Empty)
+ return false;
+ if (_contentType == "command/reply")
+ return _body != string.Empty;
+
+ return true;
+ }
+
+ public bool Validate()
+ {
+ if (!ValidateHeader())
+ return false;
+
+ if (_contentLength > 0)
+ return _contentLength == _body.Length || _contentLength == _body.Length + 2; // include first and last line breaks that we skip in parsing
+
+ return true;
+ }
+
+
+ public NameValueCollection BodyToNameValue(bool urlDecodeValues)
+ {
+ NameValueCollection items = new NameValueCollection();
+ StringParser parser = new StringParser(_body);
+ string name = parser.Read(':', true);
+ while (!parser.EOF && name != string.Empty)
+ {
+ string value = parser.ReadLine(true);
+ if (items[name] == null)
+ {
+ try
+ {
+ items.Add(name.ToLower(), Uri.UnescapeDataString(value));
+ }
+ catch (UriFormatException)
+ {
+ // add the value unformatted
+ items.Add(name.ToLower(), value);
+ }
+ }
+
+ name = parser.Read(':', true);
+ }
+
+ return items;
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Program.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Program.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,43 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using FreeSwitch.EventSocket;
+
+namespace FreeSwitch.EventSocket
+{
+ class Program
+ {
+ /// <summary>
+ /// This method is called by the event delegate.
+ /// </summary>
+ /// <param name="eb">Reference to an event, each event has their own class.</param>
+ void HandleEvent(EventBase eb)
+ {
+ //Console.WriteLine(eb.DateLocal + " Got Event: " + eb.Name);
+
+
+ if (eb is EventChannelHangup)
+ Console.WriteLine(eb.DateLocal + " Hangup reason: " + ((EventChannelHangup)eb).Cause.ToString());
+ }
+
+ static void Main(string[] args)
+ {
+ Program p = new Program();
+
+ /// Create a new FreeSwitch event socket.
+ EventManager eventManager = new EventManager();
+
+ // Hook all events to the same delegate. Can also provide one delegate per event.
+ eventManager.EventReceived += p.HandleEvent;
+ eventManager.Subscribe(new Events(Event.All));
+
+ // Connect to localhost
+ eventManager.Start("localhost");
+
+
+ System.Threading.Thread.Sleep(1000000);
+
+ //a.
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Properties/AssemblyInfo.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Properties/AssemblyInfo.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,33 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("FreeSwitch.EventSocket")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("FreeSwitch.EventSocket")]
+[assembly: AssemblyCopyright("Copyright © 2007")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("db16a54e-3305-4b56-92a1-70cc95179bc6")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/SipEvents/EventPresence.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/SipEvents/EventPresence.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,112 @@
+namespace FreeSwitch.EventSocket
+{
+ public class EventPresence : SipEvent
+ {
+ private PartyInfo _caller;
+ private string _rpid = string.Empty;
+ private string _status = string.Empty;
+ //private string _callId; // not "presencein/register", "presenceout/register"
+ //private string _contact; // not "presencein/register", "presenceout/register"
+ //private string _expires; //not "presencein/register", "presenceout/register"
+ private string _eventType = string.Empty;
+ private string _login = string.Empty;
+ private EventChannelState _channelState;
+
+ public string Login
+ {
+ get { return _login; }
+ set { _login = value; }
+ }
+
+ /// <summary>
+ /// "Click to call", "Registered", "unavailable", "Active (%d waiting)", "Idle"
+ /// </summary>
+ public string Status
+ {
+ get { return _status; }
+ set { _status = value; }
+ }
+
+ public string Rpid
+ {
+ get { return _rpid; }
+ set { _rpid = value; }
+ }
+
+ /// <summary>
+ /// Caller is only specified on state CS_RING
+ /// and not on CS_HANGUP
+ /// </summary>
+ public PartyInfo Caller
+ {
+ get { return _caller; }
+ set { _caller = value; }
+ }
+
+ /// <summary>
+ /// presence,
+ /// </summary>
+ public string PresenceEventType
+ {
+ get { return _eventType; }
+ set { _eventType = value; }
+ }
+
+ /// <summary>
+ /// We *may* have channel state info
+ /// </summary>
+ public EventChannelState ChannelState
+ {
+ get { return _channelState; }
+ set { _channelState = value; }
+ }
+
+
+ /*
+ proto: sip
+ login: sip%3Amod_sofia%40192.168.0.58%3A5070
+ rpid: unknown
+ from: gauffin%40gauffin.com
+ status: Registered
+ * */
+ public override bool ParseCommand(string name, string value)
+ {
+ switch (name)
+ {
+ case "status":
+ _status = value;
+ break;
+ case "rpid":
+ _rpid = value;
+ break;
+ case "login":
+ _login = value;
+ break;
+ case "event_type":
+ _eventType = value;
+ break;
+
+ default:
+ if (name.Length > 7 && name.Substring(0, 7) == "caller-")
+ {
+ if (Caller == null)
+ Caller = new PartyInfo();
+ return Caller.Parse(name.Substring(7), value);
+ }
+ else
+ {
+ if (base.ParseCommand(name, value))
+ return true;
+ else
+ {
+ if (_channelState == null)
+ _channelState = new EventChannelState();
+ return _channelState.ParseCommand(name, value);
+ }
+ }
+
+ }
+ return true;
+ }
+ }
+}
\ No newline at end of file
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/SipEvents/EventPresenceIn.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/SipEvents/EventPresenceIn.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,6 @@
+namespace FreeSwitch.EventSocket
+{
+ public class EventPresenceIn : EventPresence
+ {
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/SipEvents/EventPresenceOut.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/SipEvents/EventPresenceOut.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,8 @@
+namespace FreeSwitch.EventSocket
+{
+ public class EventPresenceOut : EventPresence
+ {
+
+
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/SipEvents/EventPresenceProbe.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/SipEvents/EventPresenceProbe.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,10 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace FreeSwitch.EventSocket.SipEvents
+{
+ class EventPresenceProbe : EventPresence
+ {
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/SipEvents/EventRoster.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/SipEvents/EventRoster.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,10 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace FreeSwitch.EventSocket
+{
+ class EventRoster : SipEvent
+ {
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/SipEvents/EventSofiaExpire.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/SipEvents/EventSofiaExpire.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,63 @@
+namespace FreeSwitch.EventSocket
+{
+ public class EventSofiaExpire : EventPresence
+ {
+ private string _profileName;
+ private string _userName;
+ private string _domain;
+ private string _userAgent;
+
+ public string ProfileName
+ {
+ get { return _profileName; }
+ set { _profileName = value; }
+ }
+
+ public string UserName
+ {
+ get { return _userName; }
+ set { _userName = value; }
+ }
+
+ public string Domain
+ {
+ get { return _domain; }
+ set { _domain = value; }
+ }
+
+ public string UserAgent
+ {
+ get { return _userAgent; }
+ set { _userAgent = value; }
+ }
+
+ /*
+ switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "profile-name", "%s", argv[6]);
+ switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "user", "%s", argv[1]);
+ switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "host", "%s", argv[2]);
+ switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "user-agent", "%s", argv[5]);
+ * */
+ public override bool ParseCommand(string name, string value)
+ {
+ switch (name)
+ {
+ case "profile-name":
+ _profileName = value;
+ break;
+ case "user":
+ _userName = value;
+ break;
+ case "host":
+ _domain = value;
+ break;
+ case "user-agent":
+ _userAgent = value;
+ break;
+ default:
+ return base.ParseCommand(name, value);
+ }
+ return true;
+
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/SipEvents/EventSofiaRegister.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/SipEvents/EventSofiaRegister.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,92 @@
+namespace FreeSwitch.EventSocket
+{
+ /*
+ * profile-name: gauffin.com
+from-user: jonas
+from-host: gauffin.com
+contact: %22Jonas%20Gauffin%22%20%3Csip%3Ajonas%40192.168.1.101%3A5060%3E
+*/
+
+ /// <summary>
+ /// Sofia_reg.c way down in sofia_reg_handle_register
+ /// </summary>
+ public class EventSofiaRegister : EventBase
+ {
+ private string _domain;
+ private string _profileName;
+ private string _user;
+ private string _contact;
+ private string _callId;
+ private int _expires;
+
+ public string ProfileName
+ {
+ get { return _profileName; }
+ set { _profileName = value; }
+ }
+
+ public string UserName
+ {
+ get { return _user; }
+ set { _user = value; }
+ }
+
+ public string Domain
+ {
+ get { return _domain; }
+ set { _domain = value; }
+ }
+
+ public string Contact
+ {
+ get { return _contact; }
+ set { _contact = value; }
+ }
+
+ public string CallId
+ {
+ get { return _callId; }
+ set { _callId = value; }
+ }
+
+ public int Expires
+ {
+ get { return _expires; }
+ set { _expires = value; }
+ }
+
+ /*
+ switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "profile-name", "%s", profile->name);
+ switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "from-user", "%s", to_user);
+ switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "from-host", "%s", to_host);
+ switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "rpid", "%s", rpid);
+ */
+ public override bool ParseCommand(string name, string value)
+ {
+ switch (name)
+ {
+ case "profile-name":
+ _profileName = value;
+ break;
+ case "from-user":
+ _user = value;
+ break;
+ case "from-host":
+ _domain = value;
+ break;
+ case "contact":
+ _contact = value;
+ break;
+ case "call-id":
+ _callId = value;
+ break;
+ case "expires":
+ int.TryParse(value, out _expires);
+ break;
+ default:
+ return base.ParseCommand(name, value);
+ }
+ return true;
+ }
+ }
+}
\ No newline at end of file
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/SipEvents/SipEvent.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/SipEvents/SipEvent.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,39 @@
+namespace FreeSwitch.EventSocket
+{
+ public class SipEvent : EventBase
+ {
+ private string _from;
+ private string _protocol;
+
+ public string Protocol
+ {
+ get { return _protocol; }
+ set { _protocol = value; }
+ }
+
+ /// <summary>
+ /// username@domain
+ /// </summary>
+ public string From
+ {
+ get { return _from; }
+ set { _from = value; }
+ }
+
+ public override bool ParseCommand(string name, string value)
+ {
+ switch (name)
+ {
+ case "from":
+ _from = value;
+ break;
+ case "proto":
+ _protocol = value;
+ break;
+ default:
+ return base.ParseCommand(name, value);
+ }
+ return true;
+ }
+ }
+}
\ No newline at end of file
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/StringHelper.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/StringHelper.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,55 @@
+namespace FreeSwitch.EventSocket
+{
+ public static class StringHelper
+ {
+ /// <summary>
+ /// This method converts a enum value to the correct format
+ /// that FreeSwitch uses (WORD1_WORD2) instead of the CamelCase that
+ /// we use in .net.
+ /// </summary>
+ /// <param name="name"></param>
+ /// <returns></returns>
+ public static string UpperCaseToCamelCase(string name)
+ {
+ bool isFirst = true;
+ string result = string.Empty;
+ foreach (char ch in name)
+ {
+ if (isFirst)
+ {
+ result += char.ToUpper(ch);
+ isFirst = false;
+ }
+ else
+ {
+ if (ch == '_')
+ isFirst = true;
+ else
+ result += char.ToLower(ch);
+ }
+ }
+ return result;
+ }
+
+ public static string CamelCaseToUpperCase(string name)
+ {
+ string result = string.Empty;
+ bool isFirst = true;
+ foreach (char ch in name)
+ {
+ if (char.IsUpper(ch))
+ {
+ if (!isFirst)
+ result += '_';
+ else
+ isFirst = false;
+ result += char.ToUpper(ch);
+ }
+ else
+ result += char.ToUpper(ch);
+ }
+
+ return result;
+ }
+ }
+}
\ No newline at end of file
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/StringParser.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/StringParser.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,269 @@
+using System.Collections.Generic;
+
+namespace EventSocketParser
+{
+ internal class StringParser
+ {
+ private readonly Stack<int> _savedPositions = new Stack<int>();
+ private int _pos;
+ private string _text;
+
+ public StringParser(string text)
+ {
+ _pos = 0;
+ _text = text;
+ }
+
+ public bool EOF
+ {
+ get { return IsEOF(_pos); }
+ }
+
+ /// <summary>
+ /// true if we are currently on a emty line
+ /// </summary>
+ public bool EOL
+ {
+ get
+ {
+ if (EOF)
+ return false;
+ else if (_text[_pos] == '\n')
+ return true;
+ else if (_pos < _text.Length - 2)
+ return _text[_pos] == '\r' && _text[_pos + 1] == '\n';
+ else
+ return false;
+ }
+ }
+
+ public void SavePos()
+ {
+ _savedPositions.Push(_pos);
+ }
+
+ public void RestorePos()
+ {
+ _pos = _savedPositions.Pop();
+ }
+
+ public void RemoveSavedPos()
+ {
+ _savedPositions.Pop();
+ }
+
+ public void ClearSavedPositions()
+ {
+ _savedPositions.Clear();
+ }
+
+ private bool IsEOF(int pos)
+ {
+ return pos >= _text.Length - 1;
+ }
+
+ public bool IsEmptyLine(bool skipWhitespaces)
+ {
+ if (EOF)
+ return false;
+ else if (_pos == _text.Length - 1)
+ return _text[_pos] == '\n';
+ else
+ return _text[_pos] == '\r' && _text[_pos + 1] == '\n';
+ }
+
+ public string PeekWord(bool skipWS, bool stopAtEOL)
+ {
+ int startpos = _pos;
+ if (skipWS)
+ SkipWS();
+ int pos = FindWS(stopAtEOL);
+ _pos = startpos;
+
+ if (pos != -1)
+ return _text.Substring(_pos, pos - _pos);
+ else
+ return string.Empty;
+ }
+
+ public string GetWord(bool skipWS, bool stopAtEOL)
+ {
+ int startpos = _pos;
+ if (skipWS)
+ SkipWS();
+ int pos = FindWS(stopAtEOL);
+
+ _pos = pos;
+
+ if (pos != -1)
+ return _text.Substring(startpos, pos - startpos);
+ else
+ return string.Empty;
+ }
+
+ public string ReadLine()
+ {
+ return ReadLine(false);
+ }
+
+ public string ReadLine(bool trimWhiteSpaces)
+ {
+ if (EOF)
+ return string.Empty;
+
+ if (trimWhiteSpaces)
+ SkipWS();
+
+ // loop until we get new line chars
+ int startpos = _pos;
+ while (!EOF && !IsEOL())
+ ++_pos;
+
+ // Save _pos, trim whitespaces, restore _pos
+ int pos = _pos;
+ if (trimWhiteSpaces)
+ TrimEnd();
+ int endpos = _pos;
+ _pos = pos;
+
+ // Move to after new line chars
+ if (_text[_pos] == '\r')
+ _pos += 2;
+ else
+ ++_pos;
+
+ // .. and the result is line without whitespaces at the end and without new line chars.
+ return _text.Substring(startpos, endpos - startpos);
+ }
+
+ public string ReadToEmptyLine()
+ {
+ int chars = 4;
+ int pos = _text.IndexOf("\n\n", _pos);
+ if (pos == -1)
+ {
+ chars = 2;
+ pos = _text.IndexOf("\n\n", _pos);
+ }
+ if (pos == -1)
+ return string.Empty;
+
+ int startpos = _pos;
+ _pos = pos + chars;
+ return _text.Substring(startpos, pos - startpos);
+ }
+
+ public string Read(int chars)
+ {
+ if (_text.Length - _pos < chars)
+ return string.Empty;
+
+ string result = _text.Substring(_pos, chars);
+ _pos += chars;
+ return result;
+ }
+
+ public string ReadToEnd()
+ {
+ string result = _text.Substring(_pos, _text.Length - _pos);
+ _pos = _text.Length;
+ return result;
+ }
+
+ public string Read(char delimiter, bool skipWS)
+ {
+ if (skipWS)
+ SkipWS();
+
+ // find delimiter
+ int startpos = _pos;
+ while (!EOF && _text[_pos] != delimiter)
+ ++_pos;
+
+ // did not find it, reset pos
+ if (EOF)
+ {
+ _pos = startpos;
+ return string.Empty;
+ }
+ else
+ {
+ ++_pos; // skip delimiter
+ int endpos = TrimEnd(); // skip
+ return _text.Substring(startpos, endpos - startpos);
+ }
+ }
+
+ private int TrimEnd()
+ {
+ int pos = _pos;
+ while (IsWS(_text[pos]))
+ --pos;
+ return pos;
+ }
+
+ private int FindWS(bool stopAtEOL)
+ {
+ if (!stopAtEOL)
+ return FindWS();
+
+ int pos = _pos;
+ while (!IsEOF(pos) && !IsEOL(_text[pos]) && !IsWS(_text[pos]))
+ ++pos;
+
+ return IsEOF(pos) ? -1 : pos;
+ }
+
+ private bool IsEOL()
+ {
+ if (_text[_pos] == '\r' && _text[_pos + 1] == '\n')
+ return true;
+ else if (_text[_pos] == '\n')
+ return true;
+ else
+ return false;
+ }
+
+ private bool IsEOL(char ch)
+ {
+ return ch == '\r' || ch == '\n';
+ }
+
+ private bool IsWS(char ch)
+ {
+ return ch == '\t' || ch == ' ';
+ }
+
+ private int FindWS()
+ {
+ int pos = _pos;
+ while (!IsEOF(pos) && !IsWS(_text[pos]))
+ ++pos;
+
+ return IsEOF(pos) ? -1 : pos;
+ }
+
+ public void SkipWS()
+ {
+ while (!EOF && IsWS(_text[_pos]))
+ ++_pos;
+ }
+
+ public void RemoveUsedContent()
+ {
+ _text = _text.Remove(0, _pos);
+ _pos = 0;
+ }
+
+ public void Append(string value)
+ {
+ _text += value;
+ }
+
+ public void Clear()
+ {
+ _text = string.Empty;
+ _pos = 0;
+ }
+ }
+}
\ No newline at end of file
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/IvrSocket/IvrSocket.csproj
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/IvrSocket/IvrSocket.csproj Thu May 1 14:27:39 2008
@@ -0,0 +1,54 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>8.0.50727</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{22F26D13-0A0E-4345-9FEC-CE13FC8F37FD}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>IvrSocket</RootNamespace>
+ <AssemblyName>IvrSocket</AssemblyName>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ <Reference Include="System.Data" />
+ <Reference Include="System.Xml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="Program.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="Voicemail.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\FreeSwitchEventSocket\FreeSwitch.EventSocket.csproj">
+ <Project>{3F8895F6-F710-4323-B96A-4EFB6BC97E08}</Project>
+ <Name>FreeSwitch.EventSocket</Name>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+</Project>
\ No newline at end of file
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/IvrSocket/Program.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/IvrSocket/Program.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,38 @@
+using System;
+using FreeSwitch.EventSocket;
+
+namespace IvrSocket
+{
+ class Program
+ {
+ private static EventManager mgr;
+ static void Main(string[] args)
+ {
+ mgr = new EventManager();
+ mgr.EventReceived += IvrManager;
+ mgr.Subscribe(Event.All);
+ mgr.Start("localhost");
+ Console.ReadLine();
+ }
+
+ private static void IvrManager(EventBase receivedEvent)
+ {
+ Console.WriteLine(receivedEvent.Name);
+ if (receivedEvent is ChannelEvent)
+ {
+ ChannelEvent evt = (ChannelEvent) receivedEvent;
+ Console.WriteLine(evt.Name + ": " + evt.UniqueId);
+ }
+ if (receivedEvent is EventChannelAnswer)
+ {
+ EventChannelAnswer answer = (EventChannelAnswer)receivedEvent;
+ if (answer.Parameters["variable_ivr_name"] == "voicemail")
+ new Voicemail(mgr, answer.UniqueId);
+ }
+ else if (receivedEvent is EventChannelHangup)
+ {
+ Console.WriteLine("Bye bye baby!");
+ }
+ }
+ }
+}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/IvrSocket/Properties/AssemblyInfo.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/IvrSocket/Properties/AssemblyInfo.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,33 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("IvrSocket")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("IvrSocket")]
+[assembly: AssemblyCopyright("Copyright © 2008")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("3e447189-bfd8-4412-93bb-da3543dd2ca6")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/IvrSocket/Voicemail.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/IvrSocket/Voicemail.cs Thu May 1 14:27:39 2008
@@ -0,0 +1,28 @@
+using System;
+using System.Threading;
+using FreeSwitch.EventSocket;
+using FreeSwitch.EventSocket.Ivr;
+
+namespace IvrSocket
+{
+ /// <summary>
+ /// Very simple voicemail app =)
+ /// </summary>
+ class Voicemail
+ {
+ private readonly IvrInterface _ivr;
+
+ public Voicemail(EventManager mgr, string uuid)
+ {
+ _ivr = new IvrInterface(mgr, uuid);
+ _ivr.BeginInvoke(OnIvr, null, null);
+ }
+
+ private void OnIvr(IvrInterface app)
+ {
+ _ivr.Play("sv\\system\\record_after_beep.wav", IvrInterface.AllDigits);
+ //_ivr.Sleep(5000);
+ //_ivr.Record("voicemails\\" + Guid.NewGuid() + ".wav", 60);
+ }
+ }
+}
1
0
Author: anthm
Date: Thu May 1 14:09:05 2008
New Revision: 8235
Modified:
freeswitch/trunk/src/switch_cpp.cpp
Log:
fix
Modified: freeswitch/trunk/src/switch_cpp.cpp
==============================================================================
--- freeswitch/trunk/src/switch_cpp.cpp (original)
+++ freeswitch/trunk/src/switch_cpp.cpp Thu May 1 14:09:05 2008
@@ -320,7 +320,7 @@
if (session) {
channel = switch_core_session_get_channel(session);
- if (switch_test_flag(this, S_HUP)) {
+ if (switch_test_flag(this, S_HUP) && !switch_channel_test_flag(channel, CF_TRANSFER)) {
switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING);
}
switch_core_session_rwunlock(session);
1
0
[Freeswitch-svn] [commit] r8234 - freeswitch/trunk/scripts/contrib/verifier
by Freeswitch SVN 01 May '08
by Freeswitch SVN 01 May '08
01 May '08
Author: mikej
Date: Thu May 1 14:08:22 2008
New Revision: 8234
Added:
freeswitch/trunk/scripts/contrib/verifier/
Log:
add contrib dir
1
0
[Freeswitch-svn] [commit] r8233 - freeswitch/trunk/src/mod/languages/mod_perl
by Freeswitch SVN 01 May '08
by Freeswitch SVN 01 May '08
01 May '08
Author: anthm
Date: Thu May 1 13:28:29 2008
New Revision: 8233
Modified:
freeswitch/trunk/src/mod/languages/mod_perl/freeswitch.pm
freeswitch/trunk/src/mod/languages/mod_perl/freeswitch_perl.h
freeswitch/trunk/src/mod/languages/mod_perl/mod_perl_wrap.cpp
Log:
doh
Modified: freeswitch/trunk/src/mod/languages/mod_perl/freeswitch.pm
==============================================================================
--- freeswitch/trunk/src/mod/languages/mod_perl/freeswitch.pm (original)
+++ freeswitch/trunk/src/mod/languages/mod_perl/freeswitch.pm Thu May 1 13:28:29 2008
@@ -55,8 +55,6 @@
*bridge = *freeswitchc::bridge;
*hanguphook = *freeswitchc::hanguphook;
*dtmf_callback = *freeswitchc::dtmf_callback;
-*api_execute = *freeswitchc::api_execute;
-*api_reply_delete = *freeswitchc::api_reply_delete;
############# Class : freeswitch::API ##############
Modified: freeswitch/trunk/src/mod/languages/mod_perl/freeswitch_perl.h
==============================================================================
--- freeswitch/trunk/src/mod/languages/mod_perl/freeswitch_perl.h (original)
+++ freeswitch/trunk/src/mod/languages/mod_perl/freeswitch_perl.h Thu May 1 13:28:29 2008
@@ -3,11 +3,6 @@
#include <switch_cpp.h>
-void console_log(char *level_str, char *msg);
-void console_clean_log(char *msg);
-char *api_execute(char *cmd, char *arg);
-void api_reply_delete(char *reply);
-
class Session : public CoreSession {
private:
Modified: freeswitch/trunk/src/mod/languages/mod_perl/mod_perl_wrap.cpp
==============================================================================
--- freeswitch/trunk/src/mod/languages/mod_perl/mod_perl_wrap.cpp (original)
+++ freeswitch/trunk/src/mod/languages/mod_perl/mod_perl_wrap.cpp Thu May 1 13:28:29 2008
@@ -6320,74 +6320,6 @@
}
-XS(_wrap_api_execute) {
- {
- char *arg1 = (char *) 0 ;
- char *arg2 = (char *) 0 ;
- char *result = 0 ;
- int res1 ;
- char *buf1 = 0 ;
- int alloc1 = 0 ;
- int res2 ;
- char *buf2 = 0 ;
- int alloc2 = 0 ;
- int argvi = 0;
- dXSARGS;
-
- if ((items < 2) || (items > 2)) {
- SWIG_croak("Usage: api_execute(cmd,arg);");
- }
- res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "api_execute" "', argument " "1"" of type '" "char *""'");
- }
- arg1 = reinterpret_cast< char * >(buf1);
- res2 = SWIG_AsCharPtrAndSize(ST(1), &buf2, NULL, &alloc2);
- if (!SWIG_IsOK(res2)) {
- SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "api_execute" "', argument " "2"" of type '" "char *""'");
- }
- arg2 = reinterpret_cast< char * >(buf2);
- result = (char *)api_execute(arg1,arg2);
- ST(argvi) = SWIG_FromCharPtr((const char *)result); argvi++ ;
- if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
- if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
- XSRETURN(argvi);
- fail:
- if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
- if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
- SWIG_croak_null();
- }
-}
-
-
-XS(_wrap_api_reply_delete) {
- {
- char *arg1 = (char *) 0 ;
- int res1 ;
- char *buf1 = 0 ;
- int alloc1 = 0 ;
- int argvi = 0;
- dXSARGS;
-
- if ((items < 1) || (items > 1)) {
- SWIG_croak("Usage: api_reply_delete(reply);");
- }
- res1 = SWIG_AsCharPtrAndSize(ST(0), &buf1, NULL, &alloc1);
- if (!SWIG_IsOK(res1)) {
- SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "api_reply_delete" "', argument " "1"" of type '" "char *""'");
- }
- arg1 = reinterpret_cast< char * >(buf1);
- api_reply_delete(arg1);
-
- if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
- XSRETURN(argvi);
- fail:
- if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
- SWIG_croak_null();
- }
-}
-
-
XS(_wrap_new_Session__SWIG_0) {
{
Session *result = 0 ;
@@ -6884,8 +6816,6 @@
{"freeswitchc::bridge", _wrap_bridge},
{"freeswitchc::hanguphook", _wrap_hanguphook},
{"freeswitchc::dtmf_callback", _wrap_dtmf_callback},
-{"freeswitchc::api_execute", _wrap_api_execute},
-{"freeswitchc::api_reply_delete", _wrap_api_reply_delete},
{"freeswitchc::new_Session", _wrap_new_Session},
{"freeswitchc::delete_Session", _wrap_delete_Session},
{"freeswitchc::Session_begin_allow_threads", _wrap_Session_begin_allow_threads},
1
0
[Freeswitch-svn] [commit] r8232 - in freeswitch/trunk/src: . include mod/applications/mod_commands mod/applications/mod_dptools mod/endpoints/mod_sofia
by Freeswitch SVN 01 May '08
by Freeswitch SVN 01 May '08
01 May '08
Author: anthm
Date: Thu May 1 12:41:46 2008
New Revision: 8232
Modified:
freeswitch/trunk/src/include/switch_ivr.h
freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c
freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c
freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c
freeswitch/trunk/src/switch_core_io.c
freeswitch/trunk/src/switch_core_rwlock.c
freeswitch/trunk/src/switch_ivr.c
freeswitch/trunk/src/switch_ivr_bridge.c
Log:
tewaks
Modified: freeswitch/trunk/src/include/switch_ivr.h
==============================================================================
--- freeswitch/trunk/src/include/switch_ivr.h (original)
+++ freeswitch/trunk/src/include/switch_ivr.h Thu May 1 12:41:46 2008
@@ -466,7 +466,7 @@
\param message optional message
\return SWITCH_STATUS_SUCCESS if all is well
*/
-SWITCH_DECLARE(switch_status_t) switch_ivr_hold_uuid(const char *uuid, const char *message);
+SWITCH_DECLARE(switch_status_t) switch_ivr_hold_uuid(const char *uuid, const char *message, switch_bool_t moh);
/*!
\brief Signal the session with a protocol specific unhold message.
@@ -481,7 +481,7 @@
\param message optional message
\return SWITCH_STATUS_SUCCESS if all is well
*/
-SWITCH_DECLARE(switch_status_t) switch_ivr_hold(switch_core_session_t *session, const char *message);
+SWITCH_DECLARE(switch_status_t) switch_ivr_hold(switch_core_session_t *session, const char *message, switch_bool_t moh);
/*!
\brief Signal the session with a protocol specific unhold message.
Modified: freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c (original)
+++ freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c Thu May 1 12:41:46 2008
@@ -1171,7 +1171,7 @@
if (!strcasecmp(argv[0], "off")) {
status = switch_ivr_unhold_uuid(argv[1]);
} else {
- status = switch_ivr_hold_uuid(argv[0], argv[1]);
+ status = switch_ivr_hold_uuid(argv[0], argv[1], 1);
}
}
Modified: freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c (original)
+++ freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c Thu May 1 12:41:46 2008
@@ -1897,7 +1897,7 @@
#define HOLD_SYNTAX "[<display message>]"
SWITCH_STANDARD_APP(hold_function)
{
- switch_ivr_hold_uuid(switch_core_session_get_uuid(session), data);
+ switch_ivr_hold_uuid(switch_core_session_get_uuid(session), data, 1);
}
#define UNHOLD_SYNTAX ""
Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c
==============================================================================
--- freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c (original)
+++ freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c Thu May 1 12:41:46 2008
@@ -1829,7 +1829,13 @@
}
if (stream && strcasecmp(stream, "silence")) {
- switch_ivr_broadcast(switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE), stream, SMF_ECHO_ALEG | SMF_LOOP);
+ if (!strcasecmp(stream, "indicate_hold")) {
+ switch_channel_set_flag(tech_pvt->channel, CF_SUSPEND);
+ switch_channel_set_flag(tech_pvt->channel, CF_HOLD);
+ switch_ivr_hold_uuid(switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE), NULL, 0);
+ } else {
+ switch_ivr_broadcast(switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE), stream, SMF_ECHO_ALEG | SMF_LOOP);
+ }
}
}
} else {
@@ -1843,8 +1849,15 @@
if ((uuid = switch_channel_get_variable(tech_pvt->channel, SWITCH_SIGNAL_BOND_VARIABLE)) && (b_session = switch_core_session_locate(uuid))) {
switch_channel_t *b_channel = switch_core_session_get_channel(b_session);
- switch_channel_stop_broadcast(b_channel);
- switch_channel_wait_for_flag(b_channel, CF_BROADCAST, SWITCH_FALSE, 5000);
+
+ if (switch_channel_test_flag(tech_pvt->channel, CF_HOLD)) {
+ switch_ivr_unhold(b_session);
+ switch_channel_clear_flag(tech_pvt->channel, CF_SUSPEND);
+ switch_channel_clear_flag(tech_pvt->channel, CF_HOLD);
+ } else {
+ switch_channel_stop_broadcast(b_channel);
+ switch_channel_wait_for_flag(b_channel, CF_BROADCAST, SWITCH_FALSE, 5000);
+ }
switch_core_session_rwunlock(b_session);
}
Modified: freeswitch/trunk/src/switch_core_io.c
==============================================================================
--- freeswitch/trunk/src/switch_core_io.c (original)
+++ freeswitch/trunk/src/switch_core_io.c Thu May 1 12:41:46 2008
@@ -120,7 +120,7 @@
if (switch_channel_test_flag(session->channel, CF_HOLD)) {
status = SWITCH_STATUS_BREAK;
- goto done;
+ goto even_more_done;
}
if (session->endpoint_interface->io_routines->read_frame) {
@@ -459,6 +459,9 @@
switch_thread_rwlock_unlock(session->bug_rwlock);
}
}
+
+ even_more_done:
+
return status;
}
Modified: freeswitch/trunk/src/switch_core_rwlock.c
==============================================================================
--- freeswitch/trunk/src/switch_core_rwlock.c (original)
+++ freeswitch/trunk/src/switch_core_rwlock.c Thu May 1 12:41:46 2008
@@ -35,7 +35,6 @@
#include <switch.h>
#include "private/switch_core_pvt.h"
-
SWITCH_DECLARE(switch_status_t) switch_core_session_signal_lock(switch_core_session_t *session)
{
return switch_mutex_lock(session->signal_mutex);
@@ -58,12 +57,12 @@
if (switch_test_flag(session, SSF_DESTROYED)) {
status = SWITCH_STATUS_FALSE;
#ifdef SWITCH_DEBUG_RWLOCKS
- switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, SWITCH_LOG_ERROR, "%s Read lock FAIL\n", switch_channel_get_name(session->channel));
+ switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, NULL, SWITCH_LOG_ERROR, "%s Read lock FAIL\n", switch_channel_get_name(session->channel));
#endif
} else {
status = (switch_status_t) switch_thread_rwlock_tryrdlock(session->rwlock);
#ifdef SWITCH_DEBUG_RWLOCKS
- switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, SWITCH_LOG_ERROR, "%s Read lock AQUIRED\n",
+ switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, NULL, SWITCH_LOG_ERROR, "%s Read lock AQUIRED\n",
switch_channel_get_name(session->channel));
#endif
}
@@ -76,7 +75,7 @@
SWITCH_DECLARE(void) switch_core_session_perform_write_lock(switch_core_session_t *session, const char *file, const char *func, int line)
{
- switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, SWITCH_LOG_ERROR, "%s Write lock AQUIRED\n", switch_channel_get_name(session->channel));
+ switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, NULL, SWITCH_LOG_ERROR, "%s Write lock AQUIRED\n", switch_channel_get_name(session->channel));
#else
SWITCH_DECLARE(void) switch_core_session_write_lock(switch_core_session_t *session)
{
@@ -87,7 +86,7 @@
#ifdef SWITCH_DEBUG_RWLOCKS
SWITCH_DECLARE(void) switch_core_session_perform_rwunlock(switch_core_session_t *session, const char *file, const char *func, int line)
{
- switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, SWITCH_LOG_ERROR, "%s Read/Write lock CLEARED\n",
+ switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, NULL, SWITCH_LOG_ERROR, "%s Read/Write lock CLEARED\n",
switch_channel_get_name(session->channel));
#else
SWITCH_DECLARE(void) switch_core_session_rwunlock(switch_core_session_t *session)
Modified: freeswitch/trunk/src/switch_ivr.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr.c (original)
+++ freeswitch/trunk/src/switch_ivr.c Thu May 1 12:41:46 2008
@@ -741,7 +741,7 @@
return status;
}
-SWITCH_DECLARE(switch_status_t) switch_ivr_hold(switch_core_session_t *session, const char *message)
+SWITCH_DECLARE(switch_status_t) switch_ivr_hold(switch_core_session_t *session, const char *message, switch_bool_t moh)
{
switch_core_session_message_t msg = { 0 };
switch_channel_t *channel = switch_core_session_get_channel(session);
@@ -756,8 +756,8 @@
switch_channel_set_flag(channel, CF_SUSPEND);
switch_core_session_receive_message(session, &msg);
-
- if ((stream = switch_channel_get_variable(channel, SWITCH_HOLD_MUSIC_VARIABLE))) {
+
+ if (moh && (stream = switch_channel_get_variable(channel, SWITCH_HOLD_MUSIC_VARIABLE))) {
if ((other_uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))) {
switch_ivr_broadcast(other_uuid, stream, SMF_ECHO_ALEG | SMF_LOOP);
}
@@ -767,12 +767,12 @@
return SWITCH_STATUS_SUCCESS;
}
-SWITCH_DECLARE(switch_status_t) switch_ivr_hold_uuid(const char *uuid, const char *message)
+SWITCH_DECLARE(switch_status_t) switch_ivr_hold_uuid(const char *uuid, const char *message, switch_bool_t moh)
{
switch_core_session_t *session;
if ((session = switch_core_session_locate(uuid))) {
- switch_ivr_hold(session, message);
+ switch_ivr_hold(session, message, moh);
switch_core_session_rwunlock(session);
}
Modified: freeswitch/trunk/src/switch_ivr_bridge.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr_bridge.c (original)
+++ freeswitch/trunk/src/switch_ivr_bridge.c Thu May 1 12:41:46 2008
@@ -161,8 +161,12 @@
}
if (!nosuspend && (switch_channel_test_flag(chan_a, CF_SUSPEND) || switch_channel_test_flag(chan_b, CF_SUSPEND))) {
- status = switch_core_session_read_frame(session_a, &read_frame, -1, stream_id);
-
+ if (switch_channel_test_flag(chan_a, CF_SUSPEND)) {
+ status = SWITCH_STATUS_SUCCESS;
+ } else {
+ status = switch_core_session_read_frame(session_a, &read_frame, -1, stream_id);
+ }
+
if (!SWITCH_READ_ACCEPTABLE(status)) {
goto end_of_bridge_loop;
}
1
0
01 May '08
Author: brian
Date: Wed Apr 30 23:12:26 2008
New Revision: 8231
Modified:
freeswitch/trunk/scripts/lua/mwi_event.lua
Log:
update
Modified: freeswitch/trunk/scripts/lua/mwi_event.lua
==============================================================================
--- freeswitch/trunk/scripts/lua/mwi_event.lua (original)
+++ freeswitch/trunk/scripts/lua/mwi_event.lua Wed Apr 30 23:12:26 2008
@@ -3,6 +3,6 @@
freeswitch.console_log("info", "Lua in da house!!!\n");
local event = freeswitch.Event("message_waiting");
-event:add_header("MWI-Messages-Waiting", "no");
-event:add_header("MWI-Message-Account", "sip:1002@10.0.1.100");
+event:addHeader("MWI-Messages-Waiting", "yes");
+event:addHeader("MWI-Message-Account", "sip:1000@10.0.1.100");
event:fire();
1
0