OLD | NEW |
| (Empty) |
1 // Copyright (c) 2010 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. | |
4 | |
5 #include "chrome/browser/mime_registry_dispatcher.h" | |
6 | |
7 #include "chrome/browser/browser_thread.h" | |
8 #include "chrome/common/render_messages.h" | |
9 #include "net/base/mime_util.h" | |
10 | |
11 MimeRegistryDispatcher::MimeRegistryDispatcher(IPC::Message::Sender* sender) | |
12 : message_sender_(sender) { | |
13 DCHECK(message_sender_); | |
14 } | |
15 | |
16 MimeRegistryDispatcher::~MimeRegistryDispatcher() { | |
17 } | |
18 | |
19 void MimeRegistryDispatcher::Shutdown() { | |
20 message_sender_ = NULL; | |
21 } | |
22 | |
23 bool MimeRegistryDispatcher::OnMessageReceived(const IPC::Message& message) { | |
24 // On Windows MIME registry requests may access the Windows Registry so | |
25 // they need to run on the FILE thread. | |
26 if (!BrowserThread::CurrentlyOn(BrowserThread::FILE)) { | |
27 // Return false if the message is not for us. | |
28 if (message.type() != ViewHostMsg_GetMimeTypeFromExtension::ID && | |
29 message.type() != ViewHostMsg_GetMimeTypeFromFile::ID && | |
30 message.type() != ViewHostMsg_GetPreferredExtensionForMimeType::ID) | |
31 return false; | |
32 | |
33 BrowserThread::PostTask( | |
34 BrowserThread::FILE, FROM_HERE, | |
35 NewRunnableMethod( | |
36 this, &MimeRegistryDispatcher::OnMessageReceived, message)); | |
37 return true; | |
38 } | |
39 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | |
40 | |
41 bool handled = true; | |
42 IPC_BEGIN_MESSAGE_MAP(MimeRegistryDispatcher, message) | |
43 IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_GetMimeTypeFromExtension, | |
44 OnGetMimeTypeFromExtension) | |
45 IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_GetMimeTypeFromFile, | |
46 OnGetMimeTypeFromFile) | |
47 IPC_MESSAGE_HANDLER_DELAY_REPLY( | |
48 ViewHostMsg_GetPreferredExtensionForMimeType, | |
49 OnGetPreferredExtensionForMimeType) | |
50 IPC_MESSAGE_UNHANDLED((handled = false)) | |
51 IPC_END_MESSAGE_MAP() | |
52 return handled; | |
53 } | |
54 | |
55 void MimeRegistryDispatcher::OnGetMimeTypeFromExtension( | |
56 const FilePath::StringType& ext, IPC::Message* reply_msg) { | |
57 std::string mime_type; | |
58 net::GetMimeTypeFromExtension(ext, &mime_type); | |
59 ViewHostMsg_GetMimeTypeFromExtension::WriteReplyParams(reply_msg, mime_type); | |
60 Send(reply_msg); | |
61 } | |
62 | |
63 void MimeRegistryDispatcher::OnGetMimeTypeFromFile( | |
64 const FilePath& file_path, IPC::Message* reply_msg) { | |
65 std::string mime_type; | |
66 net::GetMimeTypeFromFile(file_path, &mime_type); | |
67 ViewHostMsg_GetMimeTypeFromFile::WriteReplyParams(reply_msg, mime_type); | |
68 Send(reply_msg); | |
69 } | |
70 | |
71 void MimeRegistryDispatcher::OnGetPreferredExtensionForMimeType( | |
72 const std::string& mime_type, IPC::Message* reply_msg) { | |
73 FilePath::StringType ext; | |
74 net::GetPreferredExtensionForMimeType(mime_type, &ext); | |
75 ViewHostMsg_GetPreferredExtensionForMimeType::WriteReplyParams( | |
76 reply_msg, ext); | |
77 Send(reply_msg); | |
78 } | |
79 | |
80 void MimeRegistryDispatcher::Send(IPC::Message* message) { | |
81 if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { | |
82 if (!BrowserThread::PostTask( | |
83 BrowserThread::IO, FROM_HERE, NewRunnableMethod( | |
84 this, &MimeRegistryDispatcher::Send, message))) { | |
85 // The IO thread is dead. | |
86 delete message; | |
87 } | |
88 return; | |
89 } | |
90 | |
91 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | |
92 if (message_sender_) | |
93 message_sender_->Send(message); | |
94 else | |
95 delete message; | |
96 } | |
OLD | NEW |