1<?php
2/**
3 * SimplePie
4 *
5 * A PHP-Based RSS and Atom Feed Framework.
6 * Takes the hard work out of managing a complete RSS/Atom solution.
7 *
8 * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without modification, are
12 * permitted provided that the following conditions are met:
13 *
14 * 	* Redistributions of source code must retain the above copyright notice, this list of
15 * 	  conditions and the following disclaimer.
16 *
17 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
18 * 	  of conditions and the following disclaimer in the documentation and/or other materials
19 * 	  provided with the distribution.
20 *
21 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
22 * 	  to endorse or promote products derived from this software without specific prior
23 * 	  written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
26 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
27 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
28 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
32 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33 * POSSIBILITY OF SUCH DAMAGE.
34 *
35 * @package SimplePie
36 * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
37 * @author Ryan Parman
38 * @author Sam Sneddon
39 * @author Ryan McCue
40 * @link http://simplepie.org/ SimplePie
41 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
42 */
43
44/**
45 * Caches data to the filesystem
46 *
47 * @package SimplePie
48 * @subpackage Caching
49 */
50class SimplePie_Cache_File implements SimplePie_Cache_Base
51{
52	/**
53	 * Location string
54	 *
55	 * @see SimplePie::$cache_location
56	 * @var string
57	 */
58	protected $location;
59
60	/**
61	 * Filename
62	 *
63	 * @var string
64	 */
65	protected $filename;
66
67	/**
68	 * File extension
69	 *
70	 * @var string
71	 */
72	protected $extension;
73
74	/**
75	 * File path
76	 *
77	 * @var string
78	 */
79	protected $name;
80
81	/**
82	 * Create a new cache object
83	 *
84	 * @param string $location Location string (from SimplePie::$cache_location)
85	 * @param string $name Unique ID for the cache
86	 * @param string $type Either TYPE_FEED for SimplePie data, or TYPE_IMAGE for image data
87	 */
88	public function __construct($location, $name, $type)
89	{
90		$this->location = $location;
91		$this->filename = $name;
92		$this->extension = $type;
93		$this->name = "$this->location/$this->filename.$this->extension";
94	}
95
96	/**
97	 * Save data to the cache
98	 *
99	 * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property
100	 * @return bool Successfulness
101	 */
102	public function save($data)
103	{
104		if (file_exists($this->name) && is_writable($this->name) || file_exists($this->location) && is_writable($this->location))
105		{
106			if ($data instanceof SimplePie)
107			{
108				$data = $data->data;
109			}
110
111			$data = serialize($data);
112			return (bool) file_put_contents($this->name, $data);
113		}
114		return false;
115	}
116
117	/**
118	 * Retrieve the data saved to the cache
119	 *
120	 * @return array Data for SimplePie::$data
121	 */
122	public function load()
123	{
124		if (file_exists($this->name) && is_readable($this->name))
125		{
126			return unserialize(file_get_contents($this->name));
127		}
128		return false;
129	}
130
131	/**
132	 * Retrieve the last modified time for the cache
133	 *
134	 * @return int Timestamp
135	 */
136	public function mtime()
137	{
138		return @filemtime($this->name);
139	}
140
141	/**
142	 * Set the last modified time to the current time
143	 *
144	 * @return bool Success status
145	 */
146	public function touch()
147	{
148		return @touch($this->name);
149	}
150
151	/**
152	 * Remove the cache
153	 *
154	 * @return bool Success status
155	 */
156	public function unlink()
157	{
158		if (file_exists($this->name))
159		{
160			return unlink($this->name);
161		}
162		return false;
163	}
164}
165