/*
* 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.presence;
import net.java.sip.communicator.plugin.desktoputil.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.util.*;
import net.java.sip.communicator.util.account.*;
import javax.swing.*;
import java.util.*;
/**
* @author Damian Minkov
*/
public class GlobalStatusMessageMenu
extends AbstractStatusMessageMenu
{
/**
* Our logger.
*/
private final static Logger logger
= Logger.getLogger(GlobalStatusMessageMenu.class);
/**
* Creates an instance of <tt>GlobalStatusMessageMenu</tt>.
*
* @param swing should we use swing or awt
*/
public GlobalStatusMessageMenu(boolean swing)
{
super(swing);
}
/**
* Returns the currently set status message.
* @return the currently set status message.
*/
@Override
public String getCurrentStatusMessage()
{
// we will always return empty string
// as we have several providers that can have different status messages
// this is normally used when creating new status messages, to pre fill
return "";
}
/**
* Publishes the new message in separate thread. If successfully ended
* the message item is created and added to te list of current status
* messages and if needed the message is saved.
* @param message the message to save
* @param menuItem the item which was clicked to set this status
* @param saveIfNewMessage whether to save the status on the custom
* statuses list.
*/
@Override
public void publishStatusMessage(
String message,
Object menuItem,
boolean saveIfNewMessage)
{
new PublishStatusMessageThread(message, menuItem, saveIfNewMessage)
.start();
}
/**
* Returns the descriptor common for this status message menu instance.
* @return the descriptor common for this status message menu instance.
*/
@Override
public Object getDescriptor()
{
// we will receive the calls in order to update all global status menu
// instances when one is changed
return GlobalStatusMessageMenu.class;
}
@Override
protected Icon getMenuIcon()
{
return DesktopUtilActivator.getResources().getImage(
"service.gui.statusmessage.GLOBAL_STATUS_MESSAGE_ICON");
}
/**
* This class allow to use a thread to change the presence status message
* to all providers available.
*/
private class PublishStatusMessageThread extends Thread
{
private String message;
private Object menuItem;
private boolean saveIfNewMessage;
public PublishStatusMessageThread(
String message,
Object menuItem,
boolean saveIfNewMessage)
{
this.message = message;
this.menuItem = menuItem;
this.saveIfNewMessage = saveIfNewMessage;
}
@Override
public void run()
{
Iterator<ProtocolProviderService> pProvidersIter
= AccountUtils.getRegisteredProviders().iterator();
while(pProvidersIter.hasNext())
{
try
{
ProtocolProviderService protocolProvider
= pProvidersIter.next();
OperationSetPresence presenceOpSet
= protocolProvider.getOperationSet(
OperationSetPresence.class);
if(presenceOpSet == null
|| !protocolProvider.isRegistered())
continue;
presenceOpSet.publishPresenceStatus(
presenceOpSet.getPresenceStatus(), message);
}
catch (IllegalArgumentException e1)
{
logger.error("Error - changing status", e1);
}
catch (IllegalStateException e1)
{
logger.error("Error - changing status", e1);
}
catch (OperationFailedException e1)
{
if (e1.getErrorCode()
== OperationFailedException.GENERAL_ERROR)
{
logger.error(
"General error occured while "
+ "publishing presence status.",
e1);
}
else if (e1.getErrorCode()
== OperationFailedException
.NETWORK_FAILURE)
{
logger.error(
"Network failure occured while "
+ "publishing presence status.",
e1);
}
else if (e1.getErrorCode()
== OperationFailedException
.PROVIDER_NOT_REGISTERED)
{
logger.error(
"Protocol provider must be"
+ "registered in order to change status.",
e1);
}
}
}
}
}
}