Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(235)

Side by Side Diff: ipc/ipc_channel_win.cc

Issue 6334061: Clean up channel modes (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixed up agl's comments Created 9 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ipc/ipc_channel_proxy.cc ('k') | ipc/ipc_sync_channel_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ipc/ipc_channel_win.h" 5 #include "ipc/ipc_channel_win.h"
6 6
7 #include <windows.h> 7 #include <windows.h>
8 #include <sddl.h> 8 #include <sddl.h>
9 #include <sstream> 9 #include <sstream>
10 10
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 } 96 }
97 97
98 //------------------------------------------------------------------------------ 98 //------------------------------------------------------------------------------
99 99
100 Channel::ChannelImpl::ChannelImpl(const IPC::ChannelHandle &channel_handle, 100 Channel::ChannelImpl::ChannelImpl(const IPC::ChannelHandle &channel_handle,
101 Mode mode, Listener* listener) 101 Mode mode, Listener* listener)
102 : ALLOW_THIS_IN_INITIALIZER_LIST(input_state_(this)), 102 : ALLOW_THIS_IN_INITIALIZER_LIST(input_state_(this)),
103 ALLOW_THIS_IN_INITIALIZER_LIST(output_state_(this)), 103 ALLOW_THIS_IN_INITIALIZER_LIST(output_state_(this)),
104 pipe_(INVALID_HANDLE_VALUE), 104 pipe_(INVALID_HANDLE_VALUE),
105 listener_(listener), 105 listener_(listener),
106 waiting_connect_(mode == MODE_SERVER || mode == MODE_NAMED_SERVER), 106 waiting_connect_(mode & MODE_SERVER_FLAG),
107 processing_incoming_(false), 107 processing_incoming_(false),
108 ALLOW_THIS_IN_INITIALIZER_LIST(factory_(this)) { 108 ALLOW_THIS_IN_INITIALIZER_LIST(factory_(this)) {
109 switch(mode) {
110 case MODE_NONE:
111 LOG(FATAL) << "Bad mode for " << channel_handle.name;
112 break;
113 case MODE_SERVER:
114 case MODE_CLIENT:
115 break;
116 case MODE_NAMED_SERVER:
117 mode = MODE_SERVER;
118 break;
119 case MODE_NAMED_CLIENT:
120 mode = MODE_CLIENT;
121 break;
122 // Intentionally no default case here so that the compiler
123 // will check that we handle all the cases in the enum.
124 }
125 if (!CreatePipe(channel_handle, mode)) { 109 if (!CreatePipe(channel_handle, mode)) {
126 // The pipe may have been closed already. 110 // The pipe may have been closed already.
127 LOG(WARNING) << "Unable to create pipe named \"" << channel_handle.name << 111 LOG(WARNING) << "Unable to create pipe named \"" << channel_handle.name <<
128 "\" in " << (mode == 0 ? "server" : "client") << " mode."; 112 "\" in " << (mode == 0 ? "server" : "client") << " mode.";
129 } 113 }
130 } 114 }
131 115
132 Channel::ChannelImpl::~ChannelImpl() { 116 Channel::ChannelImpl::~ChannelImpl() {
133 Close(); 117 Close();
134 } 118 }
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 std::wostringstream ss; 172 std::wostringstream ss;
189 // XXX(darin): get application name from somewhere else 173 // XXX(darin): get application name from somewhere else
190 ss << L"\\\\.\\pipe\\chrome." << ASCIIToWide(channel_id); 174 ss << L"\\\\.\\pipe\\chrome." << ASCIIToWide(channel_id);
191 return ss.str(); 175 return ss.str();
192 } 176 }
193 177
194 bool Channel::ChannelImpl::CreatePipe(const IPC::ChannelHandle &channel_handle, 178 bool Channel::ChannelImpl::CreatePipe(const IPC::ChannelHandle &channel_handle,
195 Mode mode) { 179 Mode mode) {
196 DCHECK(pipe_ == INVALID_HANDLE_VALUE); 180 DCHECK(pipe_ == INVALID_HANDLE_VALUE);
197 const std::wstring pipe_name = PipeName(channel_handle.name); 181 const std::wstring pipe_name = PipeName(channel_handle.name);
198 if (mode == MODE_SERVER) { 182 if (mode & MODE_SERVER_FLAG) {
199 SECURITY_ATTRIBUTES security_attributes = {0}; 183 SECURITY_ATTRIBUTES security_attributes = {0};
200 security_attributes.bInheritHandle = FALSE; 184 security_attributes.bInheritHandle = FALSE;
201 security_attributes.nLength = sizeof(SECURITY_ATTRIBUTES); 185 security_attributes.nLength = sizeof(SECURITY_ATTRIBUTES);
202 if (!GetLogonSessionOnlyDACL( 186 if (!GetLogonSessionOnlyDACL(
203 reinterpret_cast<SECURITY_DESCRIPTOR**>( 187 reinterpret_cast<SECURITY_DESCRIPTOR**>(
204 &security_attributes.lpSecurityDescriptor))) { 188 &security_attributes.lpSecurityDescriptor))) {
205 NOTREACHED(); 189 NOTREACHED();
206 } 190 }
207 191
208 pipe_ = CreateNamedPipeW(pipe_name.c_str(), 192 pipe_ = CreateNamedPipeW(pipe_name.c_str(),
209 PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED | 193 PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED |
210 FILE_FLAG_FIRST_PIPE_INSTANCE, 194 FILE_FLAG_FIRST_PIPE_INSTANCE,
211 PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, 195 PIPE_TYPE_BYTE | PIPE_READMODE_BYTE,
212 1, // number of pipe instances 196 1, // number of pipe instances
213 // output buffer size (XXX tune) 197 // output buffer size (XXX tune)
214 Channel::kReadBufferSize, 198 Channel::kReadBufferSize,
215 // input buffer size (XXX tune) 199 // input buffer size (XXX tune)
216 Channel::kReadBufferSize, 200 Channel::kReadBufferSize,
217 5000, // timeout in milliseconds (XXX tune) 201 5000, // timeout in milliseconds (XXX tune)
218 &security_attributes); 202 &security_attributes);
219 LocalFree(security_attributes.lpSecurityDescriptor); 203 LocalFree(security_attributes.lpSecurityDescriptor);
220 } else { 204 } else if (mode & MODE_CLIENT_FLAG) {
221 pipe_ = CreateFileW(pipe_name.c_str(), 205 pipe_ = CreateFileW(pipe_name.c_str(),
222 GENERIC_READ | GENERIC_WRITE, 206 GENERIC_READ | GENERIC_WRITE,
223 0, 207 0,
224 NULL, 208 NULL,
225 OPEN_EXISTING, 209 OPEN_EXISTING,
226 SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION | 210 SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION |
227 FILE_FLAG_OVERLAPPED, 211 FILE_FLAG_OVERLAPPED,
228 NULL); 212 NULL);
213 } else {
214 NOTREACHED();
229 } 215 }
230 if (pipe_ == INVALID_HANDLE_VALUE) { 216 if (pipe_ == INVALID_HANDLE_VALUE) {
231 // If this process is being closed, the pipe may be gone already. 217 // If this process is being closed, the pipe may be gone already.
232 LOG(WARNING) << "failed to create pipe: " << GetLastError(); 218 LOG(WARNING) << "failed to create pipe: " << GetLastError();
233 return false; 219 return false;
234 } 220 }
235 221
236 // Create the Hello message to be sent when Connect is called 222 // Create the Hello message to be sent when Connect is called
237 scoped_ptr<Message> m(new Message(MSG_ROUTING_NONE, 223 scoped_ptr<Message> m(new Message(MSG_ROUTING_NONE,
238 HELLO_MESSAGE_TYPE, 224 HELLO_MESSAGE_TYPE,
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
505 491
506 void Channel::set_listener(Listener* listener) { 492 void Channel::set_listener(Listener* listener) {
507 channel_impl_->set_listener(listener); 493 channel_impl_->set_listener(listener);
508 } 494 }
509 495
510 bool Channel::Send(Message* message) { 496 bool Channel::Send(Message* message) {
511 return channel_impl_->Send(message); 497 return channel_impl_->Send(message);
512 } 498 }
513 499
514 } // namespace IPC 500 } // namespace IPC
OLDNEW
« no previous file with comments | « ipc/ipc_channel_proxy.cc ('k') | ipc/ipc_sync_channel_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698