/** * Publish present status. We search for the highest value in the given interval. * * <p>change the status. * * @param globalStatus */ public void publishStatus(GlobalStatusEnum globalStatus) { String itemName = globalStatus.getStatusName(); Iterator<ProtocolProviderService> pProviders = GuiActivator.getUIService().getMainFrame().getProtocolProviders(); while (pProviders.hasNext()) { ProtocolProviderService protocolProvider = pProviders.next(); if (itemName.equals(GlobalStatusEnum.ONLINE_STATUS)) { if (!protocolProvider.isRegistered()) { saveStatusInformation(protocolProvider, itemName); GuiActivator.getUIService().getLoginManager().login(protocolProvider); } else { OperationSetPresence presence = protocolProvider.getOperationSet(OperationSetPresence.class); if (presence == null) { saveStatusInformation(protocolProvider, itemName); continue; } Iterator<PresenceStatus> statusSet = presence.getSupportedStatusSet(); while (statusSet.hasNext()) { PresenceStatus status = statusSet.next(); if (status.getStatus() < PresenceStatus.EAGER_TO_COMMUNICATE_THRESHOLD && status.getStatus() >= PresenceStatus.AVAILABLE_THRESHOLD) { new PublishPresenceStatusThread(protocolProvider, presence, status).start(); this.saveStatusInformation(protocolProvider, status.getStatusName()); break; } } } } else if (itemName.equals(GlobalStatusEnum.OFFLINE_STATUS)) { if (!protocolProvider.getRegistrationState().equals(RegistrationState.UNREGISTERED) && !protocolProvider.getRegistrationState().equals(RegistrationState.UNREGISTERING)) { OperationSetPresence presence = protocolProvider.getOperationSet(OperationSetPresence.class); if (presence == null) { saveStatusInformation(protocolProvider, itemName); GuiActivator.getUIService().getLoginManager().logoff(protocolProvider); continue; } Iterator<PresenceStatus> statusSet = presence.getSupportedStatusSet(); while (statusSet.hasNext()) { PresenceStatus status = statusSet.next(); if (status.getStatus() < PresenceStatus.ONLINE_THRESHOLD) { this.saveStatusInformation(protocolProvider, status.getStatusName()); break; } } try { protocolProvider.unregister(); } catch (OperationFailedException e1) { logger.error( "Unable to unregister the protocol provider: " + protocolProvider + " due to the following exception: " + e1); } } } else if (itemName.equals(GlobalStatusEnum.FREE_FOR_CHAT_STATUS)) { // we search for highest available status here publishStatus( protocolProvider, PresenceStatus.AVAILABLE_THRESHOLD, PresenceStatus.MAX_STATUS_VALUE); } else if (itemName.equals(GlobalStatusEnum.DO_NOT_DISTURB_STATUS)) { // status between online and away is DND publishStatus( protocolProvider, PresenceStatus.ONLINE_THRESHOLD, PresenceStatus.AWAY_THRESHOLD); } else if (itemName.equals(GlobalStatusEnum.AWAY_STATUS)) { // a status in the away interval publishStatus( protocolProvider, PresenceStatus.AWAY_THRESHOLD, PresenceStatus.AVAILABLE_THRESHOLD); } } }