
    zh                        d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	 ddl
mZmZmZmZmZmZmZ ddlmZ ddlmZmZmZmZ dd	lmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% dd
l&m'Z' ddl(m)Z) ddl*m+Z+m,Z, ddl-m.Z. ddl/m0Z0 dZ1 edd          Z2 e	dd          Z3 e	dd          Z4d Z5 G d d          Z6 G d de)          Z7 G d de7          Z8 G d de7          Z9dS )aK  
Copyright 2009-2010 Mozes, Inc.

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either expressed or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
    )BytesION)Enum)
namedtuple)GenericNackgetPDUClassEnquireLinkBindTransmitterBindTransceiverBindReceiverUnbind)
PDUEncoder)
PDURequestPDUResponsePDUDataRequestCommandStatus)"SMPPClientConnectionCorruptedErrorPDUCorruptErrorPDUParseErrorSMPPClientSessionStateErrorSessionStateErrorSMPPProtocolErrorSMPPClientError	SMPPErrorSMPPGenericNackTransactionErrorSMPPTransactionErrorSMPPRequestTimoutErrorSMPPSessionInitTimoutError)command_status_name_map)Protocol)deferreactor)inlineCallbacks)errorzsmpp.twisted.protocolSMPPSessionStateszNONE, OPEN, BIND_TX_PENDING, BOUND_TX, BIND_RX_PENDING, BOUND_RX, BIND_TRX_PENDING, BOUND_TRX, UNBIND_PENDING, UNBIND_RECEIVED, UNBOUNDSMPPOutboundTxnzrequest, timer, ackDeferredSMPPOutboundTxnResultzsmpp, request, responsec                 N    	 t          j        |           S # t          $ r Y dS w xY w)Nz=Couldn't log out the pdu content due to non-ascii characters.)binasciib2a_hexUnicodeEncodeError)contents    e/home/jenkins/workspace/simtester-sanitize/venv/lib/python3.11/site-packages/smpp/twisted/protocol.py_safelylogOutPdur-   @   sA    O((( O O ONNNOs    
$$c                       e Zd Zd ZdS )DataHandlerResponsec                 "    || _         || _        d S N)statusparams)selfr2   r3   s      r,   __init__zDataHandlerResponse.__init__I   s        N)__name__
__module____qualname__r5    r6   r,   r/   r/   G   s#            r6   r/   c                      e Zd ZdZdZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zej        fdZd Zd Zd Zd Zd Zd Zd Zd Zej        fdZd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d  Z%d! Z&d" Z'd# Z(d$ Z)d% Z*d& Z+d' Z,d( Z-d) Z.d* Z/d+ Z0d, Z1d- Z2d. Z3d/ Z4d0 Z5d1 Z6d2 Z7d3 Z8d4 Z9d5 Z:d6 Z;d7 Z<d8 Z=d9 Z>d: Z?d; Z@d< ZAd= ZBd> ZCd? ZDd@S )ASMPPProtocolBasezCShort Message Peer to Peer Protocol v3.4 implementing ESME (client)4   c                 h   d| _         d| _        d | _        d | _        d | _        d | _        d| _        i | _        i | _        t          j
        | _        t                      | _        t          j                    | _        t"          j        | _        d | _        t)          j        t,                    | _        d S )Nr6   Fr   )
