- get fax details (calling station ID, transfer format, ...), handle PLCI
git-svn-id: https://svn.ibp.de/svn/capisuite/trunk/capisuite@118 4ebea2bb-67d4-0310-8558-a5799e421b66
This commit is contained in:
parent
0b8a3ff37a
commit
78f2285953
|
@ -2,7 +2,7 @@
|
||||||
@brief Contains Connection - Encapsulates a CAPI connection with all its states and methods.
|
@brief Contains Connection - Encapsulates a CAPI connection with all its states and methods.
|
||||||
|
|
||||||
@author Gernot Hillier <gernot@hillier.de>
|
@author Gernot Hillier <gernot@hillier.de>
|
||||||
$Revision: 1.7 $
|
$Revision: 1.8 $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
|
@ -23,15 +23,13 @@
|
||||||
|
|
||||||
#define conf_send_buffers 4
|
#define conf_send_buffers 4
|
||||||
|
|
||||||
// TODO NCPI handling für Fax
|
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
Connection::Connection (_cmsg& message, Capi* capi_in):
|
Connection::Connection (_cmsg& message, Capi* capi_in):
|
||||||
call_if(NULL),capi(capi_in),plci_state(P2),ncci_state(N0), buffer_start(0), buffers_used(0),
|
call_if(NULL),capi(capi_in),plci_state(P2),ncci_state(N0), buffer_start(0), buffers_used(0),
|
||||||
file_for_reception(NULL), file_to_send(NULL), received_dtmf(""), keepPhysicalConnection(false),
|
file_for_reception(NULL), file_to_send(NULL), received_dtmf(""), keepPhysicalConnection(false),
|
||||||
disconnect_cause(0),debug(capi->debug), debug_level(capi->debug_level), error(capi->error),
|
disconnect_cause(0),debug(capi->debug), debug_level(capi->debug_level), error(capi->error),
|
||||||
our_call(false), disconnect_cause_b3(0)
|
our_call(false), disconnect_cause_b3(0), fax_info(NULL)
|
||||||
{
|
{
|
||||||
pthread_mutex_init(&send_mutex, NULL);
|
pthread_mutex_init(&send_mutex, NULL);
|
||||||
pthread_mutex_init(&receive_mutex, NULL);
|
pthread_mutex_init(&receive_mutex, NULL);
|
||||||
|
@ -40,8 +38,8 @@ Connection::Connection (_cmsg& message, Capi* capi_in):
|
||||||
call_from = getNumber(CONNECT_IND_CALLINGPARTYNUMBER(&message),true);
|
call_from = getNumber(CONNECT_IND_CALLINGPARTYNUMBER(&message),true);
|
||||||
call_to = getNumber(CONNECT_IND_CALLEDPARTYNUMBER(&message),false);
|
call_to = getNumber(CONNECT_IND_CALLEDPARTYNUMBER(&message),false);
|
||||||
if (debug_level >= 1) {
|
if (debug_level >= 1) {
|
||||||
debug << prefix() << "Connection object created for incoming call PLCI " << plci << endl;
|
debug << prefix() << "Connection object created for incoming call PLCI " << plci;
|
||||||
debug << prefix() << "from " << call_from << " to " << call_to << " CIP 0x" << hex << CONNECT_IND_CIPVALUE(&message) << endl;
|
debug << " from " << call_from << " to " << call_to << " CIP 0x" << hex << CONNECT_IND_CIPVALUE(&message) << endl;
|
||||||
}
|
}
|
||||||
switch (CONNECT_IND_CIPVALUE(&message)) {
|
switch (CONNECT_IND_CIPVALUE(&message)) {
|
||||||
case 1:
|
case 1:
|
||||||
|
@ -63,7 +61,7 @@ Connection::Connection (Capi* capi, _cdword controller, string call_from_in, boo
|
||||||
:call_if(NULL),capi(capi),plci_state(P01),ncci_state(N0),plci(0),service(service), buffer_start(0), buffers_used(0),
|
:call_if(NULL),capi(capi),plci_state(P01),ncci_state(N0),plci(0),service(service), buffer_start(0), buffers_used(0),
|
||||||
file_for_reception(NULL), file_to_send(NULL), call_from(call_from_in), call_to(call_to_in), connect_ind_msg_nr(0),
|
file_for_reception(NULL), file_to_send(NULL), call_from(call_from_in), call_to(call_to_in), connect_ind_msg_nr(0),
|
||||||
disconnect_cause(0), debug(capi->debug), debug_level(capi->debug_level), error(capi->error), keepPhysicalConnection(false),
|
disconnect_cause(0), debug(capi->debug), debug_level(capi->debug_level), error(capi->error), keepPhysicalConnection(false),
|
||||||
our_call(true), disconnect_cause_b3(0)
|
our_call(true), disconnect_cause_b3(0), fax_info(NULL)
|
||||||
{
|
{
|
||||||
pthread_mutex_init(&send_mutex, NULL);
|
pthread_mutex_init(&send_mutex, NULL);
|
||||||
pthread_mutex_init(&receive_mutex, NULL);
|
pthread_mutex_init(&receive_mutex, NULL);
|
||||||
|
@ -161,6 +159,9 @@ Connection::~Connection()
|
||||||
pthread_mutex_unlock(&receive_mutex);
|
pthread_mutex_unlock(&receive_mutex);
|
||||||
pthread_mutex_destroy(&receive_mutex);
|
pthread_mutex_destroy(&receive_mutex);
|
||||||
|
|
||||||
|
if (fax_info)
|
||||||
|
delete fax_info;
|
||||||
|
|
||||||
if (debug_level >= 1) {
|
if (debug_level >= 1) {
|
||||||
debug << prefix() << "Connection object deleted" << endl;
|
debug << prefix() << "Connection object deleted" << endl;
|
||||||
}
|
}
|
||||||
|
@ -318,6 +319,12 @@ Connection::getService()
|
||||||
return service;
|
return service;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Connection::fax_info_t*
|
||||||
|
Connection::getFaxInfo()
|
||||||
|
{
|
||||||
|
return fax_info;
|
||||||
|
}
|
||||||
|
|
||||||
Connection::connection_state_t
|
Connection::connection_state_t
|
||||||
Connection::getState()
|
Connection::getState()
|
||||||
{
|
{
|
||||||
|
@ -390,10 +397,10 @@ void
|
||||||
Connection::connect_b3_active_ind(_cmsg& message) throw (CapiWrongState, CapiExternalError)
|
Connection::connect_b3_active_ind(_cmsg& message) throw (CapiWrongState, CapiExternalError)
|
||||||
{
|
{
|
||||||
if (ncci_state!=N2) {
|
if (ncci_state!=N2) {
|
||||||
throw CapiWrongState("CONNECT_B3_ACTIVE_IND received in wrong state","Connection::connect_active_b3_ind()");
|
throw CapiWrongState("CONNECT_B3_ACTIVE_IND received in wrong state","Connection::connect_b3_active_ind()");
|
||||||
} else {
|
} else {
|
||||||
if (ncci!=CONNECT_B3_IND_NCCI(&message))
|
if (ncci!=CONNECT_B3_ACTIVE_IND_NCCI(&message))
|
||||||
throw CapiError("CONNECT_B3_ACTIVE_IND received with wrong NCCI","Connection::connect_active_b3_ind()");
|
throw CapiError("CONNECT_B3_ACTIVE_IND received with wrong NCCI","Connection::connect_b3_active_ind()");
|
||||||
try {
|
try {
|
||||||
capi->connect_b3_active_resp(message.Messagenumber,ncci);
|
capi->connect_b3_active_resp(message.Messagenumber,ncci);
|
||||||
}
|
}
|
||||||
|
@ -401,6 +408,23 @@ Connection::connect_b3_active_ind(_cmsg& message) throw (CapiWrongState, CapiExt
|
||||||
error << prefix() << "WARNING: Error deteced when sending connect_b3_active_resp. Message was: " << e << endl;
|
error << prefix() << "WARNING: Error deteced when sending connect_b3_active_resp. Message was: " << e << endl;
|
||||||
}
|
}
|
||||||
ncci_state=NACT;
|
ncci_state=NACT;
|
||||||
|
|
||||||
|
if (service==FAXG3 && CONNECT_B3_ACTIVE_IND_NCPI(&message)[0]>=9) {
|
||||||
|
_cstruct ncpi=CONNECT_B3_ACTIVE_IND_NCPI(&message);
|
||||||
|
if (!fax_info)
|
||||||
|
fax_info=new fax_info_t;
|
||||||
|
fax_info->rate=ncpi[1]+(ncpi[2]<<8);
|
||||||
|
fax_info->hiRes=((ncpi[3] & 0x01) == 0x01);
|
||||||
|
fax_info->colorJPEG=((ncpi[4] & 0x04) == 0x04);
|
||||||
|
fax_info->pages=ncpi[7]+(ncpi[8]<<8);
|
||||||
|
fax_info->stationID.assign(reinterpret_cast<char*>(&ncpi[10]),static_cast<int>(ncpi[9])); // indx 9 helds the length, string starts at 10
|
||||||
|
if (debug_level >= 2) {
|
||||||
|
debug << prefix() << "fax connected with rate " << dec << fax_info->rate
|
||||||
|
<< (fax_info->hiRes ? ", hiRes" : ", lowRes") << (fax_info->colorJPEG ? ", JPEG" : "")
|
||||||
|
<< ", ID: " << fax_info->stationID << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (call_if)
|
if (call_if)
|
||||||
call_if->callConnected();
|
call_if->callConnected();
|
||||||
else
|
else
|
||||||
|
@ -419,10 +443,26 @@ Connection::disconnect_b3_ind(_cmsg& message) throw (CapiWrongState)
|
||||||
|
|
||||||
disconnect_cause_b3=DISCONNECT_B3_IND_REASON_B3(&message);
|
disconnect_cause_b3=DISCONNECT_B3_IND_REASON_B3(&message);
|
||||||
|
|
||||||
|
if (service==FAXG3 && CONNECT_B3_ACTIVE_IND_NCPI(&message)[0]>=9) {
|
||||||
|
_cstruct ncpi=CONNECT_B3_ACTIVE_IND_NCPI(&message);
|
||||||
|
if (!fax_info)
|
||||||
|
fax_info=new fax_info_t;
|
||||||
|
fax_info->rate=ncpi[1]+(ncpi[2]<<8);
|
||||||
|
fax_info->hiRes=((ncpi[3] & 0x01) == 0x01);
|
||||||
|
fax_info->colorJPEG=((ncpi[4] & 0x04) == 0x04);
|
||||||
|
fax_info->pages=ncpi[7]+(ncpi[8]<<8);
|
||||||
|
fax_info->stationID.assign(reinterpret_cast<char*>(&ncpi[10]),static_cast<int>(ncpi[9])); // indx 9 helds the length, string starts at 10
|
||||||
|
if (debug_level >= 2) {
|
||||||
|
debug << prefix() << "fax finished with rate " << dec << fax_info->rate
|
||||||
|
<< (fax_info->hiRes ? ", hiRes" : ", lowRes") << (fax_info->colorJPEG ? ", JPEG" : "")
|
||||||
|
<< ", ID: " << fax_info->stationID << ", " << fax_info->pages << " pages" << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pthread_mutex_lock(&send_mutex);
|
pthread_mutex_lock(&send_mutex);
|
||||||
buffers_used=0; // we'll get no DATA_B3_CONF's after DISCONNECT_B3_IND, see Capi 2.0 spec, 5.18, note for DATA_B3_CONF
|
buffers_used=0; // we'll get no DATA_B3_CONF's after DISCONNECT_B3_IND, see Capi 2.0 spec, 5.18, note for DATA_B3_CONF
|
||||||
pthread_mutex_unlock(&send_mutex);
|
pthread_mutex_unlock(&send_mutex);
|
||||||
|
|
||||||
stop_file_transmission();
|
stop_file_transmission();
|
||||||
stop_file_reception();
|
stop_file_reception();
|
||||||
|
|
||||||
|
@ -1000,6 +1040,9 @@ Connection::buildBconfiguration(_cdword controller, service_t service, string fa
|
||||||
/* History
|
/* History
|
||||||
|
|
||||||
$Log: connection.cpp,v $
|
$Log: connection.cpp,v $
|
||||||
|
Revision 1.8 2003/05/24 13:48:54 gernot
|
||||||
|
- get fax details (calling station ID, transfer format, ...), handle PLCI
|
||||||
|
|
||||||
Revision 1.7 2003/04/17 10:39:42 gernot
|
Revision 1.7 2003/04/17 10:39:42 gernot
|
||||||
- support ALERTING notification (to know when it's ringing on the other side)
|
- support ALERTING notification (to know when it's ringing on the other side)
|
||||||
- cosmetical fixes in capi.cpp
|
- cosmetical fixes in capi.cpp
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
@brief Contains Connection - Encapsulates a CAPI connection with all its states and methods.
|
@brief Contains Connection - Encapsulates a CAPI connection with all its states and methods.
|
||||||
|
|
||||||
@author Gernot Hillier <gernot@hillier.de>
|
@author Gernot Hillier <gernot@hillier.de>
|
||||||
$Revision: 1.3 $
|
$Revision: 1.4 $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
|
@ -308,6 +308,25 @@ class Connection
|
||||||
*/
|
*/
|
||||||
connection_state_t getState();
|
connection_state_t getState();
|
||||||
|
|
||||||
|
/** @brief several parameters describing fax protocol details for incoming faxes
|
||||||
|
|
||||||
|
Information is available when B3 connection is established (after CallInterface::callConnected()
|
||||||
|
was called) unless noted otherwise.
|
||||||
|
*/
|
||||||
|
struct fax_info_t {
|
||||||
|
int rate; ///< bit rate used at connect or at disconnect (depends when you ask for it)
|
||||||
|
bool hiRes; ///< fax is transferred in high resolution
|
||||||
|
bool colorJPEG; ///< color fax transmitted as JPEG file
|
||||||
|
int pages; ///< number of transmitted pages (only available after disconnection!)
|
||||||
|
std::string stationID; ///< ID of the sending station
|
||||||
|
};
|
||||||
|
|
||||||
|
/** @brief Return fax information
|
||||||
|
|
||||||
|
@return several informations about a fax transfer as specified in Connection::fax_info_t, NULL when not available
|
||||||
|
*/
|
||||||
|
fax_info_t* getFaxInfo();
|
||||||
|
|
||||||
/** @brief Output error message
|
/** @brief Output error message
|
||||||
|
|
||||||
This is intended for external use if some other part of the application wants to make a error-log entry.
|
This is intended for external use if some other part of the application wants to make a error-log entry.
|
||||||
|
@ -629,6 +648,8 @@ class Connection
|
||||||
|
|
||||||
unsigned short buffer_start, ///< holds the index for the first buffer currently used
|
unsigned short buffer_start, ///< holds the index for the first buffer currently used
|
||||||
buffers_used; ///< holds the number of currently used buffers
|
buffers_used; ///< holds the number of currently used buffers
|
||||||
|
|
||||||
|
fax_info_t* fax_info;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -636,6 +657,9 @@ class Connection
|
||||||
/* History
|
/* History
|
||||||
|
|
||||||
$Log: connection.h,v $
|
$Log: connection.h,v $
|
||||||
|
Revision 1.4 2003/05/24 13:48:54 gernot
|
||||||
|
- get fax details (calling station ID, transfer format, ...), handle PLCI
|
||||||
|
|
||||||
Revision 1.3 2003/04/17 10:39:42 gernot
|
Revision 1.3 2003/04/17 10:39:42 gernot
|
||||||
- support ALERTING notification (to know when it's ringing on the other side)
|
- support ALERTING notification (to know when it's ringing on the other side)
|
||||||
- cosmetical fixes in capi.cpp
|
- cosmetical fixes in capi.cpp
|
||||||
|
|
Loading…
Reference in New Issue