OLD | NEW |
| (Empty) |
1 // Copyright (c) 2009 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_frame/sync_msg_reply_dispatcher.h" | |
6 | |
7 #include "ipc/ipc_sync_message.h" | |
8 | |
9 void SyncMessageReplyDispatcher::Push(IPC::SyncMessage* msg, | |
10 SyncMessageCallContext* context, | |
11 void* key) { | |
12 if (context) { | |
13 context->message_type_ = msg->type(); | |
14 context->id_ = IPC::SyncMessage::GetMessageId(*msg); | |
15 context->key_ = key; | |
16 | |
17 base::AutoLock lock(message_queue_lock_); | |
18 message_queue_.push_back(context); | |
19 } | |
20 } | |
21 | |
22 bool SyncMessageReplyDispatcher::HandleMessageType( | |
23 const IPC::Message& msg, SyncMessageCallContext* context) { | |
24 return false; | |
25 } | |
26 | |
27 bool SyncMessageReplyDispatcher::OnMessageReceived(const IPC::Message& msg) { | |
28 SyncMessageCallContext* context = GetContext(msg); | |
29 // No context e.g. no return values and/or don't care | |
30 if (!context) { | |
31 return false; | |
32 } | |
33 | |
34 return HandleMessageType(msg, context); | |
35 } | |
36 | |
37 void SyncMessageReplyDispatcher::Cancel(void* key) { | |
38 DCHECK(key != NULL); | |
39 base::AutoLock lock(message_queue_lock_); | |
40 PendingSyncMessageQueue::iterator it = message_queue_.begin(); | |
41 while (it != message_queue_.end()) { | |
42 SyncMessageCallContext* context = *it; | |
43 if (context->key_ == key) { | |
44 it = message_queue_.erase(it); | |
45 delete context; | |
46 } else { | |
47 ++it; | |
48 } | |
49 } | |
50 } | |
51 | |
52 SyncMessageReplyDispatcher::SyncMessageCallContext* | |
53 SyncMessageReplyDispatcher::GetContext(const IPC::Message& msg) { | |
54 if (!msg.is_reply()) | |
55 return NULL; | |
56 | |
57 int id = IPC::SyncMessage::GetMessageId(msg); | |
58 base::AutoLock lock(message_queue_lock_); | |
59 PendingSyncMessageQueue::iterator it; | |
60 for (it = message_queue_.begin(); it != message_queue_.end(); ++it) { | |
61 SyncMessageCallContext* context = *it; | |
62 if (context->id_ == id) { | |
63 message_queue_.erase(it); | |
64 return context; | |
65 } | |
66 } | |
67 return NULL; | |
68 } | |
OLD | NEW |