View Javadoc

1   /* ***** BEGIN LICENSE BLOCK *****
2    * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3    *
4    * The contents of this file are subject to the Mozilla Public License Version
5    * 1.1 (the "License"); you may not use this file except in compliance with
6    * the License. You may obtain a copy of the License at
7    * http://www.mozilla.org/MPL/
8    *
9    * Software distributed under the License is distributed on an "AS IS" basis,
10   * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11   * for the specific language governing rights and limitations under the
12   * License.
13   *
14   * The Original Code is "SMS Library for the Java platform".
15   *
16   * The Initial Developer of the Original Code is Markus Eriksson.
17   * Portions created by the Initial Developer are Copyright (C) 2002
18   * the Initial Developer. All Rights Reserved.
19   *
20   * Contributor(s):
21   *
22   * Alternatively, the contents of this file may be used under the terms of
23   * either the GNU General Public License Version 2 or later (the "GPL"), or
24   * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
25   * in which case the provisions of the GPL or the LGPL are applicable instead
26   * of those above. If you wish to allow use of your version of this file only
27   * under the terms of either the GPL or the LGPL, and not to allow others to
28   * use your version of this file under the terms of the MPL, indicate your
29   * decision by deleting the provisions above and replace them with the notice
30   * and other provisions required by the GPL or the LGPL. If you do not delete
31   * the provisions above, a recipient may use your version of this file under
32   * the terms of any one of the MPL, the GPL or the LGPL.
33   *
34   * ***** END LICENSE BLOCK ***** */
35  package org.marre.sms.transport.gsm.commands;
36  
37  import java.io.IOException;
38  
39  import org.marre.sms.SmsException;
40  import org.marre.sms.transport.gsm.GsmComm;
41  import org.marre.sms.transport.gsm.GsmException;
42  import org.marre.util.StringUtil;
43  import org.slf4j.Logger;
44  import org.slf4j.LoggerFactory;
45  
46  /***
47   * Represents a PDU mode Send Message Set request (AT+CMGS).
48   * 
49   * @author Markus
50   * @version $Id: PduSendMessageReq.java,v 1.1 2005/11/26 16:38:50 c95men Exp $
51   */
52  public class PduSendMessageReq
53  {
54      private static Logger log_ = LoggerFactory.getLogger(PduSendMessageReq.class);
55      
56      private byte[] smscPdu_;
57      private byte[] smsPdu_;
58      
59      /***
60       * Send message in PDU mode using default SMSC.
61       * 
62       * @param smsPdu pdu for the sms data.
63       */
64      public PduSendMessageReq(byte[] smsPdu) {
65          smscPdu_ = new byte[] {0x00};
66          smsPdu_ = smsPdu;
67      }
68      
69      /***
70       * Send message in PDU mode.
71       * 
72       * @param smscPdu pdu for the SMSC address.
73       * @param smsPdu pdu for the sms data.
74       */
75      public PduSendMessageReq(byte[] smscPdu, byte[] smsPdu) {
76          smscPdu_ = smscPdu;
77          smsPdu_ = smsPdu;
78      }
79      
80      /***
81       * Sends the command and builds a response object.
82       * 
83       * @param comm
84       * @return
85       * @throws GsmException
86       * @throws IOException
87       */
88      public PduSendMessageRsp send(GsmComm comm) throws GsmException, IOException 
89      {
90          // <length> must indicate the number of octets coded in the TP layer data unit to 
91          // be given (i.e. SMSC address octets are excluded)
92          log_.debug("Sending AT+CMGS command");
93          comm.send("AT+CMGS=" + smsPdu_.length + "\r");
94          log_.debug("Read response from AT+CMGS command. Expecting a single '> ' without crlf.");
95          readContinue(comm);
96  
97          // Build cmgs string.
98          String cmgsPduString = StringUtil.bytesToHexString(smscPdu_) + StringUtil.bytesToHexString(smsPdu_);
99          
100         log_.debug("Send hexcoded PDU.");
101         comm.send(cmgsPduString + "\032");
102         return readResponse(comm);
103     }
104     
105     private PduSendMessageRsp readResponse(GsmComm comm) throws GsmException, IOException 
106     {
107         while (true)
108         {
109             String response = comm.readLine();
110             if (response.startsWith("+CMGS"))
111             {
112                 // TODO: Parse message reference
113                 return new PduSendMessageRsp(null);
114             } 
115             else if (response.startsWith("+CMS ERROR:"))
116             {
117                 throw new GsmException("CMS ERROR", response);
118             } 
119             else
120             {
121                 throw new GsmException("Unexpected response", response);
122             }
123         }
124     }
125     
126     private void readContinue(GsmComm comm)
127         throws GsmException, IOException
128     {
129         // Eat "> " that is sent from the device
130         String response = comm.readLine("> ");
131         
132         if (! response.equals("> ")) {
133             throw new GsmException("Unexpected response", response);
134         }
135     }
136 }