/*
* Created by Paul Gardner
* Created on Nov 25, 2008
*
* Copyright 2008 Vuze, Inc. All rights reserved.
*
* This program 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; version 2 of the License only.
*
* This program 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. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/
package com.aelitis.azureus.core.cnetwork.impl;
import java.io.IOException;
import java.util.*;
import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.config.ParameterListener;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.util.Base32;
import org.gudy.azureus2.core3.util.Constants;
import org.gudy.azureus2.core3.util.SystemTime;
import org.gudy.azureus2.core3.util.UrlUtils;
import org.gudy.azureus2.plugins.utils.FeatureManager;
import org.gudy.azureus2.plugins.utils.FeatureManager.FeatureDetails;
import org.gudy.azureus2.pluginsimpl.local.PluginInitializer;
import com.aelitis.azureus.core.crypto.VuzeCryptoManager;
import com.aelitis.azureus.core.metasearch.MetaSearchManagerFactory;
import com.aelitis.azureus.util.ImportExportUtils;
public class
ContentNetworkVuzeGeneric
extends ContentNetworkImpl
{
private static String URL_SUFFIX;
static {
COConfigurationManager.addAndFireParameterListeners(new String[] {
"Send Version Info",
"locale"
}, new ParameterListener() {
public void parameterChanged(String parameterName) {
// Don't change the order of the params as there's some code somewhere
// that depends on them (I think its code that removes the azid so
// we can fix this up when that code's migrated here I guess
boolean send_info = COConfigurationManager.getBooleanParameter("Send Version Info");
URL_SUFFIX = "azid="
+ (send_info
? Base32.encode(VuzeCryptoManager.getSingleton().getPlatformAZID())
: "anonymous") + "&azv=" + Constants.AZUREUS_VERSION
+ "&locale=" + MessageText.getCurrentLocale().toString() + "&os.name="
+ UrlUtils.encode(System.getProperty("os.name")) + "&vzemb=1";
String suffix = System.getProperty("url.suffix", null);
if (suffix != null) {
URL_SUFFIX += "&" + suffix;
}
}
});
}
private static final String RPC_ADDRESS = System.getProperty( "platform_rpc", "vrpc.vuze.com" );
private Map<Integer, String> service_map = new HashMap<Integer, String>();
private Set<Integer> service_exclusions;
private String SITE_HOST;
private String URL_PREFIX;
private String URL_EXT_PREFIX;
private String URL_ICON;
private String URL_RELAY_RPC;
private String URL_AUTHORIZED_RPC;
private String URL_FAQ;
private String URL_BLOG;
private String URL_FORUMS;
private String URL_WIKI;
public
ContentNetworkVuzeGeneric(
ContentNetworkManagerImpl _manager,
long _content_network,
long _version,
String _name,
Map<String,Object> _pprop_defaults,
Set<Integer> _service_exclusions,
String _site_host,
String _url_prefix,
String _url_icon,
String _url_relay_rpc,
String _url_authorised_rpc,
String _url_faq,
String _url_blog,
String _url_forums,
String _url_wiki,
String _url_ext_prefix )
{
super( _manager, TYPE_VUZE_GENERIC, _content_network, _version, _name, _pprop_defaults );
SITE_HOST = _site_host;
URL_PREFIX = _url_prefix;
URL_ICON = _url_icon;
URL_RELAY_RPC = _url_relay_rpc;
URL_AUTHORIZED_RPC = _url_authorised_rpc;
URL_FAQ = _url_faq;
URL_BLOG = _url_blog;
URL_FORUMS = _url_forums;
URL_WIKI = _url_wiki;
URL_EXT_PREFIX = _url_ext_prefix;
service_exclusions = _service_exclusions;
init();
}
protected
ContentNetworkVuzeGeneric(
ContentNetworkManagerImpl _manager,
Map<String,Object> _map )
throws IOException
{
super( _manager );
importFromBEncodedMap( _map );
}
protected void
importFromBEncodedMap(
Map<String,Object> map )
throws IOException
{
super.importFromBEncodedMap( map );
SITE_HOST = ImportExportUtils.importString(map, "vg_site" );
URL_PREFIX = ImportExportUtils.importString(map, "vg_prefix" );
URL_EXT_PREFIX = ImportExportUtils.importString(map, "vg_ext_prefix" );
if (URL_EXT_PREFIX == null) {
URL_EXT_PREFIX = URL_PREFIX;
}
URL_ICON = ImportExportUtils.importString(map, "vg_icon" );
URL_RELAY_RPC = ImportExportUtils.importString(map, "vg_relay_rpc" );
URL_AUTHORIZED_RPC = ImportExportUtils.importString(map, "vg_auth_rpc" );
URL_FAQ = ImportExportUtils.importString(map, "vg_faq" );
URL_BLOG = ImportExportUtils.importString(map, "vg_blog" );
URL_FORUMS = ImportExportUtils.importString(map, "vg_forums" );
URL_WIKI = ImportExportUtils.importString(map, "vg_wiki" );
List<Long> sex = (List<Long>)map.get( "vg_sex" );
if ( sex != null ){
service_exclusions = new HashSet<Integer>();
for ( Long l: sex ){
service_exclusions.add( l.intValue());
}
}
init();
}
protected void
exportToBEncodedMap(
Map map )
throws IOException
{
super.exportToBEncodedMap( map );
ImportExportUtils.exportString(map, "vg_site", SITE_HOST );
ImportExportUtils.exportString(map, "vg_prefix", URL_PREFIX );
ImportExportUtils.exportString(map, "vg_ext_prefix", URL_EXT_PREFIX );
ImportExportUtils.exportString(map, "vg_icon", URL_ICON );
ImportExportUtils.exportString(map, "vg_relay_rpc", URL_RELAY_RPC );
ImportExportUtils.exportString(map, "vg_auth_rpc", URL_AUTHORIZED_RPC );
ImportExportUtils.exportString(map, "vg_faq", URL_FAQ );
ImportExportUtils.exportString(map, "vg_blog", URL_BLOG );
ImportExportUtils.exportString(map, "vg_forums", URL_FORUMS );
ImportExportUtils.exportString(map, "vg_wiki", URL_WIKI );
if ( service_exclusions != null ){
List<Long> sex = new ArrayList<Long>();
for (Integer i: service_exclusions){
sex.add( i.longValue());
}
map.put( "vg_sex", sex );
}
}
protected void
init()
{
service_map.clear();
addService( SERVICE_SEARCH, URL_PREFIX + "search?q=" );
addService( SERVICE_XSEARCH, URL_PREFIX + "xsearch/index.php?q=" );
addService( SERVICE_RPC, "http://" + RPC_ADDRESS + "/vzrpc/rpc.php" );
addService( SERVICE_BIG_BROWSE, URL_PREFIX + "browse.start?" );
addService( SERVICE_PUBLISH, URL_PREFIX + "publish.start?" );
addService( SERVICE_WELCOME, URL_PREFIX + "welcome.start?" );
addService( SERVICE_ABOUT, URL_PREFIX + "about.start?" );
addService( SERVICE_PUBLISH_NEW, URL_PREFIX + "publishnew.start?" );
addService( SERVICE_PUBLISH_ABOUT, URL_PREFIX + "publishinfo.start" );
addService( SERVICE_CONTENT_DETAILS, URL_PREFIX + "details/" );
addService( SERVICE_COMMENT, URL_PREFIX + "comment/" );
addService( SERVICE_PROFILE, URL_PREFIX + "profile/" );
addService( SERVICE_TORRENT_DOWNLOAD, URL_PREFIX + "download/" );
addService( SERVICE_SITE, URL_PREFIX );
addService( SERVICE_SUPPORT, URL_EXT_PREFIX + "support/" );
addService( SERVICE_LOGIN, URL_PREFIX + "login.start?" );
addService( SERVICE_LOGOUT, URL_PREFIX + "logout.start?" );
addService( SERVICE_REGISTER, URL_PREFIX + "register.start?" );
addService( SERVICE_MY_PROFILE, URL_PREFIX + "profile.start?" );
addService( SERVICE_MY_ACCOUNT, URL_PREFIX + "account.start?" );
addService( SERVICE_SITE_RELATIVE, URL_PREFIX );
addService( SERVICE_EXT_SITE_RELATIVE, URL_EXT_PREFIX );
addService( SERVICE_ADD_FRIEND, URL_PREFIX + "user/AddFriend.html?" );
addService( SERVICE_SUBSCRIPTION, URL_PREFIX + "xsearch/index.php?" );
addService( SERVICE_AUTHORIZE, URL_PREFIX + "ip.start?" );
addService( SERVICE_GET_ICON, URL_ICON );
addService( SERVICE_PREPLAYBACK, URL_PREFIX + "emp/load/" );
addService( SERVICE_POSTPLAYBACK, URL_PREFIX + "emp/recommend/" );
addService( SERVICE_SIDEBAR_CLOSE, URL_PREFIX + "sidebar.close" );
addService( SERVICE_IDENTIFY, "http://pixel.quantserve.com/pixel/p-64Ix1G_SXwOa-.gif" );
if ( URL_RELAY_RPC != null ){
addService( SERVICE_RELAY_RPC, URL_RELAY_RPC );
}
if ( URL_AUTHORIZED_RPC != null ){
addService( SERVICE_AUTH_RPC, URL_AUTHORIZED_RPC );
}
if ( URL_FAQ != null ){
addService( SERVICE_FAQ, URL_FAQ );
addService( SERVICE_FAQ_TOPIC, URL_FAQ );
}
if ( URL_BLOG != null ){
addService( SERVICE_BLOG, URL_BLOG );
}
if ( URL_FORUMS != null ){
addService( SERVICE_FORUMS, URL_FORUMS );
}
if ( URL_WIKI != null ){
addService( SERVICE_WIKI, URL_WIKI );
}
}
protected void
addService(
int type,
String url_str )
{
service_map.put( type, url_str );
}
protected Set<Integer>
getServiceExclusions()
{
return( service_exclusions );
}
public Object
getProperty(
int property )
{
if ( property == PROPERTY_SITE_HOST ){
return( SITE_HOST );
}else if ( property == PROPERTY_REMOVEABLE ){
return( getID() != CONTENT_NETWORK_VUZE );
}else if ( property == PROPERTY_ORDER ){
return( String.valueOf( getID()));
}else{
debug( "Unknown property" );
return( null );
}
}
public boolean
isServiceSupported(
int service_type )
{
if ( service_exclusions != null && service_exclusions.contains( service_type )){
return( false );
}
return( service_map.get( service_type ) != null );
}
public String
getServiceURL(
int service_type )
{
return( getServiceURL( service_type, new Object[0]));
}
public String
getServiceURL(
int service_type,
Object[] params )
{
if ( service_exclusions != null && service_exclusions.contains( service_type )){
debug( "Service type '" + service_type + "' is excluded" );
return( null );
}
String base = service_map.get( service_type );
if ( base == null ){
debug( "Unknown service type '" + service_type + "'" );
return( null );
}
switch( service_type ){
case SERVICE_SEARCH:{
String query = (String)params[0];
return( base +
UrlUtils.encode(query) +
"&" + URL_SUFFIX +
"&rand=" + SystemTime.getCurrentTime());
}
case SERVICE_XSEARCH:{
String query = (String)params[0];
boolean to_subscribe = (Boolean)params[1];
String url_str =
base +
UrlUtils.encode(query) +
"&" + URL_SUFFIX +
"&rand=" + SystemTime.getCurrentTime();
if ( to_subscribe ){
url_str += "&createSubscription=1";
}
String extension_key = getExtensionKey();
if ( extension_key != null ){
url_str += "&extension_key=" + UrlUtils.encode( extension_key );
}
url_str += "&fud=" + UrlUtils.encode( MetaSearchManagerFactory.getSingleton().getMetaSearch().getFUD());
return( url_str );
}
case SERVICE_CONTENT_DETAILS:{
String hash = (String)params[0];
String client_ref = (String)params[1];
String url_str = base + hash + ".html?" + URL_SUFFIX;
if ( client_ref != null ){
url_str += "&client_ref=" + UrlUtils.encode( client_ref );
}
return( url_str );
}
case SERVICE_POSTPLAYBACK:
case SERVICE_PREPLAYBACK:{
String hash = (String)params[0];
String url_str = base + hash + "?" + URL_SUFFIX;
return( url_str );
}
case SERVICE_COMMENT:{
String hash = (String)params[0];
return( base + hash + ".html?" + URL_SUFFIX + "&rnd=" + Math.random());
}
case SERVICE_PROFILE:{
String login_id = (String)params[0];
String client_ref = (String)params[1];
return( base + UrlUtils.encode( login_id ) + "?" + URL_SUFFIX + "&client_ref=" + UrlUtils.encode( client_ref ));
}
case SERVICE_TORRENT_DOWNLOAD:{
String hash = (String)params[0];
String client_ref = (String)params[1];
String url_str = base + hash + ".torrent";
if ( client_ref != null ){
url_str += "?referal=" + UrlUtils.encode( client_ref );
}
url_str = appendURLSuffix(url_str, false, true);
return( url_str );
}
case SERVICE_FAQ_TOPIC:{
String topic = (String)params[0];
return( base + topic );
}
case SERVICE_LOGIN:{
String message = (String)params[0];
if ( message == null || message.length() == 0 ){
base += URL_SUFFIX;
}else{
base += "msg=" + UrlUtils.encode( message );
base += "&" + URL_SUFFIX;
}
return( base );
}
case SERVICE_MY_PROFILE:
case SERVICE_MY_ACCOUNT:{
base += URL_SUFFIX + "&rand=" + SystemTime.getCurrentTime();
return( base );
}
case SERVICE_SITE_RELATIVE:{
String relative_url = (String)params[0];
boolean append_suffix = (Boolean)params[1];
base += relative_url.startsWith("/")?relative_url.substring(1):relative_url;
if ( append_suffix ){
base = appendURLSuffix( base, false, true );
}
return( base );
}
case SERVICE_EXT_SITE_RELATIVE:{
String relative_url = (String)params[0];
boolean append_suffix = (Boolean)params[1];
base += relative_url.startsWith("/")?relative_url.substring(1):relative_url;
if ( append_suffix ){
base = appendURLSuffix( base, false, true );
}
base = base.replaceAll( "&vzemb=1", "" );
return( base );
}
case SERVICE_ADD_FRIEND:{
String colour = (String)params[0];
base += "ts=" + Math.random() + "&bg_color=" + colour + "&" + URL_SUFFIX;
return( base );
}
case SERVICE_SUBSCRIPTION:{
String subs_id = (String)params[0];
base += "subscription=" + subs_id + "&" + URL_SUFFIX;
return( base );
}
case SERVICE_AUTHORIZE:{
String sourceRef = params.length > 0 ? (String) params[0] : null;
if (sourceRef != null) {
base += "sourceref=" + UrlUtils.encode(sourceRef) + "&" + URL_SUFFIX;
}
return( base );
}
case SERVICE_WELCOME:{
String installID = COConfigurationManager.getStringParameter("install.id", "null");
if (installID.length() == 0) {
installID = "blank";
}
base += "iid=" + UrlUtils.encode(installID) + "&" + URL_SUFFIX;
return( base );
}
case SERVICE_BIG_BROWSE:
case SERVICE_PUBLISH:
case SERVICE_LOGOUT:
case SERVICE_REGISTER:{
return( base + URL_SUFFIX );
}
case SERVICE_ABOUT: {
// no azid needed (+ makes URL ugly)
return base + "azv=" + Constants.AZUREUS_VERSION + "&locale="
+ MessageText.getCurrentLocale().toString();
}
default:{
return( appendURLSuffix( base, false, true) );
}
}
}
public String
appendURLSuffix(
String url_in,
boolean for_post,
boolean include_azid )
{
if ( url_in.indexOf( "vzemb=" ) != -1 ){
// already present
return( url_in );
}
String suffix = URL_SUFFIX;
if ( !include_azid ){
suffix = suffix.replaceAll( "azid=.*?&", "" );
}
if ( for_post ){
if ( url_in.length() == 0 ){
return( suffix );
}else{
return( url_in + "&" + suffix );
}
}else{
if ( url_in.indexOf("?") >= 0 ){
return( url_in + "&" + suffix );
}else{
return( url_in + "?" + suffix );
}
}
}
private String
getExtensionKey()
{
FeatureManager fm = PluginInitializer.getDefaultInterface().getUtilities().getFeatureManager();
FeatureDetails[] fds = fm.getFeatureDetails( "core" );
for ( FeatureDetails fd: fds ){
if ( !fd.hasExpired()){
String finger_print = (String)fd.getProperty( FeatureDetails.PR_FINGERPRINT );
if ( finger_print != null ){
return( fd.getLicence().getShortID() + "-" + finger_print );
}
}
}
return( null );
}
}