recvBufferconnectionCorruptedpduReadTimerenquireLinkTimerinactivityTimerdataRequestHandler
lastSeqNuminTxnsoutTxnsr$   NONEsessionStater   encoderr    DeferreddisconnectedDeferredr!   	callLaterportlogging	getLoggerLOG_CATEGORYlogr4   s    r,   r5   zSMPPProtocolBase.__init__R   s    #(   $#"&-2!||$)N$4$4! !*	$\22r6   c                 4    | j                                         S r1   )factory	getConfigrS   s    r,   configzSMPPProtocolBase.confige   s    |%%'''r6   c                 8   t          j        |            | j                                        j        | _        |                                  t          j        | _        | j	        
                    d| j                                        j        | j                   dS )z$When TCP connection is made
        z.SMPP connection established from %s to port %sN)r   connectionMade	transportgetHostrN   activateInactivityTimerr$   OPENrI   rR   warninggetPeerhostrS   s    r,   rY   zSMPPProtocolBase.connectionMadei   s     	%%%N**,,1	$$&&&-2I4>KaKaKcKcKhjnjstttttr6   c                 R   t          j        | |           | j                            d| j                                        j        | j        |           t          j	        | _
        |                                  |                                  | j                            d            d S )Nz%SMPP %s disconnected from port %s: %s)r   connectionLostrR   r^   rZ   r_   r`   rN   r$   rH   rI   cancelEnquireLinkTimercancelInactivityTimerrL   callbackr4   reasons     r,   rb   zSMPPProtocolBase.connectionLosts   s    f---@$.BXBXBZBZB_aeajlrsss-2##%%%""$$$!**400000r6   c                    | j                             t          j                  r*| j                             dt          |          z             | j        |z   | _        	 | j        rdS |                                 }|n*| 	                                 | 
                    |           Jt          | j                  dk    r|                                  dS dS )zb Looks for a full PDU (protocol data unit) and passes it from
        rawMessageReceived.
        zReceived data [%s]TNr   )rR   isEnabledForrO   DEBUGdebugr-   r?   r@   readMessage
endPDUReadrawMessageReceivedlenincompletePDURead)r4   datamsgs      r,   dataReceivedzSMPPProtocolBase.dataReceived~   s     8  // 	JHNN/2B42H2HHIII/D0	)' ""$$C{OO##C(((	) t!##""$$$$$ $#r6   c                     | j         r| j                                         rd S |                     |                                 j        | j                  | _         d S r1   )rA   activerM   rW   pduReadTimerSecsonPDUReadTimeoutrS   s    r,   rp   z"SMPPProtocolBase.incompletePDURead   sR     	!2!9!9!;!; 	F NN4;;==+I4K`aar6   c                     | j         r4| j                                         r| j                                          d S d S d S r1   )rA   ru   cancelrS   s    r,   rm   zSMPPProtocolBase.endPDURead   sR     	'!2!9!9!;!; 	'$$&&&&&	' 	' 	' 	'r6   c                 \    |                                  }|d S |                     |          S r1   )getMessageLength
getMessage)r4   pduLens     r,   rl   zSMPPProtocolBase.readMessage   s/    &&((>4v&&&r6   c                     t          | j                  dk     rd S t          j        d| j        d d                   d         S )N   z!Lr   )ro   r?   structunpackrS   s    r,   r{   z!SMPPProtocolBase.getMessageLength   s>    t!##4}T4?2A2#677::r6   c                     t          | j                  |k     rd S | j        d |         }| j        |d          | _        |S r1   )ro   r?   )r4   r}   messages      r,   r|   zSMPPProtocolBase.getMessage   sC    t&((4/'6'*/&''2r6   c                 t    |                      t          |                     |                                  d S Nr2   )sendPDUr   onCorruptConnection)r4   r2   s     r,   corruptDataRecvdz!SMPPProtocolBase.corruptDataRecvd   s7    [///000  """""r6   c                     | j                             d           d| _        |                     t	                                 |                                  dS )a'   Once the connection is corrupt, the PDU boundaries are lost and it's impossible to
            continue processing messages.
                - Set a flag to indicate corrupt connection
                    - no more parse attempts should be made for inbound data
                    - no more outbound requests should be attempted (they should errback immediately)
                - Cancel outstanding outbound requests (which have not yet been ack'ed)
                    (removed from the list and errback called)
                - Shutdown
        z)Connection is corrupt!!! Shutting down...TN)rR   criticalr@   cancelOutboundTransactionsr   shutdownrS   s    r,   r   z$SMPPProtocolBase.onCorruptConnection   sO     	EFFF#' ''(J(L(LMMMr6   c                     	 | j                             t          |d | j         j                                     S #  i cY S xY wr1   )rJ   decodeHeaderr   
HEADER_LEN)r4   r   s     r,   	getHeaderzSMPPProtocolBase.getHeader   sG    	<,,WW=Udl>U=U5V-W-WXXX	IIIs	   8; Ac                 b    | j                             d           |                                  d S )Nz4PDU read timed out. Buffer is now considered corrupt)rR   r   r   rS   s    r,   rw   z!SMPPProtocolBase.onPDUReadTimeout   s1    PQQQr6   c                    d}	 | j                             t          |                    }|                     |           dS # t          $ rj}| j                            |           | j                            dt          |          z             | 	                    |j
                   Y d}~dS d}~wt          $ r}| j                            |           | j                            dt          |          z             |                     |          }|                    dd          }|                    dd          }|                     t          |                              ||j
                             Y d}~dS d}~ww xY w)zCalled once a PDU (protocol data unit) boundary is identified.

        Creates an SMPP PDU class from the data and calls PDUReceived dispatcher
        NzReceived corrupt PDU %sr   zReceived unparsable PDU %ssequence_number
command_id)seqNumr2   )rJ   decoder   PDUReceivedr   rR   	exceptionr   r-   r   r2   r   r   getr   r   
requireAck)r4   r   pdueheaderr   	commandIds          r,   rn   z#SMPPProtocolBase.rawMessageReceived   s   
 	",%%gg&6&677C S!!!!!  	3 	3 	3Hq!!!H7:J7:S:SSTTT!!!222222222 	\ 	\ 	\Hq!!!H:=Mg=V=VVWWW^^G,,FZZ 1488F

<66ILLY//::&QRQY:ZZ[[[[[[[[[	\s%   'A 
F
AB11F
>CFF
c                 |   | j                             t          j                  r| j                             d|z             | j                            |          }| j                             t          j                  r*| j                             dt          |          z             |                                  t          |t                    r|                     |           dS t          |t                    r|                     |           dS  t          | d|j        j        z            |           dS )!Dispatches incoming PDUs
        zReceived PDU: %szReceiving data [%s]zonPDU_%sN)rR   ri   rO   rj   rk   rJ   encoder-   onSMPPOperation
