package uk.co.mmscomputing.sms; import java.io.*; public class SMSAddress extends SMSTransportProtocolParameter{ // [1] p.40 9.1.2.5 Address fields private int numberingPlan=0; // Numbering-plan-identification private int typeOfNumber=0; // Type-of-number private byte[] number; // max 10 digits public SMSAddress(InputStream in)throws IOException{ int nolen = read(in); numberingPlan = read(in); // bit 7 always set typeOfNumber = (numberingPlan>>4)&0x0007; // bits 6..4 numberingPlan&= 0x0F; // bits 3..0 number = new byte[nolen]; if(nolen!=new SMSNibbleInputStream(in).read(number)){ throw new IOException(getClass().getName()+"<init>:\nUnexpected EOF. Could not read whole number."); } } public SMSAddress(int np,int ton,byte[] n){ numberingPlan=np; typeOfNumber=ton; number=n; } public SMSAddress(int np,int ton,String n){ this(np,ton,n.getBytes()); } public SMSAddress(String n){ this(0x01,0x00,n.getBytes()); // use E.164/E.163 numbering plan; type of number unknown to us } public void writeTo(OutputStream out)throws IOException{ out.write(number.length); out.write(0x80|(typeOfNumber<<4)|numberingPlan); out=new SMSNibbleOutputStream(out); out.write(number); out.flush(); } public String getTypeOfNumberString(){ switch(typeOfNumber){ case 0: return "Unknown"; case 1: return "International number"; case 2: return "National number"; case 3: return "Network specific number"; case 4: return "Subscriber number"; case 5: return "Alphanumeric, (coded according to 3GPP TS 23.038 [9] GSM 7-bit default alphabet)"; case 6: return "Abbreviated number"; default: return "Reserved for extension"; } } public String getNumberingPlanString(){ switch(numberingPlan){ case 0: return "Unknown"; case 1: return "ISDN/telephone numbering plan (E.164/E.163)"; case 3: return "Data numbering plan (X.121)"; case 4: return "Telex numbering plan"; case 5: return "Service Centre Specific plan (5)"; case 6: return "Service Centre Specific plan (6)"; case 8: return "National numbering plan"; case 9: return "Private numbering plan"; case 10: return "ERMES numbering plan (ETSI DE/PS 3 01-3)"; default: return "Reserved for extension"; } } public String getNumber(){ return new String(number); } public String toString(){ String s=getClass().getName()+":\n"; s+="numbering plan = "+getNumberingPlanString()+"\n"; s+="type of number = "+getTypeOfNumberString()+"\n"; s+="number = "+getNumber()+"\n"; return s; } } // [1] ETSI TS 123 040 (2004-09)