SmsConstants.java

1
package fr.sii.ogham.sms;
2
3
public final class SmsConstants {
4
	/**
5
	 * Default constant values for splitting messages.
6
	 * 
7
	 * 
8
	 * @author Aurélien Baudet
9
	 *
10
	 */
11
	public static final class SmppSplitConstants {
12
		/**
13
		 * A single SMS GSM message has a maximum size of 140 octets.
14
		 */
15
		public static final int MAXIMUM_BYTES_PER_MESSAGE = 140;
16
17
		/**
18
		 * Smpp message size is 140 octets. UCS-2 encoding uses 2 octets per
19
		 * character. Therefore the original Java {@link String} can completely
20
		 * fit in one segment if its length is lower or equal to 70 characters
21
		 * (140 octets / 2). If the original Java {@link String} can't fit, then
22
		 * each part must have a maximum length of 67 characters ((140 octetes -
23
		 * 6 octets for header) / 2).
24
		 * 
25
		 * <hr>
26
		 * <strong>Explanation:</strong>
27
		 * <p>
28
		 * UCS-2 Encoding This encoding allows use of a greater range of
29
		 * characters and languages. UCS-2 can represent the most commonly used
30
		 * Latin and eastern characters at the cost of a greater space expense.
31
		 * Strictly speaking, UCS-2 is limited to characters in the Basic
32
		 * Multilingual Plane. However, since modern programming environments do
33
		 * not provide encoders or decoders for UCS-2, some cell phones (e.g.
34
		 * iPhones) use UTF-16 instead of UCS-2.[4] This works, because for
35
		 * characters in the Basic Multilingual Plane (including full alphabets
36
		 * of most modern human languages) UCS-2 and UTF-16 encodings are
37
		 * identical. To encode characters outside of the BMP (unreachable in
38
		 * plain UCS-2), such as Emoji, UTF-16 uses surrogate pairs, which when
39
		 * decoded with UCS-2 would appear as two valid but unmapped code
40
		 * points.
41
		 * 
42
		 * <p>
43
		 * A single SMS GSM message using this encoding can have at most 70
44
		 * characters (140 octets).
45
		 * 
46
		 * <p>
47
		 * Note that on many GSM cell phones, there's no specific preselection
48
		 * of the UCS-2 encoding. The default is to use the 7-bit encoding
49
		 * described above, until one enters a character that is not present in
50
		 * the GSM 7-bit table (for example the lowercase 'a' with acute: 'á').
51
		 * In that case, the whole message gets reencoded using the UCS-2
52
		 * encoding, and the maximum length of the message sent in a single SMS
53
		 * is immediately reduced to 70 characters, instead of 160. Others vary
54
		 * based on the choice and configuration of SMS application, and the
55
		 * length of the message.
56
		 * 
57
		 */
58
		public static final SegmentSizes SEGMENT_SIZE_UCS2 = new SegmentSizes(70, 67);
59
60
		/**
61
		 * Smpp message size is 140 octets. GSM 8-bit encoding uses one octet
62
		 * per character. Therefore the original Java {@link String} can
63
		 * completely fit in one segment if its length is lower or equal to 140
64
		 * characters (140 octets = 140 characters). If the original Java
65
		 * {@link String} can't fit, then each part must have a maximum length
66
		 * of 134 characters (140 octets - 6 octets for header = 134 octets for
67
		 * message {@literal ->} 134 characters).
68
		 */
69
		public static final SegmentSizes SEGMENT_SIZE_GSM_8BIT = new SegmentSizes(140, 134);
70
71
		/**
72
		 * Smpp message size is 140 octets. GSM 7-bit encoding uses 7 bits per
73
		 * character. Therefore the original Java {@link String} can completely
74
		 * fit in one segment if its length is lower or equal to 160 characters
75
		 * (140 octets * 8 bits / 7 bits). If the original Java {@link String}
76
		 * can't fit, then each part must have a maximum length of 153
77
		 * characters ((140 octets - 6 octets for header) * 8 / 7).
78
		 * 
79
		 * <hr>
80
		 * <strong>Explanation:</strong>
81
		 * <p>
82
		 * The standard encoding for GSM messages is the 7-bit default alphabet
83
		 * as defined in the 23.038 recommendation.
84
		 * 
85
		 * <p>
86
		 * Seven-bit characters must be encoded into octets following one of
87
		 * three packing modes:
88
		 * 
89
		 * <ul>
90
		 * <li>CBS: using this encoding, it is possible to send up to 93
91
		 * characters (packed in up to 82 octets) in one SMS message in a Cell
92
		 * Broadcast Service.</li>
93
		 * <li><strong>SMS</strong>: using this encoding, it is possible to send
94
		 * up to 160 characters (packed in up to 140 octets) in one SMS message
95
		 * in the GSM network.</li>
96
		 * <li>USSD: using this encoding, it is possible to send up to 182
97
		 * characters (packed in up to 160 octets) in one SMS message of
98
		 * Unstructured Supplementary Service Data.</li>
99
		 * </ul>
100
		 * 
101
		 * <p>
102
		 * In a standard GSM text message, all characters are encoded using
103
		 * 7-bit code units, packed together to fill all bits of octets. So, for
104
		 * example, the 140-octet envelope of an SMS, with no other language
105
		 * indicator but only the standard class prefix, can transport up to
106
		 * (140*8)/7=160, that is 160 GSM 7-bit characters (but note that the
107
		 * ESC code counts for one of them, if characters in the high part of
108
		 * the table are used).
109
		 * 
110
		 * <p>
111
		 * Longer messages may be sent, but will require a continuation prefix
112
		 * and a sequence number on subsequent SMS messages (these prefix octets
113
		 * and sequence number are counted within the maximum length of the
114
		 * 140-octet payload of the envelope format).
115
		 * 
116
		 * <p>
117
		 * When there are 1 to 6 spare bits in the last octet of a message,
118
		 * these bits are set to zero (these bits do not count as a character
119
		 * but only as a filler). When there are 7 spare bits in the last octet
120
		 * of a message, these bits are set to the 7-bit code of the CR control
121
		 * (also used as a padding filler) instead of being set to zero (where
122
		 * they would be confused with the 7-bit code of an '@' character).
123
		 */
124
		public static final SegmentSizes SEGMENT_SIZE_GSM_7BIT_SMS_PACKING_MODE = new SegmentSizes(160, 153);
125
126
		/**
127
		 * Represents maximum sizes for segments:
128
		 * <ul>
129
		 * <li>maximumStringLengthToFitInASingleSegment: This is the maximum
130
		 * length of the original string (Java {@link String}) that can
131
		 * completely fit in only one segment.</li>
132
		 * <li>maximumStringLengthPerSegment: If the original string (Java
133
		 * {@link String}) can't completely fit in only one segment, then the
134
		 * string is split in several segments with this value as maximum size.
135
		 * Each resulting segment may contain a header or some control
136
		 * characters. This size only represents the maximum length of the
137
		 * payload.</li>
138
		 * </ul>
139
		 * 
140
		 * @author Aurélien Baudet
141
		 *
142
		 */
143
		public static class SegmentSizes {
144
			/**
145
			 * This is the maximum length of the original string (Java
146
			 * {@link String}) that can completely fit in only one segment.
147
			 */
148
			private final int maximumStringLengthToFitInASingleSegment;
149
			/**
150
			 * If the original string (Java {@link String}) can't completely fit
151
			 * in only one segment, then the string is split in several segments
152
			 * with this value as maximum size. Each resulting segment may
153
			 * contain a header or some control characters. This size only
154
			 * represents the maximum length of the payload.
155
			 */
156
			private final int maximumStringLengthPerSegment;
157
158
			/**
159
			 * Initializes with maximum segment sizes
160
			 * 
161
			 * @param maximumStringLengthToFitInASingleSegment
162
			 *            This is the maximum length of the original string
163
			 *            (Java {@link String}) that can completely fit in only
164
			 *            one segment.
165
			 * @param maximumStringLengthPerSegment
166
			 *            If the original string (Java {@link String}) can't
167
			 *            completely fit in only one segment, then the string is
168
			 *            split in several segments with this value as maximum
169
			 *            size. Each resulting segment may contain a header or
170
			 *            some control characters. This size only represents the
171
			 *            maximum length of the payload.
172
			 */
173
			public SegmentSizes(int maximumStringLengthToFitInASingleSegment, int maximumStringLengthPerSegment) {
174
				super();
175
				this.maximumStringLengthToFitInASingleSegment = maximumStringLengthToFitInASingleSegment;
176
				this.maximumStringLengthPerSegment = maximumStringLengthPerSegment;
177
			}
178
179
			/**
180
			 * Get the maximum string length that can fit in only one segment.
181
			 * 
182
			 * @return the maximum length of the Java {@link String} that can
183
			 *         fit in only one segment
184
			 */
185
			public int getMaximumStringLengthToFitInASingleSegment() {
186 5 1. getMaximumStringLengthToFitInASingleSegment : replaced int return with 0 for fr/sii/ogham/sms/SmsConstants$SmppSplitConstants$SegmentSizes::getMaximumStringLengthToFitInASingleSegment → NO_COVERAGE
2. getMaximumStringLengthToFitInASingleSegment : replaced int return with 0 for fr/sii/ogham/sms/SmsConstants$SmppSplitConstants$SegmentSizes::getMaximumStringLengthToFitInASingleSegment → TIMED_OUT
3. getMaximumStringLengthToFitInASingleSegment : replaced int return with 0 for fr/sii/ogham/sms/SmsConstants$SmppSplitConstants$SegmentSizes::getMaximumStringLengthToFitInASingleSegment → KILLED
4. getMaximumStringLengthToFitInASingleSegment : replaced int return with 0 for fr/sii/ogham/sms/SmsConstants$SmppSplitConstants$SegmentSizes::getMaximumStringLengthToFitInASingleSegment → KILLED
5. getMaximumStringLengthToFitInASingleSegment : replaced int return with 0 for fr/sii/ogham/sms/SmsConstants$SmppSplitConstants$SegmentSizes::getMaximumStringLengthToFitInASingleSegment → KILLED
				return maximumStringLengthToFitInASingleSegment;
187
			}
188
189
			/**
190
			 * Get the maximum string length for each segment.
191
			 * 
192
			 * If the original string (Java {@link String}) can't completely fit
193
			 * in only one segment, then the string is split in several segments
194
			 * with this value as maximum size. Each resulting segment may
195
			 * contain a header or some control characters. This size only
196
			 * represents the maximum length of the payload.
197
			 * 
198
			 * @return the maximum string length of Java {@link String} for each
199
			 *         segment
200
			 */
201
			public int getMaximumStringLengthPerSegment() {
202 1 1. getMaximumStringLengthPerSegment : replaced int return with 0 for fr/sii/ogham/sms/SmsConstants$SmppSplitConstants$SegmentSizes::getMaximumStringLengthPerSegment → NO_COVERAGE
				return maximumStringLengthPerSegment;
203
			}
204
		}
205
206
		private SmppSplitConstants() {
207
			super();
208
		}
209
	}
210
211
	private SmsConstants() {
212
		super();
213
	}
214
}