isinstancer   PDURequestReceivedr   PDUResponseReceivedgetattridnamer4   r   encodeds      r,   r   zSMPPProtocolBase.PDUReceived   s     8  // 	5HNN-3444,%%c**8  // 	NHNN03CG3L3LLMMM 	c:&& 	9##C((((([)) 	9$$S)))))3GD*sv{233C88888r6   c                     t          |t                    r|                     |           dS  t          | d|j        j        z            |           dS )z%Handle incoming request PDUs
        NzonPDURequest_%s)r   r   PDUDataRequestReceivedr   r   r   r4   reqPDUs     r,   r   z#SMPPProtocolBase.PDURequestReceived   sY     fn-- 	''///F9'&).899&AAAAAr6   c                 0    |                      |           d S r1   )sendResponser   s     r,   onPDURequest_enquire_linkz*SMPPProtocolBase.onPDURequest_enquire_link   s    &!!!!!r6   c                      t           j         _                                                               t          d                                                                           fd           d S )NzUnbind receivedc                 Z                                   sdo                                S )NT)r   
disconnect)rr   r4   s    r,   <lambda>z6SMPPProtocolBase.onPDURequest_unbind.<locals>.<lambda>  s-    8I8I&8Q8Q8YUY7p_c_n_n_p_p r6   )r$   UNBIND_RECEIVEDrI   rc   r   r   finishInboundTxnsaddCallbackr   s   ``r,   onPDURequest_unbindz$SMPPProtocolBase.onPDURequest_unbind  st     .=##%%%''(CDU(V(VWWW  ,,-p-p-p-p-pqqqqqr6   c                 T    |                       |j        |j        |fi |           d S r1   )r   r   r   )r4   r   r2   r3   s       r,   r   zSMPPProtocolBase.sendResponse  s4    &V&v}fGGGGHHHHHr6   c                    | j         t          j        k    r| j                            d|z             d S |                                 sSd|z  }|                     t          |t          j	                             | 
                    ||t          j	                  S | j        !| 
                    |dt          j                  S |                     || j                   d S )Nz0Unbind is pending...Ignoring data request PDU %sz'Received data request when not bound %szMissing dataRequestHandler)rI   r$   UNBIND_PENDINGrR   infoisBoundr   r   r   ESME_RINVBNDSTSfatalErrorOnRequestrD   ESME_RX_T_APPNdoPDURequest)r4   r   errMsgs      r,   r   z'SMPPProtocolBase.PDUDataRequestReceived  s     1 @@@HMMLvUVVVF||~~ 	[>GF++,=fmFc,d,deee++FFM<YZZZ"*++F4PR_Rnooo&$"9:::::r6   c                     | j                             |           |                     ||           |                                  d S r1   )rR   r   r   r   )r4   r   r   r2   s       r,   r   z$SMPPProtocolBase.fatalErrorOnRequest  s?    &!!!&&)))r6   c                     |                      |           t          j        || |          }|                    | j        |           |                    | j        |           |                    | j        |           d S r1   )	startInboundTransactionr    maybeDeferredr   PDURequestSucceeded
addErrbackPDURequestFailedaddBothPDURequestFinished)r4   r   handlerhandlerCalls       r,   r   zSMPPProtocolBase.doPDURequest$  s{    $$V,,,)'4@@ 8&AAAt4f===D3V<<<<<r6   c                 d   |j         rt          j        }i }|r|t          t                    v r|}nnt	          |t
                    r|j        }|j        }nJ| j        	                    dt          |          z             t          j        }|                                   | j        ||fi | d S d S )Nz3Invalid response type returned from data handler %s)r   r   ESME_ROKlistr   r/   r2   r3   rR   r   typer   r   r   )r4   dataHdlrRespr   r2   r3   s        r,   r   z$SMPPProtocolBase.PDURequestSucceeded,  s     	8"+FF 	$4#6#666)FF.ABB $)0F)0FFH%%&[^bco^p^p&pqqq*9FMMOOODff7777777	8 	8r6   c                 :    |j         t                    rz	  |j                     n# t          $ r\}| j                            d|d|dt          | j                            |                    d           |j        }d}Y d }~n^d }~ww xY w| j        	                    d|dt          | j                            |                    d|           t          j        }d	}|j        r|                     ||           |r|                                  d S d S )
