org.smslib.modem.IPModemDriver.java Source code

Java tutorial

Introduction

Here is the source code for org.smslib.modem.IPModemDriver.java

Source

// SMSLib for Java v3
// A Java API library for sending and receiving SMS via a GSM modem
// or other supported gateways.
// Web Site: http://www.smslib.org
//
// Copyright (C) 2002-2008, Thanasis Delenikas, Athens/GREECE.
// SMSLib is distributed under the terms of the Apache License version 2.0
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package org.smslib.modem;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.StringTokenizer;
import org.apache.commons.net.telnet.EchoOptionHandler;
import org.apache.commons.net.telnet.InvalidTelnetOptionException;
import org.apache.commons.net.telnet.SuppressGAOptionHandler;
import org.apache.commons.net.telnet.TelnetClient;
import org.apache.commons.net.telnet.TerminalTypeOptionHandler;
import org.smslib.GatewayException;

class IPModemDriver extends AModemDriver {
    private String ipAddress;
    private int ipPort;
    private TelnetClient tc;
    private InputStream in;
    private OutputStream out;
    private Peeker peeker;
    TerminalTypeOptionHandler ttopt = new TerminalTypeOptionHandler("VT100", false, false, true, false);
    EchoOptionHandler echoopt = new EchoOptionHandler(true, false, true, false);
    SuppressGAOptionHandler gaopt = new SuppressGAOptionHandler(true, true, true, true);

    IPModemDriver(ModemGateway gateway, String deviceParms) {
        super(gateway, deviceParms);
        StringTokenizer tokens = new StringTokenizer(deviceParms, ":");
        ipAddress = tokens.nextToken();
        ipPort = Integer.parseInt(tokens.nextToken());
        tc = null;
    }

    void connectPort() throws GatewayException, IOException, InterruptedException {
        try {
            gateway.logInfo("Opening: " + ipAddress + " @" + ipPort);
            tc = new TelnetClient();
            tc.addOptionHandler(ttopt);
            tc.addOptionHandler(echoopt);
            tc.addOptionHandler(gaopt);
            tc.connect(ipAddress, ipPort);
            in = tc.getInputStream();
            out = tc.getOutputStream();
            peeker = new Peeker();
        } catch (InvalidTelnetOptionException e) {
            throw new GatewayException("Unsupported telnet option for the selected IP connection.");
        }
    }

    void disconnectPort() throws IOException, InterruptedException {
        gateway.logInfo("Closing: " + ipAddress + " @" + ipPort);
        synchronized (SYNC_Reader) {
            if (tc != null)
                tc.disconnect();
            tc = null;
            peeker.interrupt();
            peeker.join();
        }
    }

    void clear() throws IOException {
        while (portHasData())
            read();
    }

    boolean portHasData() throws IOException {
        return (in.available() > 0);
    }

    public void write(char c) throws IOException {
        out.write((short) c);
        out.flush();
    }

    public void write(byte[] s) throws IOException {
        out.write(s);
        out.flush();
    }

    int read() throws IOException {
        return in.read();
    }

    private class Peeker extends Thread {
        public Peeker() {
            setPriority(MIN_PRIORITY);
            start();
        }

        public void run() {
            gateway.logDebug("Peeker started.");
            while (true) {
                try {
                    if (tc != null) {
                        if (portHasData()) {
                            synchronized (SYNC_Reader) {
                                dataReceived = true;
                                SYNC_Reader.notifyAll();
                            }
                        }
                    }
                    sleep(gateway.getService().S.SERIAL_POLLING_INTERVAL);
                } catch (InterruptedException e) {
                    if (tc == null)
                        break;
                } catch (Exception e) {
                }
            }
            gateway.logDebug("Peeker stopped.");
        }
    }
}