<?
/*
HPE - News Portal Engine
Copyright (C) 2000-2001 Mike Krus
This program is free software; it is distributed in the hope
that it will be useful, but WITHOUT ANY WARRANTY; without
even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE.
READ LICENSE.TXT IN THE BASE DIRECTORY FOR INFORMATION
ABOUT REDISTRIBUTING THIS SOURCE CODE
*/
require_once "$HPEinc/xmltree.inc";
////// ACCESS CATEGORY INFORMATION /////
class HPECatInfo
{
var $catsbyid;
var $catsbyname;
var $dmoz;
function HPECatInfo()
{
$this->catsbyid = array();
$this->catsbyname = array();
$this->dmoz = array();
}
function localize()
{
global $HPEstrings;
reset($this->catsbyid);
while (list ($key, $val) = each ($this->catsbyid))
{
if(!isset($HPEstrings["cat$key"])) continue;
$this->catsbyid[$key]["name"] = $HPEstrings["cat$key"];
}
reset($this->catsbyname);
while (list ($key, $val) = each ($this->catsbyname))
{
$this->catsbyname[$key]["name"] = $this->catsbyid[$val["id"]]["name"];
}
}
function SubCatNav($parent, $level, $selected, $displayfct, $displayfctparam)
{
global $HPECatContainer;
$displayfct($parent, $HPECatContainer->catsbyid[$parent]["name"], $level,
($selected != -1 && $parent == $selected), $displayfctparam);
$n = count($HPECatContainer->cattree[$parent]);
for($i=0; $i<$n; $i++)
$this->SubCatNav($HPECatContainer->cattree[$parent][$i], $level + 1,
$selected, $displayfct, $displayfctparam);
}
function CatNav($displayfct, $displayfctparam = "", $selected = -1)
{
global $HPECatContainer;
$n = count($HPECatContainer->catsbyname);
for($i=0; $i<$n; $i++) {
if($HPECatContainer->catsbyname[$i]["parent"] != -1) continue;
$this->SubCatNav($HPECatContainer->catsbyname[$i]["id"], 0,
$selected, $displayfct, $displayfctparam);
}
}
function GetName($id)
{
global $HPECatContainer;
if(isset($HPECatContainer->catsbyid[$id]))
return $HPECatContainer->catsbyid[$id]["name"];
return "Unknown";
}
function GetDMOZ($id)
{
global $HPECatContainer;
if(isset($HPECatContainer->dmoz[$id]))
return $HPECatContainer->dmoz[$id];
return "";
}
function GetPath($id)
{
global $HPECatContainer;
$res = array( );
while(1)
{
if(isset($HPECatContainer->catsbyid[$id]))
$res[] = array( "name" => $HPECatContainer->catsbyid[$id]["name"], "id" => $id );
$id = $HPECatContainer->catsbyid[$id]["parent"];
if($id == -1) break;
}
return array_reverse($res);
}
function GetSubCats($id, $max = 0)
{
global $HPECatContainer;
if(!isset($HPECatContainer->catsbyid[$id])) return array();
if($max == 0) $max = count($HPECatContainer->cattree[$id]);
$res = array( );
for($i=0; $i<$max; $i++)
$res[] = $HPECatContainer->cattree[$id][$i];
return $res;
}
function GetParent($id)
{
global $HPECatContainer;
if(isset($HPECatContainer->catsbyid[$id]))
return $HPECatContainer->catsbyid[$id]["parent"];
return -1;
}
};
function HPEBuildCats(&$xmltree, &$container, $parent, $path)
{
$i = 1;
while(1)
{
$lpath = $path . "/outline($i)";
if(!isset($container->cattree[$parent]))
$container->cattree[$parent] = array();
$cat = $xmltree->getAttribute($lpath, "id");
if($cat == "") break;
$name = $xmltree->getAttribute($lpath, "text");
$dmoz = $xmltree->getAttribute($lpath, "dmoz");
$container->cattree[$parent][] = $cat;
$container->catsbyid[$cat] = array( "parent" => $parent, "name" => $name );
$container->catsbyname[] = array( "name" => $name, "id" => $cat, "parent" => $parent );
$container->dmoz[$cat] = $dmoz;
HPEBuildCats($xmltree, $container, $cat, $lpath);
$i++;
}
}
$dfile = $HPEinc . "/xml/categories.opml";
if(!file_exists($dfile))
die("No category listing file $dfile");
$cfile = "$HPEtheConfig->cachepath/$HPEtheDB->dbtnewssites/categories.spd";
$HPECatContainer = "";
if(file_exists($cfile) && (filemtime($cfile) > filemtime($dfile)))
{
if($cf = fopen($cfile, "r"))
{
$sdata = fread($cf, filesize($cfile));
fclose($cf);
$HPECatContainer = unserialize($sdata);
}
}
if($HPECatContainer == "")
{
$HPECatContainer = new HPECatInfo();
$xmltree = new XMLtree;
if ($err = $xmltree->parse($dfile))
die("Failed to parse XML: $err");
HPEBuildCats($xmltree, $HPECatContainer, 0, "/opml(1)/body(1)");
$HPECatContainer->catsbyname[] = array( "name" => "Unknown", "id" => 0, "parent" => -1);
$HPECatContainer->catsbyid[0] = array( "parent" => -1, "name" => "Unknown" );
if($cf = fopen($cfile, "w"))
{
$sdata = serialize($HPECatContainer);
fwrite($cf, $sdata, strlen($sdata));
fclose($cf);
}
else HPEWatchdog("error", "Failed to write file '$cfile'");
$result = $HPEtheDB->query("DELETE FROM $HPEtheDB->dbtnewscats");
if(!$HPEtheDB->iserror($result))
{
foreach($HPECatContainer->catsbyid as $key => $val)
{
if($key)
$HPEtheDB->query("INSERT INTO $HPEtheDB->dbtnewscats (catid, parentid, title) VALUES " .
"($key, " . $val["parent"] . ", " . $HPEtheDB->escapestring($val["name"]) . ")");
}
}
}
$HPECatContainer->localize();
////// ACCESS NEWS FEED INFORMATION /////
function HPELoadNewsItem($aid, &$title, &$link, &$desc, &$source)
{
global $HPEtheDB;
$row = $HPEtheDB->one_array("SELECT * FROM $HPEtheDB->dbtnewsitems WHERE newsid=$aid;");
if($row) {
$link = $row["newslink"];
$title = $row["newsitem"];
$source = $row["source"];
$desc = $row["description"];
return true;
} else return false;
}
function HPELoadCustomNews(&$data, $agent, $maxitems)
{
global $HPEtheConfig;
$cfn = "$HPEtheConfig->cachepath/$agent.spd";
if(file_exists($cfn))
{
$cf = fopen($cfn, "r");
if($cf)
{
$data = unserialize(fread($cf, filesize($cfn)));
fclose($cf);
return $data["itemcount"];
}
}
$data = array(
"title" => "Non Available",
"description" => "",
"link" => $HPEtheConfig->siteroot,
"items" => array(),
"itemcount" => 0
);
return 0;
}
function HPELoadSingleNews(&$data, $id)
{
global $HPEtheConfig;
global $HPEtheDB;
global $HPECatContainer;
$cache = "$HPEtheConfig->cachepath/$HPEtheDB->dbtnewssites/";
$cache .= sprintf("%03d", ($id % 100));
$cache .= "/$id.spd";
if(!file_exists($cache))
{
$data = array();
// HPEWatchdog("parser", "Failed to find cache file '$cache' for source $id");
return 0;
}
$cf = fopen($cache, "r");
if($cf)
{
$sdata = fread($cf, filesize($cache));
fclose($cf);
$data = unserialize($sdata);
$data["dmoz"] = $HPECatContainer->dmoz[$data["category"]];
return $data["itemcount"];
}
return 0;
}
function HPELoadMultiNews(&$data, $id, $maxitems, $sort = 1, $level = 0)
{
global $HPEtheConfig;
$data = array();
$data["items"] = array();
$sources = array();
$nid = count($id);
$nitems = 0;
for($i=0; $i<$nid; $i++)
{
HPELoadSingleNews($srcdata, $id[$i]);
if(count($srcdata) == 0)
continue;
if($srcdata["flags"] & HPENewsDisable)
continue;
if($srcdata["level"] > $level)
continue;
if($srcdata["itemcount"])
{
$sources[] = $srcdata["title"];
for($j = 0; $j<$srcdata["itemcount"]; $j++)
{
$data["items"][$nitems] = $srcdata["items"][$j];
$data["items"][$nitems]["sourcelink"] = $srcdata["link"];
$data["items"][$nitems]["sourcetitle"] = $srcdata["title"];
$data["items"][$nitems]["sourceid"] = $id[$i];
$nitems++;
// if(!$sort && $maxitems && $nitems >= $maxitems) break;
}
}
// if(!$sort && $maxitems && $nitems >= $maxitems) break;
}
if($sort)
{
for($i=1; $i<$nitems; ++$i)
{
for($j=0; $j<$i; ++$j)
{
if($data["items"][$i]["date"] > $data["items"][$j]["date"])
{
$t = $data["items"][$i];
$data["items"][$i] = $data["items"][$j];
$data["items"][$j] = $t;
}
}
}
/*
if($maxitems && $maxitems < $nitems)
{
for($i=$maxitems; $i<$nitems; $i++)
unset($data["items"][$i]);
$nitems = $maxitems;
}
*/
}
if($maxitems && $maxitems < $nitems)
{
$data["items"] = array_splice($data["items"], 0, $maxitems);
$nitems = count($data["items"]);
}
if($nitems) $data["date"] = $data["items"][0]["date"];
else $data["date"] = time();
$data["title"] = $HPEtheConfig->sitename . " Aggregated Feed";
$data["link"] = $HPEtheConfig->siteurl;
$data["description"] = implode(" - ", $sources);
$data["itemcount"] = $nitems;
return $nitems;
}
function HPELoadCatNews(&$result, $cat, $maxitems, $excludes, $languages, $flagexcluded = 0, $level = 0)
{
global $HPEinc;
global $HPEtheConfig;
global $HPEtheDB;
if($maxitems == 0)
$maxitems = 200;
$newscats = new HPECatInfo();
$result = array();
$result["items"] = array();
$result["itemcount"] = 0;
$result["cat"] = $cat;
$result["catlink"] = $HPEtheConfig->siteurl . "source/browse/$cat/";
$result["catname"] = $newscats->GetName($cat);
$cache = "$HPEtheConfig->cachepath/NewsCat$cat.spd";
if(!file_exists($cache))
return 0;
$cf = fopen($cache, "r");
if($cf == 0)
return 0;
$data = fread($cf, filesize($cache));
fclose($cf);
$result = unserialize($data);
$result["cat"] = $cat;
$ic = 0;
$sites = array();
reset($result["items"]);
foreach($result["items"] as $key => $val)
// while (list ($key, $val) = each ($result["items"]))
{
if(!isset($sites[$val["sourceid"]]))
{
HPELoadSingleNews($srcdata, $val["sourceid"]);
$sites[$val["sourceid"]] = array (
"name" => $srcdata["title"],
"id" => $val["sourceid"],
"lang" => $srcdata["language"],
"link" => $srcdata["link"],
"level" => $srcdata["level"],
"flags" => $srcdata["flags"],
"cat" => $srcdata["category"]
);
}
if($sites[$val["sourceid"]]["flags"] & HPENewsDisable)
{
unset($result["items"][$key]);
continue;
}
if($sites[$val["sourceid"]]["level"] > $level)
{
unset($result["items"][$key]);
continue;
}
if($languages != "")
if(ereg("^$languages\$", $sites[$val["sourceid"]]["lang"]))
{
unset($result["items"][$key]);
continue;
}
if($excludes != "")
if(ereg("^$excludes\$", $val["sourceid"]))
if($flagexcluded)
{
$data[$i]["x"] = 1;
$ic--;
}
else
{
unset($result["items"][$key]);
continue;
}
$ic++;
if($ic > $maxitems)
{
$result["items"] = array_splice($result["items"], $ic);
$result["itemcount"] = count($result["items"]);
return $result["itemcount"];
}
}
$result["itemcount"] = count($result["items"]);
/*
echo "<pre>";
print_r($result);
die("</pre>");
*/
return $result["itemcount"];
}
function HPELoadArchives(&$data, $source)
{
global $HPEtheConfig;
global $HPEtheDB;
$cfn = "$HPEtheConfig->cachepath/$HPEtheDB->dbtnewssites/" . sprintf("%03d", ($source % 100)) . "/$source.archive.spd";
if(file_exists($cfn))
{
$lastmod = $HPEtheDB->one_data("SELECT lastmod FROM $HPEtheDB->dbtnewsupdates WHERE id=$source");
if($lastmod < filemtime($cfn))
{
$cf = fopen($cfn, "r");
if($cf)
{
$data = unserialize(fread($cf, filesize($cfn)));
fclose($cf);
return $data["itemcount"];
}
}
}
HPELoadSingleNews($data, $source);
if(count($data) == 0 || $data["flags"] & HPENewsDisable)
return 0;
$data["items"] = array();
$ndx = 0;
for($i=0; $i<7; $i++)
{
$result = $HPEtheDB->query("SELECT * FROM $HPEtheDB->dbtnewsitems$i WHERE source=$source");
if(!$HPEtheDB->iserror($result))
{
while($row = $HPEtheDB->getrow($result))
{
$date = 0;
if(preg_match("%([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})%", $row["adddate"], $matches))
{
$date = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
}
$data["items"][$ndx] = array(
"title" => $row["newsitem"],
"desc" => $row["description"],
"date" => $date,
"link" => $row["newslink"],
"id" => "-$i," . $row["newsid"],
"sourcetitle" => $srcdata["title"],
"sourceid" => $source,
"sourcelink" => $srcdata["link"]
);
$ndx++;
}
}
}
$data["itemcount"] = $ndx;
for($i=1; $i<$ndx; ++$i)
{
for($j=0; $j<$i; ++$j)
{
if($data["items"][$i]["date"] > $data["items"][$j]["date"])
{
$t = $data["items"][$i];
$data["items"][$i] = $data["items"][$j];
$data["items"][$j] = $t;
}
}
}
$cf = fopen($cfn, "w");
if($cf)
{
$sdata = serialize($data);
fwrite($cf, $sdata, strlen($sdata));
fclose($cf);
}
return $ndx;
}
?>