void GatewayTask::processIcqSignOff()
{
    if ( !d->online ) {
        return;
    }

    ICQ::Session *conn = qobject_cast<ICQ::Session*>( sender() );
    if ( !d->icqJidTable.contains(conn) ) {
        return;
    }

    QString user_bare = d->icqJidTable[conn];
    XMPP::Jid user = d->jidResources[user_bare];
    emit offlineNotifyFor(user);

    d->icqJidTable.remove(conn);
    d->jidIcqTable.remove(user_bare);
    d->jidResources.remove(user_bare);
    conn->deleteLater();

    bool reconnect = UserManager::instance()->getOption(user_bare, "auto-reconnect").toBool();
    if ( reconnect ) {
        int rCount = d->reconnects.value(user_bare);
        if ( rCount >= 3 ) { // limit number of reconnects to 3.
            emit gatewayMessage(user, "Tried to reconnect 3 times, but no result. Stopping reconnects.");
            return;
        }
        d->reconnects.insert(user_bare, ++rCount);
        // qDebug() << "[GT]" << "Processing auto-reconnect for user" << user;
        emit probeRequest(user);
    }
}
/**
 * Sends presence notification to all registered users.
 */
void GatewayTask::processGatewayOnline()
{
    d->online = true;

    QStringListIterator ri(UserManager::instance()->getUserList());
    while ( ri.hasNext() ) {
        emit offlineNotifyFor( XMPP::Jid(ri.next()) );
    }

    QStringListIterator auto_invite(UserManager::instance()->getUserListByOptVal("auto-invite", QVariant(true)));
    while ( auto_invite.hasNext() ) {
        emit probeRequest( XMPP::Jid(auto_invite.next()) );
    }
}
void ProbeRequestFilter::received(PacketP_t packet)
{
    assert(packet->size() >= sizeof(struct ieee80211_radiotap_hdr));

    const struct ieee80211_radiotap_hdr *rh =
        (const struct ieee80211_radiotap_hdr*)packet->getData().data();

    assert(rh->version == 0);

    packet->pull(rh->len);
    // At this point we can no longer dereference the rh pointer!
    rh = NULL;

    assert(packet->size() >= sizeof(struct ieee80211_hdr));
    const struct ieee80211_hdr *hdr =
        (const struct ieee80211_hdr*)packet->getData().data();

    /* We're only interested in administrative frames, not data frames */
    if (IEEE80211_TYPE(hdr->frame_control) != WLAN_FC_TYPE_MGMT)
       return;

    /* We're only interested in probe requests */
    if (IEEE80211_STYPE(hdr->frame_control) != WLAN_FC_STYPE_PROBE_REQ)
        return;

    /* Copy out mac address */
    ProbeRequestP_t req(new ProbeRequest(hdr->addr2));

    packet->pull(sizeof(struct ieee80211_hdr));
    hdr = NULL;

    TagParser tp(packet->getData());

    assert(tp.hasTag(WLAN_EID_SSID));

    req->SSID = tp.getTagData(WLAN_EID_SSID);
    if (req->SSID.size() == 0)
        req->SSID = "Broadcast";

    emit probeRequest(req);
}