NzApplication raised error 'z*', forwarding to client. Inbound PDU was [z], hex[]Fz'Exception raised handling inbound PDU [z] hex[z]: T)checkr   raiseExceptionrR   r   r-   rJ   r   r2   r   r   r   r   r   r   )r4   r#   r   validation_errorreturn_cmd_statusr   s         r,   r   z!SMPPProtocolBase.PDURequestFailed=  sc   5;()) 	!$$&&&&$ ! ! !   &&&*:4<;N;Nv;V;V*W*W*W*WY Z Z Z %5$;! ! HFF$T\%8%8%@%@AAAA55J K K K - <H 	9f&7888 	MMOOOOO	 	s   ' 
BABBc                 0    |                      |           |S r1   )endInboundTransaction)r4   resultr   s      r,   r   z#SMPPProtocolBase.PDURequestFinishedU  s    ""6***r6   c                 v    t          j        |                                 |                                 g          S r1   )r    DeferredListr   finishOutboundTxnsrS   s    r,   
finishTxnszSMPPProtocolBase.finishTxnsY  s0    !4#9#9#;#;T=T=T=V=V"WXXXr6   c                 X    t          j        | j                                                  S r1   )r    r   rF   valuesrS   s    r,   r   z"SMPPProtocolBase.finishInboundTxns\  s!    !$+"4"4"6"6777r6   c                     t          j        d t          | j                                                  D                       S )Nc                     g | ]	}|j         
S r:   )ackDeferred).0txns     r,   
<listcomp>z7SMPPProtocolBase.finishOutboundTxns.<locals>.<listcomp>`  s    "Z"Z"Zs3?"Z"Z"Zr6   )r    r   r   rG   r   rS   s    r,   r   z#SMPPProtocolBase.finishOutboundTxns_  s8    !"Z"Zd4<CVCVCXCX>Y>Y"Z"Z"Z[[[r6   c                 (   t          |t                    r:| j                            d|z             |j        |                                  dS |j        | j        vr| j                            d|z             dS |                     |           dS )z&Handle incoming response PDUs
        zRecevied generic_nack %sNzJResponse PDU received with unknown outbound transaction sequence number %s)r   r   rR   r   r   r   rG   endOutboundTransactionr4   r   s     r,   r   z$SMPPProtocolBase.PDUResponseReceivedb  s     c;'' 	H83>???z!((***:T\))HjmppqqqF##C(((((r6   c                    | j                             t          j                  r| j                             d|z             | j                            |          }| j                             t          j                  r*| j                             dt          |          z             | j        	                    |           | 
                                 dS )zSend a SMPP PDU
        zSending PDU: %szSending data [%s]N)rR   ri   rO   rj   rk   rJ   r   r-   rZ   writer   r   s      r,   r   zSMPPProtocolBase.sendPDUq  s     8  // 	4HNN,s2333,%%c**8  // 	LHNN.1A'1J1JJKKKW%%%r6   c                 \    |                      ||                                 j                  S r1   )sendRequestrW   sessionInitTimerSecsr   s     r,   sendBindRequestz SMPPProtocolBase.sendBindRequest~  s#    T[[]]%GHHHr6   c                 8    t          j        | j        ||          S r1   )r    r   doSendRequestr4   r   timeouts      r,   r   zSMPPProtocolBase.sendRequest  s    "4#5sGDDDr6   c                    | j         rt                      t          |t                    r|j        t          d|z            |                                 |_        |                     |           | 	                    ||          S )NzInvalid PDU to send: %s)
r@   r   r   r   r   r   claimSeqNumr   r   startOutboundTransactionr   s      r,   r   zSMPPProtocolBase.doSendRequest  s    # 	74666#z** 	Ccn.D!";c"ABBB%%''
S,,S':::r6   c                 ~    |                                  r|                                  |                                  dS )z8Called whenever an SMPP PDU is sent or received
        N)r   activateEnquireLinkTimerr\   rS   s    r,   r   z SMPPProtocolBase.onSMPPOperation  s>     <<>> 	,))+++$$&&&&&r6   c                 P   | j         rL| j                                         r3| j                             |                                 j                   d S |                                 j        r9|                     |                                 j        | j                  | _         d S d S r1   )rB   ru   resetrW   enquireLinkTimerSecsrM   enquireLinkTimerExpiredrS   s    r,   r   z)SMPPProtocolBase.activateEnquireLinkTimer  s      	uT%:%A%A%C%C 	u!''(JKKKKK[[]]/ 	u$(NN4;;==3UW[Ws$t$tD!!!	u 	ur6   c                 P   | j         rL| j                                         r3| j                             |                                 j                   d S |                                 j        r9|                     |                                 j        | j                  | _         d S d S r1   )rC   ru   r   rW   inactivityTimerSecsrM   inactivityTimerExpiredrS   s    r,   r\   z(SMPPProtocolBase.activateInactivityTimer  s     	rD$8$?$?$A$A 	r &&t{{}}'HIIIII[[]]. 	r#'>>$++--2SUYUp#q#qD   	r 	rr6   c                     | j         r;| j                                         r$| j                                          d | _         d S d S d S r1   )rB   ru   ry   rS   s    r,   rc   z'SMPPProtocolBase.cancelEnquireLinkTimer  sZ      	)T%:%A%A%C%C 	)!((***$(D!!!	) 	) 	) 	)r6   c                     | j         r;| j                                         r$| j                                          d | _         d S d S d S r1   )rC   ru   ry   rS   s    r,   rd   z&SMPPProtocolBase.cancelInactivityTimer  sZ     	(D$8$?$?$A$A 	( '')))#'D   	( 	( 	( 	(r6   c                     |                      t                      |                                 j                  }|                    | j                   d S r1   )r   r   rW   responseTimerSecsr   enquireLinkErr)r4   r   s     r,   r   z(SMPPProtocolBase.enquireLinkTimerExpired  sA    {}}dkkmm.MNNt*+++++r6   c                 :    |                     t                     d S r1   )trapr   )r4   failures     r,   r  zSMPPProtocolBase.enquireLinkErr  s    Yr6   c                 b    | j                             d           |                                  d S )Nz(Inactivity timer expired...shutting down)rR   r   r   rS   s    r,   r  z'SMPPProtocolBase.inactivityTimerExpired  s*    DEEEr6   c                 V    | j         t          j        t          j        t          j        fv S r1   )rI   r$   BOUND_TXBOUND_RX	BOUND_TRXrS   s    r,   r   zSMPPProtocolBase.isBound  s,     "$5$>@Q@[%] ] 	]r6   c                                                       rM j        sF j                            d                                                                 fd           dS  j        t          j        t          j	        fvr0 j                            d            
                                 dS  j                            d           dS )z& Unbind if appropriate and disconnect zShutdown requested...unbindingc                 ,                                     S r1   r   r   r4   s    r,   r   z+SMPPProtocolBase.shutdown.<locals>.<lambda>  s    1B1B r6   z"Shutdown requested...disconnectingzShutdown already in progressN)r   r@   rR   r^   unbindr   rI   r$   r   r   r   rk   rS   s   `r,   r   zSMPPProtocolBase.shutdown  s     <<>> 	;$": 	;H=>>>KKMM!!"B"B"B"BCCCCC'8'HJ[Jj&kkkHABBBOOHNN9:::::r6   c                     |j         | j        v r"t          d|j         z  t          j                  t          j                    }|| j        |j         <   | j                            d|j         z             |S )Nz8Duplicate message id [%s] received.  Already in progess.z.Inbound transaction started with message id %s)	r   rF   r   r   ESME_RUNKNOWNERRr    rK   rR   rk   )r4   r   txnDeferreds      r,   r   z(SMPPProtocolBase.startInboundTransaction  su    =DK''#$^agan$n$1$BD D Dn&&%0FM"G&-WXXXr6   c                     |j         | j        vrt          d|z            | j                            d|j         z             | j        |j                                      |           | j        |j         = d S )NzAUnknown inbound sequence number in transaction for request PDU %sz/Inbound transaction finished with message id %s)r   rF   
ValueErrorrR   rk   re   r   s     r,   r   z&SMPPProtocolBase.endInboundTransaction  sq    }++`ciijjjH6=XYYYFM"++F333K&&&r6   c                 0   |j         | j        v rt          d|j         z            t          j                    }|                     || j        ||          }t          |||          | j        |j         <   | j        	                    d|j         z             |S )Nz&Seq number [%s] is already in progess.z/Outbound transaction started with message id %s)
r   rG   r  r    rK   rM   onResponseTimeoutr%   rR   rk   )r4   r   r   r   timers        r,   r   z)SMPPProtocolBase.startOutboundTransaction  s    =DL((EUVVV n&&w(>PP&5fe[&Q&QV]#H6=XYYYr6   c                    | j                             d|z             || j        v rI| j        |         }| j        |= |j                                        r|j                                         |S | j                             d|           d S )Nz0Outbound transaction finished with message id %sz:Cannot close outbound transaction: trx id [%s] not found !)rR   rk   rG   r  ru   ry   r   )r4   r   r   s      r,   closeOutboundTransactionz)SMPPProtocolBase.closeOutboundTransaction  s    IFRSSST\!!,v&CV$y!! #	  """JHZ\bccc4r6   c                    |                      |j                  }|)|j        t          j        k    rt          ||j        j                  sP|j        	                    t          |dt          |          dt          |j                  d                     d S |j                            t          | |j        |                     d S t          |t                    r/|j        	                    t          ||j                             d S |j        }|j        	                    t!          ||j                             d S d S )NzInvalid PDU response type [z] returned for request type [r   )r  r   r2   r   r   r   requestr   r   errbackr   r   re   r&   r   r   r   )r4   respPDUr   errCodes       r,   r   z'SMPPProtocolBase.endOutboundTransaction  s7   ++GN;;?~!777!'3;+ABB O++,=ggWtCK'8'8'8'8:-; -; < < < F(()>tS[RY)Z)Z[[[';// ''(GQTQ\(](]^^^nGO##$8#+$N$NOOOOO! ?r6   c                     | j                             |           |                     |j                  }||j                            |           d S d S r1   )rR   r#   r  r   r   r"  )r4   r   r#   r   s       r,   endOutboundTransactionErrz*SMPPProtocolBase.endOutboundTransactionErr
  sS    u++FM::?O##E***** ?r6   c                     t          | j                                                  D ]}|                     |j        |           d S r1   )r   rG   r   r&  r!  )r4   r#   r   s      r,   r   z+SMPPProtocolBase.cancelOutboundTransactions  sL    ++--.. 	? 	?C**3;>>>>	? 	?r6   c                     d|d|}|                      |t          |                     |                                  d S )NzRequest timed out after  secs: )r&  r   r   r4   r   r   r   s       r,   r  z"SMPPProtocolBase.onResponseTimeout  sD     :A''66J&&v/Ef/M/MNNNr6   c                 0    | xj         dz  c_         | j         S )N   )rE   rS   s    r,   r   zSMPPProtocolBase.claimSeqNum  s    1r6   c                 \    t           j        | _        | j                            d           |S )NzUnbind succeeded)r$   UNBOUNDrI   rR   r^   )r4   r   s     r,   unbindSucceededz SMPPProtocolBase.unbindSucceeded  s)    -5+,,,r6   c                     | j                             d|z             |                                  |                    t                    rt          t          |                    |S )Nz$Unbind failed [%s]. Disconnecting...rR   r#   r   r   r   r   strrf   s     r,   unbindFailedzSMPPProtocolBase.unbindFailed$  sZ    =FGGG<<.// 	:,S[[999r6   c                     | j                             d           |                     t                                                    | j        | j                                      |           d S )NzIssuing unbind request)rR   r^   r   r   addCallbacksr/  r3  chainDeferred)r4   r   unbindDeferreds      r,   !unbindAfterInProgressTxnsFinishedz2SMPPProtocolBase.unbindAfterInProgressTxnsFinished+  sf    1222VXX&&33D4H$J[\\jj	 	 	 	 	r6   c                 ~   |                                  s)t          j        t          d| j        z                      S |                                  | j                            d           t          j	        | _        t          j
                    }|                                                     | j        |           |S )z>Unbind from SMSC

        Result is a Deferred object
        z,unbind called with illegal session state: %sz1Waiting for in-progress transactions to finish...)r   r    failr   rI   rc   rR   r   r$   r   rK   r   r   r8  )r4   r7  s     r,   r  zSMPPProtocolBase.unbind3  s    
 ||~~ 	q:+,Z]a]n,nooq q q 	##%%%IJJJ
 .<))%%d&Ln]]]r6   c                 X                                                            fd          S )zMUnbind from SMSC and disconnect

        Result is a Deferred object
        c                 ,                                     S r1   r  r  s    r,   r   z6SMPPProtocolBase.unbindAndDisconnect.<locals>.<lambda>P  s    DOO4E4E r6   )r  r   rS   s   `r,   unbindAndDisconnectz$SMPPProtocolBase.unbindAndDisconnectK  s+    
 {{}}$$%E%E%E%EFFFr6   c                     |                                  r| j                            d           n| j                            d           t          j        | _        | j                                         dS )zDisconnect from SMSC
        z$Disconnecting while bound to SMSC...zDisconnecting...N)r   rR   r^   r$   r.  rI   rZ   loseConnectionrS   s    r,   r   zSMPPProtocolBase.disconnectR  sj     <<>> 	1HCDDDDH/000-5%%'''''r6   c                     | j         S )z<Get a Deferred so you can be notified on disconnect
        )rL   rS   s    r,   getDisconnectedDeferredz(SMPPProtocolBase.getDisconnectedDeferred\  s     ((r6   c                 8   t          |t                    s$t          j        t	          d|z                      S |                                 s!t          j        t          d                    S |                     ||                                 j	                  S )zSend a SMPP Request Message

        Argument is an SMPP PDUDataRequest (protocol data unit).
        Result is a Deferred object
        z+Invalid PDU passed to sendDataRequest(): %sz	Not bound)
r   r   r    r:  r   r   r   r   rW   r  r   s     r,   sendDataRequestz SMPPProtocolBase.sendDataRequesta  s     #~.. 	d:o.[^a.abbccc||~~ 	H:9+FFGGGT[[]]%DEEEr6   N)Er7   r8   r9   __doc__versionr5   rW   rY   rb   rs   rp   rm   rl   r{   r|   r   ESME_RINVCMDLENr   r   r   rw   rn   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r\   rc   rd   r   r  r  r   r   r   r   r   r  r   r&  r   r  r   r/  r3  r8  r  r=  r   rA  rC  r:   r6   r,   r<   r<   N   s       MMG3 3 3&( ( (u u u	1 	1 	1% % %*b b b
' ' '' ' '; ; ;
   '4&C # # # #         " " ",9 9 9*B B B" " "r r r +8*@ I I I I; ; ;  
= = =8 8 8"  0  Y Y Y8 8 8\ \ \) ) )  I I IE E E; ; ;' ' 'u u ur r r) ) )
( ( (
, , ,       ] ] ]
; 
; 
;  ' ' '    P P P*+ + +? ? ?  
    
      0G G G( ( () ) )

F 
F 
F 
F 
Fr6   r<   c                   \    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd ZdS )SMPPClientProtocolc                     t          j        t                    | _        t                              |            d | _        d S r1   )rO   rP   rQ   rR   r<   r5   alertNotificationHandlerrS   s    r,   r5   zSMPPClientProtocol.__init__p  s6    $\22!!$'''(,%%%r6   c           	          | j                             d|j        d|j        d|j        d           t
                              | |           dS )r   z#SMPP Client received PDU [command: , sequence_number: , command_status: r   N)rR   r   r   r   r2   r<   r   r   s     r,   r   zSMPPClientProtocol.PDUReceivedv  sX     	


CJJJ( 	) 	) 	)$$T3/////r6   c                 $   | j         t          j        k    r)t          j        t          d| j         z                      S |                     |          }|                    | j        |           |	                    | j
                   || _         |S )Nz*bind called with illegal session state: %s)rI   r$   r]   r    r:  r   r   r   bindSucceededr   
bindFailed)r4   r   pendingState
boundStatebindDeferreds        r,   bindzSMPPClientProtocol.bind}  s     1 666:+,X[_[l,lmmo o o ++C00  !3Z@@@000(r6   c           	         | j                             d           t          |                                 j        |                                 j        |                                 j        |                                 j        |                                 j        |                                 j	        | j
                  }|                     |t          j        t          j                  S )NzRequesting bind as receiver	system_idpasswordsystem_typeaddress_rangeaddr_tonaddr_npiinterface_version)rR   r^   r   rW   usernamerX  
systemTypeaddressRange
addressTon
addressNpirE  rT  r$   BIND_RX_PENDINGr  r   s     r,   doBindAsReceiverz#SMPPClientProtocol.doBindAsReceiver  s    6777kkmm,[[]]+0++--4[[]]-[[]]-"l
 
 
 yy/?ARA[\\\r6   c                     || _         | j                            dt          | j                   z             |                                  |S )Nz Bind succeeded...now in state %s)rI   rR   r^   r2  r   )r4   r   	nextStates      r,   rO  z SMPPClientProtocol.bindSucceeded  sH    %;c$BS>T>TTUUU%%'''r6   c                     | j                             d|z             |                                  |                    t                    rt          t          |                    |S )Nz"Bind failed [%s]. Disconnecting...r1  rf   s     r,   rP  zSMPPClientProtocol.bindFailed  sZ    ;fDEEE<<.// 	:,S[[999r6   c                    | j         t          j        k    rE| j                            dt          | j                   z             |                                  d S | j                            d           |                                  d S )Nz,Received outbind command in invalid state %szReceived outbind command)	rI   r$   r]   rR   r   r2  r   r^   rd  r   s     r,   onPDU_outbindz SMPPClientProtocol.onPDU_outbind  s}     1 666HLsSWSdOeOeefffMMOOOF3444r6   c                 z   | j         t          j        k    r| j                            d|z             d S |                                 sbd|z  }|                     t          |t          j	                             | j        
                    |           |                                  d S | j        r	 |                     | |           d S # t          $ rc}| j        
                    dt          |          z             | j                            |           |                                  Y d }~d S d }~ww xY wd S )Nz6Unbind is pending...Ignoring alert notification PDU %sz-Received alert notification when not bound %sz!Alert handler threw exception: %s)rI   r$   r   rR   r   r   r   r   r   r   r   r   rJ  	Exceptionr2  r   )r4   r   r   r   s       r,   onPDU_alert_notificationz+SMPPClientProtocol.onPDU_alert_notification  s>    1 @@@HMMRUXXYYYF||~~ 	DsJF++,=fmFc,d,deeeHf%%%MMOOOF( 	  --dC88888      !!"EA"NOOO""1%%% 	  	 s   3C 
D8AD33D8c           	         | j                             d           t          |                                 j        |                                 j        |                                 j        |                                 j        |                                 j        |                                 j	        | j
                  }|                     |t          j        t          j                  S )zIBind to SMSC as transmitter

        Result is a Deferred object
        zRequesting bind as transmitterrV  )rR   r^   r	   rW   r^  rX  r_  r`  ra  rb  rE  rT  r$   BIND_TX_PENDINGr  r   s     r,   bindAsTransmitterz$SMPPClientProtocol.bindAsTransmitter  s    
 	9:::kkmm,[[]]+0++--4[[]]-[[]]-"l
 
 
 yy/?ARA[\\\r6   c                 T    |                      |           |                                 S )zFBind to SMSC as receiver

        Result is a Deferred object
        )setDataRequestHandlerrd  )r4   rD   s     r,   bindAsReceiverz!SMPPClientProtocol.bindAsReceiver  s+    
 	""#5666$$&&&r6   c           	          |                      |           | j                            d           t          |                                 j        |                                 j        |                                 j        |                                 j        |                                 j	        |                                 j
        | j                  }|                     |t          j        t          j                  S )zIBind to SMSC as transceiver

        Result is a Deferred object
        zRequesting bind as transceiverrV  )rq  rR   r^   r
   rW   r^  rX  r_  r`  ra  rb  rE  rT  r$   BIND_TRX_PENDINGr  )r4   rD   r   s      r,   bindAsTransceiverz$SMPPClientProtocol.bindAsTransceiver  s    
 	""#56669:::kkmm,[[]]+0++--4[[]]-[[]]-"l
 
 
 yy/@BSB]^^^r6   c                     || _         dS z7Set handler to use for receiving data requests
        N)rD   r4   r   s     r,   rq  z(SMPPClientProtocol.setDataRequestHandler  s     #*r6   c                     || _         dS rw  )rJ  rx  s     r,   setAlertNotificationHandlerz.SMPPClientProtocol.setAlertNotificationHandler  s     )0%%%r6   N)r7   r8   r9   r5   r   rT  rd  rO  rP  ri  rl  ro  rr  ru  rq  rz  r:   r6   r,   rH  rH  n  s        - - -0 0 0	 	 	] ] ]              .] ] ]"' ' '_ _ _$* * *
0 0 0 0 0r6   rH  c                   Z    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
ed	             Zd
 ZdS )SMPPServerProtocolc                      t                                            fd _        d  _        t	          j        t                     _        d S )Nc                  T                                      j        j        g| R i |S r1   )rW   
msgHandlerrW  )argskwargsr4   s     r,   r   z-SMPPServerProtocol.__init__.<locals>.<lambda>  s3    :R$++--:RSWSa:sdh:s:s:slr:s:s r6   )r<   r5   rD   rW  rO   rP   rQ   rR   rS   s   `r,   r5   zSMPPServerProtocol.__init__  sH    !!$''' #t"s"s"s$\22r6   c                     d| j         d|d|}|                     |t          |                     |                                  d S )Nz Request timed out for system id z after r)  )rW  r&  r   r   r*  s       r,   r  z$SMPPServerProtocol.onResponseTimeout  sQ     KO>>>[b[b[bdjdjk&&v/Ef/M/MNNNr6   c                 p    | j                             |            t                              | |           d S r1   )rU   removeConnectionr<   rb   rf   s     r,   rb   z!SMPPServerProtocol.connectionLost	  s6     	%%d+++''f55555r6   c                     | j                             d| j        d|j        d|j        d|j        d	           t                              | |           dS )r   z$SMPP Server received PDU to system 'z' [command: rL  rM  r   N)rR   rk   rW  r   r   r2   r<   r   r   s     r,   r   zSMPPServerProtocol.PDUReceived  sb     	NNNCFFFCJJJ


