code: public boolean logoff (boolean abortable)
      {
          // if we have no communicator, we're not logged on anyway
          if (_comm == null) {
              log.warning("Ignoring request to logoff because we're not logged on.");
              return true;
          }
  
          // if the request is abortable, let's run it past the observers before we act upon it
          final boolean[] rejected = new boolean[] { false };
          _observers.apply(new ObserverOps.Client(this) {
              @Override protected void notify (ClientObserver obs) {
                  if (!obs.clientWillLogoff(_client)) {
                      rejected[0] = true;
                  }
              }
          });
          if (abortable && rejected[0]) {
              return false;
          }
  
          // ask the communicator to send a logoff message and disconnect from the server
          _comm.logoff();
  
          return true;
      }
docs: Requests that the client log off of the server to which it is connected.
  
  @param abortable If true, the client will call <code>clientWillDisconnect</code> on all of
  the client observers and abort the logoff process if any of them return false. If false,
  <code>clientWillDisconnect</code> will not be called at all.
  
  @return true if the logoff succeeded, false if it failed due to a disagreeable observer.