1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef PPAPI_CPP_DIRECTORY_ENTRY_H_ 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define PPAPI_CPP_DIRECTORY_ENTRY_H_ 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <vector> 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/c/pp_array_output.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/c/pp_directory_entry.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/cpp/array_output.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/cpp/file_ref.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/cpp/output_traits.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/cpp/pass_ref.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/// @file 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/// This file defines the API used to handle a directory entry. 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace pp { 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/// The <code>DirectoryEntry</code> class represents information about 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/// a directory entry. 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class DirectoryEntry { 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// Default constructor for creating an is_null() <code>DirectoryEntry</code> 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// object. 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DirectoryEntry(); 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// A constructor used when you have a <code>PP_DirectoryEntry</code> which 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// contains a <code>FileRef</code> that has already been reference counted 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// as a return value. 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// @param[in] data A <code>PP_DirectoryEntry</code> to be copied. 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DirectoryEntry(PassRef, const PP_DirectoryEntry& data); 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// A copy constructor for <code>DirectoryEntry</code>. This constructor 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// increments a reference count of the <code>FileRef</code> held by this 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// DirectoryEntry. 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// @param[in] other A pointer to a <code>DirectoryEntry</code>. 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DirectoryEntry(const DirectoryEntry& other); 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// A destructor that decrements a reference count of the <code>FileRef</code> 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// held by this <code>DirectoryEntry</code>. 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ~DirectoryEntry(); 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// This function assigns one <code>DirectoryEntry</code> object to this 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// <code>DirectoryEntry</code> object. This function increases the reference 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// count of the <code>FileRef</code> of the other DirectoryEntry while 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// decrementing the reference count of the FileRef of this DirectoryEntry. 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// @param[in] other A pointer to a <code>DirectoryEntry</code>. 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// @return A new <code>DirectoryEntry</code> object. 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DirectoryEntry& operator=(const DirectoryEntry& other); 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// This function determines if this <code>DirectoryEntry</code> is a null 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// value. 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// @return true if this <code>DirectoryEntry</code> is null, otherwise false. 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is_null() const { return !data_.file_ref; } 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// This function returns the <code>FileRef</code> held by this 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// <code>DirectoryEntry</code>. 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// @return A <code>FileRef</code> of the file. 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FileRef file_ref() const { return FileRef(data_.file_ref); } 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// This function returns the <code>PP_FileType</code> of the file referenced 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// by this <code>DirectoryEntry</code>. 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// @return A <code>PP_FileType</code> of the file. 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PP_FileType file_type() const { return data_.file_type; } 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PP_DirectoryEntry data_; 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace internal { 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class DirectoryEntryArrayOutputAdapterWithStorage 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public ArrayOutputAdapter<PP_DirectoryEntry> { 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DirectoryEntryArrayOutputAdapterWithStorage(); 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~DirectoryEntryArrayOutputAdapterWithStorage(); 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Returns the final array of resource objects, converting the 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // PP_DirectoryEntry written by the browser to pp::DirectoryEntry 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // objects. 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This function should only be called once or we would end up converting 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the array more than once, which would mess up the refcounting. 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<DirectoryEntry>& output(); 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The browser will write the PP_DirectoryEntrys into this array. 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<PP_DirectoryEntry> temp_storage_; 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // When asked for the output, the PP_DirectoryEntrys above will be 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // converted to the pp::DirectoryEntrys in this array for passing to the 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // calling code. 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<DirectoryEntry> output_storage_; 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// A specialization of CallbackOutputTraits to provide the callback system the 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// information on how to handle vectors of pp::DirectoryEntry. This converts 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// PP_DirectoryEntry to pp::DirectoryEntry when passing to the plugin. 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template <> 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct CallbackOutputTraits< std::vector<DirectoryEntry> > { 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef PP_ArrayOutput APIArgType; 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef DirectoryEntryArrayOutputAdapterWithStorage StorageType; 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static inline APIArgType StorageToAPIArg(StorageType& t) { 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return t.pp_array_output(); 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static inline std::vector<DirectoryEntry>& StorageToPluginArg( 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StorageType& t) { 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return t.output(); 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch static inline void Initialize(StorageType* /* t */) {} 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace internal 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace pp 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // PPAPI_CPP_DIRECTORY_ENTRY_H_ 130