/*
* Created on Jan 17, 2013
* Created by Paul Gardner
*
* Copyright 2013 Azureus Software, 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.util;
import java.util.Collections;
import java.util.Set;
import java.util.TreeMap;
import org.gudy.azureus2.core3.util.Debug;
import org.gudy.azureus2.core3.util.SystemTime;
import org.gudy.azureus2.plugins.PluginInterface;
import org.gudy.azureus2.plugins.utils.FeatureManager;
import org.gudy.azureus2.plugins.utils.FeatureManager.FeatureDetails;
import org.gudy.azureus2.plugins.utils.FeatureManager.Licence;
import org.gudy.azureus2.pluginsimpl.local.PluginInitializer;
import org.gudy.azureus2.pluginsimpl.local.utils.UtilitiesImpl;
import com.aelitis.azureus.core.AzureusCore;
import com.aelitis.azureus.core.AzureusCoreFactory;
import com.aelitis.azureus.core.AzureusCoreRunningListener;
public class
FeatureUtils
{
private static FeatureManager featman;
static{
AzureusCoreFactory.addCoreRunningListener(
new AzureusCoreRunningListener()
{
public void
azureusCoreRunning(
AzureusCore core)
{
PluginInterface pi = core.getPluginManager().getDefaultPluginInterface();
featman = pi.getUtilities().getFeatureManager();
}
});
}
public static String getMode() {
boolean isFull = hasFullLicence();
boolean isTrial = hasFullBurn() && !isFull;
return isFull ? "plus" : isTrial ? "trial" : "free";
}
public static boolean hasFullLicence() {
if (featman == null) {
//Debug.out("featman null");
Set<String> featuresInstalled = UtilitiesImpl.getFeaturesInstalled();
return featuresInstalled.contains("dvdburn");
}
licenceDetails fullFeatureDetails = getFullFeatureDetails();
long now = SystemTime.getCurrentTime();
return fullFeatureDetails != null && fullFeatureDetails.expiry > now
&& fullFeatureDetails.displayedExpiry > now;
}
public static class licenceDetails {
public final Licence licence;
public long expiry;
public long displayedExpiry;
public licenceDetails(long expiry, long displayedExpiry, Licence licence) {
this.expiry = expiry;
this.displayedExpiry = displayedExpiry;
this.licence = licence;
}
public String getRenewalKey() {
FeatureDetails[] features = licence.getFeatures();
if (features == null) {
return null;
}
for (FeatureDetails fd : features) {
Object property = fd.getProperty(FeatureDetails.PR_RENEWAL_KEY);
if (property instanceof String) {
return (String) property;
}
}
return null;
}
}
public static licenceDetails getFullFeatureDetails() {
if (featman == null) {
Debug.out("featman null");
return null;
}
TreeMap<Long, Object[]> mapOrder = new TreeMap<Long, Object[]>(
Collections.reverseOrder());
FeatureDetails[] featureDetails = featman.getFeatureDetails("dvdburn");
// if any of the feature details are still valid, we have a full
for (FeatureDetails fd : featureDetails) {
Licence licence = fd.getLicence();
int state = licence.getState();
if (state == Licence.LS_ACTIVATION_DENIED) {
mapOrder.put(-1L, new Object[] { licence, Long.valueOf(0) });
continue;
} else if (state == Licence.LS_CANCELLED) {
mapOrder.put(-2L, new Object[] { licence, Long.valueOf(0) });
continue;
} else if (state == Licence.LS_INVALID_KEY) {
mapOrder.put(-3L, new Object[] { licence, Long.valueOf(0) });
continue;
} else if (state == Licence.LS_REVOKED) {
mapOrder.put(-4L, new Object[] { licence, Long.valueOf(0) });
continue;
} else if (state == Licence.LS_PENDING_AUTHENTICATION) {
mapOrder.put(-6L, new Object[] { licence, Long.valueOf(0) });
continue;
}
long now = SystemTime.getCurrentTime();
Long lValidUntil = (Long) fd.getProperty(FeatureDetails.PR_VALID_UNTIL);
Long lValidOfflineUntil = (Long) fd.getProperty(FeatureDetails.PR_OFFLINE_VALID_UNTIL);
if (lValidUntil == null && lValidOfflineUntil == null) {
continue;
}
long minValidUntil = -1;
long maxValidUntil = -1;
if (lValidUntil != null) {
minValidUntil = maxValidUntil = lValidUntil.longValue();
if (minValidUntil < now) {
mapOrder.put(minValidUntil, new Object[] { licence, Long.valueOf(minValidUntil) });
continue;
}
}
if (lValidOfflineUntil != null) {
long validOfflineUntil = lValidOfflineUntil.longValue();
if (validOfflineUntil < now) {
mapOrder.put(validOfflineUntil, new Object[] { licence, Long.valueOf(maxValidUntil) });
continue;
}
if (maxValidUntil == -1 || validOfflineUntil > maxValidUntil) {
maxValidUntil = validOfflineUntil;
}
}
mapOrder.put(maxValidUntil, new Object[] { licence, minValidUntil });
}
if (mapOrder.size() == 0) {
return null;
}
Long firstKey = mapOrder.firstKey();
Object[] objects = mapOrder.get(firstKey);
Licence licence = (Licence) objects[0];
return new licenceDetails(firstKey.longValue(), ((Long) objects[1]).longValue(), licence);
}
public static boolean isTrialLicence(Licence licence) {
if (featman == null) {
return false;
}
// if any of the FeatureDetails is a trial, return true
boolean trial = false;
FeatureDetails[] featureDetails = licence.getFeatures();
for (FeatureDetails fd : featureDetails) {
trial = isTrial(fd);
if (trial) {
break;
}
}
return trial;
}
public static boolean isTrial(FeatureDetails fd) {
Long lIsTrial = (Long) fd.getProperty(FeatureDetails.PR_IS_TRIAL);
return lIsTrial == null ? false : lIsTrial.longValue() != 0;
}
public static long getRemaining() {
FeatureDetails[] featureDetails = featman.getFeatureDetails("dvdburn_trial");
if (featureDetails == null) {
return 0;
}
for (FeatureDetails fd : featureDetails) {
long remainingUses = getRemainingUses(fd);
if (remainingUses >= 0) {
return remainingUses;
}
}
return 0;
}
private static long getRemainingUses(FeatureDetails fd) {
if (fd == null) {
return 0;
}
Long lRemainingUses = (Long) fd.getProperty(FeatureDetails.PR_TRIAL_USES_REMAINING);
long remainingUses = lRemainingUses == null ? -1
: lRemainingUses.longValue();
return remainingUses;
}
/**
* @return
*/
public static boolean hasFullBurn() {
PluginInterface pi = PluginInitializer.getDefaultInterface().getPluginState().isInitialisationComplete()
? AzureusCoreFactory.getSingleton().getPluginManager().getPluginInterfaceByID(
"azburn_v") : null;
if (pi == null) {
// maybe not added yet.. use featman
Set<String> featuresInstalled = UtilitiesImpl.getFeaturesInstalled();
return featuresInstalled.contains("dvdburn_trial") && !featuresInstalled.contains("dvdburn");
}
return pi.getPluginState().isOperational();
}
public static long getPlusExpiryTimeStamp() {
licenceDetails fullFeatureDetails = getFullFeatureDetails();
if (fullFeatureDetails == null || fullFeatureDetails.expiry == 0) {
return 0;
}
return fullFeatureDetails.expiry;
}
public static long getPlusExpiryDisplayTimeStamp() {
licenceDetails fullFeatureDetails = getFullFeatureDetails();
if (fullFeatureDetails == null || fullFeatureDetails.expiry == 0) {
return 0;
}
return fullFeatureDetails.displayedExpiry;
}
public static String getPlusRenewalCode() {
licenceDetails fullFeatureDetails = getFullFeatureDetails();
if (fullFeatureDetails == null || fullFeatureDetails.expiry == 0) {
return null;
}
return fullFeatureDetails.getRenewalKey();
}
}