📄 iqownerhandler.java
字号:
}
finally {
room.lock.writeLock().unlock();
room.lock.readLock().lock();
}
}
finally {
room.lock.readLock().unlock();
}
// Send the updated presences to the room occupants
for (Presence presence : presences) {
room.send(presence);
}
}
}
/**
* Handles packets that includes a data form. The data form was sent using an element with name
* "x" and namespace "jabber:x:data".
*
* @param senderRole the role of the user that sent the data form.
* @param formElement the element that contains the data form specification.
* @throws ForbiddenException if the user does not have enough privileges.
* @throws ConflictException If the room was going to lose all of its owners.
*/
private void handleDataFormElement(MUCRole senderRole, Element formElement)
throws ForbiddenException, ConflictException {
XDataFormImpl completedForm = new XDataFormImpl();
completedForm.parse(formElement);
if (DataForm.TYPE_CANCEL.equals(completedForm.getType())) {
// If the room was just created (i.e. is locked) and the owner cancels the configuration
// form then destroy the room
if (room.isLocked()) {
room.destroyRoom(null, null);
}
}
else if (DataForm.TYPE_SUBMIT.equals(completedForm.getType())) {
// The owner is requesting an instant room
if (completedForm.getFieldsSize() == 0) {
// Do nothing
}
// The owner is requesting a reserved room or is changing the current configuration
else {
processConfigurationForm(completedForm, senderRole);
}
// If the room was locked, unlock it and send to the owner the "room is now unlocked"
// message
if (room.isLocked() && !room.isManuallyLocked()) {
room.unlock(senderRole);
}
if (!room.isDestroyed) {
// Let other cluster nodes that the room has been updated
CacheFactory.doClusterTask(new RoomUpdatedEvent(room));
}
}
}
/**
* Processes the completed form sent by an owner of the room. This will modify the room's
* configuration as well as the list of owners and admins.
*
* @param completedForm the completed form sent by an owner of the room.
* @param senderRole the role of the user that sent the completed form.
* @throws ForbiddenException if the user does not have enough privileges.
* @throws ConflictException If the room was going to lose all of its owners.
*/
private void processConfigurationForm(XDataFormImpl completedForm, MUCRole senderRole)
throws ForbiddenException, ConflictException {
Iterator<String> values;
String booleanValue;
List<String> list;
FormField field;
// Get the new list of admins
field = completedForm.getField("muc#roomconfig_roomadmins");
boolean adminsSent = field != null;
List<String> admins = new ArrayList<String>();
if (field != null) {
values = field.getValues();
while (values.hasNext()) {
admins.add(values.next());
}
}
// Get the new list of owners
field = completedForm.getField("muc#roomconfig_roomowners");
boolean ownersSent = field != null;
List<String> owners = new ArrayList<String>();
if (field != null) {
values = field.getValues();
while (values.hasNext()) {
owners.add(values.next());
}
}
// Answer a conflic error if all the current owners will be removed
if (ownersSent && owners.isEmpty()) {
throw new ConflictException();
}
// Keep a registry of the updated presences
List presences = new ArrayList(admins.size() + owners.size());
room.lock.writeLock().lock();
try {
field = completedForm.getField("muc#roomconfig_roomname");
if (field != null) {
values = field.getValues();
room.setNaturalLanguageName((values.hasNext() ? values.next() : " "));
}
field = completedForm.getField("muc#roomconfig_roomdesc");
if (field != null) {
values = field.getValues();
room.setDescription((values.hasNext() ? values.next() : " "));
}
field = completedForm.getField("muc#roomconfig_changesubject");
if (field != null) {
values = field.getValues();
booleanValue = (values.hasNext() ? values.next() : "1");
room.setCanOccupantsChangeSubject(("1".equals(booleanValue) ? true : false));
}
field = completedForm.getField("muc#roomconfig_maxusers");
if (field != null) {
values = field.getValues();
room.setMaxUsers((values.hasNext() ? Integer.parseInt(values.next()) : 30));
}
field = completedForm.getField("muc#roomconfig_presencebroadcast");
if (field != null) {
values = field.getValues();
list = new ArrayList<String>();
while (values.hasNext()) {
list.add(values.next());
}
room.setRolesToBroadcastPresence(list);
}
field = completedForm.getField("muc#roomconfig_publicroom");
if (field != null) {
values = field.getValues();
booleanValue = (values.hasNext() ? values.next() : "1");
room.setPublicRoom(("1".equals(booleanValue) ? true : false));
}
field = completedForm.getField("muc#roomconfig_persistentroom");
if (field != null) {
values = field.getValues();
booleanValue = (values.hasNext() ? values.next() : "1");
boolean isPersistent = ("1".equals(booleanValue) ? true : false);
// Delete the room from the DB if it's no longer persistent
if (room.isPersistent() && !isPersistent) {
MUCPersistenceManager.deleteFromDB(room);
}
room.setPersistent(isPersistent);
}
field = completedForm.getField("muc#roomconfig_moderatedroom");
if (field != null) {
values = field.getValues();
booleanValue = (values.hasNext() ? values.next() : "1");
room.setModerated(("1".equals(booleanValue) ? true : false));
}
field = completedForm.getField("muc#roomconfig_membersonly");
if (field != null) {
values = field.getValues();
booleanValue = (values.hasNext() ? values.next() : "1");
presences.addAll(room.setMembersOnly(("1".equals(booleanValue) ?
true : false)));
}
field = completedForm.getField("muc#roomconfig_allowinvites");
if (field != null) {
values = field.getValues();
booleanValue = (values.hasNext() ? values.next() : "1");
room.setCanOccupantsInvite(("1".equals(booleanValue) ? true : false));
}
field = completedForm.getField("muc#roomconfig_passwordprotectedroom");
if (field != null) {
values = field.getValues();
booleanValue = (values.hasNext() ? values.next() : "1");
boolean isPasswordProtected = "1".equals(booleanValue);
if (isPasswordProtected) {
// The room is password protected so set the new password
field = completedForm.getField("muc#roomconfig_roomsecret");
if (field != null) {
values = completedForm.getField("muc#roomconfig_roomsecret").getValues();
room.setPassword((values.hasNext() ? values.next() : null));
}
}
else {
// The room is not password protected so remove any previous password
room.setPassword(null);
}
}
field = completedForm.getField("muc#roomconfig_whois");
if (field != null) {
values = field.getValues();
booleanValue = (values.hasNext() ? values.next() : "1");
room.setCanAnyoneDiscoverJID(("anyone".equals(booleanValue) ? true : false));
}
field = completedForm.getField("muc#roomconfig_enablelogging");
if (field != null) {
values = field.getValues();
booleanValue = (values.hasNext() ? values.next() : "1");
room.setLogEnabled(("1".equals(booleanValue) ? true : false));
}
field = completedForm.getField("x-muc#roomconfig_reservednick");
if (field != null) {
values = field.getValues();
booleanValue = (values.hasNext() ? values.next() : "1");
room.setLoginRestrictedToNickname(("1".equals(booleanValue) ? true : false));
}
field = completedForm.getField("x-muc#roomconfig_canchangenick");
if (field != null) {
values = field.getValues();
booleanValue = (values.hasNext() ? values.next() : "1");
room.setChangeNickname(("1".equals(booleanValue) ? true : false));
}
field = completedForm.getField("x-muc#roomconfig_registration");
if (field != null) {
values = field.getValues();
booleanValue = (values.hasNext() ? values.next() : "1");
room.setRegistrationEnabled(("1".equals(booleanValue) ? true : false));
}
// Update the modification date to reflect the last time when the room's configuration
// was modified
room.setModificationDate(new Date());
if (room.isPersistent()) {
room.saveToDB();
}
// Set the new owners and admins of the room
presences.addAll(room.addOwners(owners, senderRole));
presences.addAll(room.addAdmins(admins, senderRole));
if (ownersSent) {
// Change the affiliation to "member" for the current owners that won't be neither
// owner nor admin (if the form included the owners field)
List<String> ownersToRemove = new ArrayList<String>(room.owners);
ownersToRemove.removeAll(admins);
ownersToRemove.removeAll(owners);
for (String jid : ownersToRemove) {
presences.addAll(room.addMember(jid, null, senderRole));
}
}
if (adminsSent) {
// Change the affiliation to "member" for the current admins that won't be neither
// owner nor admin (if the form included the admins field)
List<String> adminsToRemove = new ArrayList<String>(room.admins);
adminsToRemove.removeAll(admins);
adminsToRemove.removeAll(owners);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -