15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/child/npapi/plugin_stream.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/child/npapi/plugin_instance.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace content {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginStream::ResetTempFileHandle() {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  temp_file_handle_ = INVALID_HANDLE_VALUE;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginStream::ResetTempFileName() {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  temp_file_name_[0] = '\0';
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginStream::WriteAsFile() {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (RequestedPluginModeIsAsFile())
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    instance_->NPP_StreamAsFile(&stream_, temp_file_name_);
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t PluginStream::WriteBytes(const char *buf, size_t length) {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DWORD bytes;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!WriteFile(temp_file_handle_, buf, length, &bytes, 0))
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0U;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<size_t>(bytes);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PluginStream::OpenTempFile() {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(INVALID_HANDLE_VALUE, temp_file_handle_);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The reason for using all the Ascii versions of these filesystem
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // calls is that the filename which we pass back to the plugin
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // via NPAPI is an ascii filename.  Otherwise, we'd use wide-chars.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO:
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is a bug in NPAPI itself, and it needs to be fixed.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The case which will fail is if a user has a multibyte name,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // but has the system locale set to english.  GetTempPathA will
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // return junk in this case, causing us to be unable to open the
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // file.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char temp_directory[MAX_PATH];
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetTempPathA(MAX_PATH, temp_directory) == 0)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetTempFileNameA(temp_directory, "npstream", 0, temp_file_name_) == 0)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  temp_file_handle_ = CreateFileA(temp_file_name_,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  FILE_ALL_ACCESS,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  FILE_SHARE_READ,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  0,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  CREATE_ALWAYS,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  FILE_ATTRIBUTE_NORMAL,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  0);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (temp_file_handle_ == INVALID_HANDLE_VALUE) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ResetTempFileName();
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginStream::CloseTempFile() {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!TempFileIsValid())
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CloseHandle(temp_file_handle_);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResetTempFileHandle();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PluginStream::TempFileIsValid() const {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return temp_file_handle_ != INVALID_HANDLE_VALUE;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}  // namespace content
80