1 /** 2 * $RCSfile$ 3 * $Revision$ 4 * $Date$ 5 * 6 * Copyright 2003-2007 Jive Software. 7 * 8 * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); 9 * you may not use this file except in compliance with the License. 10 * You may obtain a copy of the License at 11 * 12 * http://www.apache.org/licenses/LICENSE-2.0 13 * 14 * Unless required by applicable law or agreed to in writing, software 15 * distributed under the License is distributed on an "AS IS" BASIS, 16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17 * See the License for the specific language governing permissions and 18 * limitations under the License. 19 */ 20 21 package org.jivesoftware.smackx.packet; 22 23 import org.jivesoftware.smack.packet.PacketExtension; 24 25 /** 26 * Represents extended presence information about roles, affiliations, full JIDs, 27 * or status codes scoped by the 'http://jabber.org/protocol/muc#user' namespace. 28 * 29 * @author Gaston Dombiak 30 */ 31 public class MUCUser implements PacketExtension { 32 33 private Invite invite; 34 private Decline decline; 35 private Item item; 36 private String password; 37 private Status status; 38 private Destroy destroy; 39 40 public String getElementName() { 41 return "x"; 42 } 43 44 public String getNamespace() { 45 return "http://jabber.org/protocol/muc#user"; 46 } 47 48 public String toXML() { 49 StringBuilder buf = new StringBuilder(); 50 buf.append("<").append(getElementName()).append(" xmlns=\"").append(getNamespace()).append( 51 "\">"); 52 if (getInvite() != null) { 53 buf.append(getInvite().toXML()); 54 } 55 if (getDecline() != null) { 56 buf.append(getDecline().toXML()); 57 } 58 if (getItem() != null) { 59 buf.append(getItem().toXML()); 60 } 61 if (getPassword() != null) { 62 buf.append("<password>").append(getPassword()).append("</password>"); 63 } 64 if (getStatus() != null) { 65 buf.append(getStatus().toXML()); 66 } 67 if (getDestroy() != null) { 68 buf.append(getDestroy().toXML()); 69 } 70 buf.append("</").append(getElementName()).append(">"); 71 return buf.toString(); 72 } 73 74 /** 75 * Returns the invitation for another user to a room. The sender of the invitation 76 * must be an occupant of the room. The invitation will be sent to the room which in turn 77 * will forward the invitation to the invitee. 78 * 79 * @return an invitation for another user to a room. 80 */ 81 public Invite getInvite() { 82 return invite; 83 } 84 85 /** 86 * Returns the rejection to an invitation from another user to a room. The rejection will be 87 * sent to the room which in turn will forward the refusal to the inviter. 88 * 89 * @return a rejection to an invitation from another user to a room. 90 */ 91 public Decline getDecline() { 92 return decline; 93 } 94 95 /** 96 * Returns the item child that holds information about roles, affiliation, jids and nicks. 97 * 98 * @return an item child that holds information about roles, affiliation, jids and nicks. 99 */ 100 public Item getItem() { 101 return item; 102 } 103 104 /** 105 * Returns the password to use to enter Password-Protected Room. A Password-Protected Room is 106 * a room that a user cannot enter without first providing the correct password. 107 * 108 * @return the password to use to enter Password-Protected Room. 109 */ 110 public String getPassword() { 111 return password; 112 } 113 114 /** 115 * Returns the status which holds a code that assists in presenting notification messages. 116 * 117 * @return the status which holds a code that assists in presenting notification messages. 118 */ 119 public Status getStatus() { 120 return status; 121 } 122 123 /** 124 * Returns the notification that the room has been destroyed. After a room has been destroyed, 125 * the room occupants will receive a Presence packet of type 'unavailable' with the reason for 126 * the room destruction if provided by the room owner. 127 * 128 * @return a notification that the room has been destroyed. 129 */ 130 public Destroy getDestroy() { 131 return destroy; 132 } 133 134 /** 135 * Sets the invitation for another user to a room. The sender of the invitation 136 * must be an occupant of the room. The invitation will be sent to the room which in turn 137 * will forward the invitation to the invitee. 138 * 139 * @param invite the invitation for another user to a room. 140 */ 141 public void setInvite(Invite invite) { 142 this.invite = invite; 143 } 144 145 /** 146 * Sets the rejection to an invitation from another user to a room. The rejection will be 147 * sent to the room which in turn will forward the refusal to the inviter. 148 * 149 * @param decline the rejection to an invitation from another user to a room. 150 */ 151 public void setDecline(Decline decline) { 152 this.decline = decline; 153 } 154 155 /** 156 * Sets the item child that holds information about roles, affiliation, jids and nicks. 157 * 158 * @param item the item child that holds information about roles, affiliation, jids and nicks. 159 */ 160 public void setItem(Item item) { 161 this.item = item; 162 } 163 164 /** 165 * Sets the password to use to enter Password-Protected Room. A Password-Protected Room is 166 * a room that a user cannot enter without first providing the correct password. 167 * 168 * @param string the password to use to enter Password-Protected Room. 169 */ 170 public void setPassword(String string) { 171 password = string; 172 } 173 174 /** 175 * Sets the status which holds a code that assists in presenting notification messages. 176 * 177 * @param status the status which holds a code that assists in presenting notification 178 * messages. 179 */ 180 public void setStatus(Status status) { 181 this.status = status; 182 } 183 184 /** 185 * Sets the notification that the room has been destroyed. After a room has been destroyed, 186 * the room occupants will receive a Presence packet of type 'unavailable' with the reason for 187 * the room destruction if provided by the room owner. 188 * 189 * @param destroy the notification that the room has been destroyed. 190 */ 191 public void setDestroy(Destroy destroy) { 192 this.destroy = destroy; 193 } 194 195 /** 196 * Represents an invitation for another user to a room. The sender of the invitation 197 * must be an occupant of the room. The invitation will be sent to the room which in turn 198 * will forward the invitation to the invitee. 199 * 200 * @author Gaston Dombiak 201 */ 202 public static class Invite { 203 private String reason; 204 private String from; 205 private String to; 206 207 /** 208 * Returns the bare JID of the inviter or, optionally, the room JID. (e.g. 209 * 'crone1 (at) shakespeare.lit/desktop'). 210 * 211 * @return the room's occupant that sent the invitation. 212 */ 213 public String getFrom() { 214 return from; 215 } 216 217 /** 218 * Returns the message explaining the invitation. 219 * 220 * @return the message explaining the invitation. 221 */ 222 public String getReason() { 223 return reason; 224 } 225 226 /** 227 * Returns the bare JID of the invitee. (e.g. 'hecate (at) shakespeare.lit') 228 * 229 * @return the bare JID of the invitee. 230 */ 231 public String getTo() { 232 return to; 233 } 234 235 /** 236 * Sets the bare JID of the inviter or, optionally, the room JID. (e.g. 237 * 'crone1 (at) shakespeare.lit/desktop') 238 * 239 * @param from the bare JID of the inviter or, optionally, the room JID. 240 */ 241 public void setFrom(String from) { 242 this.from = from; 243 } 244 245 /** 246 * Sets the message explaining the invitation. 247 * 248 * @param reason the message explaining the invitation. 249 */ 250 public void setReason(String reason) { 251 this.reason = reason; 252 } 253 254 /** 255 * Sets the bare JID of the invitee. (e.g. 'hecate (at) shakespeare.lit') 256 * 257 * @param to the bare JID of the invitee. 258 */ 259 public void setTo(String to) { 260 this.to = to; 261 } 262 263 public String toXML() { 264 StringBuilder buf = new StringBuilder(); 265 buf.append("<invite "); 266 if (getTo() != null) { 267 buf.append(" to=\"").append(getTo()).append("\""); 268 } 269 if (getFrom() != null) { 270 buf.append(" from=\"").append(getFrom()).append("\""); 271 } 272 buf.append(">"); 273 if (getReason() != null) { 274 buf.append("<reason>").append(getReason()).append("</reason>"); 275 } 276 buf.append("</invite>"); 277 return buf.toString(); 278 } 279 } 280 281 /** 282 * Represents a rejection to an invitation from another user to a room. The rejection will be 283 * sent to the room which in turn will forward the refusal to the inviter. 284 * 285 * @author Gaston Dombiak 286 */ 287 public static class Decline { 288 private String reason; 289 private String from; 290 private String to; 291 292 /** 293 * Returns the bare JID of the invitee that rejected the invitation. (e.g. 294 * 'crone1 (at) shakespeare.lit/desktop'). 295 * 296 * @return the bare JID of the invitee that rejected the invitation. 297 */ 298 public String getFrom() { 299 return from; 300 } 301 302 /** 303 * Returns the message explaining why the invitation was rejected. 304 * 305 * @return the message explaining the reason for the rejection. 306 */ 307 public String getReason() { 308 return reason; 309 } 310 311 /** 312 * Returns the bare JID of the inviter. (e.g. 'hecate (at) shakespeare.lit') 313 * 314 * @return the bare JID of the inviter. 315 */ 316 public String getTo() { 317 return to; 318 } 319 320 /** 321 * Sets the bare JID of the invitee that rejected the invitation. (e.g. 322 * 'crone1 (at) shakespeare.lit/desktop'). 323 * 324 * @param from the bare JID of the invitee that rejected the invitation. 325 */ 326 public void setFrom(String from) { 327 this.from = from; 328 } 329 330 /** 331 * Sets the message explaining why the invitation was rejected. 332 * 333 * @param reason the message explaining the reason for the rejection. 334 */ 335 public void setReason(String reason) { 336 this.reason = reason; 337 } 338 339 /** 340 * Sets the bare JID of the inviter. (e.g. 'hecate (at) shakespeare.lit') 341 * 342 * @param to the bare JID of the inviter. 343 */ 344 public void setTo(String to) { 345 this.to = to; 346 } 347 348 public String toXML() { 349 StringBuilder buf = new StringBuilder(); 350 buf.append("<decline "); 351 if (getTo() != null) { 352 buf.append(" to=\"").append(getTo()).append("\""); 353 } 354 if (getFrom() != null) { 355 buf.append(" from=\"").append(getFrom()).append("\""); 356 } 357 buf.append(">"); 358 if (getReason() != null) { 359 buf.append("<reason>").append(getReason()).append("</reason>"); 360 } 361 buf.append("</decline>"); 362 return buf.toString(); 363 } 364 } 365 366 /** 367 * Item child that holds information about roles, affiliation, jids and nicks. 368 * 369 * @author Gaston Dombiak 370 */ 371 public static class Item { 372 private String actor; 373 private String reason; 374 private String affiliation; 375 private String jid; 376 private String nick; 377 private String role; 378 379 /** 380 * Creates a new item child. 381 * 382 * @param affiliation the actor's affiliation to the room 383 * @param role the privilege level of an occupant within a room. 384 */ 385 public Item(String affiliation, String role) { 386 this.affiliation = affiliation; 387 this.role = role; 388 } 389 390 /** 391 * Returns the actor (JID of an occupant in the room) that was kicked or banned. 392 * 393 * @return the JID of an occupant in the room that was kicked or banned. 394 */ 395 public String getActor() { 396 return actor == null ? "" : actor; 397 } 398 399 /** 400 * Returns the reason for the item child. The reason is optional and could be used to 401 * explain the reason why a user (occupant) was kicked or banned. 402 * 403 * @return the reason for the item child. 404 */ 405 public String getReason() { 406 return reason == null ? "" : reason; 407 } 408 409 /** 410 * Returns the occupant's affiliation to the room. The affiliation is a semi-permanent 411 * association or connection with a room. The possible affiliations are "owner", "admin", 412 * "member", and "outcast" (naturally it is also possible to have no affiliation). An 413 * affiliation lasts across a user's visits to a room. 414 * 415 * @return the actor's affiliation to the room 416 */ 417 public String getAffiliation() { 418 return affiliation; 419 } 420 421 /** 422 * Returns the <room@service/nick> by which an occupant is identified within the context 423 * of a room. If the room is non-anonymous, the JID will be included in the item. 424 * 425 * @return the room JID by which an occupant is identified within the room. 426 */ 427 public String getJid() { 428 return jid; 429 } 430 431 /** 432 * Returns the new nickname of an occupant that is changing his/her nickname. The new 433 * nickname is sent as part of the unavailable presence. 434 * 435 * @return the new nickname of an occupant that is changing his/her nickname. 436 */ 437 public String getNick() { 438 return nick; 439 } 440 441 /** 442 * Returns the temporary position or privilege level of an occupant within a room. The 443 * possible roles are "moderator", "participant", and "visitor" (it is also possible to 444 * have no defined role). A role lasts only for the duration of an occupant's visit to 445 * a room. 446 * 447 * @return the privilege level of an occupant within a room. 448 */ 449 public String getRole() { 450 return role; 451 } 452 453 /** 454 * Sets the actor (JID of an occupant in the room) that was kicked or banned. 455 * 456 * @param actor the actor (JID of an occupant in the room) that was kicked or banned. 457 */ 458 public void setActor(String actor) { 459 this.actor = actor; 460 } 461 462 /** 463 * Sets the reason for the item child. The reason is optional and could be used to 464 * explain the reason why a user (occupant) was kicked or banned. 465 * 466 * @param reason the reason why a user (occupant) was kicked or banned. 467 */ 468 public void setReason(String reason) { 469 this.reason = reason; 470 } 471 472 /** 473 * Sets the <room@service/nick> by which an occupant is identified within the context 474 * of a room. If the room is non-anonymous, the JID will be included in the item. 475 * 476 * @param jid the JID by which an occupant is identified within a room. 477 */ 478 public void setJid(String jid) { 479 this.jid = jid; 480 } 481 482 /** 483 * Sets the new nickname of an occupant that is changing his/her nickname. The new 484 * nickname is sent as part of the unavailable presence. 485 * 486 * @param nick the new nickname of an occupant that is changing his/her nickname. 487 */ 488 public void setNick(String nick) { 489 this.nick = nick; 490 } 491 492 public String toXML() { 493 StringBuilder buf = new StringBuilder(); 494 buf.append("<item"); 495 if (getAffiliation() != null) { 496 buf.append(" affiliation=\"").append(getAffiliation()).append("\""); 497 } 498 if (getJid() != null) { 499 buf.append(" jid=\"").append(getJid()).append("\""); 500 } 501 if (getNick() != null) { 502 buf.append(" nick=\"").append(getNick()).append("\""); 503 } 504 if (getRole() != null) { 505 buf.append(" role=\"").append(getRole()).append("\""); 506 } 507 if (getReason() == null && getActor() == null) { 508 buf.append("/>"); 509 } 510 else { 511 buf.append(">"); 512 if (getReason() != null) { 513 buf.append("<reason>").append(getReason()).append("</reason>"); 514 } 515 if (getActor() != null) { 516 buf.append("<actor jid=\"").append(getActor()).append("\"/>"); 517 } 518 buf.append("</item>"); 519 } 520 return buf.toString(); 521 } 522 } 523 524 /** 525 * Status code assists in presenting notification messages. The following link provides the 526 * list of existing error codes (@link http://www.jabber.org/jeps/jep-0045.html#errorstatus). 527 * 528 * @author Gaston Dombiak 529 */ 530 public static class Status { 531 private String code; 532 533 /** 534 * Creates a new instance of Status with the specified code. 535 * 536 * @param code the code that uniquely identifies the reason of the error. 537 */ 538 public Status(String code) { 539 this.code = code; 540 } 541 542 /** 543 * Returns the code that uniquely identifies the reason of the error. The code 544 * assists in presenting notification messages. 545 * 546 * @return the code that uniquely identifies the reason of the error. 547 */ 548 public String getCode() { 549 return code; 550 } 551 552 public String toXML() { 553 StringBuilder buf = new StringBuilder(); 554 buf.append("<status code=\"").append(getCode()).append("\"/>"); 555 return buf.toString(); 556 } 557 } 558 559 /** 560 * Represents a notification that the room has been destroyed. After a room has been destroyed, 561 * the room occupants will receive a Presence packet of type 'unavailable' with the reason for 562 * the room destruction if provided by the room owner. 563 * 564 * @author Gaston Dombiak 565 */ 566 public static class Destroy { 567 private String reason; 568 private String jid; 569 570 571 /** 572 * Returns the JID of an alternate location since the current room is being destroyed. 573 * 574 * @return the JID of an alternate location. 575 */ 576 public String getJid() { 577 return jid; 578 } 579 580 /** 581 * Returns the reason for the room destruction. 582 * 583 * @return the reason for the room destruction. 584 */ 585 public String getReason() { 586 return reason; 587 } 588 589 /** 590 * Sets the JID of an alternate location since the current room is being destroyed. 591 * 592 * @param jid the JID of an alternate location. 593 */ 594 public void setJid(String jid) { 595 this.jid = jid; 596 } 597 598 /** 599 * Sets the reason for the room destruction. 600 * 601 * @param reason the reason for the room destruction. 602 */ 603 public void setReason(String reason) { 604 this.reason = reason; 605 } 606 607 public String toXML() { 608 StringBuilder buf = new StringBuilder(); 609 buf.append("<destroy"); 610 if (getJid() != null) { 611 buf.append(" jid=\"").append(getJid()).append("\""); 612 } 613 if (getReason() == null) { 614 buf.append("/>"); 615 } 616 else { 617 buf.append(">"); 618 if (getReason() != null) { 619 buf.append("<reason>").append(getReason()).append("</reason>"); 620 } 621 buf.append("</destroy>"); 622 } 623 return buf.toString(); 624 } 625 626 } 627 }