<	= 	= 	= 	$$T3/////r6   c                     |                                  r|                     |           d S |                     |t          j                   d S r   )r   r   r   r   r   s     r,   r   z,SMPPServerProtocol.onPDURequest_enquire_link  sO    <<>> 	Lf%%%%%f]-JKKKKKr6   c                 F    |                      |t          j                   d S r1   )doBindRequestr$   r  r   s     r,   onPDURequest_bind_receiverz-SMPPServerProtocol.onPDURequest_bind_receiver  "    6#4#=>>>>>r6   c                 F    |                      |t          j                   d S r1   )r  r$   r  r   s     r,   onPDURequest_bind_transmitterz0SMPPServerProtocol.onPDURequest_bind_transmitter   r  r6   c                 F    |                      |t          j                   d S r1   )r  r$   r  r   s     r,   onPDURequest_bind_transceiverz0SMPPServerProtocol.onPDURequest_bind_transceiver#  s"    6#4#>?????r6   c              #     K   |j         d                                         |j         d                                         }}	 | j                            ||| j                                        j                  V \  }}}n# t          j        $ r |t          | j        j
        j                  vr?| j                            d|z             |                     |t          j        |           n>| j                            d|z             |                     |t          j        |           Y d S w xY w| j        t&          j        k    r@| j                            d|z             |                     |t          j        |           d S |j        }| j                            ||          sD| j                            d|d|d           |                     |t          j        |           d S || _        || _        || _        | j                            |            | j                            |          }	| j                            d	||	r|	                                nd
fz             |                     ||           d S )NrW  rX  zFSMPP Bind request failed for system_id: "%s", System ID not configuredzDSMPP Bind request failed for system_id: "%s", failed to authenticatez-Duplicate SMPP bind request received from: %szSMPP System z  has exceeded maximum number of z	 bindingsz.Bind request succeeded for %s. %d active bindsr   )rW  ) r3   r   rU   loginrZ   r_   r`   r#   UnauthorizedLoginr   rW   systemsrR   r^   sendErrorResponser   ESME_RINVSYSIDESME_RINVPASWDrI   r$   r]   ESME_RALYBNDr   canOpenNewConnectionESME_RBINDFAILrW  	bind_typeaddBoundConnectiongetBoundConnectionsr   getBindingCountr   )
r4   r   rI   rW  rX  ifaceauth_avatarlogoutr  bound_cnxnss
             r,   r  z SMPPServerProtocol.doBindRequest&  s      %mK8??AA6=Q[C\CcCcCeCe8		/3|/A/A)XW[WeWmWmWoWoWt/u/u)u)u&E;& 	 	 	T\%8%@ A AAA  !ilu!uvvv&&v}/KYWWWW  !gjs!sttt&&v}/KYWWWFF	  1 666HLyXYYY""6=+EyQQQF $	|00IFF 	H\e\e\egpgpgpqrrr""6=+GSSSF #(" 	''---l66yAAFKF;..000QJH H 	I 	I 	I&I66666s   >B B,D10D1c                 j    |                     |j        ||          }|                     |           dS )zE Send an error response to reqPDU, with the specified command status.)r   r2   rW  N)r   r   r   )r4   r   r2   rW  err_pdus        r,   r  z$SMPPServerProtocol.sendErrorResponseT  s7    ##6=S\#]]Wr6   N)r7   r8   r9   r5   r  rb   r   r   r  r  r  r"   r  r  r:   r6   r,   r|  r|    s        3 3 3  
6 6 60 0 0L L L? ? ?? ? ?@ @ @ +7 +7 _+7Z    r6   r|  ):rD  ior   r   rO   r(   enumr   collectionsr   smpp.pdu.operationsr   r   r   r	   r
   r   r   smpp.pdu.pdu_encodingr   smpp.pdu.pdu_typesr   r   r   r   smpp.pdu.errorr   r   r   r   r   r   r   r   r   r   r   r   smpp.pdu.constantsr   twisted.internet.protocolr   twisted.internetr    r!   twisted.internet.deferr"   twisted.credr#   rQ   r$   r%   r&   r-   r/   r<   rH  r|  r:   r6   r,   <module>r     s                    " " " " " "                  - , , , , , U U U U U U U U U U U U                            7 6 6 6 6 6 . . . . . . + + + + + + + + 2 2 2 2 2 2      &D,  /x  y  y *.0MNN"
#:<UVV O O O       ]F ]F ]F ]F ]Fx ]F ]F ]F@G0 G0 G0 G0 G0) G0 G0 G0T_ _ _ _ _) _ _ _ _ _r6   