/*    Copyright 2014 MongoDB Inc.
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

#include <boost/scoped_ptr.hpp>

#include "mongo/client/sasl_client_session.h"

namespace mongo {

class SaslClientConversation;

/**
 * Implementation of the client side of a SASL authentication conversation using the
 * native SASL implementation.
 */
class NativeSaslClientSession : public SaslClientSession {
    MONGO_DISALLOW_COPYING(NativeSaslClientSession);

public:
    NativeSaslClientSession();
    ~NativeSaslClientSession();

    virtual Status initialize();

    virtual Status step(const StringData& inputData, std::string* outputData);

    virtual bool isDone() const {
        return _done;
    }

private:
    /// Number of successfully completed conversation steps.
    int _step;

    /// See isDone().
    bool _done;

    /// The client side of a SASL authentication conversation.
    boost::scoped_ptr<SaslClientConversation> _saslConversation;
};

}  // namespace mongo
