parser = xml_parser_create(); } // end func /** boolean parse(void) parses a XML file */ function parse() { if (!$this->testLock()) { // prevent html caching $_GLOBALS['bFeedError'] = true; return false; } // set the handlers xml_set_object($this->parser, $this); xml_set_element_handler($this->parser, 'startHandler', 'endHandler'); xml_set_character_data_handler($this->parser, 'cdataHandler'); if (!is_resource($this->fp)) { $this->createLock(); return false; } while ($data = fread($this->fp, 2048)) { $err = xml_parse($this->parser, $data); if (!$err) { fclose($this->fp); return $err; } } fclose($this->fp); // free the parser resource xml_parser_free($this->parser); return true; } // end func /** void startHandler (obj , str , arr) Event handler called by the expat library when an element's begin tag is encountered. */ function startHandler($parser, $sTag, $arAttr) { // Start with empty sData string. $this->sData = ''; // Put each attribute into the Data array. foreach ($arAttr as $Key=> $Val) { $this->arAtribute["$sTag:$Key"] = trim($Val); } } /** void cdataHandler (obj, str) Event handler called by the expat library when Character Data are encountered. */ function cdataHandler($parser, $sTag) { $this->sData .= $sTag; } /** void endHandler (obj, str) Event handler called by the expat library when an element's end tag is encountered. */ function endHandler($parser, $sTag) { static $MODE, $ASIN, $PRODUCTNAME, $CATALOG, $AUTHORS, $ARTISTS, $STARRING, $DIRECTORS, $THEATRICALRELEASEDATE, $RELEASEDATE, $MANUFACTURER, $IMAGEURLSMALL, $IMAGEURLMEDIUM, $IMAGEURLLARGE, $LISTPRICE, $OURPRICE, $USEDPRICE, $REFURBISHEDPRICE, $THIRDPARTYNEWPRICE, $SALESRANK, $LISTS, $TRACKS, $BROWSELIST, $MEDIA, $NUMMEDIA, $ISBN, $FEATURES, $MPAARATING, $PLATFORM, $AVAILABILITY, $UPC, $ACCESSORIES, $PRODUCTDESCRIPTION, $REVIEWS, $THIRDPARTYPRODUCTINFO, $AVGCUSTOMERRATING, $CUSTOMERREVIEW, $THIRDPARTYPRODUCTDETAILS, $SIMILARPRODUCTS, $TOTALRESULTS, $DETAILPAGEURL ; // put the $this->sData into a string. $sData = $this->sData; switch (strtoupper ($sTag)) { case 'ACTOR': // build the list $STARRING[] = $sData; break; case 'URL': $IMAGEURLSMALL = $sData; break; case 'TITLE': $PRODUCTNAME = $sData; break; case 'ARTIST': // build the list $ARTISTS[] = $sData; break; case 'DIRECTOR': // build the list $DIRECTORS[] = $sData; break; case 'AUTHOR': // build the Authors list $AUTHORS .= ($AUTHORS?', ':'') . $sData; break; case 'LISTID': // build the list $LISTS[] = $sData; break; case 'TRACK': // build the list $TRACKS[] = $sData; break; case 'BROWSENAME': // build the list $BROWSELIST[] = $sData; break; case 'FEATURE': // build the list $FEATURES[] = $sData; break; case 'ACCESSORY': // build the list $ACCESSORIES[] = $sData; break; case 'PRODUCT': // build the list $SIMILARPRODUCTS[] = $sData; break; case 'PUBLICATIONDATE': $RELEASEDATE = $sData; break; case 'AVGCUSTOMERRATING': // build the list $AVGCUSTOMERRATING = $sData; break; case 'CUSTOMERREVIEW': // build the list $REVIEWS[] = $CUSTOMERREVIEW; break; case 'THIRDPARTYPRODUCTDETAILS': // build the list $THIRDPARTYPRODUCTINFO[] = $THIRDPARTYPRODUCTDETAILS; break; case 'SELLERID': case 'SELLERNICKNAME': case 'EXCHANGEID': case 'OFFERINGPRICE': case 'CONDITION': case 'CONDITIONTYPE': case 'EXCHANGEAVAILABILITY': case 'SELLERCOUNTRY': case 'SELLERSTATE': case 'SELLERRATING': // build the list $THIRDPARTYPRODUCTDETAILS[$sTag] = $sData; break; case 'RATING': // build the list $CUSTOMERREVIEW['Rating'] = $sData; break; case 'SUMMARY': // build the list $CUSTOMERREVIEW['Summary'] = $sData; break; case 'COMMENT': // build the list $CUSTOMERREVIEW['Comment'] = $sData; break; case 'ASIN': case 'MODE': case 'CATALOG': case 'THEATRICALRELEASEDATE': case 'MPAARATING': case 'MANUFACTURER': case 'IMAGEURLMEDIUM': case 'IMAGEURLLARGE': case 'LISTPRICE': case 'OURPRICE': case 'USEDPRICE': case 'REFURBISHEDPRICE': case 'THIRDPARTYNEWPRICE': case 'SALESRANK': case 'MEDIA': case 'PRODUCTDESCRIPTION': case 'NUMMEDIA': case 'ISBN': case 'PLATFORM': case 'AVAILABILITY': case 'UPC': case 'DETAILPAGEURL': $$sTag = $sData; break; case 'ERRORMSG': // if this is a global error, avoid caching the module if (!$this->iNumResults) { global $bParseError; $bParseError = true; } break; case 'ITEMATTRIBUTES': // offer some details $sBookUrl = PRODUCT_DETAIL_URL . $ASIN; if (!$this->stop) { //Details finished require($this->sTemplate); } // empty the product related information $STARRING= array (); $ARTISTS= array (); $DIRECTORS= array (); $AUTHORS = ''; $REVIEWS = array (); $THIRDPARTYPRODUCTINFO = array(); $BROWSELIST= array (); $FEATURES= array (); $ACCESSORIES = array (); $AVGCUSTOMERRATING = array (); $CUSTOMERREVIEW = array (); $SIMILARPRODUCTS = array (); $ASIN=''; $PRODUCTNAME=''; $CATALOG=''; $AUTHORS=''; $THEATRICALRELEASEDATE=''; $RELEASEDATE=''; $MANUFACTURER=''; $IMAGEURLSMALL=''; $IMAGEURLMEDIUM=''; $IMAGEURLLARGE=''; $LISTPRICE=''; $OURPRICE=''; $USEDPRICE=''; $REFURBISHEDPRICE=''; $THIRDPARTYNEWPRICE=''; $SALESRANK=''; $MEDIA=''; $PRODUCTDESCRIPTION = ''; $NUMMEDIA=''; $ISBN=''; $MPAARATING=''; $PLATFORM=''; $AVAILABILITY=''; $UPC=''; // increase global counter if (++$this->iNumResults >= $GLOBALS['amz_anzahl_ergebnisse']) $this->stop = true; break; case 'TOTALRESULTS': $this->arAtribute['TotalResults'] = $sData; break; case 'PRODUCTINFO': break; } } // }}} // {{{ setInputUrl() /** * Defines * * @param string sUrl (full url) * @param integer iTimeout (url open timeout) * @return resource fsockopen handle of the given file * @throws XML_Parser_Error * @see setInput(), setInputFile() * @access public */ /** bool setInputUrl(str, int) tries to open a connection to the given url with the given timeout */ function setInputUrl($sUrl, $iTimeout) { if (!$this->testLock()) { // prevent html caching $_GLOBALS['bFeedError'] = true; return false; } $arUrl = parse_url($sUrl); $sHost = $arUrl['host']; if (!@$iPort = $arUrl['port']) { $iPort = 80; // default HTTP port } $sFullPath = $arUrl['path'] . '?' . $arUrl['query']; /* $fp = fsockopen($sHost, $iPort, $errno, $errstr, $iTimeout); if(!is_resource($fp)) { // return an error echo '@'; $this->createLock(); return false; } else { fputs($fp,"GET $sFullPath HTTP/1.0\r\nHost: " . $sHost. "\r\n\r\n"); // win32 if (function_exists('socket_set_timeout')) { @socket_set_timeout($fp, $iTimeout); } // in blocking mode it will wait for data to become available on the socket socket_set_blocking($fp, true); // get the first line and determine the answer-code $sLine = fgets($fp , 1024); */ //$iCode = preg_replace("/.*(\d\d\d).*/i" , "\\1" , $sLine); /* // an error occurred if code is not between 200 and 399 $error = null; if ($iCode != 200) { // prevent html caching $_GLOBALS['bFeedError'] = true; error_log ( "\n". time() .':'. $sUrl .':'. $sLine .':'. $_SERVER['REQUEST_URI'], 3, 'htmlcache/search/return_code_failures.log' ); fclose($fp); $this->createLock(); return false; } $sHeader = ''; // no error - now determine start of data (skipping header) while (!feof($fp)) { $sLine = fgets($fp , 1024); if (strlen($sLine) < 3) { break; } } */ if (!$fp = @fopen($sUrl, "r")) return false; $this->fp = $fp; return true; //} } // end func /** createLock() lock */ function createLock() { //error_log ("\n". date ('D M j G:i:s', time() + 6*3600) .' : AWS Failed' , 3, 'htmlcache/search/aws_uptime.log'); if (!$handle = fopen(AWS_LOCK_FILE, 'w')) { echo 'cannot open lock'; return false; } fclose($handle); return true; } // end func /** testLock() test lock for a given time, eventually release it */ function testLock() { if (!file_exists(AWS_LOCK_FILE)) { return true; } if ((time() - filemtime(AWS_LOCK_FILE)) < AWS_LOCK_TIME) { //error_log ("\n". date ('D M j G:i:s', time() + 6*3600) .' : AWS call avoided' , 3, 'htmlcache/search/aws_uptime.log'); return false; } // release lock if (!$handle = unlink(AWS_LOCK_FILE)) { error_log ("\n cannot release lock: ". time() .'-'. filemtime(AWS_LOCK_FILE) .'='. (time() - filemtime(AWS_LOCK_FILE)).'<'. AWS_LOCK_TIME, 3, 'release_lock.log'); return false; } //error_log ("\n". date ('D M j G:i:s', time() + 6*3600) .' : AWS Recovered' , 3, 'htmlcache/search/aws_uptime.log'); return true; } // end func } // end class definition ?>