hJdZddlZddlZddlmZddlmZmZmZmZm Z ddlm Z m Z m Z m Z mZmZddlmZmZddlmZmZmZmZddlmZmZmZdd lmZmZejeefZ Gd d Z!d ej"d e#fdZ$d ej"fdZ%GddZ&Gddej'Z(Gdde(Z)Gdde(Z*dS)z%Code related to SMS Encoding/DecodingN)bidict)Int8ubByteBitFlag BitsInteger)StructEnumTell BitStructthisPadding)Prefixed GreedyRange) BcdAdapterTonNpiBytes GreedyBytes)Hexstrh2bb2h) pdu_types operationsc eZdZedez dez deejz Zede ee ez de z Z gfdZ defdZdedefd Zed edejdeffd Zdefd Zd S)UserDataHeaderieilengthvalueiesdatac||_dSNr)selfrs 7/home/jenkins/workspace/simtester-sanitize/pySim/sms.py__init__zUserDataHeader.__init__(s returncd|jzS)NzUDH(%r)r#r$s r%__repr__zUserDataHeader.__repr__+s48##r'c8|jD]}|d|krdSdS)NrTFr#)r$ries r%has_iezUserDataHeader.has_ie.s3(  B%yCtt ur'inbct|trt|}|j|}||d|dfS)Nrr  isinstancestrr _constructparse)clsr/ress r% from_byteszUserDataHeader.from_bytes4sO c3   c((Cn""3''s3u:F ++r'cF|j|jddS)Nr')rr )r4buildrr*s r%to_byteszUserDataHeader.to_bytes;s"$$DHS%A%ABBBr'N)__name__ __module__ __qualname__r rrr rie_crrrr4r&r3r+intboolr. classmethod BytesOrHextypingTuplebytesr8r;r'r%rr!s) 6%,t{9K9K1K L LDhhv{{4/@/@AAA{*,,J$#$$$$ ,Z,FL9I59P,Q,,,[, C%CCCCCCr'rdcsr(cb|tjtjjtjjkrdS|tjtjjtjjkrdS|jtjjkr"|j dtj j krdSdS)z?Determine if the given SMPP data coding scheme is 8-bit or not.T msgCodingF) r DataCodingDataCodingSchemeDEFAULTDataCodingDefaultOCTET_UNSPECIFIEDOCTET_UNSPECIFIED_COMMONschemeGSM_MESSAGE_CLASS schemeDataDataCodingGsmMsgCoding DATA_8BITrHs r%smpp_dcs_is_8bitrW?s i"9#=#E#,#>#PRRRRt i"9#=#E#,#>#WYYYYt zY/AAAcnU`FaenfFfPGPGPtur'cBt|stddS)z5Assert if given SMPP data coding scheme is not 8-bit.z&We only support 8bit coded SMS for nowN)rW ValueErrorrVs r%ensure_smpp_is_8bitrZNs. C CABBBCCr'c PeZdZdZedez dez deee j dze j dzzz de z Z e ddd d d d d ddZe ddd dddddZddZdZededejdeffdZed dZdZdefdZdS)! AddressFieldz8Representation of an address field as used in SMS T-PDU.addr_len type_of_addrdigitstellunknown isdn_e164 data_x121 telex_f69 sc_specific6nationalprivateermes)UNKNOWNISDNDATATELEX LAND_MOBILENATIONALPRIVATEERMES internationalnetwork_specific short_code alphanumeric abbreviated)rj INTERNATIONALroNETWORK_SPECIFICSUBSCRIBER_NUMBER ALPHANUMERIC ABBREVIATEDc0||_||_||_dSr"tonnpir_)r$r_r~rs r%r&zAddressField.__init__ns r'c8d|jd|jd|jdS)NzAddressField(TON=z, NPI=z, )r}r*s r%__str__zAddressField.__str__ss#59XXXtxxxUUr'r/r(ct|trt|}|j|}|dd}|dd}||dd|d||||ddfS)zHConstruct an AddressField instance from the binary T-PDU address format.r^type_of_numbernumbering_plan_idr_Nr]rar1)r6r/r7r~rs r%r8zAddressField.from_bytesvs c3   c((Cn""3''.!"23.!"56s3x=!1#j/!12C==s3v;<  KK3 KK""&(%)X k  $$Q'''r'N)rbrb)r(r\)r<r=r>__doc__r rrrrr r]r r4rrrr&rrBrCrDrErFr8rrr;rGr'r%r\r\SsBB 6)&v- EE$-2BT]ST_2T,U,U!V!VVt %%J6%     L6(.)&$    L VVV QZ QFL9N,O Q Q Q[ Qsss[s ggg(%((((((r'r\ceZdZdZdZdS)SMS_TPDUzBase class for a SMS T-PDU.c |dd|_|dd|_|dd|_|dd|_|dd|_|dd|_|dd|_dS) Ntp_mtitp_rpFtp_udhitp_pidtp_dcstp_udltp_ud)getrrrrrrr)r$kwargss r%r&zSMS_TPDU.__init__sjj400 ZZ// zz)U33 jj400 jj400 jj400 ZZ.. r'N)r<r=r>rr&rGr'r%rrs)%%/////r'rc eZdZdZedez dez dez dez eddez dedz Zfd Z d Z e d e d dfd Z d efdZe ddZe ddZe ddZd ejfdZxZS) SMS_DELIVERzYRepresentation of a SMS-DELIVER T-PDU. This is the Network to MS/UE (downlink) direction.rrtp_sritp_mmsrr`c Rd|d<tjd i||dd|_|dd|_|dd|_|dd|_|dd|_dS) Nrrtp_lpFrtp_oatp_sctsrrG)superr&rrrrrrr$r __class__s r%r&zSMS_DELIVER.__init__sx""6"""ZZ// jj511 ZZ.. zz)T22 jj511 r'cd|jj|j|j|j|j|j|j|j|j |j |j |j |j f zS)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))rr<rrrrrrrrrrrrr*s r%r+zSMS_DELIVER.__repr__srvzwEwNPTP[]a]hjnjtvzv@BFBNPTP[]a]gimitvzvACGCOQUQ\^b^hvii ir'r/r(ct|trt|}tj|}t |dd\}}||d<d}|||d<|dz }|||d<|dz }|||dz|d<|dz }|||d <|dz }||d|d <|d i|S) zQConstruct a SMS_DELIVER instance from the binary encoded format as used in T-PDU.rNrrrrrrrrG)r2r3rrflags_constructr5r\r8)r6r/roa remainderoffsets r%r8zSMS_DELIVER.from_bytess c3   c((C  ' - -c 2 2$//ABB88 I' '( ! '( !  q1) ! '( ! vww'' sxxQxxr'c4t}|j|j|j|j|j|jd}tj |}| || |j | |j| |j| |j| |j| |j|S)zLEncode a SMS_DELIVER instance to the binary encoded format as used in T-PDU.)rrrrrr) bytearrayrrrrrrrrr:extendrr;appendrrrrrr$outbrflagss r%r;zSMS_DELIVER.to_bytess{{kT[4:ZDLDK  +11!44 E DJ''))*** DK    DK    DL!!! DK    DJ r'c|jtjjkr||St d|jz)zJConstruct a SMS_DELIVER instance from the deliver format used by smpp.pdu.Unsupported SMPP commandId %sidr CommandId submit_smfrom_smpp_submitrYr6smpp_pdus r%rzSMS_DELIVER.from_smppA ;)-7 7 7''11 1#PRR&y'='EyG]Ge4=4Q4d3eggg : 9(, (:(:(<(< %Ivvv(8 %Ivv# 4:4:.704 0326*>>> >r')r(r)rrr(r)r<r=r>rr rrrrr&r+rBrCr8rFr;rrrrPDUr __classcell__rs@r%rrsgcci ingdlHUYM ' HTM8KKPQNN;RTTO22222iiiZM[(%$LLL[L[,[(>>>>>>>>>r'rc eZdZdZedez dez dez deeddddd z d ez d edz Zfd Z dZ e de ddfdZ defdZe ddZe ddZdejfdZxZS)rzVRepresentation of a SMS-SUBMIT T-PDU. This is the MS/UE -> network (uplink) direction.tp_srrrrtp_vpfr`rr)nonerelativeenhancedabsolutetp_rdrc d|d<tjd i||dd|_|dd|_|dd|_|dd|_|d d|_|d d|_dS) NrrrFrrrtp_mrtp_datp_vprG) rr&rrrrrrrrs r%r&zSMS_SUBMIT.__init__2sx""6"""ZZ// jj622 jj511 ZZ.. ZZ.. ZZ.. r'cd|jj|j|j|j|j|j|j|j|j |j |j |j |j f zS)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))rr<rrrrrrrrrrrrr*s r%r+zSMS_SUBMIT.__repr__<sptxuCuLNRNY[_[egkgrtxt~@D@LNRNY[_[egkgrtxtAEAKMQMXZ^Zdtee er'r/r(cd}t|trt|}tj|}|dz }|||d<|dz }t |dd\}}||d<d}|||d<|dz }|||d<|dz }|d d krn~|d d kr|||dz|d <|dz }n\|d d kr|||dz|d <|dz }n:|d dkr|||dz|d <|dz }ntd|d z|||d<|dz }||d|d<|di|S)zPConstruct a SMS_SUBMIT instance from the binary encoded format as used in T-PDU.rrrr`NrrrrrrrrrrzInvalid VPF: %srrrG) r2r3rrrr5r\r8rY)r6r/rrdars r%r8zSMS_SUBMIT.from_bytes?s c3   c((C  & , ,S 1 1! K' ! $//ABB88 I' '( ! '( !  X;&  x[J & &"6&(?3AgJ aKFF x[J & &"6&(?3AgJ aKFF x[J & &"6&(?3AgJ aKFF.8<== ='( ! vww'' sxxQxxr'c~t}|j|j|j|j|j|jd}tj |}| || |j | |j | |j| |j|jdkr| |j| |j| |j|S)zKEncode a SMS_SUBMIT instance to the binary encoded format as used in T-PDU.)rrrrrrr)rrrrrrrrrr:rrrrr;rrrrrrs r%r;zSMS_SUBMIT.to_bytesfs{{kDJ$+ZDLDK  *0033 E DJ DJ''))*** DK    DK   ;& KK # # # DK    DJ r'c|jtjjkr||St d|jz)zAConstruct a SMS_SUBMIT instance from the format used by smpp.pdu.rrrs r%rzSMS_SUBMIT.from_smppyrr'c t|jdt|jd|jd|jd}|jd}|jdjdkrdnd d d t jj|jd jv|jd rdnd d ||jddd t||d }|di|S)zHConstruct a SMS_SUBMIT instance from the submit format used by smpp.pdu.rdestination_addr dest_addr_ton dest_addr_npirreplace_if_present_flagREPLACETFNrregistered_deliveryrrr) rrrrrrrrrrrrrG) rZrr\rrrrrrr)r6rrrrs r%rzSMS_SUBMIT.from_smpp_submits HOM:;;;&&x7I'J'/'G'/'GII0 &_-FGLPYYYTT_d 4G8?[fKgKss&o.CDOdd%om4%jj  sxxQxxr'ctjtjjtjj}tjtjj}|jrtj j }ntj j }|j dkrtdtjtjjtjj}|j\}}}t)jdtjjtjjd|||||jtjj||||jS)zKTranslate a SMS_SUBMIT instance to a smpp.pdu.operations.SubmitSM instance.rrsimcard) service_typerrrrrrrr priority_flagrrrr)rrrrMrRegisteredDeliveryRegisteredDeliveryReceipt"NO_SMSC_DELIVERY_RECEIPT_REQUESTEDrReplaceIfPresentFlagrDO_NOT_REPLACErrYrKrLrNrOrrrSubmitSMAddrTonrzAddrNpirjr PriorityFlagLEVEL_0r)r$rreg_delrepl_ifdcdaddrr~rs r%rzSMS_SUBMIT.to_smpps&y'='EyG]Geff .y/R/uvv : D4rr rr rrr&r+rBrCr8rFr;rrrrrrrs@r%rr-s]``i y~wt| (kk!nn1q[\gh)i)i)i i ' h{{1~~.EGGO/////eee$J$<$$$[$L%&LLL[L[4=========r'r)+rrDabcr constructrrrrrr r r r r rrrosmocom.constructrrrr osmocom.utilsrrrsmpp.pdurrUnionrFrCrrKrArWrZr\ABCrrrrGr'r%rsS++& ::::::::::::::BBBBBBBBBBBBBBBB++++++++DDDDDDDDDDDD****************** \&%- ( CCCCCCCC< ). 4    CY1CCCC G(G(G(G(G(G(G(G(T / / / / /sw / / />>>>>(>>>FL=L=L=L=L=L=L=L=L=L=r'