示例#1
0
 /**
  * Register a particular listener for a particular message type. More than one listener can be
  * registered for each message type.
  *
  * @param m specify message type and template we're listening for
  * @param listener destination for received messages
  */
 public void registerListener(Message template, MessageListener listener) {
   Integer amType = new Integer(template.amType());
   Vector vec = (Vector) templateTbl.get(amType);
   if (vec == null) {
     vec = new Vector();
   }
   vec.addElement(new msgTemplate(template, listener));
   templateTbl.put(amType, vec);
 }
示例#2
0
 /**
  * Stop listening for messages of the given type with the given listener.
  *
  * @param m specify message type and template we're listening for
  * @param listener destination for received messages
  */
 public void deregisterListener(Message template, MessageListener listener) {
   Integer amType = new Integer(template.amType());
   Vector vec = (Vector) templateTbl.get(amType);
   if (vec == null) {
     throw new IllegalArgumentException(
         "No listeners registered for message type "
             + template.getClass().getName()
             + " (AM type "
             + template.amType()
             + ")");
   }
   msgTemplate mt = new msgTemplate(template, listener);
   // Remove all occurrences
   while (vec.removeElement(mt)) ;
   if (vec.size() == 0) templateTbl.remove(amType);
 }
示例#3
0
  public void packetReceived(byte[] packet) {
    // XXX: hack: with the new packetsource format, packet does not
    // contain a crc field, so numElements_data() will be wrong. But we
    // access the data area via dataSet/dataGet, so we're ok.

    // this is where the source comes in to create the correct packet

    final TOSMsg msg = messageFactory.createTOSMsg(packet);

    if (DEBUG) Dump.dump("Received message", packet);

    if (drop_bad_crc && msg.get_crc() != 0x01) {
      // Drop message
      if (DISPLAY_ERROR_MSGS) Dump.dump("Dropping packet with bad CRC", packet);
      return;
    }

    if (groupId == MoteIF.ANY_GROUP_ID || msg.get_group() == groupId) {
      Integer type = new Integer(msg.get_type());
      Vector vec = (Vector) templateTbl.get(type);
      if (vec == null) {
        if (DEBUG)
          Dump.dump(
              "Received packet with type " + msg.get_type() + ", but no listeners registered",
              packet);
        return;
      }
      int length = msg.get_length();

      Enumeration en = vec.elements();
      while (en.hasMoreElements()) {
        msgTemplate temp = (msgTemplate) en.nextElement();

        Message received;

        // Erk - end up cloning the message multiple times in case
        // different templates used for different listeners
        try {
          received = temp.template.clone(length);
          received.dataSet(msg.dataGet(), msg.offset_data(0), 0, length);
        } catch (ArrayIndexOutOfBoundsException e) {
          /*
           * Note: this will not catch messages whose length is
           * incorrect, but less than DATA_LENGTH (see AM.h) + 2
           */
          error(temp, "invalid length message received (too long)");
          continue;
        } catch (Exception e) {
          error(temp, "couldn't clone message!");
          continue;
        }

        /*
         * Messages that are longer than the template might have a
         * variable-sized array at their end
         */
        if (temp.template.dataGet().length > length) {
          error(temp, "invalid length message received (too short)");
          continue;
        }
        temp.listener.messageReceived(msg.get_addr(), received);
      }

    } else {
      if (DISPLAY_ERROR_MSGS) Dump.dump("Dropping packet with bad group ID", packet);
    }
  }