package uk.co.mmscomputing.sms;
import java.io.*;
public class SMSDataCodingScheme extends SMSTransportProtocolParameter{
private int flags;
private int msggroup=-1;
private int msgcoding=-1;
private int msgclass=-1;
private boolean msgcompression=false; // Compression algorithm described in 3GPP TS 23.042
public SMSDataCodingScheme(int flags){
this.flags=flags&0x00FF;
msggroup=(flags>>6)&0x03;
switch(msggroup){
case 0: group0(flags);break;
case 1: group1(flags);break;
case 2: group2(flags);break;
case 3: group3(flags);break;
}
}
public void group0(int flags){ // General Data Coding indication
msgcompression=(((flags>>5)&0x01)==1); // Bit 5 Message compression [1] 3.9 p.25
if(!msgcompression){ // if compressed ignore bits 2..3
msgcoding=((flags>>2)&0x03); // Bit 2..3 Message coding
}
if(((flags>>4)&0x01)==1){ // Bit 4
msgclass =( flags & 0x03); // Bit 0..1 Message class
}
}
public void group1(int flags){ // Message Marked for Automatic Deletion Group
msgcompression=(((flags>>5)&0x01)==1); // Bit 5 Message compression [1] 3.9 p.25
if(!msgcompression){ // if compressed ignore bits 2..3
msgcoding=((flags>>2)&0x03); // Bit 2..3 Message coding
}
if(((flags>>4)&0x01)==1){ // Bit 4
msgclass =( flags & 0x03); // Bit 0..1 Message class
}
}
public void group2(int flags){ // Reserved coding groups
}
public void group3(int flags){
msggroup=((flags>>4)&0x0F);
switch((flags>>4)&0x03){
case 0:
break;
case 1:
break;
case 2:
break;
case 3: // Data coding/message class
// Bit 3 is reserved, set to 0.
msgcoding=((flags>>2)&0x01); // Bit 2 Message coding
msgclass =( flags &0x03); // Bit 0..1 Message class
break;
}
}
public int getCoding(){return msgcoding;}
public void writeTo(OutputStream out)throws IOException{
out.write(flags);
}
public String toString(){
String s=getClass().getName()+":\n";
s+="flags = "+Integer.toBinaryString(flags)+"b\n";
switch(msggroup){
case 0: s+="General Data Coding indication\n";break;
case 1: s+="Message Marked for Automatic Deletion Group\n";break;
case 2: s+="Reserved coding groups\n";break;
case 0x0C: s+="Message Waiting Indication Group: Discard Message\n";break;
case 0x0D: s+="Message Waiting Indication Group: Store Message\n";break;
case 0x0E: s+="Message Waiting Indication Group: Store Message\n";break;
case 0x0F: s+="Data coding/message class\n";break;
}
switch(msgcoding){
case 0: s+="GSM 7 bit default alphabet\n";break;
case 1: s+="8 bit data\n";break;
case 2: s+="UCS2 (16bit)\n";break;
case 3: s+="Reserved\n";break;
}
switch(msgclass){
case 0: s+="Class 0: Display message immediately on ME screen.\n";break;
case 1: s+="Class 1: Default meaning: ME-specific\n";break;
case 2: s+="Class 2: (U)SIM-specific message\n";break;
case 3: s+="Class 3: Default meaning: TE specific (see 3GPP TS 27.005)\n";break;
}
if(msgcompression){
s+="Use compression algorithm defined in 3GPP TS 23.042\n";
}
return s;
}
public static void main(String[] argv){
try{
System.out.println(new SMSDataCodingScheme(Integer.parseInt(argv[0],16)).toString());
}catch(Exception e){
System.out.println(e);
}
}
}
// [2] 3GPP TS 23.038 V7.0.0 (2006-03)