package sms.gateway.process;
import smpp.*;
import smpp.pdu.*;
import sms.util.Queue;
import sms.util.FileTool;
import sms.common.*;
import sms.gateway.Gateway;
import java.io.IOException;
/**
* For receiving PDUs from SMSC, in Sync mode
* --> Only request PDUs are received.
*/
public class SMPPReceiver extends Thread {
private static Logger logger = new Logger("SMPPReceiver");
private PDU pdu = null;
private DeliverSM dsm = null;
private Queue requestQueue = null;
public SMPPReceiver() {
this.requestQueue = Gateway.getRequestQueue();
}
public void run() {
while (Gateway.isRunning()) {
try {
//pdu = Gateway.getSessionR().receive(Preference.receiveTimeout);
pdu = Gateway.getSessionR().receive();
if (pdu == null) continue;
if (pdu.isValid()) {
if (pdu.isRequest()) {
// Logger.println2C("==> " + pdu.debugString());
// Make default response
Response response = ( (Request) pdu).getResponse();
// Reply with default response
//Logger.println2C("<== " + response.debugString());
Gateway.getSessionR().respond(response);
// Add to requestQueue for further processing
if (pdu.getCommandId() != Data.ENQUIRE_LINK) {
if (pdu.getCommandId() == Data.DELIVER_SM) {
dsm = (DeliverSM) pdu;
logger.printPDU(dsm);
requestQueue.enqueue(pdu);
} else {
logger.info("Not a Deliver_SM: " + pdu.debugString());
}
}
} else if (pdu.isResponse()) {
// Process response
if (pdu.getCommandId() == Data.UNBIND_RESP) {
UnbindResp response = (UnbindResp) pdu;
logger.info("Unbind response " + response.debugString());
Gateway.setBoundR(false);
//System.exit(0);
} else {
logger.info("received a response(?), while expect requests only.");
}
} else {
logger.info(
"pdu of unknown class (not request nor response) " +
"received; Discarding " + pdu.debugString());
}
} else {
logger.info("Received an invalid pdu: " + pdu);
String filename = "" + System.currentTimeMillis() + "_inv_pdu.dat";
logger.info("-->Save to file: " + filename);
try {
FileTool.saveToFile(pdu.getData().getBuffer(), filename, false);
} catch (ValueNotSetException ex) {
logger.error("handleEvent: " + ex.getMessage());
}
}
} catch (IOException ex) {
logger.alert("DISCONNECTED from SMSC.");
if (Gateway.isBound()) {
Gateway.setBound(false);
Gateway.setBoundR(false);
Gateway.bind();
}
} catch (Exception ex) {
logger.error("run: " + ex.getMessage());
}
}
}
}