/*
 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
 * Copyright (C) 2008 Collabora, Ltd. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 */

#pragma once

#include "PluginQuirkSet.h"
#include <WebCore/FileSystem.h>
#include <WebCore/NetscapePlugInStreamLoader.h>
#include <WebCore/ResourceRequest.h>
#include <WebCore/ResourceResponse.h>
#include <WebCore/Timer.h>
#include <WebCore/URL.h>
#include <WebCore/npruntime_internal.h>
#include <wtf/HashMap.h>
#include <wtf/RefCounted.h>
#include <wtf/Vector.h>
#include <wtf/text/CString.h>
#include <wtf/text/StringHash.h>
#include <wtf/text/WTFString.h>

namespace WebCore {
class Frame;
class PluginStream;

enum PluginStreamState { StreamBeforeStarted, StreamStarted, StreamStopped };

class PluginStreamClient {
public:
    virtual ~PluginStreamClient() { }
    virtual void streamDidFinishLoading(PluginStream*) { }
};

class PluginStream : public RefCounted<PluginStream>, private NetscapePlugInStreamLoaderClient {
public:
    static Ref<PluginStream> create(PluginStreamClient* client, Frame* frame, const ResourceRequest& request, bool sendNotification, void* notifyData, const NPPluginFuncs* functions, NPP instance, const PluginQuirkSet& quirks)
    {
        return adoptRef(*new PluginStream(client, frame, request, sendNotification, notifyData, functions, instance, quirks));
    }
    virtual ~PluginStream();
    
    void start();
    void stop();

    void startStream();

    void setLoadManually(bool loadManually) { m_loadManually = loadManually; }

    void sendJavaScriptStream(const URL& requestURL, const WTF::CString& resultString);
    void cancelAndDestroyStream(NPReason);

    static NPP ownerForStream(NPStream*);

private:
    PluginStream(PluginStreamClient*, Frame*, const ResourceRequest&, bool sendNotification, void* notifyData, const NPPluginFuncs*, NPP instance, const PluginQuirkSet&);

    void deliverData();
    void destroyStream(NPReason);
    void destroyStream();

    // NetscapePlugInStreamLoaderClient
    void willSendRequest(NetscapePlugInStreamLoader*, ResourceRequest&&, const ResourceResponse& redirectResponse, CompletionHandler<void(ResourceRequest&&)>&&) override;
    void didReceiveResponse(NetscapePlugInStreamLoader*, const ResourceResponse&) override;
    void didReceiveData(NetscapePlugInStreamLoader*, const char*, int) override;
    void didFail(NetscapePlugInStreamLoader*, const ResourceError&) override;
    void didFinishLoading(NetscapePlugInStreamLoader*) override;
    bool wantsAllStreams() const override;

    ResourceRequest m_resourceRequest;
    ResourceResponse m_resourceResponse;

    PluginStreamClient* m_client;
    Frame* m_frame;
    RefPtr<NetscapePlugInStreamLoader> m_loader;
    void* m_notifyData;
    bool m_sendNotification;
    PluginStreamState m_streamState;
    bool m_loadManually;

    Timer m_delayDeliveryTimer;
    void delayDeliveryTimerFired();

    std::unique_ptr<Vector<char>> m_deliveryData;

    FileSystem::PlatformFileHandle m_tempFileHandle;

    const NPPluginFuncs* m_pluginFuncs;
    NPP m_instance;
    uint16_t m_transferMode;
    int32_t m_offset;
    CString m_headers;
    String m_path;
    NPReason m_reason;
    NPStream m_stream;
    PluginQuirkSet m_quirks;

    friend class PluginView;
};

} // namespace WebCore
