Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 #ifndef CHROME_COMMON_IPC_MESSAGE_UTILS_H_ | 5 #ifndef CHROME_COMMON_IPC_MESSAGE_UTILS_H_ |
| 6 #define CHROME_COMMON_IPC_MESSAGE_UTILS_H_ | 6 #define CHROME_COMMON_IPC_MESSAGE_UTILS_H_ |
| 7 | 7 |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 #include <map> | 10 #include <map> |
| 11 | 11 |
| 12 #include "base/file_path.h" | 12 #include "base/file_path.h" |
| 13 #include "base/string_util.h" | 13 #include "base/string_util.h" |
| 14 #include "base/string16.h" | 14 #include "base/string16.h" |
| 15 #include "base/tuple.h" | 15 #include "base/tuple.h" |
| 16 #if defined(OS_POSIX) | 16 #if defined(OS_POSIX) |
| 17 #include "chrome/common/file_descriptor_set_posix.h" | 17 #include "chrome/common/file_descriptor_set_posix.h" |
| 18 #endif | 18 #endif |
| 19 #include "chrome/common/ipc_maybe.h" | |
| 20 #include "chrome/common/ipc_sync_message.h" | 19 #include "chrome/common/ipc_sync_message.h" |
| 21 #include "chrome/common/thumbnail_score.h" | 20 #include "chrome/common/thumbnail_score.h" |
| 22 #include "chrome/common/transport_dib.h" | 21 #include "chrome/common/transport_dib.h" |
| 23 #include "webkit/glue/cache_manager.h" | 22 #include "webkit/glue/cache_manager.h" |
| 24 #include "webkit/glue/console_message_level.h" | 23 #include "webkit/glue/console_message_level.h" |
| 25 #include "webkit/glue/find_in_page_request.h" | 24 #include "webkit/glue/find_in_page_request.h" |
| 26 #include "webkit/glue/webcursor.h" | 25 #include "webkit/glue/webcursor.h" |
| 27 #include "webkit/glue/window_open_disposition.h" | 26 #include "webkit/glue/window_open_disposition.h" |
| 28 | 27 |
| 29 // Forward declarations. | 28 // Forward declarations. |
| (...skipping 657 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 687 | 686 |
| 688 template <> | 687 template <> |
| 689 struct ParamTraits<gfx::Size> { | 688 struct ParamTraits<gfx::Size> { |
| 690 typedef gfx::Size param_type; | 689 typedef gfx::Size param_type; |
| 691 static void Write(Message* m, const param_type& p); | 690 static void Write(Message* m, const param_type& p); |
| 692 static bool Read(const Message* m, void** iter, param_type* r); | 691 static bool Read(const Message* m, void** iter, param_type* r); |
| 693 static void Log(const param_type& p, std::wstring* l); | 692 static void Log(const param_type& p, std::wstring* l); |
| 694 }; | 693 }; |
| 695 | 694 |
| 696 #if defined(OS_POSIX) | 695 #if defined(OS_POSIX) |
| 696 // FileDescriptors may be serialised over IPC channels on POSIX. On the | |
| 697 // receiving side, the FileDescriptor is a valid duplicate of the file | |
| 698 // descriptor which was transmitted: *it is not just a copy of the integer like | |
| 699 // HANDLEs on Windows*. The only exception is if the file descriptor is < 0. In | |
| 700 // this case, the receiving end will see a value of -1. *Zero is a valid file | |
| 701 // descriptor*. | |
| 702 // | |
| 703 // The received file descriptor will have the |auto_close| flag set to true. The | |
| 704 // code which handles the message is responsible for taking ownership of it. | |
| 705 // File descriptors are OS resources and must be closed when no longer needed. | |
| 706 // | |
| 707 // When sending a file descriptor, the file descriptor must be valid at the time | |
| 708 // of transmission. Since transmission is not synchronous, one should consider | |
| 709 // dup()ing any file descriptors to be transmitted and setting the |auto_close| | |
| 710 // flag, which causes the file descriptor to be closed after writing. | |
| 697 template<> | 711 template<> |
| 698 struct ParamTraits<base::FileDescriptor> { | 712 struct ParamTraits<base::FileDescriptor> { |
| 699 typedef base::FileDescriptor param_type; | 713 typedef base::FileDescriptor param_type; |
| 700 static void Write(Message* m, const param_type& p) { | 714 static void Write(Message* m, const param_type& p) { |
| 701 if (!m->WriteFileDescriptor(p)) | 715 const bool valid = p.fd >= 0; |
| 702 NOTREACHED(); | 716 WriteParam(m, valid); |
| 717 | |
| 718 if (valid) { | |
| 719 if (!m->WriteFileDescriptor(p)) | |
| 720 NOTREACHED(); | |
| 721 } | |
| 703 } | 722 } |
| 704 static bool Read(const Message* m, void** iter, param_type* r) { | 723 static bool Read(const Message* m, void** iter, param_type* r) { |
| 705 return m->ReadFileDescriptor(iter, r); | 724 bool valid; |
| 725 if (!ReadParam(m, iter, &valid)) | |
| 726 return false; | |
| 727 | |
| 728 if (valid) { | |
| 729 return m->ReadFileDescriptor(iter, r); | |
| 730 } else { | |
|
darin (slow to review)
2009/03/05 19:42:12
nit: no need for else after return
| |
| 731 r->fd = -1; | |
| 732 r->auto_close = false; | |
| 733 return true; | |
| 734 } | |
| 706 } | 735 } |
| 707 static void Log(const param_type& p, std::wstring* l) { | 736 static void Log(const param_type& p, std::wstring* l) { |
| 708 if (p.auto_close) { | 737 if (p.auto_close) { |
| 709 l->append(StringPrintf(L"FD(%d auto-close)", p.fd)); | 738 l->append(StringPrintf(L"FD(%d auto-close)", p.fd)); |
| 710 } else { | 739 } else { |
| 711 l->append(StringPrintf(L"FD(%d)", p.fd)); | 740 l->append(StringPrintf(L"FD(%d)", p.fd)); |
| 712 } | 741 } |
| 713 } | 742 } |
| 714 }; | 743 }; |
| 715 #endif // defined(OS_POSIX) | 744 #endif // defined(OS_POSIX) |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 940 static void Log(const param_type& p, std::wstring* l) { | 969 static void Log(const param_type& p, std::wstring* l) { |
| 941 l->append(L"TransportDIB("); | 970 l->append(L"TransportDIB("); |
| 942 LogParam(p.handle, l); | 971 LogParam(p.handle, l); |
| 943 l->append(L", "); | 972 l->append(L", "); |
| 944 LogParam(p.sequence_num, l); | 973 LogParam(p.sequence_num, l); |
| 945 l->append(L")"); | 974 l->append(L")"); |
| 946 } | 975 } |
| 947 }; | 976 }; |
| 948 #endif | 977 #endif |
| 949 | 978 |
| 950 template<typename A> | |
| 951 struct ParamTraits<Maybe<A> > { | |
| 952 typedef struct Maybe<A> param_type; | |
| 953 static void Write(Message* m, const param_type& p) { | |
| 954 WriteParam(m, p.valid); | |
| 955 if (p.valid) | |
| 956 WriteParam(m, p.value); | |
| 957 } | |
| 958 static bool Read(const Message* m, void** iter, param_type* r) { | |
| 959 if (!ReadParam(m, iter, &r->valid)) | |
| 960 return false; | |
| 961 | |
| 962 if (r->valid) | |
| 963 return ReadParam(m, iter, &r->value); | |
| 964 return true; | |
| 965 } | |
| 966 static void Log(const param_type& p, std::wstring* l) { | |
| 967 if (p.valid) { | |
| 968 l->append(L"Just "); | |
| 969 ParamTraits<A>::Log(p.value, l); | |
| 970 } else { | |
| 971 l->append(L"Nothing"); | |
| 972 } | |
| 973 | |
| 974 } | |
| 975 }; | |
| 976 | |
| 977 | |
| 978 template <> | 979 template <> |
| 979 struct ParamTraits<Message> { | 980 struct ParamTraits<Message> { |
| 980 static void Write(Message* m, const Message& p) { | 981 static void Write(Message* m, const Message& p) { |
| 981 m->WriteInt(p.size()); | 982 m->WriteInt(p.size()); |
| 982 m->WriteData(reinterpret_cast<const char*>(p.data()), p.size()); | 983 m->WriteData(reinterpret_cast<const char*>(p.data()), p.size()); |
| 983 } | 984 } |
| 984 static bool Read(const Message* m, void** iter, Message* r) { | 985 static bool Read(const Message* m, void** iter, Message* r) { |
| 985 int size; | 986 int size; |
| 986 if (!m->ReadInt(iter, &size)) | 987 if (!m->ReadInt(iter, &size)) |
| 987 return false; | 988 return false; |
| 988 const char* data; | 989 const char* data; |
| 989 if (!m->ReadData(iter, &data, &size)) | 990 if (!m->ReadData(iter, &data, &size)) |
| 990 return false; | 991 return false; |
| 991 *r = Message(data, size); | 992 *r = Message(data, size); |
| 992 return true; | 993 return true; |
| 993 } | 994 } |
| 994 static void Log(const Message& p, std::wstring* l) { | 995 static void Log(const Message& p, std::wstring* l) { |
| 995 l->append(L"<IPC::Message>"); | 996 l->append(L"<IPC::Message>"); |
| 996 } | 997 } |
| 997 }; | 998 }; |
| 998 | 999 |
| 999 | |
| 1000 template <> | 1000 template <> |
| 1001 struct ParamTraits<Tuple0> { | 1001 struct ParamTraits<Tuple0> { |
| 1002 typedef Tuple0 param_type; | 1002 typedef Tuple0 param_type; |
| 1003 static void Write(Message* m, const param_type& p) { | 1003 static void Write(Message* m, const param_type& p) { |
| 1004 } | 1004 } |
| 1005 static bool Read(const Message* m, void** iter, param_type* r) { | 1005 static bool Read(const Message* m, void** iter, param_type* r) { |
| 1006 return true; | 1006 return true; |
| 1007 } | 1007 } |
| 1008 static void Log(const param_type& p, std::wstring* l) { | 1008 static void Log(const param_type& p, std::wstring* l) { |
| 1009 } | 1009 } |
| (...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1467 l->append(L"<FindInPageRequest>"); | 1467 l->append(L"<FindInPageRequest>"); |
| 1468 } | 1468 } |
| 1469 }; | 1469 }; |
| 1470 | 1470 |
| 1471 //----------------------------------------------------------------------------- | 1471 //----------------------------------------------------------------------------- |
| 1472 | 1472 |
| 1473 } // namespace IPC | 1473 } // namespace IPC |
| 1474 | 1474 |
| 1475 #endif // CHROME_COMMON_IPC_MESSAGE_UTILS_H_ | 1475 #endif // CHROME_COMMON_IPC_MESSAGE_UTILS_H_ |
| 1476 | 1476 |
| OLD | NEW |