package com.aelitis.azureus.ui.swt.feature;
import java.util.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
import org.gudy.azureus2.core3.config.impl.ConfigurationChecker;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.logging.LogAlert;
import org.gudy.azureus2.core3.logging.Logger;
import org.gudy.azureus2.core3.util.*;
import org.gudy.azureus2.plugins.PluginInterface;
import org.gudy.azureus2.plugins.ui.UIInstance;
import org.gudy.azureus2.plugins.ui.UIManager;
import org.gudy.azureus2.plugins.ui.UIManagerListener;
import org.gudy.azureus2.plugins.ui.menus.MenuItem;
import org.gudy.azureus2.plugins.ui.menus.MenuItemListener;
import org.gudy.azureus2.plugins.ui.menus.MenuManager;
import org.gudy.azureus2.plugins.utils.FeatureManager;
import org.gudy.azureus2.plugins.utils.FeatureManager.Licence;
import org.gudy.azureus2.pluginsimpl.local.PluginInitializer;
import org.gudy.azureus2.ui.swt.Utils;
import org.gudy.azureus2.ui.swt.plugins.UISWTInstance;
import org.gudy.azureus2.ui.swt.shells.MessageBoxShell;
import org.gudy.azureus2.ui.swt.shells.GCStringPrinter.URLInfo;
import com.aelitis.azureus.core.AzureusCore;
import com.aelitis.azureus.core.AzureusCoreFactory;
import com.aelitis.azureus.core.AzureusCoreRunningListener;
import com.aelitis.azureus.ui.UIFunctionsManager;
import com.aelitis.azureus.ui.UserPrompterResultListener;
import com.aelitis.azureus.ui.mdi.*;
import com.aelitis.azureus.ui.skin.SkinPropertiesImpl;
import com.aelitis.azureus.ui.swt.skin.*;
import com.aelitis.azureus.ui.swt.views.skin.SBC_PlusFTUX;
import com.aelitis.azureus.ui.swt.views.skin.VuzeMessageBox;
import com.aelitis.azureus.ui.swt.views.skin.VuzeMessageBoxListener;
import com.aelitis.azureus.util.ConstantsVuze;
import com.aelitis.azureus.util.FeatureUtils;
public class FeatureManagerUI
{
private static final Integer BUTTON_UPGRADE = 0x1000;
public static boolean enabled = !Constants.isUnix
//&& FeatureAvailability.ENABLE_PLUS()
|| System.getProperty("fm.ui", "0").equals("1");
private static FeatureManager featman;
private static VuzeMessageBox validatingBox;
private static VuzeMessageBox entryWindow;
private static FeatureManagerUIListener fml;
public static void registerWithFeatureManager() {
if (!enabled) {
return;
}
AzureusCoreFactory.addCoreRunningListener(new AzureusCoreRunningListener() {
public void azureusCoreRunning(AzureusCore core) {
PluginInterface pi = core.getPluginManager().getDefaultPluginInterface();
featman = pi.getUtilities().getFeatureManager();
fml = new FeatureManagerUIListener(featman);
featman.addListener(fml);
Licence[] licences = featman.getLicences();
for (Licence licence : licences) {
fml.licenceAdded(licence);
}
UIManager ui_manager = pi.getUIManager();
ui_manager.addUIListener(new UIManagerListener() {
public void UIDetached(UIInstance instance) {
}
public void UIAttached(UIInstance instance) {
if (!(instance instanceof UISWTInstance)) {
return;
}
if (!Utils.isAZ2UI()) {
addFreeBurnUI();
}
}
});
}
});
}
private static void addFreeBurnUI() {
final MultipleDocumentInterface mdi = UIFunctionsManager.getUIFunctions().getMDI();
mdi.registerEntry(MultipleDocumentInterface.SIDEBAR_SECTION_PLUS,
new MdiEntryCreationListener() {
public MdiEntry createMDiEntry(String id) {
String title = FeatureUtils.hasFullLicence()
? "{mdi.entry.plus.full}" : "{mdi.entry.plus.free}";
String placeBelow = mdi.getEntry(MultipleDocumentInterface.SIDEBAR_SECTION_WELCOME) == null
? "" : MultipleDocumentInterface.SIDEBAR_SECTION_WELCOME;
MdiEntry entry = mdi.createEntryFromSkinRef(
MultipleDocumentInterface.SIDEBAR_HEADER_VUZE,
MultipleDocumentInterface.SIDEBAR_SECTION_PLUS,
"main.area.plus", title, null, null, true, placeBelow);
entry.setImageLeftID("image.sidebar.plus");
return entry;
}
});
MdiEntry existingEntry = mdi.getEntry(MultipleDocumentInterface.SIDEBAR_HEADER_DVD);
if (existingEntry != null) {
// abandon all hope, something already added DVD stuff
return;
}
mdi.registerEntry(MultipleDocumentInterface.SIDEBAR_SECTION_BURN_INFO,
new MdiEntryCreationListener() {
public MdiEntry createMDiEntry(String id) {
MdiEntry entryAbout = mdi.createEntryFromSkinRef(
MultipleDocumentInterface.SIDEBAR_HEADER_DVD,
MultipleDocumentInterface.SIDEBAR_SECTION_BURN_INFO, "main.burn.ftux",
"{mdi.entry.about.dvdburn}", null, null,
false, null);
entryAbout.setImageLeftID("image.sidebar.dvdburn");
entryAbout.setExpanded(true);
entryAbout.addListener(new MdiEntryDropListener() {
public boolean mdiEntryDrop(MdiEntry entry, Object droppedObject) {
openTrialAskWindow();
return true;
}
});
MenuManager menuManager = PluginInitializer.getDefaultInterface().getUIManager().getMenuManager();
MenuItem menuHide = menuManager.addMenuItem("Sidebar." +
MultipleDocumentInterface.SIDEBAR_SECTION_BURN_INFO,
"popup.error.hide");
menuHide.addListener(new MenuItemListener() {
public void selected(MenuItem menu, Object target) {
mdi.closeEntry(MultipleDocumentInterface.SIDEBAR_SECTION_BURN_INFO);
}
});
return entryAbout;
}
});
mdi.addListener(new MdiEntryLoadedListener() {
public void mdiEntryLoaded(MdiEntry entry) {
if (!entry.getId().equals(MultipleDocumentInterface.SIDEBAR_HEADER_DVD)) {
return;
}
MdiEntryVitalityImage addSub = entry.addVitalityImage("image.sidebar.subs.add");
addSub.addListener(new MdiEntryVitalityImageListener() {
public void mdiEntryVitalityImage_clicked(int x, int y) {
openTrialAskWindow();
}
});
}
});
if (ConfigurationChecker.isNewVersion()
&& !ConfigurationChecker.isNewInstall() && !FeatureUtils.hasFullLicence()) {
SBC_PlusFTUX.setSourceRef("startup");
mdi.showEntryByID(MultipleDocumentInterface.SIDEBAR_SECTION_PLUS);
}
}
public static void openTrialAskWindow() {
VuzeMessageBox box = new VuzeMessageBox(
MessageText.getString("dlg.try.trial.title"),
MessageText.getString("dlg.try.trial.text"), new String[] {
MessageText.getString("Button.turnon"),
MessageText.getString("Button.cancel")
}, 0);
box.setButtonVals(new Integer[] {
SWT.OK,
SWT.CANCEL,
});
box.addResourceBundle(FeatureManagerUI.class,
SkinPropertiesImpl.PATH_SKIN_DEFS, "skin3_dlg_register");
box.setIconResource("image.burn.dlg.header");
box.setListener(new VuzeMessageBoxListener() {
public void shellReady(Shell shell, SWTSkinObjectContainer soExtra) {
SWTSkin skin = soExtra.getSkin();
String id = "dlg.register.trialask";
SWTSkinObject so = skin.createSkinObject(id, id, soExtra);
SWTSkinObjectText soLink = (SWTSkinObjectText) skin.getSkinObject(
"link", so);
if (soLink != null) {
soLink.addUrlClickedListener(new SWTSkinObjectText_UrlClickedListener() {
public boolean urlClicked(URLInfo urlInfo) {
String url = ConstantsVuze.getDefaultContentNetwork().getExternalSiteRelativeURL(
"plus_tos.start", true);
Utils.launch(url);
return true;
}
});
}
}
});
box.open(new UserPrompterResultListener() {
public void prompterClosed(int result) {
if (result == SWT.OK) {
SimpleTimer.addEvent("createTrial", SystemTime.getCurrentTime(),
new TimerEventPerformer() {
public void perform(TimerEvent event) {
createTrial();
}
});
}
}
});
}
public static void createTrial() {
try {
Licence[] trial = featman.createLicences(new String[] {
"dvdburn_trial"
});
} catch (Throwable e) {
String s = "Creating Trial: " + Debug.getNestedExceptionMessage(e);
new MessageBoxShell("Trial Error", s).open(null);
Logger.log(new LogAlert(true, s, e));
}
}
public static void openLicenceEntryWindow(final boolean trytwo, final String prefillWith) {
synchronized( FeatureManagerUI.class ){
if (!enabled) {
return;
}
if (entryWindow != null) {
return;
}
try {
String tryNo = (trytwo ? "2" : "1");
final SWTSkinObjectTextbox[] key = new SWTSkinObjectTextbox[1];
entryWindow = new VuzeMessageBox(
MessageText.getString("dlg.auth.title"),
MessageText.getString("dlg.auth.enter.line.try." + tryNo),
new String[] {
MessageText.getString("Button.agree"),
MessageText.getString("Button.cancel")
}, 0);
entryWindow.setButtonVals(new Integer[] {
SWT.OK,
SWT.CANCEL,
});
entryWindow.setSubTitle(MessageText.getString("dlg.auth.enter.subtitle.try."
+ tryNo));
entryWindow.addResourceBundle(FeatureManagerUI.class,
SkinPropertiesImpl.PATH_SKIN_DEFS, "skin3_dlg_register");
entryWindow.setIconResource("image.vp");
if (trytwo) {
entryWindow.setTextIconResource("image.warn.big");
}
entryWindow.setListener(new VuzeMessageBoxListener() {
public void shellReady(Shell shell, SWTSkinObjectContainer soExtra) {
SWTSkin skin = soExtra.getSkin();
skin.createSkinObject("dlg.register", "dlg.register", soExtra);
SWTSkinObjectText link = (SWTSkinObjectText) skin.getSkinObject(
"register-link", soExtra);
link.setText(MessageText.getString(trytwo ? "dlg.auth.enter.link.try.2" : "dlg.auth.enter.link.try.1"));
link.addUrlClickedListener(new SWTSkinObjectText_UrlClickedListener() {
public boolean urlClicked(URLInfo urlInfo) {
if (trytwo) {
String url = ConstantsVuze.getDefaultContentNetwork().getExternalSiteRelativeURL(
"upgrade.start", true);
Utils.launch(url);
} else {
SBC_PlusFTUX.setSourceRef("dlg-activation");
MultipleDocumentInterface mdi = UIFunctionsManager.getUIFunctions().getMDI();
mdi.showEntryByID(MultipleDocumentInterface.SIDEBAR_SECTION_PLUS);
entryWindow.close(-2);
}
return true;
}
});
SWTSkinObjectText linkTOS = (SWTSkinObjectText) skin.getSkinObject(
"tos-link", soExtra);
if (linkTOS != null) {
linkTOS.addUrlClickedListener(new SWTSkinObjectText_UrlClickedListener() {
public boolean urlClicked(URLInfo urlInfo) {
String url = ConstantsVuze.getDefaultContentNetwork().getExternalSiteRelativeURL(
"plus_tos.start", true);
Utils.launch(url);
return true;
}
});
}
key[0] = (SWTSkinObjectTextbox) skin.getSkinObject("key", soExtra);
if (key[0] != null) {
if (prefillWith != null) {
key[0].setText(prefillWith);
} else if (!trytwo) {
FeatureUtils.licenceDetails details = FeatureUtils.getFullFeatureDetails();
if (details != null && details.licence.getState() != Licence.LS_INVALID_KEY) {
key[0].setText(details.licence.getKey());
if (key[0].getControl() instanceof Text) {
((Text)key[0].getControl()).selectAll();
}
final SWTSkinObjectText soExpirey = (SWTSkinObjectText) skin.getSkinObject("register-expirey");
if (soExpirey != null) {
key[0].getControl().addListener(SWT.Modify, new Listener() {
public void handleEvent(Event event) {
soExpirey.setText("");
}
});
int state = details.licence.getState();
if (state == Licence.LS_CANCELLED) {
soExpirey.setText(MessageText.getString("dlg.auth.enter.cancelled"));
} else if (state == Licence.LS_REVOKED) {
soExpirey.setText(MessageText.getString("dlg.auth.enter.revoked"));
} else if (state == Licence.LS_ACTIVATION_DENIED) {
soExpirey.setText(MessageText.getString("dlg.auth.enter.denied"));
} else {
long now = SystemTime.getCurrentTime();
if (details.expiry < now && details.displayedExpiry > now) {
soExpirey.setText(MessageText.getString("plus.notificaiton.OfflineExpiredEntry"));
} else {
soExpirey.setText(MessageText.getString("dlg.auth.enter.expiry",
new String[] {
DisplayFormatters.formatCustomDateOnly(details.displayedExpiry)
}));
}
}
}
}
}
}
}
});
entryWindow.open(new UserPrompterResultListener() {
public void prompterClosed(int result) {
synchronized( FeatureManagerUI.class ){
entryWindow = null;
}
if (result == SWT.OK) {
try {
Licence licence = featman.addLicence(key[0].getText());
int initialState = licence.getState();
if (initialState == Licence.LS_AUTHENTICATED) {
if ( !licence.isFullyInstalled()){
fml.licenceAdded(licence); // open installing window
}else{
openLicenceSuccessWindow();
}
}else if (initialState == Licence.LS_PENDING_AUTHENTICATION ) {
fml.licenceAdded(licence); // open validating window
} else if (initialState == Licence.LS_INVALID_KEY) {
openLicenceFailedWindow(initialState, key[0].getText());
} else if (initialState == Licence.LS_ACTIVATION_DENIED) {
openLicenceActivationDeniedWindow(licence);
} else if (initialState == Licence.LS_CANCELLED) {
openLicenceCancelledWindow(licence);
} else if (initialState == Licence.LS_REVOKED) {
openLicenceRevokedWindow(licence);
}
} catch (Throwable e) {
String s = Debug.getNestedExceptionMessage(e);
MessageBoxShell mb = new MessageBoxShell(
SWT.ICON_ERROR | SWT.OK,
"Licence Addition Error",
s );
mb.open();
Logger.log(new LogAlert(true, LogAlert.AT_ERROR, "Adding Licence",
e));
}
}
}
});
} catch (Exception e) {
entryWindow = null;
}
}
}
public static void openLicenceSuccessWindow() {
if (!enabled) {
return;
}
if (FeatureUtils.hasFullLicence()) {
openFullLicenceSuccessWindow();
} else {
openTrialLicenceSuccessWindow();
}
}
/**
*
*
* @since 4.1.0.5
*/
private static void openTrialLicenceSuccessWindow() {
final VuzeMessageBox box = new VuzeMessageBox(
MessageText.getString("dlg.auth.trial.success.subtitle"),
MessageText.getString("dlg.auth.trial.success.line1"), new String[] {
MessageText.getString("Button.goLibrary"),
}, 0);
box.addResourceBundle(FeatureManagerUI.class,
SkinPropertiesImpl.PATH_SKIN_DEFS, "skin3_dlg_register");
box.setIconResource("image.burn.dlg.header");
box.setListener(new VuzeMessageBoxListener() {
public void shellReady(Shell shell, SWTSkinObjectContainer soExtra) {
SWTSkin skin = soExtra.getSkin();
skin.createSkinObject("dlg.register.trial.success",
"dlg.register.trial.success", soExtra);
}
});
box.open(new UserPrompterResultListener() {
public void prompterClosed(int result) {
if (result == 0) {
SBC_PlusFTUX.setSourceRef("dlg-trial-installed");
MultipleDocumentInterface mdi = UIFunctionsManager.getUIFunctions().getMDI();
mdi.showEntryByID(MultipleDocumentInterface.SIDEBAR_SECTION_LIBRARY);
}
}
});
}
private static void openFullLicenceSuccessWindow() {
final VuzeMessageBox box = new VuzeMessageBox(
MessageText.getString("dlg.auth.title"),
MessageText.getString("dlg.auth.success.line1"), new String[] {
MessageText.getString("Button.getstarted"),
}, 0);
box.setSubTitle(MessageText.getString("dlg.auth.success.subtitle"));
box.addResourceBundle(FeatureManagerUI.class,
SkinPropertiesImpl.PATH_SKIN_DEFS, "skin3_dlg_register");
box.setIconResource("image.vp");
box.setListener(new VuzeMessageBoxListener() {
public void shellReady(Shell shell, SWTSkinObjectContainer soExtra) {
SWTSkin skin = soExtra.getSkin();
skin.createSkinObject("dlg.register.success", "dlg.register.success",
soExtra);
}
});
box.open(new UserPrompterResultListener() {
public void prompterClosed(int result) {
if (result == 0) {
SBC_PlusFTUX.setSourceRef("dlg-plus-installed");
MultipleDocumentInterface mdi = UIFunctionsManager.getUIFunctions().getMDI();
mdi.showEntryByID(MultipleDocumentInterface.SIDEBAR_SECTION_PLUS);
}
}
});
}
public static void openLicenceRevokedWindow(final Licence licence) {
final VuzeMessageBox box = new VuzeMessageBox(
MessageText.getString("dlg.auth.revoked"),
MessageText.getString("dlg.auth.revoked.line1"), new String[] {
MessageText.getString("Button.close"),
}, 0);
box.addResourceBundle(FeatureManagerUI.class,
SkinPropertiesImpl.PATH_SKIN_DEFS, "skin3_dlg_register");
box.setIconResource("image.vp");
box.setTextIconResource("image.warn.big");
box.setListener(new VuzeMessageBoxListener() {
public void shellReady(Shell shell, SWTSkinObjectContainer soExtra) {
SWTSkin skin = soExtra.getSkin();
SWTSkinObject so = skin.createSkinObject("dlg.register.revoked",
"dlg.register.revoked", soExtra);
SWTSkinObjectText soLink = (SWTSkinObjectText) skin.getSkinObject(
"link", so);
if (soLink != null) {
soLink.addUrlClickedListener(new SWTSkinObjectText_UrlClickedListener() {
public boolean urlClicked(URLInfo urlInfo) {
String url = ConstantsVuze.getDefaultContentNetwork().getExternalSiteRelativeURL(
"licence_revoked.start?key="
+ UrlUtils.encode(licence.getKey()), true);
Utils.launch(url);
return true;
}
});
}
}
});
box.open(null);
}
public static void openLicenceActivationDeniedWindow(final Licence licence) {
final VuzeMessageBox box = new VuzeMessageBox(
MessageText.getString("dlg.auth.denied"),
MessageText.getString("dlg.auth.denied.line1"), new String[] {
MessageText.getString("Button.close"),
}, 0);
box.addResourceBundle(FeatureManagerUI.class,
SkinPropertiesImpl.PATH_SKIN_DEFS, "skin3_dlg_register");
box.setIconResource("image.vp");
box.setTextIconResource("image.warn.big");
box.setListener(new VuzeMessageBoxListener() {
public void shellReady(Shell shell, SWTSkinObjectContainer soExtra) {
SWTSkin skin = soExtra.getSkin();
SWTSkinObject so = skin.createSkinObject("dlg.register.denied",
"dlg.register.denied", soExtra);
SWTSkinObjectText soLink = (SWTSkinObjectText) skin.getSkinObject(
"link", so);
if (soLink != null) {
soLink.addUrlClickedListener(new SWTSkinObjectText_UrlClickedListener() {
public boolean urlClicked(URLInfo urlInfo) {
String url = ConstantsVuze.getDefaultContentNetwork().getExternalSiteRelativeURL(
"licence_denied.start?key="
+ UrlUtils.encode(licence.getKey()), true);
Utils.launch(url);
return true;
}
});
}
}
});
box.open(null);
}
public static void openLicenceCancelledWindow(final Licence licence) {
final VuzeMessageBox box = new VuzeMessageBox(
MessageText.getString("dlg.auth.cancelled"),
MessageText.getString("dlg.auth.cancelled.line1"), new String[] {
MessageText.getString("Button.close"),
}, 0);
box.addResourceBundle(FeatureManagerUI.class,
SkinPropertiesImpl.PATH_SKIN_DEFS, "skin3_dlg_register");
box.setIconResource("image.vp");
box.setTextIconResource("image.warn.big");
box.setListener(new VuzeMessageBoxListener() {
public void shellReady(Shell shell, SWTSkinObjectContainer soExtra) {
SWTSkin skin = soExtra.getSkin();
SWTSkinObject so = skin.createSkinObject("dlg.register.cancelled",
"dlg.register.cancelled", soExtra);
}
});
box.open(null);
}
protected static void openLicenceFailedWindow(int licenceState, String code) {
openLicenceEntryWindow(true, code);
}
public static void openLicenceValidatingWindow() {
synchronized( FeatureManagerUI.class ){
if (!enabled || validatingBox != null) {
return;
}
validatingBox = new VuzeMessageBox(
MessageText.getString("dlg.auth.validating.subtitle"), null, null, 0);
validatingBox.addResourceBundle(FeatureManagerUI.class,
SkinPropertiesImpl.PATH_SKIN_DEFS, "skin3_dlg_register");
validatingBox.setIconResource("image.vp");
validatingBox.setListener(new VuzeMessageBoxListener() {
public void shellReady(Shell shell, SWTSkinObjectContainer soExtra) {
SWTSkin skin = soExtra.getSkin();
skin.createSkinObject("dlg.register.validating",
"dlg.register.validating", soExtra);
}
});
validatingBox.open(
new UserPrompterResultListener()
{
public void
prompterClosed(
int result )
{
synchronized( FeatureManagerUI.class ){
validatingBox = null;
}
}
});
}
}
public static void closeLicenceValidatingWindow() {
synchronized( FeatureManagerUI.class ){
if (validatingBox != null) {
validatingBox.close(0);
validatingBox = null;
}
}
}
public static void openStreamPlusWindow(final String referal) {
String msgidPrefix;
String buttonID;
long plusExpiryTimeStamp = FeatureUtils.getPlusExpiryTimeStamp();
if (plusExpiryTimeStamp <= 0
|| plusExpiryTimeStamp >= SystemTime.getCurrentTime()) {
msgidPrefix = "dlg.stream.plus.";
buttonID = "Button.upgrade";
} else {
buttonID = "Button.renew";
msgidPrefix = "dlg.stream.plus.renew.";
if (!MessageText.keyExistsForDefaultLocale(msgidPrefix + "text")) {
msgidPrefix = "dlg.stream.plus.";
}
}
final String f_msgidPrefix = msgidPrefix;
final VuzeMessageBox box = new VuzeMessageBox(
MessageText.getString(msgidPrefix + "title"),
MessageText.getString(msgidPrefix + "text"), new String[] {
MessageText.getString(buttonID),
MessageText.getString("Button.cancel"),
}, 0);
box.setButtonVals(new Integer[] {
BUTTON_UPGRADE,
SWT.CANCEL
});
box.setSubTitle(MessageText.getString(msgidPrefix + "subtitle"));
box.addResourceBundle(FeatureManagerUI.class,
SkinPropertiesImpl.PATH_SKIN_DEFS, "skin3_dlg_streamplus");
box.setIconResource("image.header.streamplus");
box.setListener(new VuzeMessageBoxListener() {
public void shellReady(Shell shell, SWTSkinObjectContainer soExtra) {
SWTSkin skin = soExtra.getSkin();
skin.createSkinObject("dlg.stream.plus", "dlg.stream.plus", soExtra);
SWTSkinObject soSubText = skin.getSkinObject("trial-info", soExtra);
if (soSubText instanceof SWTSkinObjectText) {
((SWTSkinObjectText) soSubText).setTextID(f_msgidPrefix + "subtext");
}
}
});
box.open(new UserPrompterResultListener() {
public void prompterClosed(int result) {
if (result == BUTTON_UPGRADE) {
SBC_PlusFTUX.setSourceRef("dlg-stream" + (referal == null ? "" : "-" + referal));
MultipleDocumentInterface mdi = UIFunctionsManager.getUIFunctions().getMDI();
mdi.showEntryByID(MultipleDocumentInterface.SIDEBAR_SECTION_PLUS);
}
}
});
}
public static String appendFeatureManagerURLParams(String url) {
long remainingUses = FeatureUtils.getRemaining();
long plusExpiryTimeStamp = FeatureUtils.getPlusExpiryDisplayTimeStamp();
String plusRenewalCode = FeatureUtils.getPlusRenewalCode();
String newURL = url + (url.contains("?") ? "&" : "?");
newURL += "mode=" + FeatureUtils.getMode();
if (plusExpiryTimeStamp != 0) {
newURL += "&remaining_plus="
+ (plusExpiryTimeStamp - SystemTime.getCurrentTime());
}
newURL += "&remaining=" + remainingUses;
if (plusRenewalCode != null) {
newURL += "&renewal_code=" + plusRenewalCode;
}
return newURL;
}
/**
* Needs to stay here as used by burn plugin
*/
public static long
getPlusExpiryTimeStamp()
{
return( FeatureUtils.getPlusExpiryTimeStamp());
}
}