From 78f22859536685b4c1212268ad3bac288b4bb588 Mon Sep 17 00:00:00 2001 From: gernot Date: Sat, 24 May 2003 13:48:54 +0000 Subject: [PATCH] - 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 --- src/backend/connection.cpp | 65 +++++++++++++++++++++++++++++++------- src/backend/connection.h | 26 ++++++++++++++- 2 files changed, 79 insertions(+), 12 deletions(-) diff --git a/src/backend/connection.cpp b/src/backend/connection.cpp index b8c7cc9..ebc8443 100644 --- a/src/backend/connection.cpp +++ b/src/backend/connection.cpp @@ -2,7 +2,7 @@ @brief Contains Connection - Encapsulates a CAPI connection with all its states and methods. @author Gernot Hillier - $Revision: 1.7 $ + $Revision: 1.8 $ */ /*************************************************************************** @@ -23,15 +23,13 @@ #define conf_send_buffers 4 -// TODO NCPI handling für Fax - using namespace std; 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), 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), - 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(&receive_mutex, NULL); @@ -40,8 +38,8 @@ Connection::Connection (_cmsg& message, Capi* capi_in): call_from = getNumber(CONNECT_IND_CALLINGPARTYNUMBER(&message),true); call_to = getNumber(CONNECT_IND_CALLEDPARTYNUMBER(&message),false); if (debug_level >= 1) { - debug << prefix() << "Connection object created for incoming call PLCI " << plci << endl; - debug << prefix() << "from " << call_from << " to " << call_to << " CIP 0x" << hex << CONNECT_IND_CIPVALUE(&message) << endl; + debug << prefix() << "Connection object created for incoming call PLCI " << plci; + debug << " from " << call_from << " to " << call_to << " CIP 0x" << hex << CONNECT_IND_CIPVALUE(&message) << endl; } switch (CONNECT_IND_CIPVALUE(&message)) { 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), 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), - 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(&receive_mutex, NULL); @@ -161,6 +159,9 @@ Connection::~Connection() pthread_mutex_unlock(&receive_mutex); pthread_mutex_destroy(&receive_mutex); + if (fax_info) + delete fax_info; + if (debug_level >= 1) { debug << prefix() << "Connection object deleted" << endl; } @@ -318,6 +319,12 @@ Connection::getService() return service; } +Connection::fax_info_t* +Connection::getFaxInfo() +{ + return fax_info; +} + Connection::connection_state_t Connection::getState() { @@ -390,10 +397,10 @@ void Connection::connect_b3_active_ind(_cmsg& message) throw (CapiWrongState, CapiExternalError) { 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 { - if (ncci!=CONNECT_B3_IND_NCCI(&message)) - throw CapiError("CONNECT_B3_ACTIVE_IND received with wrong NCCI","Connection::connect_active_b3_ind()"); + if (ncci!=CONNECT_B3_ACTIVE_IND_NCCI(&message)) + throw CapiError("CONNECT_B3_ACTIVE_IND received with wrong NCCI","Connection::connect_b3_active_ind()"); try { 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; } 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(&ncpi[10]),static_cast(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) call_if->callConnected(); else @@ -419,10 +443,26 @@ Connection::disconnect_b3_ind(_cmsg& message) throw (CapiWrongState) 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(&ncpi[10]),static_cast(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); 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); - + stop_file_transmission(); stop_file_reception(); @@ -1000,6 +1040,9 @@ Connection::buildBconfiguration(_cdword controller, service_t service, string fa /* History $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 - support ALERTING notification (to know when it's ringing on the other side) - cosmetical fixes in capi.cpp diff --git a/src/backend/connection.h b/src/backend/connection.h index 2b1acf4..953c89a 100644 --- a/src/backend/connection.h +++ b/src/backend/connection.h @@ -2,7 +2,7 @@ @brief Contains Connection - Encapsulates a CAPI connection with all its states and methods. @author Gernot Hillier - $Revision: 1.3 $ + $Revision: 1.4 $ */ /*************************************************************************** @@ -308,6 +308,25 @@ class Connection */ 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 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 buffers_used; ///< holds the number of currently used buffers + + fax_info_t* fax_info; }; #endif @@ -636,6 +657,9 @@ class Connection /* History $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 - support ALERTING notification (to know when it's ringing on the other side) - cosmetical fixes in capi.cpp