Better result reporting for waitUSSDData() and postUSSDData().
This commit is contained in:
parent
9c542926ac
commit
9f707665ba
|
@ -628,54 +628,81 @@ void TMSITable::load(const char* filename)
|
|||
fclose(fp);
|
||||
}
|
||||
|
||||
unsigned USSDHandler::waitUSSDData(Control::USSDData::USSDMessageType* messageType, std::string* USSDString, unsigned timeout = USSDHandler::infinitely)
|
||||
USSDHandler::ResultCode USSDHandler::waitUSSDData(Control::USSDData::USSDMessageType* messageType,
|
||||
std::string* USSDString,
|
||||
unsigned timeout)
|
||||
{
|
||||
TransactionEntry transaction;
|
||||
// Wait for MS to signal that data is ready
|
||||
gTransactionTable.find(mTransactionID, transaction);
|
||||
|
||||
USSDData *pUssdData = NULL;
|
||||
|
||||
// Step 1 -- Find transaction
|
||||
if (!gTransactionTable.find(mTransactionID, transaction))
|
||||
{
|
||||
LOG(DEBUG) << "Transaction with ID=" << mTransactionID << " not found";
|
||||
return USSD_NO_TRANSACTION;
|
||||
}
|
||||
if ((pUssdData = transaction.ussdData()) == NULL)
|
||||
{
|
||||
LOG(DEBUG) << "Transaction has no USSD data: " << transaction;
|
||||
return USSD_BAD_STATE;
|
||||
}
|
||||
|
||||
// Step 2 -- Wait for MS to signal that data is ready
|
||||
if (timeout >= USSDHandler::infinitely)
|
||||
{
|
||||
if (transaction.ussdData()->waitMS()!=0)
|
||||
// wait infinitely
|
||||
if (pUssdData->waitMS()!=0)
|
||||
{
|
||||
LOG(ERROR) << "USSDDate semaphore returned error: " << errno;
|
||||
return 2;
|
||||
return USSD_ERROR;
|
||||
}
|
||||
}
|
||||
else if((timeout > USSDHandler::trywait) && (timeout < USSDHandler::infinitely))
|
||||
else if ((timeout > USSDHandler::trywait) && (timeout < USSDHandler::infinitely))
|
||||
{
|
||||
//wait
|
||||
if (transaction.ussdData()->waitMS(timeout)!=0)
|
||||
// wait
|
||||
if (pUssdData->waitMS(timeout)!=0)
|
||||
{
|
||||
LOG(DEBUG) << "USSDDate semaphore returned error or timeout";
|
||||
return 2;
|
||||
return USSD_TIMEOUT;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//trywait
|
||||
if (transaction.ussdData()->trywaitMS()!=0)
|
||||
// trywait
|
||||
if (pUssdData->trywaitMS()!=0)
|
||||
{
|
||||
LOG(DEBUG) << "USSDDate semaphore returned error";
|
||||
return 2;
|
||||
return USSD_TIMEOUT;
|
||||
}
|
||||
}
|
||||
|
||||
// Get data from MS and check for closing condition
|
||||
gTransactionTable.find(mTransactionID, transaction);
|
||||
// Step 3 -- Get data from MS and check for closing condition
|
||||
if (!gTransactionTable.find(mTransactionID, transaction))
|
||||
{
|
||||
LOG(DEBUG) << "Transaction with ID=" << mTransactionID << " not found";
|
||||
return USSD_NO_TRANSACTION;
|
||||
}
|
||||
if ((pUssdData = transaction.ussdData()) == NULL)
|
||||
{
|
||||
LOG(DEBUG) << "Transaction has no USSD data: " << transaction;
|
||||
return USSD_BAD_STATE;
|
||||
}
|
||||
if (transaction.Q931State() == Control::TransactionEntry::USSDclosing)
|
||||
{
|
||||
clearTransactionHistory(transaction);
|
||||
LOG(DEBUG) << "USSD clearing....";
|
||||
return 1;
|
||||
LOG(DEBUG) << "Clearing USSD transaction: " << transaction;
|
||||
return USSD_CLEARED;
|
||||
}
|
||||
*messageType = transaction.ussdData()->MessageType();
|
||||
*USSDString = transaction.ussdData()->USSDString();
|
||||
return 0;
|
||||
*messageType = pUssdData->MessageType();
|
||||
*USSDString = pUssdData->USSDString();
|
||||
return USSD_OK;
|
||||
}
|
||||
|
||||
void USSDHandler::postUSSDData(Control::USSDData::USSDMessageType messageType, std::string USSDString)
|
||||
USSDHandler::ResultCode USSDHandler::postUSSDData(Control::USSDData::USSDMessageType messageType,
|
||||
const std::string &iUSSDString)
|
||||
{
|
||||
// Step 0 -- Prepare long strings for continuation
|
||||
std::string USSDString(iUSSDString);
|
||||
if (USSDString.length()>USSD_MAX_CHARS_7BIT)
|
||||
{
|
||||
int contLen = mContinueStr.length();
|
||||
|
@ -691,15 +718,31 @@ void USSDHandler::postUSSDData(Control::USSDData::USSDMessageType messageType, s
|
|||
|
||||
// Step 1 -- Find transaction
|
||||
TransactionEntry transaction;
|
||||
gTransactionTable.find(mTransactionID, transaction);
|
||||
USSDData *pUssdData = NULL;
|
||||
if (!gTransactionTable.find(mTransactionID, transaction))
|
||||
{
|
||||
LOG(DEBUG) << "Transaction with ID=" << mTransactionID << " not found";
|
||||
return USSD_NO_TRANSACTION;
|
||||
}
|
||||
if ((pUssdData = transaction.ussdData()) == NULL)
|
||||
{
|
||||
LOG(DEBUG) << "Transaction has no USSD data: " << transaction;
|
||||
return USSD_BAD_STATE;
|
||||
}
|
||||
|
||||
// Step 2 -- Update transaction with the data to send
|
||||
transaction.ussdData()->MessageType(messageType);
|
||||
transaction.ussdData()->USSDString(USSDString);
|
||||
pUssdData->MessageType(messageType);
|
||||
pUssdData->USSDString(USSDString);
|
||||
gTransactionTable.update(transaction);
|
||||
|
||||
// Step 3 -- Notify the dispatcher thread that data is ready to be sent
|
||||
transaction.ussdData()->postNW();
|
||||
if (pUssdData->postNW() != 0)
|
||||
{
|
||||
return USSD_ERROR;
|
||||
}
|
||||
|
||||
// Success.
|
||||
return USSD_OK;
|
||||
}
|
||||
|
||||
void *USSDHandler::runWrapper(void *pThis)
|
||||
|
|
|
@ -410,19 +410,21 @@ class USSDData {
|
|||
std::string USSDString() const { return mUSSDString; }
|
||||
void USSDString(std::string wUSSDString) { mUSSDString = wUSSDString; }
|
||||
|
||||
int waitMS() { return mSemWaitMS.wait(); }
|
||||
int waitNW() { return mSemWaitNW.wait(); }
|
||||
ThreadSemaphore::Result waitMS() { return mSemWaitMS.wait(); }
|
||||
ThreadSemaphore::Result waitNW() { return mSemWaitNW.wait(); }
|
||||
ThreadSemaphore::Result waitIncomingData() { return mSemIncomingData.wait(); }
|
||||
|
||||
int waitMS(unsigned timeout) { return mSemWaitMS.wait(timeout); }
|
||||
int waitNW(unsigned timeout) { return mSemWaitNW.wait(timeout); }
|
||||
ThreadSemaphore::Result waitMS(unsigned timeout) { return mSemWaitMS.wait(timeout); }
|
||||
ThreadSemaphore::Result waitNW(unsigned timeout) { return mSemWaitNW.wait(timeout); }
|
||||
ThreadSemaphore::Result waitIncomingData(unsigned timeout) { return mSemIncomingData.wait(timeout); }
|
||||
|
||||
int trywaitMS() { return mSemWaitMS.trywait(); }
|
||||
int trywaitNW() { return mSemWaitNW.trywait(); }
|
||||
ThreadSemaphore::Result trywaitMS() { return mSemWaitMS.trywait(); }
|
||||
ThreadSemaphore::Result trywaitNW() { return mSemWaitNW.trywait(); }
|
||||
ThreadSemaphore::Result trywaitIncomingData() { return mSemIncomingData.trywait(); }
|
||||
|
||||
|
||||
int postMS() { return mSemWaitMS.post(); }
|
||||
int postNW() { return mSemWaitNW.post(); }
|
||||
|
||||
ThreadSemaphore::Result postMS() { return mSemWaitMS.post(); }
|
||||
ThreadSemaphore::Result postNW() { return mSemWaitNW.post(); }
|
||||
ThreadSemaphore::Result signalIncomingData() { return mSemIncomingData.post(); }
|
||||
};
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, USSDData::USSDMessageType);
|
||||
|
@ -930,6 +932,16 @@ class USSDHandler {
|
|||
{
|
||||
USSD_MAX_CHARS_7BIT = 182 ///< See GSM 03.38 5 Cell Broadcast Data Coding Scheme
|
||||
};
|
||||
enum ResultCode {
|
||||
USSD_OK = 0, ///< Operation performed
|
||||
|
||||
USSD_CLEARED, ///< USSD state has been cleared as a result of operation
|
||||
USSD_TIMEOUT, ///< USSD operation timed out
|
||||
|
||||
USSD_NO_TRANSACTION, ///< Can't find transaction
|
||||
USSD_BAD_STATE, ///< Wrong transaction state
|
||||
USSD_ERROR ///< Generic error
|
||||
};
|
||||
|
||||
private:
|
||||
unsigned mTransactionID;
|
||||
|
@ -946,9 +958,9 @@ class USSDHandler {
|
|||
{}
|
||||
|
||||
/** Wait USSD data from MS. Return: 0 - successful, 1 - clear transaction, 2 - error or timeout */
|
||||
unsigned waitUSSDData(Control::USSDData::USSDMessageType* messageType, std::string* USSDString, unsigned timeout);
|
||||
USSDHandler::ResultCode waitUSSDData(Control::USSDData::USSDMessageType* messageType, std::string* USSDString, unsigned timeout = USSDHandler::infinitely);
|
||||
/** Post USSD data and update transaction with new USSDData (messageType and USSDString)*/
|
||||
void postUSSDData( Control::USSDData::USSDMessageType messageType, std::string USSDString);
|
||||
USSDHandler::ResultCode postUSSDData( Control::USSDData::USSDMessageType messageType, const std::string &USSDString);
|
||||
unsigned transactionID() { return mTransactionID; }
|
||||
void transactionID(unsigned wTransactionID) { wTransactionID = mTransactionID; }
|
||||
static void *runWrapper(void *pThis);
|
||||
|
|
Reference in New Issue