package profiles;

import java.util.Vector;

/**
 * <p>E' la classe generica che descrive un messaggio.
 * Esistono 3 tipo di messaggi:
 *
 * <ul>
 * <li>richesta routing-table</li>
 * <li>routing-table inviata in risposta</li>
 * <li>messaggio livello utente</li>
 * </ul>
 *
 * </p>
 *
 * @author Lorenzo Moretti
 * @version 1.0
 */

public interface Message {
  /**
   * Il messaggio è una richiesta di RoutingTable.
   */
  final static public int RT_REQ = 0x0;

  /**
   * Il messaggio contiene una RoutingTable in risposta
   * ad una richiesta.
   */
  final static public int RT_SND = 0x1;

  /**
   * Il messaggio è un messaggio utente.
   */
  final static public int USR_MSG = 0x2;

  /**
   * Il messaggio è un broadcast.
   */
  final static public int BCAST = 0x3;

  /**
   * Deve restituire una delle costanti presentati sopra.
   * @return il tipo di messaggio.
   */
  public int getType();

  /**
   * Restituisce un percorso per un per raggiungere il destinatario. Il percorso
   * è espresso come una lista di URL (rappresentati come stringhe).
   * @return il percorso per il destinatario.
   */
  public Vector getRoute();

  /**
   * Reimposta il percorso per un messaggio.
   * @param v
   */
  public void setRoute(Vector v);

  /**
   * Ottiene il mittente. Il mittente è espresso come id (URL).
   * @return il mittente del messaggio.
   */
  public String getSrcDevice();

  /**
   * Restituisce il contenuto del messaggio.
   * @return il contenuto del messaggio.
   */
  public Object getMessage();

  /**
   * Permette di serializzare il messaggio in una stringa di testo.
   * @return una stringa di testo che consenta la ricostruzione del messaggio.
   */
  public String toString();


  /**
   * Utilizzato per i messaggi di broad-cast, indica numero di propagazioni
   * che un messaggio può subire.
   * @return time to live.
   */
  public int getTimeToLive();

  /**
   * Decrementa di un'unità il tine ti live.
   * @return il time to live rimanente.
   */
  public int decTimeToLive();
}