// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef PPAPI_PROXY_FILE_SYSTEM_RESOURCE_H_
#define PPAPI_PROXY_FILE_SYSTEM_RESOURCE_H_

#include <map>
#include <queue>
#include <string>

#include "base/memory/ref_counted.h"
#include "ppapi/c/pp_file_info.h"
#include "ppapi/c/pp_resource.h"
#include "ppapi/c/private/ppb_isolated_file_system_private.h"
#include "ppapi/proxy/connection.h"
#include "ppapi/proxy/plugin_resource.h"
#include "ppapi/proxy/ppapi_proxy_export.h"
#include "ppapi/proxy/resource_message_params.h"
#include "ppapi/thunk/ppb_file_system_api.h"

namespace ppapi {

class TrackedCallback;

namespace proxy {

class PPAPI_PROXY_EXPORT FileSystemResource
    : public PluginResource,
      public NON_EXPORTED_BASE(thunk::PPB_FileSystem_API) {
 public:
  // Creates a new FileSystemResource. The resource must be subsequently opened
  // via Open() before use.
  FileSystemResource(Connection connection,
                     PP_Instance instance,
                     PP_FileSystemType type);
  // Creates a FileSystemResource, attached to an existing pending host
  // resource. The |pending_renderer_id| and |pending_browser_id| must be
  // already-opened file systems.
  FileSystemResource(Connection connection,
                     PP_Instance instance,
                     int pending_renderer_id,
                     int pending_browser_id,
                     PP_FileSystemType type);
  ~FileSystemResource() override;

  // Resource overrides.
  thunk::PPB_FileSystem_API* AsPPB_FileSystem_API() override;

  // PPB_FileSystem_API implementation.
  int32_t Open(int64_t expected_size,
               scoped_refptr<TrackedCallback> callback) override;
  PP_FileSystemType GetType() override;
  void OpenQuotaFile(PP_Resource file_io) override;
  void CloseQuotaFile(PP_Resource file_io) override;
  typedef base::Callback<void(int64_t)> RequestQuotaCallback;
  int64_t RequestQuota(int64_t amount,
                       const RequestQuotaCallback& callback) override;

  int32_t InitIsolatedFileSystem(const std::string& fsid,
                                 PP_IsolatedFileSystemType_Private type,
                                 const base::Callback<void(int32_t)>& callback);
 private:
  struct QuotaRequest {
    QuotaRequest(int64_t amount,
                 const RequestQuotaCallback& callback);
    ~QuotaRequest();

    int64_t amount;
    RequestQuotaCallback callback;
  };

  // Called when the host has responded to our open request.
  void OpenComplete(scoped_refptr<TrackedCallback> callback,
                    const ResourceMessageReplyParams& params);

  // Called when the host has responded to our InitIsolatedFileSystem request.
  void InitIsolatedFileSystemComplete(
      const base::Callback<void(int32_t)>& callback,
      const ResourceMessageReplyParams& params);

  void ReserveQuota(int64_t amount);
  typedef std::map<int32_t, int64_t> OffsetMap;
  void ReserveQuotaComplete(const ResourceMessageReplyParams& params,
                            int64_t amount,
                            const OffsetMap& max_written_offsets);

  PP_FileSystemType type_;
  bool called_open_;
  uint32_t callback_count_;
  int32_t callback_result_;

  std::set<PP_Resource> files_;
  std::queue<QuotaRequest> pending_quota_requests_;
  int64_t reserved_quota_;
  bool reserving_quota_;

  DISALLOW_COPY_AND_ASSIGN(FileSystemResource);
};

}  // namespace proxy
}  // namespace ppapi

#endif  // PPAPI_PROXY_FILE_SYSTEM_RESOURCE_H_
