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

📄 base.pm

📁 视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.
💻 PM
📖 第 1 页 / 共 3 页
字号:
sub _inf{    my $obj = shift ;    my $class = (caller)[0] ;    my $name = (caller(1))[3] ;    $obj->croakError("$name: expected at least 1 parameters\n")        unless @_ >= 1 ;    my $input = shift ;    my $haveOut = @_ ;    my $output = shift ;    my $x = new Validator($class, *$obj->{Error}, $name, $input, $output)        or return undef ;        push @_, $output if $haveOut && $x->{Hash};    *$obj->{OneShot} = 1 ;        my $got = $obj->checkParams($name, undef, @_)        or return undef ;    if ($got->parsed('TrailingData'))    {        *$obj->{TrailingData} = $got->value('TrailingData');    }    *$obj->{MultiStream} = $got->value('MultiStream');    $got->value('MultiStream', 0);    $x->{Got} = $got ;#    if ($x->{Hash})#    {#        while (my($k, $v) = each %$input)#        {#            $v = \$input->{$k} #                unless defined $v ;##            $obj->_singleTarget($x, $k, $v, @_)#                or return undef ;#        }##        return keys %$input ;#    }        if ($x->{GlobMap})    {        $x->{oneInput} = 1 ;        foreach my $pair (@{ $x->{Pairs} })        {            my ($from, $to) = @$pair ;            $obj->_singleTarget($x, $from, $to, @_)                or return undef ;        }        return scalar @{ $x->{Pairs} } ;    }    if (! $x->{oneOutput} )    {        my $inFile = ($x->{inType} eq 'filenames'                         || $x->{inType} eq 'filename');        $x->{inType} = $inFile ? 'filename' : 'buffer';                foreach my $in ($x->{oneInput} ? $input : @$input)        {            my $out ;            $x->{oneInput} = 1 ;            $obj->_singleTarget($x, $in, $output, @_)                or return undef ;        }        return 1 ;    }    # finally the 1 to 1 and n to 1    return $obj->_singleTarget($x, $input, $output, @_);    croak "should not be here" ;}sub retErr{    my $x = shift ;    my $string = shift ;    ${ $x->{Error} } = $string ;    return undef ;}sub _singleTarget{    my $self      = shift ;    my $x         = shift ;    my $input     = shift;    my $output    = shift;        my $buff = '';    $x->{buff} = \$buff ;    my $fh ;    if ($x->{outType} eq 'filename') {        my $mode = '>' ;        $mode = '>>'            if $x->{Got}->value('Append') ;        $x->{fh} = new IO::File "$mode $output"             or return retErr($x, "cannot open file '$output': $!") ;        binmode $x->{fh} if $x->{Got}->valueOrDefault('BinModeOut');    }    elsif ($x->{outType} eq 'handle') {        $x->{fh} = $output;        binmode $x->{fh} if $x->{Got}->valueOrDefault('BinModeOut');        if ($x->{Got}->value('Append')) {                seek($x->{fh}, 0, SEEK_END)                    or return retErr($x, "Cannot seek to end of output filehandle: $!") ;            }    }        elsif ($x->{outType} eq 'buffer' )    {        $$output = ''             unless $x->{Got}->value('Append');        $x->{buff} = $output ;    }    if ($x->{oneInput})    {        defined $self->_rd2($x, $input, $output)            or return undef;     }    else    {        for my $element ( ($x->{inType} eq 'hash') ? keys %$input : @$input)        {            defined $self->_rd2($x, $element, $output)                 or return undef ;        }    }    if ( ($x->{outType} eq 'filename' && $output ne '-') ||          ($x->{outType} eq 'handle' && $x->{Got}->value('AutoClose'))) {        $x->{fh}->close()             or return retErr($x, $!);         delete $x->{fh};    }    return 1 ;}sub _rd2{    my $self      = shift ;    my $x         = shift ;    my $input     = shift;    my $output    = shift;            my $z = createSelfTiedObject($x->{Class}, *$self->{Error});        $z->_create($x->{Got}, 1, $input, @_)        or return undef ;    my $status ;    my $fh = $x->{fh};        while (1) {        while (($status = $z->read($x->{buff})) > 0) {            if ($fh) {                print $fh ${ $x->{buff} }                    or return $z->saveErrorString(undef, "Error writing to output file: $!", $!);                ${ $x->{buff} } = '' ;            }        }        if (! $x->{oneOutput} ) {            my $ot = $x->{outType} ;            if ($ot eq 'array')               { push @$output, $x->{buff} }            elsif ($ot eq 'hash')               { $output->{$input} = $x->{buff} }            my $buff = '';            $x->{buff} = \$buff;        }        last             unless *$self->{MultiStream};        $status = $z->nextStream();        last             unless $status == 1 ;    }    return $z->closeError(undef)        if $status < 0 ;    ${ *$self->{TrailingData} } = $z->trailingData()        if defined *$self->{TrailingData} ;    $z->close()         or return undef ;    return 1 ;}sub TIEHANDLE{    return $_[0] if ref($_[0]);    die "OOPS\n" ;}  sub UNTIE{    my $self = shift ;}sub getHeaderInfo{    my $self = shift ;    wantarray ? @{ *$self->{InfoList} } : *$self->{Info};}sub readBlock{    my $self = shift ;    my $buff = shift ;    my $size = shift ;    if (defined *$self->{CompressedInputLength}) {        if (*$self->{CompressedInputLengthRemaining} == 0) {            delete *$self->{CompressedInputLength};            *$self->{CompressedInputLengthDone} = 1;            return STATUS_OK ;        }        $size = min($size, *$self->{CompressedInputLengthRemaining} );        *$self->{CompressedInputLengthRemaining} -= $size ;    }        my $status = $self->smartRead($buff, $size) ;    return $self->saveErrorString(STATUS_ERROR, "Error Reading Data")        if $status < 0  ;    if ($status == 0 ) {        *$self->{Closed} = 1 ;        *$self->{EndStream} = 1 ;        return $self->saveErrorString(STATUS_ERROR, "unexpected end of file", STATUS_ERROR);    }    return STATUS_OK;}sub postBlockChk{    return STATUS_OK;}sub _raw_read{    # return codes    # >0 - ok, number of bytes read    # =0 - ok, eof    # <0 - not ok        my $self = shift ;    return G_EOF if *$self->{Closed} ;    #return G_EOF if !length *$self->{Pending} && *$self->{EndStream} ;    return G_EOF if *$self->{EndStream} ;    my $buffer = shift ;    my $scan_mode = shift ;    if (*$self->{Plain}) {        my $tmp_buff ;        my $len = $self->smartRead(\$tmp_buff, *$self->{BlockSize}) ;                return $self->saveErrorString(G_ERR, "Error reading data: $!", $!)                 if $len < 0 ;        if ($len == 0 ) {            *$self->{EndStream} = 1 ;        }        else {            *$self->{PlainBytesRead} += $len ;            $$buffer .= $tmp_buff;        }        return $len ;    }    if (*$self->{NewStream}) {        $self->gotoNextStream() > 0            or return G_ERR;        # For the headers that actually uncompressed data, put the        # uncompressed data into the output buffer.        $$buffer .=  *$self->{Pending} ;        my $len = length  *$self->{Pending} ;        *$self->{Pending} = '';        return $len;     }    my $temp_buf = '';    my $outSize = 0;    my $status = $self->readBlock(\$temp_buf, *$self->{BlockSize}, $outSize) ;    return G_ERR        if $status == STATUS_ERROR  ;    my $buf_len = 0;    if ($status == STATUS_OK) {        my $beforeC_len = length $temp_buf;        my $before_len = defined $$buffer ? length $$buffer : 0 ;        $status = *$self->{Uncomp}->uncompr(\$temp_buf, $buffer,                                    defined *$self->{CompressedInputLengthDone} ||                                                $self->smartEof(), $outSize);        return $self->saveErrorString(G_ERR, *$self->{Uncomp}{Error}, *$self->{Uncomp}{ErrorNo})            if $self->saveStatus($status) == STATUS_ERROR;        $self->postBlockChk($buffer, $before_len) == STATUS_OK            or return G_ERR;        $buf_len = length($$buffer) - $before_len;            *$self->{CompSize}->add($beforeC_len - length $temp_buf) ;        *$self->{InflatedBytesRead} += $buf_len ;        *$self->{TotalInflatedBytesRead} += $buf_len ;        *$self->{UnCompSize}->add($buf_len) ;        $self->filterUncompressed($buffer);        if (*$self->{Encoding}) {            $$buffer = *$self->{Encoding}->decode($$buffer);        }    }    if ($status == STATUS_ENDSTREAM) {        *$self->{EndStream} = 1 ;        $self->pushBack($temp_buf)  ;        $temp_buf = '';        my $trailer;        my $trailer_size = *$self->{Info}{TrailerLength} ;        my $got = 0;        if (*$self->{Info}{TrailerLength})        {            $got = $self->smartRead(\$trailer, $trailer_size) ;        }        if ($got == $trailer_size) {            $self->chkTrailer($trailer) == STATUS_OK                or return G_ERR;        }        else {            return $self->TrailerError("trailer truncated. Expected " .                                       "$trailer_size bytes, got $got")                if *$self->{Strict};            $self->pushBack($trailer)  ;        }        # TODO - if want to file file pointer, do it here        if (! $self->smartEof()) {            *$self->{NewStream} = 1 ;            if (*$self->{MultiStream}) {                *$self->{EndStream} = 0 ;                return $buf_len ;            }        }    }        # return the number of uncompressed bytes read    return $buf_len ;}sub reset{    my $self = shift ;    return *$self->{Uncomp}->reset();}sub filterUncompressed{}#sub isEndStream#{#    my $self = shift ;#    return *$self->{NewStream} ||#           *$self->{EndStream} ;#}sub nextStream{    my $self = shift ;    my $status = $self->gotoNextStream();    $status == 1        or return $status ;    *$self->{TotalInflatedBytesRead} = 0 ;    *$self->{LineNo} = $. = 0;    return 1;}sub gotoNextStream{    my $self = shift ;    if (! *$self->{NewStream}) {        my $status = 1;        my $buffer ;        # TODO - make this more efficient if know the offset for the end of        # the stream and seekable        $status = $self->read($buffer)             while $status > 0 ;        return $status            if $status < 0;    }    *$self->{NewStream} = 0 ;    *$self->{EndStream} = 0 ;    $self->reset();    *$self->{UnCompSize}->reset();    *$self->{CompSize}->reset();    my $magic = $self->ckMagic();    #*$self->{EndStream} = 0 ;    if ( ! $magic) {        if (! *$self->{Transparent} )        {            *$self->{EndStream} = 1 ;            return 0;        }        $self->clearError();        *$self->{Type} = 'plain';        *$self->{Plain} = 1;        $self->pushBack(*$self->{HeaderPending})  ;    }    else    {        *$self->{Info} = $self->readHeader($magic);        if ( ! defined *$self->{Info} ) {            *$self->{EndStream} = 1 ;            return -1;

⌨️ 快捷键说明

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