⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 base.pm

📁 视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.
💻 PM
📖 第 1 页 / 共 3 页
字号:
package IO::Uncompress::Base ;use strict ;use warnings;use bytes;our (@ISA, $VERSION, @EXPORT_OK, %EXPORT_TAGS);@ISA    = qw(Exporter IO::File);$VERSION = '2.008';use constant G_EOF => 0 ;use constant G_ERR => -1 ;use IO::Compress::Base::Common 2.008 ;#use Parse::Parameters ;use IO::File ;use Symbol;use Scalar::Util qw(readonly);use List::Util qw(min);use Carp ;%EXPORT_TAGS = ( );push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ;#Exporter::export_ok_tags('all') ;sub smartRead{    my $self = $_[0];    my $out = $_[1];    my $size = $_[2];    $$out = "" ;    my $offset = 0 ;    if (defined *$self->{InputLength}) {        return 0            if *$self->{InputLengthRemaining} <= 0 ;        $size = min($size, *$self->{InputLengthRemaining});    }    if ( length *$self->{Prime} ) {        #$$out = substr(*$self->{Prime}, 0, $size, '') ;        $$out = substr(*$self->{Prime}, 0, $size) ;        substr(*$self->{Prime}, 0, $size) =  '' ;        if (length $$out == $size) {            *$self->{InputLengthRemaining} -= length $$out                if defined *$self->{InputLength};            return length $$out ;        }        $offset = length $$out ;    }    my $get_size = $size - $offset ;    #if ( defined *$self->{InputLength} ) {    #    $get_size = min($get_size, *$self->{InputLengthRemaining});    #}    if (defined *$self->{FH})      { *$self->{FH}->read($$out, $get_size, $offset) }    elsif (defined *$self->{InputEvent}) {        my $got = 1 ;        while (length $$out < $size) {            last                 if ($got = *$self->{InputEvent}->($$out, $get_size)) <= 0;        }        if (length $$out > $size ) {            #*$self->{Prime} = substr($$out, $size, length($$out), '');            *$self->{Prime} = substr($$out, $size, length($$out));            substr($$out, $size, length($$out)) =  '';        }       *$self->{EventEof} = 1 if $got <= 0 ;    }    else {       no warnings 'uninitialized';       my $buf = *$self->{Buffer} ;       $$buf = '' unless defined $$buf ;       #$$out = '' unless defined $$out ;       substr($$out, $offset) = substr($$buf, *$self->{BufferOffset}, $get_size);       if (*$self->{ConsumeInput})         { substr($$buf, 0, $get_size) = '' }       else           { *$self->{BufferOffset} += length($$out) - $offset }    }    *$self->{InputLengthRemaining} -= length($$out) #- $offset         if defined *$self->{InputLength};            $self->saveStatus(length $$out < 0 ? STATUS_ERROR : STATUS_OK) ;    return length $$out;}sub pushBack{    my $self = shift ;    return if ! defined $_[0] || length $_[0] == 0 ;    if (defined *$self->{FH} || defined *$self->{InputEvent} ) {        *$self->{Prime} = $_[0] . *$self->{Prime} ;        *$self->{InputLengthRemaining} += length($_[0]);    }    else {        my $len = length $_[0];        if($len > *$self->{BufferOffset}) {            *$self->{Prime} = substr($_[0], 0, $len - *$self->{BufferOffset}) . *$self->{Prime} ;            *$self->{InputLengthRemaining} = *$self->{InputLength};            *$self->{BufferOffset} = 0        }        else {            *$self->{InputLengthRemaining} += length($_[0]);            *$self->{BufferOffset} -= length($_[0]) ;        }    }}sub smartSeek{    my $self   = shift ;    my $offset = shift ;    my $truncate = shift;    #print "smartSeek to $offset\n";    # TODO -- need to take prime into account    if (defined *$self->{FH})      { *$self->{FH}->seek($offset, SEEK_SET) }    else {        *$self->{BufferOffset} = $offset ;        substr(${ *$self->{Buffer} }, *$self->{BufferOffset}) = ''            if $truncate;        return 1;    }}sub smartWrite{    my $self   = shift ;    my $out_data = shift ;    if (defined *$self->{FH}) {        # flush needed for 5.8.0         defined *$self->{FH}->write($out_data, length $out_data) &&        defined *$self->{FH}->flush() ;    }    else {       my $buf = *$self->{Buffer} ;       substr($$buf, *$self->{BufferOffset}, length $out_data) = $out_data ;       *$self->{BufferOffset} += length($out_data) ;       return 1;    }}sub smartReadExact{    return $_[0]->smartRead($_[1], $_[2]) == $_[2];}sub smartEof{    my ($self) = $_[0];    local $.;     return 0 if length *$self->{Prime} || *$self->{PushMode};    if (defined *$self->{FH})     { *$self->{FH}->eof() }    elsif (defined *$self->{InputEvent})     { *$self->{EventEof} }    else      { *$self->{BufferOffset} >= length(${ *$self->{Buffer} }) }}sub clearError{    my $self   = shift ;    *$self->{ErrorNo}  =  0 ;    ${ *$self->{Error} } = '' ;}sub saveStatus{    my $self   = shift ;    my $errno = shift() + 0 ;    #return $errno unless $errno || ! defined *$self->{ErrorNo};    #return $errno unless $errno ;    *$self->{ErrorNo}  = $errno;    ${ *$self->{Error} } = '' ;    return *$self->{ErrorNo} ;}sub saveErrorString{    my $self   = shift ;    my $retval = shift ;    #return $retval if ${ *$self->{Error} };    ${ *$self->{Error} } = shift ;    *$self->{ErrorNo} = shift() + 0 if @_ ;    #warn "saveErrorString: " . ${ *$self->{Error} } . " " . *$self->{Error} . "\n" ;    return $retval;}sub croakError{    my $self   = shift ;    $self->saveErrorString(0, $_[0]);    croak $_[0];}sub closeError{    my $self = shift ;    my $retval = shift ;    my $errno = *$self->{ErrorNo};    my $error = ${ *$self->{Error} };    $self->close();    *$self->{ErrorNo} = $errno ;    ${ *$self->{Error} } = $error ;    return $retval;}sub error{    my $self   = shift ;    return ${ *$self->{Error} } ;}sub errorNo{    my $self   = shift ;    return *$self->{ErrorNo};}sub HeaderError{    my ($self) = shift;    return $self->saveErrorString(undef, "Header Error: $_[0]", STATUS_ERROR);}sub TrailerError{    my ($self) = shift;    return $self->saveErrorString(G_ERR, "Trailer Error: $_[0]", STATUS_ERROR);}sub TruncatedHeader{    my ($self) = shift;    return $self->HeaderError("Truncated in $_[0] Section");}sub TruncatedTrailer{    my ($self) = shift;    return $self->TrailerError("Truncated in $_[0] Section");}sub postCheckParams{    return 1;}sub checkParams{    my $self = shift ;    my $class = shift ;    my $got = shift || IO::Compress::Base::Parameters::new();        my $Valid = {                    'BlockSize'     => [1, 1, Parse_unsigned, 16 * 1024],                    'AutoClose'     => [1, 1, Parse_boolean,  0],                    'Strict'        => [1, 1, Parse_boolean,  0],                    'Append'        => [1, 1, Parse_boolean,  0],                    'Prime'         => [1, 1, Parse_any,      undef],                    'MultiStream'   => [1, 1, Parse_boolean,  0],                    'Transparent'   => [1, 1, Parse_any,      1],                    'Scan'          => [1, 1, Parse_boolean,  0],                    'InputLength'   => [1, 1, Parse_unsigned, undef],                    'BinModeOut'    => [1, 1, Parse_boolean,  0],                    #'Encode'        => [1, 1, Parse_any,       undef],                   #'ConsumeInput'  => [1, 1, Parse_boolean,  0],                    $self->getExtraParams(),                    #'Todo - Revert to ordinary file on end Z_STREAM_END'=> 0,                    # ContinueAfterEof                } ;    $Valid->{TrailingData} = [1, 1, Parse_writable_scalar, undef]        if  *$self->{OneShot} ;            $got->parse($Valid, @_ )         or $self->croakError("${class}: $got->{Error}")  ;    $self->postCheckParams($got)         or $self->croakError("${class}: " . $self->error())  ;    return $got;}sub _create{    my $obj = shift;    my $got = shift;    my $append_mode = shift ;    my $class = ref $obj;    $obj->croakError("$class: Missing Input parameter")        if ! @_ && ! $got ;    my $inValue = shift ;    *$obj->{OneShot}           = 0 ;    if (! $got)    {        $got = $obj->checkParams($class, undef, @_)            or return undef ;    }    my $inType  = whatIsInput($inValue, 1);    $obj->ckInputParam($class, $inValue, 1)         or return undef ;    *$obj->{InNew} = 1;    $obj->ckParams($got)        or $obj->croakError("${class}: " . *$obj->{Error});    if ($inType eq 'buffer' || $inType eq 'code') {        *$obj->{Buffer} = $inValue ;                *$obj->{InputEvent} = $inValue            if $inType eq 'code' ;    }    else {        if ($inType eq 'handle') {            *$obj->{FH} = $inValue ;            *$obj->{Handle} = 1 ;            # Need to rewind for Scan            *$obj->{FH}->seek(0, SEEK_SET)                 if $got->value('Scan');        }          else {                my $mode = '<';            $mode = '+<' if $got->value('Scan');            *$obj->{StdIO} = ($inValue eq '-');            *$obj->{FH} = new IO::File "$mode $inValue"                or return $obj->saveErrorString(undef, "cannot open file '$inValue': $!", $!) ;        }                *$obj->{LineNo} = $. = 0;        setBinModeInput(*$obj->{FH}) ;        my $buff = "" ;        *$obj->{Buffer} = \$buff ;    }    if ($got->parsed('Encode')) {         my $want_encoding = $got->value('Encode');        *$obj->{Encoding} = getEncoding($obj, $class, $want_encoding);    }    *$obj->{InputLength}       = $got->parsed('InputLength')                                     ? $got->value('InputLength')                                    : undef ;    *$obj->{InputLengthRemaining} = $got->value('InputLength');    *$obj->{BufferOffset}      = 0 ;    *$obj->{AutoClose}         = $got->value('AutoClose');    *$obj->{Strict}            = $got->value('Strict');    *$obj->{BlockSize}         = $got->value('BlockSize');    *$obj->{Append}            = $got->value('Append');    *$obj->{AppendOutput}      = $append_mode || $got->value('Append');    *$obj->{ConsumeInput}      = $got->value('ConsumeInput');    *$obj->{Transparent}       = $got->value('Transparent');    *$obj->{MultiStream}       = $got->value('MultiStream');    # TODO - move these two into RawDeflate    *$obj->{Scan}              = $got->value('Scan');    *$obj->{ParseExtra}        = $got->value('ParseExtra')                                   || $got->value('Strict')  ;    *$obj->{Type}              = '';    *$obj->{Prime}             = $got->value('Prime') || '' ;    *$obj->{Pending}           = '';    *$obj->{Plain}             = 0;    *$obj->{PlainBytesRead}    = 0;    *$obj->{InflatedBytesRead} = 0;    *$obj->{UnCompSize}        = new U64;    *$obj->{CompSize}          = new U64;    *$obj->{TotalInflatedBytesRead} = 0;    *$obj->{NewStream}         = 0 ;    *$obj->{EventEof}          = 0 ;    *$obj->{ClassName}         = $class ;    *$obj->{Params}            = $got ;    if (*$obj->{ConsumeInput}) {        *$obj->{InNew} = 0;        *$obj->{Closed} = 0;        return $obj    }    my $status = $obj->mkUncomp($class, $got);    return undef        unless defined $status;    if ( !  $status) {        return undef             unless *$obj->{Transparent};        $obj->clearError();        *$obj->{Type} = 'plain';        *$obj->{Plain} = 1;        #$status = $obj->mkIdentityUncomp($class, $got);        $obj->pushBack(*$obj->{HeaderPending})  ;    }    push @{ *$obj->{InfoList} }, *$obj->{Info} ;    $obj->saveStatus(STATUS_OK) ;    *$obj->{InNew} = 0;    *$obj->{Closed} = 0;    return $obj;}sub ckInputParam{    my $self = shift ;    my $from = shift ;    my $inType = whatIsInput($_[0], $_[1]);    $self->croakError("$from: input parameter not a filename, filehandle, array ref or scalar ref")        if ! $inType ;    if ($inType  eq 'filename' )    {        $self->croakError("$from: input filename is undef or null string")            if ! defined $_[0] || $_[0] eq ''  ;        if ($_[0] ne '-' && ! -e $_[0] )        {            return $self->saveErrorString(undef,                             "input file '$_[0]' does not exist", STATUS_ERROR);        }    }    return 1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -