<?php if (!defined('PmWiki')) exit();
/*
	Download Manager 0.4
	download manager for PmWiki
	copyright (c) 2005/2006 Yuri Giuntoli (www.giuntoli.com)
    Internet Explorer fix applied by Dave Carver

	This PHP script is free software; you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation.

	This PHP script is NOT part of the standard PmWiki distribution.

	0.1 - 12.12.2005
		First implementation
	0.2 - 21.12.2005
		Public release
	0.2b - 16.01.2006
		Added a fix which may prevent some problems with multiple accesses.
	0.3 - 24.01.2006
		Reduced locking loop to 5 seconds.
		Changed creation of lock directory to lock file, to prevent problems with some providers.
    0.4 - 16.05.2007 - Dave Carver
        Fixed issue with Internet Explorer 6.0 not recognizing the files.  Only an IE problem.

*/


	define(DOWNLOADMANAGER, '0.3');

	SDV($DownloadManagerAction, 'downloadman');
	SDVA($HandleActions, array($DownloadManagerAction => 'HandleDownloadManager'));

	SDV($IMap['Download:'], '$1');
	SDV($LinkFunctions['Download:'], 'LinkDownloadManager');


	function HandleDownloadManager($pagename, $auth='read') {
		global $UploadFileFmt, $UploadExts, $DownloadDisposition, $WorkDir;

		SDV($DownloadDisposition, "inline");
		$page = RetrieveAuthPage($pagename, $auth, true, READPAGE_CURRENT);
		if (!$page) Abort("?cannot read $pagename");

		clearstatcache();

		$upname = MakeUploadName($pagename, @$_REQUEST['upname']);
		$filepath = FmtPageName("$UploadFileFmt/$upname", $pagename);
		if (!$upname || !file_exists($filepath)) {
			header("HTTP/1.0 404 Not Found");
			Abort("?requested file not found");
			exit();
		}

		$file = "$WorkDir/download.manager";
		$lock = "$WorkDir/download.manager.lock";
		while (file_exists($lock)) {
			$st = stat($lock);
			if ((time-$st['mtime'])>5) {
				//rmdir($lock);
				unlink($lock);
				break;
			}
		}

		$oldumask = umask(0);
		//mkdir($lock);
		touch($lock);
		fixperms($lock);

		if (file_exists($file)) {
			$Downloads = unserialize(file_get_contents($file));
			$Downloads[$filepath]++;
		} else {
			$Downloads[$filepath] = 1;
		}
		if ($fp = fopen($file,'w')) {
			fixperms($file);
			fputs($fp, serialize($Downloads));
			fclose($fp);
		}
		//rmdir($lock);
		unlink($lock);

		// Fix for Internet Explorer 6.0 or prior bug.
		header('Cache-Control: maxage=3600'); //Adjust maxage appropriately
		header('Pragma: public'); 
		
		preg_match('/\\.([^.]+)$/',$filepath,$match);
		if ($UploadExts[@$match[1]]) 
			header("Content-Type: {$UploadExts[@$match[1]]}");
		header("Content-Length: ".filesize($filepath));
		header("Content-disposition: $DownloadDisposition; filename=$upname");
		$fp = fopen($filepath, "r");
		if ($fp) {
			while (!feof($fp)) echo fread($fp, 4096);
			fclose($fp);
		}
		umask($oldumask);
		exit();
	}

	function LinkDownloadManager($pagename, $imap, $path, $title, $txt, $fmt=NULL) {
		global $FmtV, $UploadFileFmt, $LinkUploadCreateFmt, $UploadUrlFmt, $WorkDir,
			$UploadPrefixFmt, $EnableDirectDownload, $DownloadManagerAction;

		if (preg_match('!^(.*)/([^/]+)$!', $path, $match)) {
			$pagename = MakePageName($pagename, $match[1]);
			$path = $match[2];
		}
		$upname = MakeUploadName($pagename, $path);
		$filepath = FmtPageName("$UploadFileFmt/$upname", $pagename);
		$FmtV['$LinkUpload'] = 
			FmtPageName("\$PageUrl?action=upload&amp;upname=$upname", $pagename);
		$FmtV['$LinkText'] = $txt;
		if (!file_exists($filepath)) return FmtPageName($LinkUploadCreateFmt, $pagename);
		$path = PUE(FmtPageName("\$PageUrl?action=$DownloadManagerAction&amp;upname=$upname", $pagename));

		$file = "$WorkDir/download.manager";
		if (file_exists($file)) {
			$Downloads = unserialize(file_get_contents($file));
			if (!$Downloads[$filepath]) $Downloads[$filepath] = 0;
		} else {
			$Downloads[$filepath] = 0;
		}

		$fmt = "<a class='urllink' href='\$LinkUrl'>\$LinkText</a> ";

		return LinkIMap($pagename, $imap, $path, $title, $txt, $fmt);
	}

?>