<s> import cStringIO <EOL> import struct <EOL> import dns . exception <EOL> import dns . rdata <EOL> _pows = ( <NUM_LIT:1> L , <NUM_LIT:10> L , <NUM_LIT:100> L , <NUM_LIT:1000> L , <NUM_LIT> L , <NUM_LIT> L , <NUM_LIT> L , <NUM_LIT> L , <EOL> <NUM_LIT> L , <NUM_LIT> L , <NUM_LIT> L ) <EOL> def _exponent_of ( what , desc ) : <EOL> exp = None <EOL> for i in xrange ( len ( _pows ) ) : <EOL> if what // _pows [ i ] == <NUM_LIT:0> L : <EOL> exp = i - <NUM_LIT:1> <EOL> break <EOL> if exp is None or exp < <NUM_LIT:0> : <EOL> raise dns . exception . SyntaxError ( "<STR_LIT>" % desc ) <EOL> return exp <EOL> def _float_to_tuple ( what ) : <EOL> if what < <NUM_LIT:0> : <EOL> sign = - <NUM_LIT:1> <EOL> what *= - <NUM_LIT:1> <EOL> else : <EOL> sign = <NUM_LIT:1> <EOL> what = long ( round ( what * <NUM_LIT> ) ) <EOL> degrees = int ( what // <NUM_LIT> ) <EOL> what -= degrees * <NUM_LIT> <EOL> minutes = int ( what // <NUM_LIT> ) <EOL> what -= minutes * <NUM_LIT> <EOL> seconds = int ( what // <NUM_LIT:1000> ) <EOL> what -= int ( seconds * <NUM_LIT:1000> ) <EOL> what = int ( what ) <EOL> return ( degrees * sign , minutes , seconds , what ) <EOL> def _tuple_to_float ( what ) : <EOL> if what [ <NUM_LIT:0> ] < <NUM_LIT:0> : <EOL> sign = - <NUM_LIT:1> <EOL> value = float ( what [ <NUM_LIT:0> ] ) * - <NUM_LIT:1> <EOL> else : <EOL> sign = <NUM_LIT:1> <EOL> value = float ( what [ <NUM_LIT:0> ] ) <EOL> value += float ( what [ <NUM_LIT:1> ] ) / <NUM_LIT> <EOL> value += float ( what [ <NUM_LIT:2> ] ) / <NUM_LIT> <EOL> value += float ( what [ <NUM_LIT:3> ] ) / <NUM_LIT> <EOL> return sign * value <EOL> def _encode_size ( what , desc ) : <EOL> what = long ( what ) ; <EOL> exponent = _exponent_of ( what , desc ) & <NUM_LIT> <EOL> base = what // pow ( <NUM_LIT:10> , exponent ) & <NUM_LIT> <EOL> return base * <NUM_LIT:16> + exponent <EOL> def _decode_size ( what , desc ) : <EOL> exponent = what & <NUM_LIT> <EOL> if exponent > <NUM_LIT:9> : <EOL> raise dns . exception . SyntaxError ( "<STR_LIT>" % desc ) <EOL> base = ( what & <NUM_LIT> ) >> <NUM_LIT:4> <EOL> if base > <NUM_LIT:9> : <EOL> raise dns . exception . SyntaxError ( "<STR_LIT>" % desc ) <EOL> return long ( base ) * pow ( <NUM_LIT:10> , exponent ) <EOL> class LOC ( dns . rdata . Rdata ) : <EOL> """<STR_LIT>""" <EOL> __slots__ = [ '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT:size>' , <EOL> '<STR_LIT>' , '<STR_LIT>' ] <EOL> def __init__ ( self , rdclass , rdtype , latitude , longitude , altitude , <EOL> size = <NUM_LIT:1.0> , hprec = <NUM_LIT> , vprec = <NUM_LIT> ) : <EOL> """<STR_LIT>""" <EOL> super ( LOC , self ) . __init__ ( rdclass , rdtype ) <EOL> if isinstance ( latitude , int ) or isinstance ( latitude , long ) : <EOL> latitude = float ( latitude ) <EOL> if isinstance ( latitude , float ) : <EOL> latitude = _float_to_tuple ( latitude ) <EOL> self . latitude = latitude <EOL> if isinstance ( longitude , int ) or isinstance ( longitude , long ) : <EOL> longitude = float ( longitude ) <EOL> if isinstance ( longitude , float ) : <EOL> longitude = _float_to_tuple ( longitude ) <EOL> self . longitude = longitude <EOL> self . altitude = float ( altitude ) <EOL> self . size = float ( size ) <EOL> self . horizontal_precision = float ( hprec ) <EOL> self . vertical_precision = float ( vprec ) <EOL> def to_text ( self , origin = None , relativize = True , ** kw ) : <EOL> if self . latitude [ <NUM_LIT:0> ] > <NUM_LIT:0> : <EOL> lat_hemisphere = '<STR_LIT:N>' <EOL> lat_degrees = self . latitude [ <NUM_LIT:0> ] <EOL> else : <EOL> lat_hemisphere = '<STR_LIT:S>' <EOL> lat_degrees = - <NUM_LIT:1> * self . latitude [ <NUM_LIT:0> ] <EOL> if self . longitude [ <NUM_LIT:0> ] > <NUM_LIT:0> : <EOL> long_hemisphere = '<STR_LIT:E>' <EOL> long_degrees = self . longitude [ <NUM_LIT:0> ] <EOL> else : <EOL> long_hemisphere = '<STR_LIT>' <EOL> long_degrees = - <NUM_LIT:1> * self . longitude [ <NUM_LIT:0> ] <EOL> text = "<STR_LIT>" % ( <EOL> lat_degrees , self . latitude [ <NUM_LIT:1> ] , self . latitude [ <NUM_LIT:2> ] , self . latitude [ <NUM_LIT:3> ] , <EOL> lat_hemisphere , long_degrees , self . longitude [ <NUM_LIT:1> ] , self . longitude [ <NUM_LIT:2> ] , <EOL> self . longitude [ <NUM_LIT:3> ] , long_hemisphere , self . altitude / <NUM_LIT> <EOL> ) <EOL> if self . size != <NUM_LIT:1.0> or self . horizontal_precision != <NUM_LIT> or self . vertical_precision != <NUM_LIT> : <EOL> text += "<STR_LIT>" % ( <EOL> self . size / <NUM_LIT> , self . horizontal_precision / <NUM_LIT> , <EOL> self . vertical_precision / <NUM_LIT> <EOL> ) <EOL> return text <EOL> def from_text ( cls , rdclass , rdtype , tok , origin = None , relativize = True ) : <EOL> latitude = [ <NUM_LIT:0> , <NUM_LIT:0> , <NUM_LIT:0> , <NUM_LIT:0> ] <EOL> longitude = [ <NUM_LIT:0> , <NUM_LIT:0> , <NUM_LIT:0> , <NUM_LIT:0> ] <EOL> size = <NUM_LIT:1.0> <EOL> hprec = <NUM_LIT> <EOL> vprec = <NUM_LIT> <EOL> latitude [ <NUM_LIT:0> ] = tok . get_int ( ) <EOL> t = tok . get_string ( ) <EOL> if t . isdigit ( ) : <EOL> latitude [ <NUM_LIT:1> ] = int ( t ) <EOL> t = tok . get_string ( ) <EOL> if '<STR_LIT:.>' in t : <EOL> ( seconds , milliseconds ) = t . split ( '<STR_LIT:.>' ) <EOL> if not seconds . isdigit ( ) : <EOL> raise dns . exception . SyntaxError ( '<STR_LIT>' ) <EOL> latitude [ <NUM_LIT:2> ] = int ( seconds ) <EOL> if latitude [ <NUM_LIT:2> ] >= <NUM_LIT> : <EOL> raise dns . exception . SyntaxError ( '<STR_LIT>' ) <EOL> l = len ( milliseconds ) <EOL> if l == <NUM_LIT:0> or l > <NUM_LIT:3> or not milliseconds . isdigit ( ) : <EOL> raise dns . exception . SyntaxError ( '<STR_LIT>' ) <EOL> if l == <NUM_LIT:1> : <EOL> m = <NUM_LIT:100> <EOL> elif l == <NUM_LIT:2> : <EOL> m = <NUM_LIT:10> <EOL> else : <EOL> m = <NUM_LIT:1> <EOL> latitude [ <NUM_LIT:3> ] = m * int ( milliseconds ) <EOL> t = tok . get_string ( ) <EOL> elif t . isdigit ( ) : <EOL> latitude [ <NUM_LIT:2> ] = int ( t ) <EOL> t = tok . get_string ( ) <EOL> if t == '<STR_LIT:S>' : <EOL> latitude [ <NUM_LIT:0> ] *= - <NUM_LIT:1> <EOL> elif t != '<STR_LIT:N>' : <EOL> raise dns . exception . SyntaxError ( '<STR_LIT>' ) <EOL> longitude [ <NUM_LIT:0> ] = tok . get_int ( ) <EOL> t = tok . get_string ( ) <EOL> if t . isdigit ( ) : <EOL> longitude [ <NUM_LIT:1> ] = int ( t ) <EOL> t = tok . get_string ( ) <EOL> if '<STR_LIT:.>' in t : <EOL> ( seconds , milliseconds ) = t . split ( '<STR_LIT:.>' ) <EOL> if not seconds . isdigit ( ) : <EOL> raise dns . exception . SyntaxError ( '<STR_LIT>' ) <EOL> longitude [ <NUM_LIT:2> ] = int ( seconds ) <EOL> if longitude [ <NUM_LIT:2> ] >= <NUM_LIT> : <EOL> raise dns . exception . SyntaxError ( '<STR_LIT>' ) <EOL> l = len ( milliseconds ) <EOL> if l == <NUM_LIT:0> or l > <NUM_LIT:3> or not milliseconds . isdigit ( ) : <EOL> raise dns . exception . SyntaxError ( '<STR_LIT>' ) <EOL> if l == <NUM_LIT:1> : <EOL> m = <NUM_LIT:100> <EOL> elif l == <NUM_LIT:2> : <EOL> m = <NUM_LIT:10> <EOL> else : <EOL> m = <NUM_LIT:1> <EOL> longitude [ <NUM_LIT:3> ] = m * int ( milliseconds ) <EOL> t = tok . get_string ( ) <EOL> elif t . isdigit ( ) : <EOL> longitude [ <NUM_LIT:2> ] = int ( t ) <EOL> t = tok . get_string ( ) <EOL> if t == '<STR_LIT>' : <EOL> longitude [ <NUM_LIT:0> ] *= - <NUM_LIT:1> <EOL> elif t != '<STR_LIT:E>' : <EOL> raise dns . exception . SyntaxError ( '<STR_LIT>' ) <EOL> t = tok . get_string ( ) <EOL> if t [ - <NUM_LIT:1> ] == '<STR_LIT:m>' : <EOL> t = t [ <NUM_LIT:0> : - <NUM_LIT:1> ] <EOL> altitude = float ( t ) * <NUM_LIT> <EOL> token = tok . get ( ) . unescape ( ) <EOL> if not token . is_eol_or_eof ( ) : <EOL> value = token . value <EOL> if value [ - <NUM_LIT:1> ] == '<STR_LIT:m>' : <EOL> value = value [ <NUM_LIT:0> : - <NUM_LIT:1> ] <EOL> size = float ( value ) * <NUM_LIT> <EOL> token = tok . get ( ) . unescape ( ) <EOL> if not token . is_eol_or_eof ( ) : <EOL> value = token . value <EOL> if value [ - <NUM_LIT:1> ] == '<STR_LIT:m>' : <EOL> value = value [ <NUM_LIT:0> : - <NUM_LIT:1> ] <EOL> hprec = float ( value ) * <NUM_LIT> <EOL> token = tok . get ( ) . unescape ( ) <EOL> if not token . is_eol_or_eof ( ) : <EOL> value = token . value <EOL> if value [ - <NUM_LIT:1> ] == '<STR_LIT:m>' : <EOL> value = value [ <NUM_LIT:0> : - <NUM_LIT:1> ] <EOL> vprec = float ( value ) * <NUM_LIT> <EOL> tok . get_eol ( ) <EOL> return cls ( rdclass , rdtype , latitude , longitude , altitude , <EOL> size , hprec , vprec ) <EOL> from_text = classmethod ( from_text ) <EOL> def to_wire ( self , file , compress = None , origin = None ) : <EOL> if self . latitude [ <NUM_LIT:0> ] < <NUM_LIT:0> : <EOL> sign = - <NUM_LIT:1> <EOL> degrees = long ( - <NUM_LIT:1> * self . latitude [ <NUM_LIT:0> ] ) <EOL> else : <EOL> sign = <NUM_LIT:1> <EOL> degrees = long ( self . latitude [ <NUM_LIT:0> ] ) <EOL> milliseconds = ( degrees * <NUM_LIT> + <EOL> self . latitude [ <NUM_LIT:1> ] * <NUM_LIT> + <EOL> self . latitude [ <NUM_LIT:2> ] * <NUM_LIT:1000> + <EOL> self . latitude [ <NUM_LIT:3> ] ) * sign <EOL> latitude = <NUM_LIT> L + milliseconds <EOL> if self . longitude [ <NUM_LIT:0> ] < <NUM_LIT:0> : <EOL> sign = - <NUM_LIT:1> <EOL> degrees = long ( - <NUM_LIT:1> * self . longitude [ <NUM_LIT:0> ] ) <EOL> else : <EOL> sign = <NUM_LIT:1> <EOL> degrees = long ( self . longitude [ <NUM_LIT:0> ] ) <EOL> milliseconds = ( degrees * <NUM_LIT> + <EOL> self . longitude [ <NUM_LIT:1> ] * <NUM_LIT> + <EOL> self . longitude [ <NUM_LIT:2> ] * <NUM_LIT:1000> + <EOL> self . longitude [ <NUM_LIT:3> ] ) * sign <EOL> longitude = <NUM_LIT> L + milliseconds <EOL> altitude = long ( self . altitude ) + <NUM_LIT> L <EOL> size = _encode_size ( self . size , "<STR_LIT:size>" ) <EOL> hprec = _encode_size ( self . horizontal_precision , "<STR_LIT>" ) <EOL> vprec = _encode_size ( self . vertical_precision , "<STR_LIT>" ) <EOL> wire = struct . pack ( "<STR_LIT>" , <NUM_LIT:0> , size , hprec , vprec , latitude , <EOL> longitude , altitude ) <EOL> file . write ( wire ) <EOL> def from_wire ( cls , rdclass , rdtype , wire , current , rdlen , origin = None ) : <EOL> ( version , size , hprec , vprec , latitude , longitude , altitude ) = struct . unpack ( "<STR_LIT>" , wire [ current : current + rdlen ] ) <EOL> if latitude > <NUM_LIT> L : <EOL> latitude = float ( latitude - <NUM_LIT> L ) / <NUM_LIT> <EOL> else : <EOL> latitude = - <NUM_LIT:1> * float ( <NUM_LIT> L - latitude ) / <NUM_LIT> <EOL> if latitude < - <NUM_LIT> or latitude > <NUM_LIT> : <EOL> raise dns . exception . FormError ( "<STR_LIT>" ) <EOL> if longitude > <NUM_LIT> L : <EOL> longitude = float ( longitude - <NUM_LIT> L ) / <NUM_LIT> <EOL> else : <EOL> longitude = - <NUM_LIT:1> * float ( <NUM_LIT> L - longitude ) / <NUM_LIT> <EOL> if longitude < - <NUM_LIT> or longitude > <NUM_LIT> : <EOL> raise dns . exception . FormError ( "<STR_LIT>" ) <EOL> altitude = float ( altitude ) - <NUM_LIT> <EOL> size = _decode_size ( size , "<STR_LIT:size>" ) <EOL> hprec = _decode_size ( hprec , "<STR_LIT>" ) <EOL> vprec = _decode_size ( vprec , "<STR_LIT>" ) <EOL> return cls ( rdclass , rdtype , latitude , longitude , altitude , <EOL> size , hprec , vprec ) <EOL> from_wire = classmethod ( from_wire ) <EOL> def _cmp ( self , other ) : <EOL> f = cStringIO . StringIO ( ) <EOL> self . to_wire ( f ) <EOL> wire1 = f . getvalue ( ) <EOL> f . seek ( <NUM_LIT:0> ) <EOL> f . truncate ( ) <EOL> other . to_wire ( f ) <EOL> wire2 = f . getvalue ( ) <EOL> f . close ( ) <EOL> return cmp ( wire1 , wire2 ) <EOL> def _get_float_latitude ( self ) : <EOL> return _tuple_to_float ( self . latitude ) <EOL> def _set_float_latitude ( self , value ) : <EOL> self . latitude = _float_to_tuple ( value ) <EOL> float_latitude = property ( _get_float_latitude , _set_float_latitude , <EOL> doc = "<STR_LIT>" ) <EOL> def _get_float_longitude ( self ) : <EOL> return _tuple_to_float ( self . longitude ) <EOL> def _set_float_longitude ( self , value ) : <EOL> self . longitude = _float_to_tuple ( value ) <EOL> float_longitude = property ( _get_float_longitude , _set_float_longitude , <EOL> doc = "<STR_LIT>" ) </s>
