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

📄 base.pm

📁 视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.
💻 PM
📖 第 1 页 / 共 2 页
字号:
package IO::Compress::Base ;require 5.004 ;use strict ;use warnings;use IO::Compress::Base::Common 2.008 ;use IO::File ;use Scalar::Util qw(blessed readonly);#use File::Glob;#require Exporter ;use Carp ;use Symbol;use bytes;our (@ISA, $VERSION);@ISA    = qw(Exporter IO::File);$VERSION = '2.008';#Can't locate object method "SWASHNEW" via package "utf8" (perhaps you forgot to load "utf8"?) at .../ext/Compress-Zlib/Gzip/blib/lib/Compress/Zlib/Common.pm line 16.sub saveStatus{    my $self   = shift ;    ${ *$self->{ErrorNo} } = shift() + 0 ;    ${ *$self->{Error} } = '' ;    return ${ *$self->{ErrorNo} } ;}sub saveErrorString{    my $self   = shift ;    my $retval = shift ;    ${ *$self->{Error} } = shift ;    ${ *$self->{ErrorNo} } = shift() + 0 if @_ ;    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 writeAt{    my $self = shift ;    my $offset = shift;    my $data = shift;    if (defined *$self->{FH}) {        my $here = tell(*$self->{FH});        return $self->saveErrorString(undef, "Cannot seek to end of output filehandle: $!", $!)             if $here < 0 ;        seek(*$self->{FH}, $offset, SEEK_SET)            or return $self->saveErrorString(undef, "Cannot seek to end of output filehandle: $!", $!) ;        defined *$self->{FH}->write($data, length $data)            or return $self->saveErrorString(undef, $!, $!) ;        seek(*$self->{FH}, $here, SEEK_SET)            or return $self->saveErrorString(undef, "Cannot seek to end of output filehandle: $!", $!) ;    }    else {        substr(${ *$self->{Buffer} }, $offset, length($data)) = $data ;    }    return 1;}sub output{    my $self = shift ;    my $data = shift ;    my $last = shift ;    return 1         if length $data == 0 && ! $last ;    if ( *$self->{FilterEnvelope} ) {        *_ = \$data;        &{ *$self->{FilterEnvelope} }();    }    if ( defined *$self->{FH} ) {        defined *$self->{FH}->write( $data, length $data )          or return $self->saveErrorString(0, $!, $!);     }    else {        ${ *$self->{Buffer} } .= $data ;    }    return 1;}sub getOneShotParams{    return ( 'MultiStream' => [1, 1, Parse_boolean,   1],           );}sub checkParams{    my $self = shift ;    my $class = shift ;    my $got = shift || IO::Compress::Base::Parameters::new();    $got->parse(        {            # Generic Parameters            'AutoClose' => [1, 1, Parse_boolean,   0],            #'Encode'    => [1, 1, Parse_any,       undef],            'Strict'    => [0, 1, Parse_boolean,   1],            'Append'    => [1, 1, Parse_boolean,   0],            'BinModeIn' => [1, 1, Parse_boolean,   0],            'FilterEnvelope' => [1, 1, Parse_any,   undef],            $self->getExtraParams(),            *$self->{OneShot} ? $self->getOneShotParams()                               : (),        },         @_) or $self->croakError("${class}: $got->{Error}")  ;    return $got ;}sub _create{    my $obj = shift;    my $got = shift;    *$obj->{Closed} = 1 ;    my $class = ref $obj;    $obj->croakError("$class: Missing Output parameter")        if ! @_ && ! $got ;    my $outValue = shift ;    my $oneShot = 1 ;    if (! $got)    {        $oneShot = 0 ;        $got = $obj->checkParams($class, undef, @_)            or return undef ;    }    my $lax = ! $got->value('Strict') ;    my $outType = whatIsOutput($outValue);    $obj->ckOutputParam($class, $outValue)        or return undef ;    if ($outType eq 'buffer') {        *$obj->{Buffer} = $outValue;    }    else {        my $buff = "" ;        *$obj->{Buffer} = \$buff ;    }    # Merge implies Append    my $merge = $got->value('Merge') ;    my $appendOutput = $got->value('Append') || $merge ;    *$obj->{Append} = $appendOutput;    *$obj->{FilterEnvelope} = $got->value('FilterEnvelope') ;    if ($merge)    {        # Switch off Merge mode if output file/buffer is empty/doesn't exist        if (($outType eq 'buffer' && length $$outValue == 0 ) ||            ($outType ne 'buffer' && (! -e $outValue || (-w _ && -z _))) )          { $merge = 0 }    }    # If output is a file, check that it is writable    if ($outType eq 'filename' && -e $outValue && ! -w _)      { return $obj->saveErrorString(undef, "Output file '$outValue' is not writable" ) }    if ($got->parsed('Encode')) {         my $want_encoding = $got->value('Encode');        *$obj->{Encoding} = getEncoding($obj, $class, $want_encoding);    }    $obj->ckParams($got)        or $obj->croakError("${class}: " . $obj->error());    $obj->saveStatus(STATUS_OK) ;    my $status ;    if (! $merge)    {        *$obj->{Compress} = $obj->mkComp($class, $got)            or return undef;                *$obj->{UnCompSize} = new U64 ;        *$obj->{CompSize} = new U64 ;        if ( $outType eq 'buffer') {            ${ *$obj->{Buffer} }  = ''                unless $appendOutput ;        }        else {            if ($outType eq 'handle') {                *$obj->{FH} = $outValue ;                setBinModeOutput(*$obj->{FH}) ;                $outValue->flush() ;                *$obj->{Handle} = 1 ;                if ($appendOutput)                {                    seek(*$obj->{FH}, 0, SEEK_END)                        or return $obj->saveErrorString(undef, "Cannot seek to end of output filehandle: $!", $!) ;                }            }            elsif ($outType eq 'filename') {                    my $mode = '>' ;                $mode = '>>'                    if $appendOutput;                *$obj->{FH} = new IO::File "$mode $outValue"                     or return $obj->saveErrorString(undef, "cannot open file '$outValue': $!", $!) ;                *$obj->{StdIO} = ($outValue eq '-');                 setBinModeOutput(*$obj->{FH}) ;            }        }        *$obj->{Header} = $obj->mkHeader($got) ;        $obj->output( *$obj->{Header} )            or return undef;    }    else    {        *$obj->{Compress} = $obj->createMerge($outValue, $outType)            or return undef;    }    *$obj->{Closed} = 0 ;    *$obj->{AutoClose} = $got->value('AutoClose') ;    *$obj->{Output} = $outValue;    *$obj->{ClassName} = $class;    *$obj->{Got} = $got;    *$obj->{OneShot} = 0 ;    return $obj ;}sub ckOutputParam {    my $self = shift ;    my $from = shift ;    my $outType = whatIsOutput($_[0]);    $self->croakError("$from: output parameter not a filename, filehandle or scalar ref")        if ! $outType ;    $self->croakError("$from: output filename is undef or null string")        if $outType eq 'filename' && (! defined $_[0] || $_[0] eq '')  ;    $self->croakError("$from: output buffer is read-only")        if $outType eq 'buffer' && readonly(${ $_[0] });        return 1;    }sub _def{    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 ;    $x->{Got} = $got ;#    if ($x->{Hash})#    {#        while (my($k, $v) = each %$input)#        {#            $v = \$input->{$k} #                unless defined $v ;##            $obj->_singleTarget($x, 1, $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, 1, $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, $inFile, $in, \$out, @_)                or return undef ;            push @$output, \$out ;            #if ($x->{outType} eq 'array')            #  { push @$output, \$out }            #else            #  { $output->{$in} = \$out }        }        return 1 ;    }    # finally the 1 to 1 and n to 1    return $obj->_singleTarget($x, 1, $input, $output, @_);    croak "should not be here" ;}sub _singleTarget{    my $obj             = shift ;    my $x               = shift ;    my $inputIsFilename = shift;    my $input           = shift;        if ($x->{oneInput})    {        $obj->getFileInfo($x->{Got}, $input)            if isaFilename($input) and $inputIsFilename ;        my $z = $obj->_create($x->{Got}, @_)            or return undef ;        defined $z->_wr2($input, $inputIsFilename)             or return $z->closeError(undef) ;        return $z->close() ;    }    else    {        my $afterFirst = 0 ;        my $inputIsFilename = ($x->{inType} ne 'array');        my $keep = $x->{Got}->clone();        #for my $element ( ($x->{inType} eq 'hash') ? keys %$input : @$input)        for my $element ( @$input)        {            my $isFilename = isaFilename($element);            if ( $afterFirst ++ )            {                defined addInterStream($obj, $element, $isFilename)                    or return $obj->closeError(undef) ;            }            else            {                $obj->getFileInfo($x->{Got}, $element)                    if $isFilename;                $obj->_create($x->{Got}, @_)                    or return undef ;            }            defined $obj->_wr2($element, $isFilename)                 or return $obj->closeError(undef) ;            *$obj->{Got} = $keep->clone();        }        return $obj->close() ;    }}sub _wr2{    my $self = shift ;    my $source = shift ;    my $inputIsFilename = shift;    my $input = $source ;    if (! $inputIsFilename)    {        $input = \$source             if ! ref $source;    }    if ( ref $input && ref $input eq 'SCALAR' )    {        return $self->syswrite($input, @_) ;    }    if ( ! ref $input  || isaFilehandle($input))    {        my $isFilehandle = isaFilehandle($input) ;        my $fh = $input ;        if ( ! $isFilehandle )        {            $fh = new IO::File "<$input"                or return $self->saveErrorString(undef, "cannot open file '$input': $!", $!) ;        }        binmode $fh if *$self->{Got}->valueOrDefault('BinModeIn') ;        my $status ;        my $buff ;        my $count = 0 ;        while (($status = read($fh, $buff, 16 * 1024)) > 0) {            $count += length $buff;            defined $self->syswrite($buff, @_)                 or return undef ;        }        return $self->saveErrorString(undef, $!, $!)             if $status < 0 ;        if ( (!$isFilehandle || *$self->{AutoClose}) && $input ne '-')        {                $fh->close() 

⌨️ 快捷键说明

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