package uk.co.mmscomputing.sms;
import java.io.*;
public class SMSDataUnitFactory implements SMSConstants{
static public SMSDataUnit decode(boolean sc2ms,byte[] bytes)throws IOException{
int type = bytes[0]&0x007F; // [2] p.15 5.3.2.1 Data Link Layer
switch(type){ // DLL data unit type
case SMS_DLL_ERROR: return new SMSDLLError(bytes[1]&0x00FF); // Data Link Layer Error
case SMS_DLL_EST: return new SMSDLLEstablished(); // Data Link Layer connection established
case SMS_DLL_REL: return new SMSDLLReleased(); // Data Link Layer connection released
}
int flags = bytes[1]&0x00FF; // [1] p.54 9.2.3.1 TP-Message-Type-Indicator (TP-MTI)
InputStream in=new ByteArrayInputStream(bytes,1,bytes.length-1);
if(sc2ms){ // Mobil Station input stream [SC->MS]
switch(type){
case SMS_DLL_DATA: // Message carries SMS data
switch(flags&0x03){
case 0: return new SMSDeliver(in); // SMS-Deliver
case 2: return new SMSStatusReport(in); // SMS-STATUS-REPORT
case 3: return new SMSDeliver(in); // Reserved; treat as SMSDeliver [1] p.54
}
break;
case SMS_DLL_ACK: // Message carries positiv acknowledgement
switch(flags&0x03){
case 1: return new SMSSubmitAckReport(in); // SMS-Submit-Report
}
case SMS_DLL_NACK: // Message carries negativ acknowledgement
switch(flags&0x03){
case 1: return new SMSSubmitErrReport(in); // SMS-Submit-Report
}
}
}else{ // Service Center input stream [MS->SC]
switch(type){
case SMS_DLL_DATA: // Message carries SMS data
switch(flags&0x03){
case 1: return new SMSSubmit(in); // SMS-Submit
case 2: return new SMSCommand(in); // SMS-Command
}
break;
case SMS_DLL_ACK: // Message carries positiv acknowledgement
switch(flags&0x03){
case 0: return new SMSDeliverAckReport(in); // SMS-Deliver
}
case SMS_DLL_NACK: // Message carries negativ acknowledgement
switch(flags&0x03){
case 0: return new SMSDeliverErrReport(in); // SMS-Deliver
}
}
}
// String s="uk.co.mmscomputing.sms.SMSDataUnitFactory.decode:\nUnknown SMSDataUnit!\n";
// s+="type="+Integer.toBinaryString(type)+"b flags="+Integer.toBinaryString(flags)+"b\n";
// System.out.println(s);
throw new SMSException.Type();
}
}
// [1] ETSI TS 123 040 (2004-09)
// [2] ETSI ES 201 912 V1.2.1 (2004-06)