laforge
/
openbts-osmo
Archived
1
0
Fork 0

Better result reporting for waitUSSDData() and postUSSDData().

This commit is contained in:
Alexander Chemeris 2010-09-09 18:21:47 +04:00
parent 9c542926ac
commit 9f707665ba
2 changed files with 92 additions and 37 deletions

View File

@ -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)

View File

@ -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);