#!/usr/bin/perl
#↑Perlのパスをサーバに合わせて記述。


package AppsPage::Gifcnt::Counter;
my $define = {};


#++++++++++++++++++++++++++++#
# 目次             
#++++++++++++++++++++++++++++#
# １：基本設定
# ２：設置環境設定
#++++++++++++++++++++++++++++#




#【１：基本設定】
#-----------------------------------------------------------------------------#


# ■ファイルロック方法
# '0' mkdir関数  / flock関数が使えないサーバ専用
# '1' flock関数  / *標準
# '2' ロックしない
$define->{'LOCK_METHOD'} = '1';


# ※基本的な設定はここまで。


#【２：設置環境設定】
#-----------------------------------------------------------------------------#
#
# 以下のの設定項目で、セキュリティ強化や、設置環境特有の状態に変更できますが、
# 分からない場合、変更しない方が無難です。
#


# ▼ディレクトリ構成（ファイル構成図参照）
# ■ライブラリディレクトリ（このファイルからのパス）
# ※２項目とも同じ設定
$define->{'LIB_DIR'} = 'lib/';

# ■データ記録ディレクトリ（このファイルからのパス）
$define->{'DATA_DIR'} = 'data/';

# ■ロックディレクトリ（このファイルからのパス）
$define->{'LOCK_DIR'} = 'lock/';

# ■作業用ディレクトリ（このファイルからのパス）
# 通常、データ記録ディレクトリと同じ。
$define->{'TMP_DIR'} = 'data/';

# ■画像用ディレクトリ（このファイルからのパス）
$define->{'IMG_DIR'} = 'imgs/';


# ▼セキュリティ強化
# ■suExec環境オプション（'0'#標準 / '1' suExec環境限定）
# '0'#標準の場合、データファイルパーミッションは常に666です。
# '1'を設定した場合、更新時、元のパーミッションを引継ぐか、644です。
# ※分からない方、suExec環境でない方は、『絶対に』変更しないで下さい。
$define->{'SU_MODE'} = '0';


# ▼flock関数の因数（通常変更不要）
# ■排他ロック
$define->{'LOCK_EX'} = '2';

# ■アンロック
$define->{'LOCK_UN'} = '8';




#=============================================================================#
#
# これ以下は、変更の必要ありません。
#
#=============================================================================#


sub new { return bless $define; }




# ↓主な処理
#-----------------------------------------------------------------------------#
package AppsPage::Gifcnt::Counter::Countup;


#use strict;
my $this = new();
$this->start;
$this->stop;


sub new {
	my $this = new AppsPage::Gifcnt::Counter::;
	return bless $this;
}


# →処理開始
sub start {
	my $this = shift;
	
	
	#基本的なライブラリ
	require($this->{'LIB_DIR'}.'modus/OO.cgi');
	require($this->{'LIB_DIR'}.'modus/TytiCnt2.cgi');
	require($this->{'LIB_DIR'}.'modus/Filelock.cgi');
	require($this->{'LIB_DIR'}.'modus/gifcat.pl');
	
	
	#ファイルロック
	$this->{'lock'} = new AppsPage::Gifcnt::Filelock::(
		$this->{'LOCK_METHOD'},
		$this->{'LOCK_DIR'},
		'flock',
		$this->{'LOCK_EX'},
		1,
		$this->{'LOCK_UN'}
	);
	
	
	#カウンタ
	$this->{'counter'} = new AppsPage::Gifcnt::TytiCnt2::(
		$this->{'DATA_DIR'}.'counter.cgi',
	);
	
	
	########## 区切 ##########
	
	
	my $check;
	#カウンタの処理
	if( $this->{'lock'}->lock('EX') ) {
		$check = $this->{'counter'}->doCount;
		if( $check eq 2) {
			#日付更新
			require($this->{'LIB_DIR'}.'mode/m_cntupd.cgi');
			if( !$this->doUpdate ) { $this->error(''); }
		}
		$this->{'lock'}->unlock;
	}
	else { $this->error(''); }
	
	
	########## 区切 ##########
	
	#カウンタ出力
	if($check) {
		my $i;
		my @giffiles;
		my( $total_fig ) = $this->{'counter'}->{'result'}->{'info'};
		my $total = $this->{'counter'}->{'result'}->{'total'};
		$total = sprintf('%0'.$total_fig.'d',$total);
		
		for ( $i = 0; $i < length($total); $i++ ) {
			push @giffiles, $this->{'IMG_DIR'}.substr($total,$i,1).'.gif';
		}
		
		
		$this->outHeader;
		print gifcat::gifcat(@giffiles);
	}
	#エラー出力
	else { $this->error(''); }
}


# →HTTPヘッダ
sub outHeader {
	my $this = shift;
	
	wait;###
	
	if( $ENV{'SCRIPT_NAME'} =~ /nph\-[^\/\\]+$/ || 
		( $ENV{'MOD_PERL'} && $ENV{'PERL_SEND_HEADER'} ne 'On' )
	) {
		print "HTTP/1.1 200 OK\n";
	}
	print "Pragma: no-cache\r\n";
	print "Cache-Control: no-cache\r\n";
	print "Expires: -1\r\n";
	print "Content-Type: image/gif\r\n";
	print "\r\n";
	binmode( STDOUT);
}


# →終了
sub stop {
	my $this = shift;
	$this->{'lock'}->unlock;
	exit(0);
}




# →エラー
sub error {
	my $this = shift;
	$this->{'lock'}->unlock;
	$this->outHeader;
	open(ERRIMG,'<'.$this->{'LIB_DIR'}.'data/error.gif');
	binmode( ERRIMG );
	while(<ERRIMG>) { print $_; }
	close(ERRIMG);
	$this->stop;
}




0;
