📄 smppclient.cs.svn-base
字号:
sendDeliverSmResp(sequence_number, StatusCodes.ESME_RUNKNOWNERR);
logMessage(LogLevels.LogExceptions, "decodeAndProcessDeliverSm returned UNKNOWNERR on 0x03");
return;
}
_esm_class = _body[++pos];
switch (_esm_class)
{
case 0x00:
break;
case 0x04:
logMessage(LogLevels.LogSteps, "Delivery Receipt Received");
isDeliveryReceipt = true;
break;
case 0x40:
logMessage(LogLevels.LogSteps, "UDHI Indicator set");
isUdhiSet = true;
break;
default:
logMessage(LogLevels.LogSteps | LogLevels.LogWarnings, "Unknown esm_class for DELIVER_SM : " + Tools.GetHexFromByte(_esm_class));
break;
}
pos += 1;
_priority_flag = _body[++pos];
pos += 4;
_data_coding = _body[++pos];
pos += 1;
_sm_length = _body[++pos];
pos += 1;
if (_sm_length > 0)
{
_short_message = new byte[_sm_length];
Array.Copy(_body, pos, _short_message, 0, _sm_length);
}
if ((isDeliveryReceipt) || (isUdhiSet))
{
int _par_tag, _par_tag_length;
bool exit = false;
if (_sm_length > 0)
{
pos += _sm_length;
}
while ((pos < _length) && (exit == false))
{
if (Tools.Get2ByteIntFromArray(_body, pos, _length, out _par_tag) == false)
{
exit = true;
break;
}
pos += 2;
if (Tools.Get2ByteIntFromArray(_body, pos, _length, out _par_tag_length) == false)
{
exit = true;
break;
}
pos += 2;
switch (_par_tag)
{
case 0x020C:
if (((pos + _par_tag_length - 1) <= _length) && (_par_tag_length == 2))
{
byte[] temp = new byte[_par_tag_length];
Array.Copy(_body, pos, temp, 0, _par_tag_length);
pos += _par_tag_length;
sar_msg_ref_num = BitConverter.ToInt16(temp, 0);
logMessage(LogLevels.LogSteps, "sar_msg_ref_num : " + sar_msg_ref_num);
}
else
exit = true;
break;
case 0x020E:
if ((pos <= _length) && (_par_tag_length == 1))
{
sar_total_segments = _body[pos];
logMessage(LogLevels.LogSteps, "sar_total_segments : " + Convert.ToString(sar_total_segments));
pos++;
}
else
exit = true;
break;
case 0x020F:
if ((pos <= _length) && (_par_tag_length == 1))
{
sar_segment_seqnum = _body[pos];
logMessage(LogLevels.LogSteps, "sar_segment_seqnum : " + Convert.ToString(sar_segment_seqnum));
pos++;
}
else
exit = true;
break;
case 0x0427:
if ((pos <= _length) && (_par_tag_length == 1))
{
_message_state = _body[pos];
logMessage(LogLevels.LogSteps, "Message state : " + Convert.ToString(_message_state));
pos++;
}
else
exit = true;
break;
case 0x001E:
if ((pos + _par_tag_length - 1) <= _length)
{
_receipted_message_id = new byte[_par_tag_length];
Array.Copy(_body, pos, _receipted_message_id, 0, _par_tag_length);
_receipted_message_id_len = Convert.ToByte(_par_tag_length);
pos += _par_tag_length;
logMessage(LogLevels.LogSteps, "Delivered message id : " + Tools.ConvertArrayToString(_receipted_message_id, _receipted_message_id_len - 1));
}
else
exit = true;
break;
default:
if ((pos + _par_tag_length - 1) <= _length)
pos += _par_tag_length;
else
exit = true;
logMessage(LogLevels.LogDebug, "_par_tag : " + Convert.ToString(_par_tag));
logMessage(LogLevels.LogDebug, "_par_tag_length : " + Convert.ToString(_par_tag_length));
break;
}
}
logMessage(LogLevels.LogDebug, "Delivery Receipt Processing Exit value - " + Convert.ToString(exit));
if (exit)
isDeliveryReceipt = false;
}
if ((sar_msg_ref_num > 0) && ((sar_total_segments > 0) && ((sar_segment_seqnum > 0) && (isUdhiSet))))
{
lock (sarMessages.SyncRoot)
{
SortedList tArr = new SortedList();
if (sarMessages.ContainsKey(sar_msg_ref_num))
{
tArr = (SortedList)sarMessages[sar_msg_ref_num];
if (tArr.ContainsKey(sar_segment_seqnum))
tArr[sar_segment_seqnum] = _short_message;
else
tArr.Add(sar_segment_seqnum, _short_message);
bool isFull = true;
byte i;
for (i = 1; i <= sar_total_segments; i++)
{
if (!tArr.ContainsKey(i))
{
isFull = false;
break;
}//if
}//for
if (!isFull)
{
sarMessages[sar_msg_ref_num] = tArr;
sendDeliverSmResp(sequence_number, StatusCodes.ESME_ROK);
return;
}
else
{
_sm_length = 0;
for (i = 1; i <= sar_total_segments; i++)
{
_sm_length += ((byte[])tArr[i]).Length;
}
_short_message = new byte[_sm_length + 100];
_sm_length = 0;
for (i = 1; i <= sar_total_segments; i++)
{
Array.Copy(((byte[])tArr[i]), 0, _short_message, _sm_length, ((byte[])tArr[i]).Length);
_sm_length += ((byte[])tArr[i]).Length;
}
sarMessages.Remove(sar_msg_ref_num);
}
}//if
else
{
tArr.Add(sar_segment_seqnum, _short_message);
sarMessages.Add(sar_msg_ref_num, tArr);
sendDeliverSmResp(sequence_number, StatusCodes.ESME_ROK);
return;
}
}//lock
}
string to;
string from;
string textString;
string hexString = "";
byte messageState = 0;
string receiptedMessageID = "";
to = Encoding.ASCII.GetString(_dest_addr, 0, daLength);
from = Encoding.ASCII.GetString(_source_addr, 0, saLength);
if (_data_coding == 8) //USC2
textString = Encoding.BigEndianUnicode.GetString(_short_message, 0, _sm_length);
else
textString = Encoding.UTF8.GetString(_short_message, 0, _sm_length);
hexString = Tools.ConvertArrayToHexString(_short_message, _sm_length);
if (isDeliveryReceipt)
{
isDeliveryReceipt = true;
messageState = _message_state;
receiptedMessageID = Encoding.ASCII.GetString(_receipted_message_id, 0, _receipted_message_id_len - 1); ;
}
DeliverSmEventArgs evArg = new DeliverSmEventArgs(sequence_number, to, from, textString, hexString, _data_coding, _esm_class, isDeliveryReceipt, messageState, receiptedMessageID);
processDeliverSm(evArg);
}
catch (Exception ex)
{
logMessage(LogLevels.LogExceptions, "decodeAndProcessDeliverSm | " + ex.ToString());
sendDeliverSmResp(sequence_number, StatusCodes.ESME_RUNKNOWNERR);
}
}//decodeAndProcessDeliverSm
private void decodeAndProcessDataSm(int sequence_number, byte[] _body, int _length)
{
if (_length < 17)
{
sendDeliverSmResp(sequence_number, StatusCodes.ESME_RINVCMDLEN);
return;
}
try
{
bool isDeliveryReceipt = false;
byte _source_addr_ton, _source_addr_npi, _dest_addr_ton, _dest_addr_npi;
byte _priority_flag, _data_coding, _esm_class;
byte[] _source_addr = new byte[21];
byte[] _dest_addr = new byte[21];
byte saLength, daLength;
byte[] _short_message = new byte[254];
int pos;
/////////////////////////////////////
/// Message Delivery Params
///
byte[] _receipted_message_id = new byte[254];
byte _receipted_message_id_len = 0;
byte _message_state = 0;
pos = 0;
while ((pos < 5) && (_body[pos] != 0x00))
pos++;
if (_body[pos] != 0x00)
{
sendDeliverSmResp(sequence_number, StatusCodes.ESME_RUNKNOWNERR);
logMessage(LogLevels.LogExceptions, "decodeAndProcessDeliverSm returned UNKNOWNERR on 0x04");
return;
}
_source_addr_ton = _body[++pos];
_source_addr_npi = _body[++pos];
pos++;
saLength = 0;
while ((saLength < 20) && (_body[pos] != 0x00))
{
_source_addr[saLength] = _body[pos];
pos++;
saLength++;
}
if (_body[pos] != 0x00)
{
sendDeliverSmResp(sequence_number, StatusCodes.ESME_RUNKNOWNERR);
logMessage(LogLevels.LogExceptions, "decodeAndProcessDeliverSm returned UNKNOWNERR on 0x05");
return;
}
_dest_addr_ton = _body[++pos];
_dest_addr_npi = _body[++pos];
pos++;
daLength = 0;
while ((daLength < 20) && (_body[pos] != 0x00))
{
_dest_addr[daLength] = _body[pos];
pos++;
daLength++;
}
if (_body[pos] != 0x00)
{
sendDeliverSmResp(sequence_number, StatusCodes.ESME_RUNKNOWNERR);
logMessage(LogLevels.LogExceptions, "decodeAndProcessDeliverSm returned UNKNOWNERR on 0x06");
return;
}
_esm_class = _body[++pos];
switch (_esm_class)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -