/*
 * Copyright (C) 1996-2023 The Squid Software Foundation and contributors
 *
 * Squid software is distributed under GPLv2+ license and includes
 * contributions from numerous individuals and organizations.
 * Please see the COPYING and CONTRIBUTORS files for details.
 */

#include "squid.h"
#include "AccessLogEntry.h"
#include "adaptation/ServiceFilter.h"
#include "HttpReply.h"
#include "HttpRequest.h"

Adaptation::ServiceFilter::ServiceFilter(Method aMethod, VectPoint aPoint, HttpRequest *aReq, HttpReply *aRep, AccessLogEntry::Pointer const &alp):
    method(aMethod),
    point(aPoint),
    request(aReq),
    reply(aRep),
    al(alp)
{
    if (reply)
        HTTPMSGLOCK(reply);

    // a lot of code assumes that there is always a virgin request or cause
    assert(request);
    HTTPMSGLOCK(request);
}

Adaptation::ServiceFilter::ServiceFilter(const ServiceFilter &f):
    method(f.method),
    point(f.point),
    request(f.request),
    reply(f.reply),
    al(f.al)
{
    if (request)
        HTTPMSGLOCK(request);

    if (reply)
        HTTPMSGLOCK(reply);
}

Adaptation::ServiceFilter::~ServiceFilter()
{
    HTTPMSGUNLOCK(request);
    HTTPMSGUNLOCK(reply);
}

Adaptation::ServiceFilter &Adaptation::ServiceFilter::operator =(const ServiceFilter &f)
{
    if (this != &f) {
        method = f.method;
        point = f.point;
        HTTPMSGUNLOCK(request);
        HTTPMSGUNLOCK(reply);
        request = f.request;
        HTTPMSGLOCK(request);
        reply = f.reply;
        if (reply)
            HTTPMSGLOCK(reply);
    }
    return *this;
}

std::ostream &
Adaptation::operator <<(std::ostream &os, const ServiceFilter &filter)
{
    os << methodStr(filter.method) << ' ' << vectPointStr(filter.point);
    return os;
}

