/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Copyright @ 2015 Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.java.sip.communicator.plugin.desktoputil;
import java.awt.image.*;
import java.lang.reflect.*;
import java.net.*;
import java.security.cert.*;
import javax.imageio.*;
import javax.swing.*;
import net.java.sip.communicator.service.browserlauncher.*;
import net.java.sip.communicator.service.certificate.*;
import net.java.sip.communicator.service.credentialsstorage.*;
import net.java.sip.communicator.service.globaldisplaydetails.*;
import net.java.sip.communicator.service.gui.*;
import net.java.sip.communicator.service.keybindings.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.service.resources.*;
import net.java.sip.communicator.util.*;
import org.jitsi.service.audionotifier.*;
import org.jitsi.service.configuration.*;
import org.jitsi.service.fileaccess.*;
import org.jitsi.service.neomedia.*;
import org.jitsi.service.resources.*;
import org.osgi.framework.*;
public class DesktopUtilActivator
implements BundleActivator,
VerifyCertificateDialogService
{
/**
* The <tt>Logger</tt> used by the <tt>SwingUtilActivator</tt> class and its
* instances for logging output.
*/
private static final Logger logger
= Logger.getLogger(DesktopUtilActivator.class);
private static ConfigurationService configurationService;
private static ResourceManagementService resourceService;
private static KeybindingsService keybindingsService;
private static BrowserLauncherService browserLauncherService;
private static UIService uiService;
private static AccountManager accountManager;
private static FileAccessService fileAccessService;
private static MediaService mediaService;
private static AudioNotifierService audioNotifierService;
private static GlobalDisplayDetailsService globalDisplayDetailsService;
static BundleContext bundleContext;
/**
* Calls <tt>Thread.setUncaughtExceptionHandler()</tt>
*
* @param context The execution context of the bundle being started
* (unused).
* @throws Exception If this method throws an exception, this bundle is
* marked as stopped and the Framework will remove this bundle's
* listeners, unregister all services registered by this bundle, and
* release all services used by this bundle.
*/
public void start(BundleContext context) throws Exception
{
bundleContext = context;
// register the VerifyCertificateDialogService
bundleContext.registerService(
VerifyCertificateDialogService.class.getName(),
this,
null);
bundleContext.registerService(
MasterPasswordInputService.class.getName(),
new MasterPasswordInputService()
{
public String showInputDialog(boolean prevSuccess)
{
return MasterPasswordInputDialog.showInput(prevSuccess);
}
},
null);
bundleContext.registerService(
AuthenticationWindowService.class.getName(),
new AuthenticationWindowService()
{
public AuthenticationWindow create(
String userName,
char[] password,
String server,
boolean isUserNameEditable,
boolean isRememberPassword,
Object icon,
String windowTitle,
String windowText,
String usernameLabelText,
String passwordLabelText,
String errorMessage,
String signupLink)
{
ImageIcon imageIcon = null;
if(icon instanceof ImageIcon)
imageIcon = (ImageIcon)icon;
AuthenticationWindowCreator creator
= new AuthenticationWindowCreator(
userName,
password,
server,
isUserNameEditable,
isRememberPassword,
imageIcon,
windowTitle,
windowText,
usernameLabelText,
passwordLabelText,
errorMessage,
signupLink);
try
{
SwingUtilities.invokeAndWait(creator);
}
catch(InterruptedException e)
{
logger.error("Error creating dialog", e);
}
catch(InvocationTargetException e)
{
logger.error("Error creating dialog", e);
}
return creator.authenticationWindow;
}
},
null);
}
/**
* Doesn't do anything.
*
* @param context The execution context of the bundle being stopped.
* @throws Exception If this method throws an exception, the bundle is
* still marked as stopped, and the Framework will remove the bundle's
* listeners, unregister all services registered by the bundle, and
* release all services used by the bundle.
*/
public void stop(BundleContext context)
throws Exception
{
}
/**
* Returns the <tt>ConfigurationService</tt> currently registered.
*
* @return the <tt>ConfigurationService</tt>
*/
public static ConfigurationService getConfigurationService()
{
if (configurationService == null)
{
configurationService
= ServiceUtils.getService(
bundleContext,
ConfigurationService.class);
}
return configurationService;
}
/**
* Returns the service giving access to all application resources.
*
* @return the service giving access to all application resources.
*/
public static ResourceManagementService getResources()
{
if (resourceService == null)
{
resourceService
= ResourceManagementServiceUtils.getService(bundleContext);
}
return resourceService;
}
/**
* Returns the image corresponding to the given <tt>imageID</tt>.
*
* @param imageID the identifier of the image
* @return the image corresponding to the given <tt>imageID</tt>
*/
public static BufferedImage getImage(String imageID)
{
BufferedImage image = null;
URL path = getResources().getImageURL(imageID);
if (path == null)
return null;
try
{
image = ImageIO.read(path);
}
catch (Exception exc)
{
logger.error("Failed to load image:" + path, exc);
}
return image;
}
/**
* Returns the <tt>KeybindingsService</tt> currently registered.
*
* @return the <tt>KeybindingsService</tt>
*/
public static KeybindingsService getKeybindingsService()
{
if (keybindingsService == null)
{
keybindingsService
= ServiceUtils.getService(
bundleContext,
KeybindingsService.class);
}
return keybindingsService;
}
/**
* Returns the <tt>BrowserLauncherService</tt> obtained from the bundle
* context.
* @return the <tt>BrowserLauncherService</tt> obtained from the bundle
* context
*/
public static BrowserLauncherService getBrowserLauncher()
{
if (browserLauncherService == null)
{
browserLauncherService
= ServiceUtils.getService(
bundleContext,
BrowserLauncherService.class);
}
return browserLauncherService;
}
/**
* Gets the <tt>UIService</tt> instance registered in the
* <tt>BundleContext</tt> of the <tt>UtilActivator</tt>.
*
* @return the <tt>UIService</tt> instance registered in the
* <tt>BundleContext</tt> of the <tt>UtilActivator</tt>
*/
public static UIService getUIService()
{
if (uiService == null)
uiService = ServiceUtils.getService(bundleContext, UIService.class);
return uiService;
}
/**
* Creates the dialog.
*
* @param certs the certificates list
* @param title The title of the dialog; when null the resource
* <tt>service.gui.CERT_DIALOG_TITLE</tt> is loaded and used.
* @param message A text that describes why the verification failed.
*/
public VerifyCertificateDialog createDialog(
Certificate[] certs, String title, String message)
{
VerifyCertificateDialogCreator creator
= new VerifyCertificateDialogCreator(certs, title, message);
try
{
SwingUtilities.invokeAndWait(creator);
}
catch(InterruptedException e)
{
logger.error("Error creating dialog", e);
}
catch(InvocationTargetException e)
{
logger.error("Error creating dialog", e);
}
return creator.dialog;
}
/**
* Returns the <tt>AccountManager</tt> obtained from the bundle context.
* @return the <tt>AccountManager</tt> obtained from the bundle context
*/
public static AccountManager getAccountManager()
{
if(accountManager == null)
{
accountManager
= ServiceUtils.getService(bundleContext, AccountManager.class);
}
return accountManager;
}
/**
* Returns the <tt>FileAccessService</tt> obtained from the bundle context.
*
* @return the <tt>FileAccessService</tt> obtained from the bundle context
*/
public static FileAccessService getFileAccessService()
{
if (fileAccessService == null)
{
fileAccessService
= ServiceUtils.getService(
bundleContext,
FileAccessService.class);
}
return fileAccessService;
}
/**
* Returns an instance of the <tt>MediaService</tt> obtained from the
* bundle context.
* @return an instance of the <tt>MediaService</tt> obtained from the
* bundle context
*/
public static MediaService getMediaService()
{
if (mediaService == null)
{
mediaService
= ServiceUtils.getService(bundleContext, MediaService.class);
}
return mediaService;
}
/**
* Returns the <tt>AudioNotifierService</tt> obtained from the bundle
* context.
* @return the <tt>AudioNotifierService</tt> obtained from the bundle
* context
*/
public static AudioNotifierService getAudioNotifier()
{
if (audioNotifierService == null)
{
audioNotifierService
= ServiceUtils.getService(
bundleContext,
AudioNotifierService.class);
}
return audioNotifierService;
}
/**
* Returns the <tt>GlobalDisplayDetailsService</tt> obtained from the bundle
* context.
*
* @return the <tt>GlobalDisplayDetailsService</tt> obtained from the bundle
* context
*/
public static GlobalDisplayDetailsService getGlobalDisplayDetailsService()
{
if (globalDisplayDetailsService == null)
{
globalDisplayDetailsService
= ServiceUtils.getService(
bundleContext,
GlobalDisplayDetailsService.class);
}
return globalDisplayDetailsService;
}
/**
* Runnable to create verify dialog.
*/
private class VerifyCertificateDialogCreator
implements Runnable
{
/**
* Certs.
*/
private final Certificate[] certs;
/**
* Dialog title.
*/
private final String title;
/**
* Dialog message.
*/
private final String message;
/**
* The result dialog.
*/
VerifyCertificateDialogImpl dialog = null;
/**
* Constructs.
* @param certs the certificates list
* @param title The title of the dialog; when null the resource
* <tt>service.gui.CERT_DIALOG_TITLE</tt> is loaded and used.
* @param message A text that describes why the verification failed.
*/
private VerifyCertificateDialogCreator(
Certificate[] certs, String title, String message)
{
this.certs = certs;
this.title = title;
this.message = message;
}
@Override
public void run()
{
dialog = new VerifyCertificateDialogImpl(certs, title, message);
}
}
/**
* Runnable to create auth window.
*/
private class AuthenticationWindowCreator
implements Runnable
{
String userName;
char[] password;
String server;
boolean isUserNameEditable;
boolean isRememberPassword;
String windowTitle;
String windowText;
String usernameLabelText;
String passwordLabelText;
String errorMessage;
String signupLink;
ImageIcon imageIcon;
AuthenticationWindowService.AuthenticationWindow authenticationWindow;
/**
* Creates an instance of the <tt>AuthenticationWindow</tt>
* implementation.
*
* @param server the server name
* @param isUserNameEditable indicates if the user name is editable
* @param imageIcon the icon to display on the left of
* the authentication window
* @param windowTitle customized window title
* @param windowText customized window text
* @param usernameLabelText customized username field label text
* @param passwordLabelText customized password field label text
* @param errorMessage an error message if this dialog is shown
* to indicate the user that something went wrong
* @param signupLink an URL that allows the user to sign up
*/
public AuthenticationWindowCreator(String userName,
char[] password,
String server,
boolean isUserNameEditable,
boolean isRememberPassword,
ImageIcon imageIcon,
String windowTitle,
String windowText,
String usernameLabelText,
String passwordLabelText,
String errorMessage,
String signupLink)
{
this.userName = userName;
this.password = password;
this.server = server;
this.isUserNameEditable = isUserNameEditable;
this.isRememberPassword = isRememberPassword;
this.windowTitle = windowTitle;
this.windowText = windowText;
this.usernameLabelText = usernameLabelText;
this.passwordLabelText = passwordLabelText;
this.errorMessage = errorMessage;
this.signupLink = signupLink;
this.imageIcon = imageIcon;
}
@Override
public void run()
{
authenticationWindow
= new net.java.sip.communicator.plugin.desktoputil
.AuthenticationWindow(
userName, password,
server,
isUserNameEditable, isRememberPassword,
imageIcon,
windowTitle, windowText,
usernameLabelText, passwordLabelText,
errorMessage,
signupLink);
}
}
}