Hi, the following Java Code is the decoder that responsible for parsing
incoming SMPP messages from Short message Center:

public class SMPPClientSideDecoder extends CumulativeProtocolDecoder {

        /** Class revision */
        public static final String _REV_ID_ = "$Revision: $";

        private static final int MAX_PDU_LENGTH = 300;

        private static final Map<Integer, Class<? extends PDU>>
PDUMapping = new HashMap<Integer, Class<? extends PDU>>();

        static {
                PDUMapping.put(Data.BIND_RECEIVER_RESP,
BindReceiverResp.class);
                PDUMapping.put(Data.BIND_TRANSCEIVER_RESP,
BindTranscieverResp.class);
                PDUMapping.put(Data.BIND_TRANSMITTER_RESP,
BindTransmitterResp.class);
                PDUMapping.put(Data.ENQUIRE_LINK_RESP,
EnquireLinkResp.class);
                PDUMapping.put(Data.ENQUIRE_LINK, EnquireLink.class);
                PDUMapping.put(Data.UNBIND_RESP, UnbindResp.class);
        }

        private void writePDUObject(int commandId, byte[] content,
                        ProtocolDecoderOutput out) throws Exception {
                Class<? extends PDU> pduClass =
PDUMapping.get(commandId);
                if (pduClass != null) {
                        PDU pdu = pduClass.newInstance();
                        pdu.setData(new ByteBuffer(content));
                        out.write(pdu);
                }
        }

        @Override
        protected boolean doDecode(IoSession session, IoBuffer in,
                        ProtocolDecoderOutput out) throws Exception {
                if (Util.prefixedDataAvailable(in, 4, MAX_PDU_LENGTH)) {
                        int commandLength = Util.getCommandLength(in);
                        int commandId = Util.getCommandId(in);
                        byte[] data = new byte[commandLength];
                        in.get(data, 0, commandLength);
                        EServerStatus status = null;
                        if (status == EServerStatus.STOPPING) {
                                // filter out Bind & Request message
during STOPPING phrase
                                if (Util.isSMPPRequest(commandId)) {
                                        return true;
                                }
                        }

                        switch (commandId) {
                        // handle Bind response & EnquireLink response
                        case Data.BIND_RECEIVER_RESP:
                                writePDUObject(Data.BIND_RECEIVER_RESP,
data, out);
                                break;
                        case Data.BIND_TRANSCEIVER_RESP:
        
writePDUObject(Data.BIND_TRANSCEIVER_RESP, data, out);
                                break;
                        case Data.BIND_TRANSMITTER_RESP:
        
writePDUObject(Data.BIND_TRANSMITTER_RESP, data, out);
                                break;
                        case Data.ENQUIRE_LINK:
                                writePDUObject(Data.ENQUIRE_LINK, data,
out);
                                break;
                        case Data.ENQUIRE_LINK_RESP:
                                writePDUObject(Data.ENQUIRE_LINK_RESP,
data, out);
                                break;
                        case Data.UNBIND_RESP:
                                writePDUObject(Data.UNBIND_RESP, data,
out);
                                break;
                        default:
                                // handle the other kind of PDU
                                out.write(IoBuffer.wrap(data));
                                break;
                        }
                        return true;
                }
                return false;
        }
} 

Reply via email to