Mutations

186

1.1
Location : getMaximumStringLengthToFitInASingleSegment
Killed by : oghamall.it.sms.SmsSMPPGsm7bitTest.longMessage(oghamall.it.sms.SmsSMPPGsm7bitTest)
replaced int return with 0 for fr/sii/ogham/sms/SmsConstants$SmppSplitConstants$SegmentSizes::getMaximumStringLengthToFitInASingleSegment → KILLED

2.2
Location : getMaximumStringLengthToFitInASingleSegment
Killed by : none
replaced int return with 0 for fr/sii/ogham/sms/SmsConstants$SmppSplitConstants$SegmentSizes::getMaximumStringLengthToFitInASingleSegment → NO_COVERAGE

3.3
Location : getMaximumStringLengthToFitInASingleSegment
Killed by : oghamcore.it.sms.splitter.GsmMessageSplitterTest
replaced int return with 0 for fr/sii/ogham/sms/SmsConstants$SmppSplitConstants$SegmentSizes::getMaximumStringLengthToFitInASingleSegment → KILLED

4.4
Location : getMaximumStringLengthToFitInASingleSegment
Killed by : none
replaced int return with 0 for fr/sii/ogham/sms/SmsConstants$SmppSplitConstants$SegmentSizes::getMaximumStringLengthToFitInASingleSegment → TIMED_OUT

5.5
Location : getMaximumStringLengthToFitInASingleSegment
Killed by : oghamcloudhopper.it.CloudhopperSmppTest.simple(oghamcloudhopper.it.CloudhopperSmppTest)
replaced int return with 0 for fr/sii/ogham/sms/SmsConstants$SmppSplitConstants$SegmentSizes::getMaximumStringLengthToFitInASingleSegment → KILLED

202

1.1
Location : getMaximumStringLengthPerSegment
Killed by : none
replaced int return with 0 for fr/sii/ogham/sms/SmsConstants$SmppSplitConstants$SegmentSizes::getMaximumStringLengthPerSegment → NO_COVERAGE

Active mutators

Tests examined


Report generated by PIT OGHAM