
    diJ                        d Z ddlZddlZddlmZ ddlmZmZmZmZm	Z	 ddlm
Z
mZmZmZmZmZ ddlmZmZ ddlmZmZmZmZ ddlmZmZmZ dd	lmZmZ ej        eef         Z  G d
 d          Z!dej"        de#fdZ$dej"        fdZ% G d d          Z& G d dej'                  Z( G d de(          Z) G d de(          Z*dS )z%Code related to SMS Encoding/Decoding    N)bidict)Int8ubByteBitFlagBitsInteger)StructEnumTell	BitStructthisPadding)PrefixedGreedyRange)
BcdAdapterTonNpiBytesGreedyBytes)Hexstrh2bb2h)	pdu_types
operationsc            	          e Zd Z edez  dez  d eej                  z            Z ed e	e e
e                    z  dez            Zg fdZdefdZdedefd	Zed
edej        d ef         fd            ZdefdZdS )UserDataHeaderieilengthvalueiesdatac                     || _         d S Nr   )selfr   s     7/home/jenkins/workspace/simtester-sanitize/pySim/sms.py__init__zUserDataHeader.__init__(   s        returnc                     d| j         z  S )NzUDH(%r)r#   r$   s    r%   __repr__zUserDataHeader.__repr__+   s    48##r'   c                 8    | j         D ]}|d         |k    r dS dS )Nr   TFr#   )r$   r   ies      r%   has_iezUserDataHeader.has_ie.   s3    ( 	 	B%yCtt  ur'   inbc                     t          |t                    rt          |          }| j                            |          } | |d                   |d         fS )Nr   r    
isinstancestrr   
_constructparse)clsr/   ress      r%   
from_byteszUserDataHeader.from_bytes4   sO    c3 	c((Cn""3''s3u:F++r'   c                 F    | j                             | j        dd          S )Nr'   )r   r    )r4   buildr   r*   s    r%   to_byteszUserDataHeader.to_bytes;   s"    $$DHS%A%ABBBr'   N)__name__
__module____qualname__r	   r   r   r   r   ie_cr   r   r   r4   r&   r3   r+   intboolr.   classmethod
BytesOrHextypingTuplebytesr8   r;    r'   r%   r   r   !   s)       6%,t{9K9K1KLLDhhv{{4/@/@AAA{*, ,J     $# $ $ $ $      ,Z ,FL9I59P,Q , , , [,C% C C C C C Cr'   r   dcsr(   c                 b   | t          j        t           j        j        t           j        j                  k    rdS | t          j        t           j        j        t           j        j                  k    rdS | j        t           j        j        k    r"| j	        d         t           j
        j        k    rdS dS )z?Determine if the given SMPP data coding scheme is 8-bit or not.T	msgCodingF)r   
DataCodingDataCodingSchemeDEFAULTDataCodingDefaultOCTET_UNSPECIFIEDOCTET_UNSPECIFIED_COMMONschemeGSM_MESSAGE_CLASS
schemeDataDataCodingGsmMsgCoding	DATA_8BITrH   s    r%   smpp_dcs_is_8bitrW   ?   s    
i"9#=#E#,#>#PR R R Rt
i"9#=#E#,#>#WY Y Y Yt zY/AAAcnU`Faen  fF  fP  GP  GPtur'   c                 B    t          |           st          d          dS )z5Assert if given SMPP data coding scheme is not 8-bit.z&We only support 8bit coded SMS for nowN)rW   
ValueErrorrV   s    r%   ensure_smpp_is_8bitrZ   N   s.    C   CABBBC Cr'   c                   P   e Zd ZdZ edez  dez  d e ee	j
        dz  e	j
        dz  z                       z  dez            Z eddd	d
