1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/media_galleries/fileapi/safe_audio_video_checker.h"
8 #include "base/callback.h"
9 #include "base/location.h"
10 #include "base/logging.h"
11 #include "base/process/process_handle.h"
12 #include "chrome/common/chrome_utility_messages.h"
13 #include "content/public/browser/child_process_data.h"
14 #include "content/public/browser/utility_process_host.h"
15 #include "content/public/browser/browser_thread.h"
16 #include "ipc/ipc_message_macros.h"
17 #include "ipc/ipc_platform_file.h"
19 SafeAudioVideoChecker::SafeAudioVideoChecker(
20 const base::PlatformFile
& file
,
21 const fileapi::CopyOrMoveFileValidator::ResultCallback
& callback
)
22 : state_(INITIAL_STATE
),
26 DCHECK(!callback
.is_null());
29 void SafeAudioVideoChecker::Start() {
30 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO
));
31 if (state_
!= INITIAL_STATE
)
33 state_
= PINGED_STATE
;
36 if (*file_closer_
.get() == base::kInvalidPlatformFileValue
) {
37 callback_
.Run(base::PLATFORM_FILE_ERROR_SECURITY
);
38 state_
= FINISHED_STATE
;
42 utility_process_host_
= content::UtilityProcessHost::Create(
43 this, base::MessageLoopProxy::current())->AsWeakPtr();
44 utility_process_host_
->Send(new ChromeUtilityMsg_StartupPing
);
47 SafeAudioVideoChecker::~SafeAudioVideoChecker() {}
49 void SafeAudioVideoChecker::OnProcessStarted() {
50 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO
));
51 if (state_
!= PINGED_STATE
)
53 state_
= STARTED_STATE
;
55 if (utility_process_host_
->GetData().handle
== base::kNullProcessHandle
)
56 DLOG(ERROR
) << "Child process handle is null";
57 IPC::PlatformFileForTransit file_for_transit
=
58 IPC::GetFileHandleForProcess(*file_closer_
.release(),
59 utility_process_host_
->GetData().handle
,
60 true /* close_source_handle */);
61 const int64 kFileDecodeTimeInMS
= 250;
62 utility_process_host_
->Send(new ChromeUtilityMsg_CheckMediaFile(
63 kFileDecodeTimeInMS
, file_for_transit
));
66 void SafeAudioVideoChecker::OnCheckingFinished(bool valid
) {
67 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO
));
68 if (state_
!= STARTED_STATE
)
70 state_
= FINISHED_STATE
;
72 callback_
.Run(valid
? base::PLATFORM_FILE_OK
73 : base::PLATFORM_FILE_ERROR_SECURITY
);
76 void SafeAudioVideoChecker::OnProcessCrashed(int exit_code
) {
77 OnCheckingFinished(false);
80 bool SafeAudioVideoChecker::OnMessageReceived(const IPC::Message
& message
) {
82 IPC_BEGIN_MESSAGE_MAP(SafeAudioVideoChecker
, message
)
83 IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_ProcessStarted
,
85 IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_CheckMediaFile_Finished
,
87 IPC_MESSAGE_UNHANDLED(handled
= false)