1 /*
2  * Created on Jul 9, 2009
3  * Created by Paul Gardner
4  *
5  * Copyright (C) Azureus Software, Inc, All Rights Reserved.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18  */
19 
20 
21 package com.aelitis.azureus.core.content;
22 
23 import org.gudy.azureus2.core3.util.Base32;
24 import org.gudy.azureus2.core3.util.SystemTime;
25 import org.gudy.azureus2.plugins.download.Download;
26 
27 import com.aelitis.azureus.core.cnetwork.ContentNetwork;
28 
29 public abstract class
30 RelatedContent
31 {
32 	public static final int	VERSION_NA					= -1;		// not applicable
33 	public static final int	VERSION_INITIAL				= 0;
34 	public static final int	VERSION_BETTER_SCRAPE		= 1;
35 
36 	public final static String[]	NO_TAGS = {};
37 
38 	final private String 		title;
39 	final private byte[]		hash;
40 	final private String		tracker;
41 	final private long			size;
42 
43 	private int					version;
44 	private int					date;
45 	private int					seeds_leechers;
46 	private byte				content_network;
47 
48 	private byte[]				related_to_hash;
49 
50 	private byte[]				tracker_keys;
51 	private byte[]				ws_keys;
52 
53 	private String[]			tags;
54 	private byte				nets;
55 
56 	private long changed_locally_on;
57 
58 	public
RelatedContent( int _version, byte[] _related_to_hash, String _title, byte[] _hash, String _tracker, byte[] _tracker_keys, byte[] _ws_keys, String[] _tags, byte _nets, long _size, int _date, int _seeds_leechers, byte _cnet )59 	RelatedContent(
60 		int			_version,
61 		byte[]		_related_to_hash,
62 		String		_title,
63 		byte[]		_hash,
64 		String		_tracker,
65 		byte[]		_tracker_keys,
66 		byte[]		_ws_keys,
67 		String[]	_tags,
68 		byte		_nets,
69 		long		_size,
70 		int			_date,
71 		int			_seeds_leechers,
72 		byte		_cnet )
73 	{
74 		version				= _version;
75 		related_to_hash		= _related_to_hash;
76 		title				= _title;
77 		hash				= _hash;
78 		tracker				= _tracker;
79 		tracker_keys		= _tracker_keys;
80 		ws_keys				= _ws_keys;
81 		tags				= _tags;
82 		nets				= _nets;
83 		size				= _size;
84 		date				= _date;
85 		seeds_leechers		= _seeds_leechers;
86 		content_network		= _cnet;
87 		setChangedLocallyOn(0);
88 	}
89 
90 	public
RelatedContent( String _title, byte[] _hash, String _tracker, long _size, int _date, int _seeds_leechers, byte _cnet )91 	RelatedContent(
92 		String		_title,
93 		byte[]		_hash,
94 		String		_tracker,
95 		long		_size,
96 		int			_date,
97 		int			_seeds_leechers,
98 		byte		_cnet )
99 	{
100 			// legacy constructor as referenced from plugin - remove oneday!
101 
102 		this( VERSION_NA, _title, _hash, _tracker, null, null, null, RelatedContentManager.NET_PUBLIC, _size, _date, _seeds_leechers, _cnet );
103 	}
104 
105 	public
RelatedContent( String _title, byte[] _hash, String _tracker, byte[] _tracker_keys, byte[] _ws_keys, String[] _tags, byte _nets, long _size, int _date, int _seeds_leechers, byte _cnet )106 	RelatedContent(
107 		String		_title,
108 		byte[]		_hash,
109 		String		_tracker,
110 		byte[]		_tracker_keys,
111 		byte[]		_ws_keys,
112 		String[]	_tags,
113 		byte		_nets,
114 		long		_size,
115 		int			_date,
116 		int			_seeds_leechers,
117 		byte		_cnet )
118 	{
119 			// legacy constructor as referenced from plugin - remove once 5711 + plugin update released
120 
121 		this( VERSION_NA, _title, _hash, _tracker, _tracker_keys, _ws_keys, _tags, _nets, _size, _date, _seeds_leechers, _cnet );
122 	}
123 
124 	public
RelatedContent( int _version, String _title, byte[] _hash, String _tracker, byte[] _tracker_keys, byte[] _ws_keys, String[] _tags, byte _nets, long _size, int _date, int _seeds_leechers, byte _cnet )125 	RelatedContent(
126 		int			_version,
127 		String		_title,
128 		byte[]		_hash,
129 		String		_tracker,
130 		byte[]		_tracker_keys,
131 		byte[]		_ws_keys,
132 		String[]	_tags,
133 		byte		_nets,
134 		long		_size,
135 		int			_date,
136 		int			_seeds_leechers,
137 		byte		_cnet )
138 	{
139 		version				= _version;
140 		title				= _title;
141 		hash				= _hash;
142 		tracker				= _tracker;
143 		tracker_keys		= _tracker_keys;
144 		ws_keys				= _ws_keys;
145 		tags				= _tags;
146 		nets				= _nets;
147 		size				= _size;
148 		date				= _date;
149 		seeds_leechers		= _seeds_leechers;
150 		content_network		= _cnet;
151 		setChangedLocallyOn(0);
152 	}
153 
154 	public int
getVersion()155 	getVersion()
156 	{
157 		return( version );
158 	}
159 
160 	protected void
setVersion( int _version )161 	setVersion(
162 		int		_version )
163 	{
164 		version = _version;
165 	}
166 
167 	protected void
setRelatedToHash( byte[] h )168 	setRelatedToHash(
169 		byte[]		h )
170 	{
171 		related_to_hash = h;
172 		// Intentionally not called, since setRelatedToHash gets called after
173 		// constructing all the RelatedContent objects
174 		// setChangedLocallyOn(0);
175 	}
176 
177 	public byte[]
getRelatedToHash()178 	getRelatedToHash()
179 	{
180 		return( related_to_hash );
181 	}
182 
183 	public abstract Download
getRelatedToDownload()184 	getRelatedToDownload();
185 
186 	public String
getTitle()187 	getTitle()
188 	{
189 		return( title );
190 	}
191 
192 	public abstract int
getRank()193 	getRank();
194 
195 	public byte[]
getHash()196 	getHash()
197 	{
198 		return( hash );
199 	}
200 
201 	public abstract int
getLevel()202 	getLevel();
203 
204 	public abstract boolean
isUnread()205 	isUnread();
206 
207 	public abstract void
setUnread( boolean unread )208 	setUnread(
209 		boolean	unread );
210 
211 	public abstract int
getLastSeenSecs()212 	getLastSeenSecs();
213 
214 	public String
getTracker()215 	getTracker()
216 	{
217 		return( tracker );
218 	}
219 
220 	public byte[]
getTrackerKeys()221 	getTrackerKeys()
222 	{
223 		return( tracker_keys );
224 	}
225 
226 	public byte[]
getWebSeedKeys()227 	getWebSeedKeys()
228 	{
229 		return( ws_keys );
230 	}
231 
232 	public String[]
getTags()233 	getTags()
234 	{
235 		return( tags==null?NO_TAGS:tags );
236 	}
237 
238 	protected void
setTags( String[] _tags )239 	setTags(
240 		String[]	_tags )
241 	{
242 		tags	= _tags;
243 		setChangedLocallyOn(0);
244 	}
245 
246 	public String[]
getNetworks()247 	getNetworks()
248 	{
249 		return( RelatedContentManager.convertNetworks( nets ));
250 	}
251 
252 	protected byte
getNetworksInternal()253 	getNetworksInternal()
254 	{
255 		return( nets );
256 	}
257 
258 	protected void
setNetworksInternal( byte n )259 	setNetworksInternal(
260 		byte		n )
261 	{
262 		nets = n;
263 	}
264 
265 	public long
getSize()266 	getSize()
267 	{
268 		return( size );
269 	}
270 
271 	public long
getPublishDate()272 	getPublishDate()
273 	{
274 		return( date*60*60*1000L );
275 	}
276 
277 	protected int
getDateHours()278 	getDateHours()
279 	{
280 		return( date );
281 	}
282 
283 	protected void
setDateHours( int _date )284 	setDateHours(
285 		int		_date )
286 	{
287 		date = _date;
288 		setChangedLocallyOn(0);
289 	}
290 
291 	public int
getLeechers()292 	getLeechers()
293 	{
294 		if ( seeds_leechers == -1 ){
295 
296 			return( -1 );
297 		}
298 
299 		return( seeds_leechers&0xffff );
300 	}
301 
302 	public int
getSeeds()303 	getSeeds()
304 	{
305 		if ( seeds_leechers == -1 ){
306 
307 			return( -1 );
308 		}
309 
310 		return( (seeds_leechers>>16) & 0xffff );
311 	}
312 
313 	protected int
getSeedsLeechers()314 	getSeedsLeechers()
315 	{
316 		return( seeds_leechers );
317 	}
318 
319 	protected void
setSeedsLeechers( int _sl )320 	setSeedsLeechers(
321 		int		_sl )
322 	{
323 		seeds_leechers = _sl;
324 		setChangedLocallyOn(0);
325 	}
326 
327 	public long
getContentNetwork()328 	getContentNetwork()
329 	{
330 		return((content_network&0xff)==0xff?ContentNetwork.CONTENT_NETWORK_UNKNOWN:(content_network&0xff));
331 	}
332 
333 	protected void
setContentNetwork( long cnet )334 	setContentNetwork(
335 		long		cnet )
336 	{
337 		content_network = (byte)cnet;
338 		setChangedLocallyOn(0);
339 	}
340 
341 	public long
getChangedLocallyOn()342 	getChangedLocallyOn()
343 	{
344 		return changed_locally_on;
345 	}
346 
347 	/**
348 	 *
349 	 * @param _changed_locally_on  0 == current time
350 	 */
351 	public void
setChangedLocallyOn(long _changed_locally_on)352 	setChangedLocallyOn(long _changed_locally_on)
353 	{
354 		changed_locally_on = (_changed_locally_on == 0) ? SystemTime.getCurrentTime() : _changed_locally_on;
355 	}
356 
357 	public abstract void
delete()358 	delete();
359 
360 	public String
getString()361 	getString()
362 	{
363 		return( "title=" + title + ", ver=" + version + ", hash=" + (hash==null?"null":Base32.encode( hash )) + ", tracker=" + tracker +", date=" + date + ", sl=" + seeds_leechers + ", cnet=" + content_network + ", nets=" + nets );
364 	}
365 }
366