ddddd          Z edddddddd          ZddZd Zededej        d ef         fd            Zed d            Zd ZdefdZdS )!AddressFieldz8Representation of an address field as used in SMS T-PDU.addr_lentype_of_addrdigits   tellunknown	isdn_e164	data_x121	telex_f69sc_specific6nationalprivateermes)UNKNOWNISDNDATATELEXLAND_MOBILENATIONALPRIVATEERMESinternationalnetwork_specific
short_codealphanumericabbreviated)rj   INTERNATIONALro   NETWORK_SPECIFICSUBSCRIBER_NUMBERALPHANUMERICABBREVIATEDc                 0    || _         || _        || _        d S r"   tonnpir_   )r$   r_   r~   r   s       r%   r&   zAddressField.__init__n   s    r'   c                 8    d| j         d| j        d| j        dS )NzAddressField(TON=z, NPI=z, )r}   r*   s    r%   __str__zAddressField.__str__s   s#     59XXXtxxxUUr'   r/   r(   c                    t          |t                    rt          |          }| j                            |          }|d         d         }|d         d         } | |d         d|d                  ||          ||d         d         fS )zHConstruct an AddressField instance from the binary T-PDU address format.r^   type_of_numbernumbering_plan_idr_   Nr]   ra   r1   )r6   r/   r7   r~   r   s        r%   r8   zAddressField.from_bytesv   s     c3 	c((Cn""3''.!"23.!"56s3x=!1#j/!12C==s3v;<<?PPPr'   c                      | |                     d          t          j        |j                 t          j        |j                           S )zTConstruct an AddressField from {source,dest}_addr_{,ton,npi} attributes of smpp.pdu.ascii)decoder\   smpp_map_tonnamesmpp_map_npi)r6   addrr~   r   s       r%   	from_smppzAddressField.from_smpp   s:     s4;;w'')B38)LlNghkhpNqrrrr'   c                 j    | j         | j        j        | j                 | j        j        | j                 fS )zQReturn smpp.pdo.*.source,dest}_addr_{,ton,npi} attributes for given AddressField.)r_   r   inverser~   r   r   r*   s    r%   to_smppzAddressField.to_smpp   s-    T.6tx@$BSB[\`\dBeffr'   c                     t          | j                  }|dz  r| xj        dz  c_        |d| j        | j        d| j        d}| j                            |          S )zHEncode the AddressField into the binary representation as used in T-PDU.r`   fT)extr   r   )r]   r^   r_   )lenr_   r~   r   r4   r:   )r$   
num_digitsds      r%   r;   zAddressField.to_bytes   sr    %%
> 	KK3KK""&(%)X 
 k  $$Q'''r'   N)rb   rb   )r(   r\   )r<   r=   r>   __doc__r	   r   r   r   r   r   r]   r   r4   r   r   r   r&   r   rB   rC   rD   rE   rF   r8   r   r   r;   rG   r'   r%   r\   r\   S   s       BB
6)&v- EE$-2BT]ST_2T,U,U!V!VVt% %J 6%	
 	
 	 	L 6(.)&$
 
  L   
V V V 	QZ 	QFL9N,O 	Q 	Q 	Q [	Q s s s [s
g g g(% ( ( ( ( ( (r'   r\   c                       e Zd ZdZd ZdS )SMS_TPDUzBase class for a SMS T-PDU.c                    |                     dd           | _        |                     dd          | _        |                     dd          | _        |                     dd           | _        |                     dd           | _        |                     dd           | _        |                     dd           | _        d S )	Ntp_mtitp_rpFtp_udhitp_pidtp_dcstp_udltp_ud)getr   r   r   r   r   r   r   )r$   kwargss     r%   r&   zSMS_TPDU.__init__   s    jj400ZZ//
zz)U33jj400jj400jj400ZZ..


r'   N)r<   r=   r>   r   r&   rG   r'   r%   r   r      s)        %%/ / / / /r'   r   c                       e Zd ZdZ edez  dez  dez  dez   ed          dez  d ed          z            Z fd	Z	d
 Z
ededd fd            ZdefdZedd            Zedd            Zedd            Zdej        fdZ xZS )SMS_DELIVERzYRepresentation of a SMS-DELIVER T-PDU. This is the Network to MS/UE (downlink) direction.r   r   tp_sri   tp_mmsr   r`   c                 R   d|d<    t                      j        d	i | |                    dd          | _        |                    dd          | _        |                    dd           | _        |                    dd           | _        |                    dd          | _        d S )
Nr   r   tp_lpFr   tp_oatp_sctsr   rG   )superr&   r   r   r   r   r   r   r$   r   	__class__s     r%   r&   zSMS_DELIVER.__init__   s    x""6"""ZZ//
jj511ZZ..
zz)T22jj511r'   c                     d| j         j        | j        | j        | j        | j        | j        | j        | j        | j	        | j
        | j        | j        | j        fz  S )Nza%s(MTI=%s, MMS=%s, LP=%s, RP=%s, UDHI=%s, SRI=%s, OA=%s, PID=%2x, DCS=%x, SCTS=%s, UDL=%u, UD=%s))r   r<   r   r   r   r   r   r   r   r   r   r   r   r   r*   s    r%   r+   zSMS_DELIVER.__repr__   s    rvz  wE  wN  PT  P[  ]a  ]h  jn  jt  vz  v@  BF  BN  PT  P[  ]a  ]g  im  it  vz  vA  CG  CO  QU  Q\  ^b  ^h  vi  i  	ir'   r/   r(   c                    t          |t                    rt          |          }t          j                            |          }t                              |dd                   \  }}||d<   d}||         |d<   |dz  }||         |d<   |dz  }|||dz            |d<   |dz  }||         |d	<   |dz  }||d         |d
<    | di |S )zQConstruct a SMS_DELIVER instance from the binary encoded format as used in T-PDU.r   Nr   r   r   r      r   r   r   rG   )r2   r3   r   r   flags_constructr5   r\   r8   )r6   r/   r   oa	remainderoffsets         r%   r8   zSMS_DELIVER.from_bytes   s     c3 	c((C'--c22$//ABB88I'
'(!'(! q1)!'(!vww''
sxxQxxr'   c                 4   t                      }| j        | j        | j        | j        | j        | j        d}t          j        	                    |          }|
                    |           |
                    | j                                                   |                    | j                   |                    | j                   |
                    | j                   |                    | j                   |
                    | j                   |S )zLEncode a SMS_DELIVER instance to the binary encoded format as used in T-PDU.)r   r   r   r   r   r   )	bytearrayr   r   r   r   r   r   r   r   r:   extendr   r;   appendr   r   r   r   r   r$   outbr   flagss       r%   r;   zSMS_DELIVER.to_bytes   s    {{kT[4:ZDLDK  +11!44EDJ''))***DK   DK   DL!!!DK   DJr'   c                     |j         t          j        j        k    r|                     |          S t          d|j         z            )zJConstruct a SMS_DELIVER instance from the deliver format used by smpp.pdu.Unsupported SMPP commandId %sidr   	CommandId	submit_smfrom_smpp_submitrY   r6   smpp_pdus     r%   r   zSMS_DELIVER.from_smpp   A     ;)-777''111<x{JKKKr'   c                    t          |j        d                    t                              |j        d         |j        d         |j        d                   }|j        d         }dd|t	          d          ddt
          j        j        |j        d         j        v |j        d	         d
t          |          |d} | di |S )zIConstruct a SMS_DELIVER instance from the submit format used by smpp.pdu.data_codingsource_addrsource_addr_tonsource_addr_npishort_messageF22705200000000	esm_classprotocol_id   )r   r   r   r   r   r   r   r   r   r   r   rG   )
rZ   paramsr\   r   r   r   EsmClassGsmFeaturesUDHI_INDICATOR_SETgsmFeaturesr   )r6   r   r   r   r   s        r%   r   zSMS_DELIVER.from_smpp_submit   s     	HOM:;;;&&x}'E&.o6G&H&.o6G&HJ J 0+,, 4G8?[fKgKssom4%jj  sxxQxxr'   submit
SMS_SUBMITc                     |j         |j        |j        |j        |j        |j        |j        dddt          d          dd} | di |S )z<Construct a SMS_DELIVER instance from a SMS_SUBMIT instance.FNr   )r   r   r   r   r   r   r   r   r   r   r   r   rG   )r   r   r   r   r   r   r   r   )r6   r   r   s      r%   from_submitzSMS_DELIVER.from_submit   s^    
 m\~mmm\+,,   sxxQxxr'   c           	         | j         dk    rt          d          t          j        t          j        j        t          j        j                  }t          j        t          j	        j        t          j
        j        t          j        j        g          }| j        r| j                                        \  }}}nd\  }}}t          j        ||||| j        || j                  S )zMTranslate a SMS_DELIVER instance to a smpp.pdu.operations.DeliverSM instance.r   1Unsupported DCS: We only support DCS=0xF6 for now)r   )NNN)r   r   r   r   r   r   r   )r   rY   r   rK   rL   rM   rN   rO   EsmClassEsmClassModeEsmClassTyper   r   r   r   r   	DeliverSMr   r   )r$   rH   r   	oa_digitsoa_tonoa_npis         r%   r   zSMS_DELIVER.to_smpp  s     ;$PQQQ"9#=#E#,#>#PR R&y'='EyG]Ge4=4Q4d3eg g g	: 	9(,
(:(:(<(<%Ivvv(8%Ivv#	4:4:.7040326*> > > 	>r'   )r(   r   )r   r   r(   r   )r<   r=   r>   r   r   r   r   r   r   r&   r+   rB   rC   r8   rF   r;   r   r   r   r   PDUr   __classcell__r   s   @r%   r   r      sg       cciingdlHUYM '

HTM8KKPQNN;RT TO2 2 2 2 2i i i Z M    [(%    $ L L L [L    [,    [(> > > > > > > > >r'   r   c                       e Zd ZdZ edez  dez  dez  d e ed          dddd	
          z  dez  d ed          z            Z fdZ	d Z
ededd fd            ZdefdZedd            Zedd            Zdej        fdZ xZS )r   zVRepresentation of a SMS-SUBMIT T-PDU. This is the MS/UE -> network (uplink) direction.tp_srrr   r   tp_vpfr`   r   r      )nonerelativeenhancedabsolutetp_rdr   c                    d|d<    t                      j        di | |                    dd          | _        |                    dd          | _        |                    dd          | _        |                    dd           | _        |                    d	d           | _        |                    d
d           | _        d S )Nr   r   r   Fr   r   r   tp_mrtp_datp_vprG   )	r   r&   r   r   r   r   r   r   r   r   s     r%   r&   zSMS_SUBMIT.__init__2  s    x""6"""ZZ//
jj622jj511ZZ..
ZZ..
ZZ..


r'   c                     d| j         j        | j        | j        | j        | j        | j        | j        | j        | j	        | j
        | j        | j        | j        fz  S )Nz_%s(MTI=%s, RD=%s, VPF=%u, RP=%s, UDHI=%s, SRR=%s, DA=%s, PID=%2x, DCS=%x, VP=%s, UDL=%u, UD=%s))r   r<   r   r   r   r   r   r   r   r   r   r   r   r   r*   s    r%   r+   zSMS_SUBMIT.__repr__<  s    ptx  uC  uL  NR  NY  [_  [e  gk  gr  tx  t~  @D  @L  NR  NY  [_  [e  gk  gr  tx  t  AE  AK  MQ  MX  Z^  Zd  te  e  	er'   r/   r(   c                    d}t          |t                    rt          |          }t          j                            |          }|dz  }||         |d<   |dz  }t                              |dd                   \  }}||d<   d}||         |d<   |dz  }||         |d<   |dz  }|d	         d
k    rn~|d	         dk    r|||dz            |d<   |dz  }n\|d	         dk    r|||dz            |d<   |dz  }n:|d	         dk    r|||dz            |d<   |dz  }nt          d|d	         z            ||         |d<   |dz  }||d         |d<    | di |S )zPConstruct a SMS_SUBMIT instance from the binary encoded format as used in T-PDU.r   r   r   r`   Nr   r   r   r   r   r   r   r   r   r   zInvalid VPF: %sr   r   rG   )	r2   r3   r   r   r   r5   r\   r8   rY   )r6   r/   r   r   dar   s         r%   r8   zSMS_SUBMIT.from_bytes?  s    c3 	c((C&,,S11!K'
!$//ABB88I'
'(!'(!X;&  x[J&&"6&(?3AgJaKFFx[J&&"6&(?3AgJaKFFx[J&&"6&(?3AgJaKFF.8<==='(!vww''
sxxQxxr'   c                 ~   t                      }| j        | j        | j        | j        | j        | j        d}t          j        	                    |          }|
                    |           |                    | j                   |
                    | j                                                   |                    | j                   |                    | j                   | j        dk    r|
                    | j                   |                    | j                   |
                    | j                   |S )zKEncode a SMS_SUBMIT instance to the binary encoded format as used in T-PDU.)r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r:   r   r   r   r   r;   r   r   r   r   r   r   s       r%   r;   zSMS_SUBMIT.to_bytesf  s   {{kDJ$+ZDLDK  *0033EDJDJ''))***DK   DK   ;&  KK
###DK   DJr'   c                     |j         t          j        j        k    r|                     |          S t          d|j         z            )zAConstruct a SMS_SUBMIT instance from the format used by smpp.pdu.r   r   r   s     r%   r   zSMS_SUBMIT.from_smppy  r   r'   c                    t          |j        d                    t                              |j        d         |j        d         |j        d                   }|j        d         }|j        d         j        dk    rdnd	d
d	t
          j        j        |j        d         j        v |j        d         rdnd	d||j        d         dd
t          |          |d} | di |S )zHConstruct a SMS_SUBMIT instance from the submit format used by smpp.pdu.r   destination_addrdest_addr_tondest_addr_npir   replace_if_present_flagREPLACETFNr   registered_deliveryr   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   rG   )
rZ   r   r\   r   r   r   r   r   r   r   )r6   r   r   r   r   s        r%   r   zSMS_SUBMIT.from_smpp_submit  s     	HOM:;;;&&x7I'J'/'G'/'GI I 0
 &_-FGLPYYYTT_d 4G8?[fKgKss&o.CDOdd%om4%jj  sxxQxxr'   c                    t          j        t           j        j        t           j        j                  }t          j        t           j        j                  }| j        rt           j	        j
        }nt           j	        j        }| j        dk    rt          d          t          j        t           j        j        t           j        j                  }| j                                        \  }}}t)          j        dt           j        j        t           j        j        d||||| j        t           j        j        |||| j                  S )zKTranslate a SMS_SUBMIT instance to a smpp.pdu.operations.SubmitSM instance.r   r    simcard)service_typer   r   r   r   r   r   r   r   priority_flagr   r   r   r   )r   r   r   rM   r   RegisteredDeliveryRegisteredDeliveryReceipt"NO_SMSC_DELIVERY_RECEIPT_REQUESTEDr   ReplaceIfPresentFlagr   DO_NOT_REPLACEr   rY   rK   rL   rN   rO   r   r   r   SubmitSMAddrTonrz   AddrNpirj   r   PriorityFlagLEVEL_0r   )r$   r   reg_delrepl_ifdcdaddrr~   r   s           r%   r   zSMS_SUBMIT.to_smpp  s   &y'='EyG]Geff	.y/R/uvv: 	D4<GG4CG;$PQQQ!)"<"DiFaFstt J..00S"3<3D3Q3<3D3L/8141449-6/3{1:1G1O 8?;B/115!= = = 	=r'   )r(   r   )r<   r=   r>   r   r   r   r
   r   r   r&   r+   rB   rC   r8   rF   r;   r   r   r   r   r   r   r   s   @r%   r   r   -  s]       ``iy~wt| (kk!nn1q[\gh)i)i)i i 'h{{1~~.EG GO/ / / / /e e e $J $< $ $ $ [$L%    & L L L [L    [4= = = = = = = = =r'   r   )+r   rD   abcr   	constructr   r   r   r   r   r	   r
   r   r   r   r   r   r   osmocom.constructr   r   r   r   osmocom.utilsr   r   r   smpp.pdur   r   UnionrF   rC   r   rK   rA   rW   rZ   r\   ABCr   r   r   rG   r'   r%   <module>r     sS   + +&  



       : : : : : : : : : : : : : : B B B B B B B B B B B B B B B B + + + + + + + + D D D D D D D D D D D D * * * * * * * * * * * * * * * * * *\&%-(
C C C C C C C C<). 4    CY1 C C C C
G( G( G( G( G( G( G( G(T	/ 	/ 	/ 	/ 	/sw 	/ 	/ 	/> > > > >( > > >FL= L= L= L= L= L= L= L= L= L=r'   