/**
* Copyright (c) 2013, Redsolution LTD. All rights reserved.
*
* This file is part of Xabber project; you can redistribute it and/or
* modify it under the terms of the GNU General Public License, Version 3.
*
* Xabber 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, see http://www.gnu.org/licenses/.
*/
package com.xabber.xmpp.archive;
import java.util.Collection;
import java.util.NoSuchElementException;
import com.xabber.xmpp.ssn.DisclosureValue;
import com.xabber.xmpp.ssn.LoggingValue;
import com.xabber.xmpp.ssn.SecurityValue;
/**
* User's default setting for OTR Mode.
* <p/>
* http://xmpp.org/extensions/xep-0136.html#pref-syntax-default-otr
*
* @author alexander.ivanov
*/
public enum OtrMode {
/**
* The user MUST explicitly approve off-the-record communication.
*/
approve(new LoggingValue[]{LoggingValue.mustnot, LoggingValue.may}),
/**
* Communications MAY be off the record if requested by another user.
*/
concede(new LoggingValue[]{LoggingValue.may, LoggingValue.mustnot}),
/**
* Communications MUST NOT be off the record.
*/
forbid(new LoggingValue[]{LoggingValue.may}),
/**
* Communications SHOULD NOT be off the record even if requested.
*/
oppose(new LoggingValue[]{LoggingValue.may, LoggingValue.mustnot}),
/**
* Communications SHOULD be off the record if possible.
*/
prefer(new LoggingValue[]{LoggingValue.mustnot, LoggingValue.may}),
/**
* Communications MUST be off the record.
*/
require(new LoggingValue[]{LoggingValue.mustnot});
private final LoggingValue[] loggingValues;
OtrMode(LoggingValue[] loggingValues) {
this.loggingValues = loggingValues;
}
public LoggingValue[] getLoggingValues() {
return loggingValues;
}
public DisclosureValue getDisclosureValue() {
if (this == require) {
return DisclosureValue.never;
} else if (this == prefer || this == approve || this == concede) {
return DisclosureValue.disabled;
} else if (this == oppose || this == forbid) {
return DisclosureValue.enabled;
} else
throw new IllegalStateException();
}
public SecurityValue getSecurityValue() {
if (this == require || this == prefer || this == approve
|| this == concede) {
return SecurityValue.c2s;
} else if (this == oppose || this == forbid) {
return SecurityValue.none;
} else
throw new IllegalStateException();
}
public boolean acceptLoggingValue(LoggingValue loggingValue) {
for (LoggingValue check : loggingValues)
if (check == loggingValue)
return true;
return false;
}
public LoggingValue selectLoggingValue(Collection<LoggingValue> values) {
if (this == require) {
if (values.contains(LoggingValue.mustnot))
return LoggingValue.mustnot;
else
return null;
} else if (this == prefer) {
if (values.contains(LoggingValue.mustnot))
return LoggingValue.mustnot;
else if (values.contains(LoggingValue.may))
return LoggingValue.may;
else
return null;
} else if (this == approve || this == concede) {
if (values.isEmpty())
return null;
else
return values.iterator().next();
} else if (this == oppose) {
if (values.contains(LoggingValue.may))
return LoggingValue.may;
else if (values.contains(LoggingValue.mustnot))
return LoggingValue.mustnot;
else
return null;
} else if (this == forbid) {
if (values.contains(LoggingValue.may))
return LoggingValue.may;
else
return null;
} else
throw new IllegalStateException();
}
public static OtrMode fromString(String value)
throws NoSuchElementException {
if (value == null)
throw new NoSuchElementException();
try {
return valueOf(value);
} catch (IllegalArgumentException e) {
throw new NoSuchElementException();
}
}
}