Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/extensions/api/socket/socket_api.h" | 5 #include "chrome/browser/extensions/api/socket/socket_api.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "chrome/common/extensions/extension.h" | 8 #include "chrome/common/extensions/extension.h" |
| 9 #include "chrome/common/extensions/permissions/socket_permission.h" | 9 #include "chrome/common/extensions/permissions/socket_permission.h" |
| 10 #include "chrome/browser/browser_process.h" | 10 #include "chrome/browser/browser_process.h" |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 31 const char kDataKey[] = "data"; | 31 const char kDataKey[] = "data"; |
| 32 const char kResultCodeKey[] = "resultCode"; | 32 const char kResultCodeKey[] = "resultCode"; |
| 33 const char kSocketIdKey[] = "socketId"; | 33 const char kSocketIdKey[] = "socketId"; |
| 34 | 34 |
| 35 const char kSocketNotFoundError[] = "Socket not found"; | 35 const char kSocketNotFoundError[] = "Socket not found"; |
| 36 const char kDnsLookupFailedError[] = "DNS resolution failed"; | 36 const char kDnsLookupFailedError[] = "DNS resolution failed"; |
| 37 const char kPermissionError[] = "App does not have permission"; | 37 const char kPermissionError[] = "App does not have permission"; |
| 38 const char kNetworkListError[] = "Network lookup failed or unsupported"; | 38 const char kNetworkListError[] = "Network lookup failed or unsupported"; |
| 39 const char kTCPSocketBindError[] = | 39 const char kTCPSocketBindError[] = |
| 40 "TCP socket does not support bind. For TCP server please use listen."; | 40 "TCP socket does not support bind. For TCP server please use listen."; |
| 41 const char kMulticastSocketTypeError[] = | |
| 42 "Only UDP socket supports multicast."; | |
| 43 const char kWildcardArress[] = "*"; | |
| 44 const int kWildcardPortNumber = 0; | |
| 41 | 45 |
| 42 SocketAsyncApiFunction::SocketAsyncApiFunction() | 46 SocketAsyncApiFunction::SocketAsyncApiFunction() |
| 43 : manager_(NULL) { | 47 : manager_(NULL) { |
| 44 } | 48 } |
| 45 | 49 |
| 46 SocketAsyncApiFunction::~SocketAsyncApiFunction() { | 50 SocketAsyncApiFunction::~SocketAsyncApiFunction() { |
| 47 } | 51 } |
| 48 | 52 |
| 49 bool SocketAsyncApiFunction::PrePrepare() { | 53 bool SocketAsyncApiFunction::PrePrepare() { |
| 50 manager_ = ExtensionSystem::Get(profile())->socket_manager(); | 54 manager_ = ExtensionSystem::Get(profile())->socket_manager(); |
| (...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 374 } | 378 } |
| 375 | 379 |
| 376 void SocketReadFunction::OnCompleted(int bytes_read, | 380 void SocketReadFunction::OnCompleted(int bytes_read, |
| 377 scoped_refptr<net::IOBuffer> io_buffer) { | 381 scoped_refptr<net::IOBuffer> io_buffer) { |
| 378 DictionaryValue* result = new DictionaryValue(); | 382 DictionaryValue* result = new DictionaryValue(); |
| 379 result->SetInteger(kResultCodeKey, bytes_read); | 383 result->SetInteger(kResultCodeKey, bytes_read); |
| 380 if (bytes_read > 0) { | 384 if (bytes_read > 0) { |
| 381 result->Set(kDataKey, | 385 result->Set(kDataKey, |
| 382 base::BinaryValue::CreateWithCopiedBuffer(io_buffer->data(), | 386 base::BinaryValue::CreateWithCopiedBuffer(io_buffer->data(), |
| 383 bytes_read)); | 387 bytes_read)); |
| 388 | |
| 384 } else { | 389 } else { |
| 385 result->Set(kDataKey, new base::BinaryValue()); | 390 result->Set(kDataKey, new base::BinaryValue()); |
| 386 } | 391 } |
| 387 SetResult(result); | 392 SetResult(result); |
| 388 | 393 |
| 389 AsyncWorkCompleted(); | 394 AsyncWorkCompleted(); |
| 390 } | 395 } |
| 391 | 396 |
| 392 SocketWriteFunction::SocketWriteFunction() | 397 SocketWriteFunction::SocketWriteFunction() |
| 393 : socket_id_(0), | 398 : socket_id_(0), |
| (...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 673 make_linked_ptr(new api::socket::NetworkInterface); | 678 make_linked_ptr(new api::socket::NetworkInterface); |
| 674 info->name = i->name; | 679 info->name = i->name; |
| 675 info->address = net::IPAddressToString(i->address); | 680 info->address = net::IPAddressToString(i->address); |
| 676 create_arg.push_back(info); | 681 create_arg.push_back(info); |
| 677 } | 682 } |
| 678 | 683 |
| 679 results_ = api::socket::GetNetworkList::Results::Create(create_arg); | 684 results_ = api::socket::GetNetworkList::Results::Create(create_arg); |
| 680 SendResponse(true); | 685 SendResponse(true); |
| 681 } | 686 } |
| 682 | 687 |
| 688 SocketJoinGroupFunction::SocketJoinGroupFunction() | |
| 689 : params_(NULL) {} | |
|
mmenke
2013/04/12 21:07:41
4 space indent. Comment applies to whole file.
Bei Zhang
2013/04/15 22:30:26
Done.
| |
| 690 | |
| 691 SocketJoinGroupFunction::~SocketJoinGroupFunction() {} | |
| 692 | |
| 693 bool SocketJoinGroupFunction::Prepare() { | |
| 694 params_ = api::socket::JoinGroup::Params::Create(*args_); | |
| 695 EXTENSION_FUNCTION_VALIDATE(params_.get()); | |
| 696 return true; | |
| 697 } | |
| 698 | |
| 699 void SocketJoinGroupFunction::Work() { | |
| 700 int result = -1; | |
| 701 Socket* socket = GetSocket(params_->socket_id); | |
| 702 if (!socket) { | |
| 703 error_ = kSocketNotFoundError; | |
| 704 SetResult(Value::CreateIntegerValue(result)); | |
| 705 return; | |
| 706 } | |
| 707 | |
| 708 if (socket->GetSocketType() == Socket::TYPE_UDP) { | |
| 709 SocketPermission::CheckParam param( | |
| 710 SocketPermissionRequest::UDP_MUTICAST_MEMBERSHIP, | |
| 711 kWildcardArress, | |
| 712 kWildcardPortNumber); | |
| 713 if (!GetExtension()->CheckAPIPermissionWithParam(APIPermission::kSocket, | |
| 714 ¶m)) { | |
|
mmenke
2013/04/12 21:07:41
Should either be aligned with APIPermission::kSock
Bei Zhang
2013/04/15 22:30:26
Done.
| |
| 715 error_ = kPermissionError; | |
| 716 SetResult(Value::CreateIntegerValue(result)); | |
| 717 return; | |
| 718 } | |
| 719 } else { | |
| 720 error_ = kMulticastSocketTypeError; | |
| 721 SetResult(Value::CreateIntegerValue(result)); | |
| 722 return; | |
| 723 } | |
| 724 | |
| 725 result = static_cast<UDPSocket*>(socket)->JoinGroup(params_->address); | |
| 726 if (result != 0) { | |
| 727 error_ = net::ErrorToString(result); | |
| 728 } | |
| 729 SetResult(Value::CreateIntegerValue(result)); | |
| 730 } | |
| 731 | |
| 732 | |
| 733 SocketLeaveGroupFunction::SocketLeaveGroupFunction() | |
| 734 : params_(NULL) {} | |
| 735 | |
| 736 SocketLeaveGroupFunction::~SocketLeaveGroupFunction() {} | |
| 737 | |
| 738 bool SocketLeaveGroupFunction::Prepare() { | |
| 739 params_ = api::socket::LeaveGroup::Params::Create(*args_); | |
| 740 EXTENSION_FUNCTION_VALIDATE(params_.get()); | |
| 741 return true; | |
| 742 } | |
| 743 | |
| 744 void SocketLeaveGroupFunction::Work() { | |
| 745 int result = -1; | |
| 746 Socket* socket = GetSocket(params_->socket_id); | |
| 747 | |
| 748 if (!socket) { | |
| 749 error_ = kSocketNotFoundError; | |
| 750 SetResult(Value::CreateIntegerValue(result)); | |
| 751 return; | |
| 752 } | |
| 753 | |
| 754 if (socket->GetSocketType() == Socket::TYPE_UDP) { | |
| 755 SocketPermission::CheckParam param( | |
| 756 SocketPermissionRequest::UDP_MUTICAST_MEMBERSHIP, | |
| 757 kWildcardArress, | |
| 758 kWildcardPortNumber); | |
| 759 if (!GetExtension()->CheckAPIPermissionWithParam(APIPermission::kSocket, | |
| 760 ¶m)) { | |
| 761 error_ = kPermissionError; | |
| 762 SetResult(Value::CreateIntegerValue(result)); | |
| 763 return; | |
| 764 } | |
| 765 } else { | |
| 766 error_ = kMulticastSocketTypeError; | |
| 767 SetResult(Value::CreateIntegerValue(result)); | |
| 768 return; | |
| 769 } | |
| 770 | |
| 771 result = static_cast<UDPSocket*>(socket)->LeaveGroup(params_->address); | |
| 772 if (result != 0) { | |
| 773 error_ = net::ErrorToString(result); | |
| 774 } | |
| 775 SetResult(Value::CreateIntegerValue(result)); | |
| 776 } | |
| 777 | |
| 778 SocketSetMulticastTimeToLiveFunction::SocketSetMulticastTimeToLiveFunction() | |
| 779 : params_(NULL) {} | |
| 780 | |
| 781 SocketSetMulticastTimeToLiveFunction::~SocketSetMulticastTimeToLiveFunction() {} | |
| 782 | |
| 783 bool SocketSetMulticastTimeToLiveFunction::Prepare() { | |
| 784 params_ = api::socket::SetMulticastTimeToLive::Params::Create(*args_); | |
| 785 EXTENSION_FUNCTION_VALIDATE(params_.get()); | |
| 786 return true; | |
| 787 } | |
| 788 void SocketSetMulticastTimeToLiveFunction::Work() { | |
| 789 int result = -1; | |
| 790 Socket* socket = GetSocket(params_->socket_id); | |
| 791 if (!socket) { | |
| 792 error_ = kSocketNotFoundError; | |
| 793 SetResult(Value::CreateIntegerValue(result)); | |
| 794 return; | |
| 795 } | |
| 796 | |
| 797 if (socket->GetSocketType() == Socket::TYPE_UDP) { | |
| 798 result = static_cast<UDPSocket*>(socket)-> | |
| 799 SetMulticastTimeToLive(params_->ttl); | |
| 800 if (result != 0) { | |
| 801 error_ = net::ErrorToString(result); | |
| 802 } | |
| 803 SetResult(Value::CreateIntegerValue(result)); | |
| 804 } else { | |
| 805 error_ = kMulticastSocketTypeError; | |
| 806 } | |
| 807 SetResult(Value::CreateIntegerValue(result)); | |
| 808 } | |
| 809 | |
| 810 SocketSetMulticastLoopbackModeFunction::SocketSetMulticastLoopbackModeFunction() | |
| 811 : params_(NULL) {} | |
| 812 | |
| 813 SocketSetMulticastLoopbackModeFunction:: | |
| 814 ~SocketSetMulticastLoopbackModeFunction() {} | |
| 815 | |
| 816 bool SocketSetMulticastLoopbackModeFunction::Prepare() { | |
| 817 params_ = api::socket::SetMulticastLoopbackMode::Params::Create(*args_); | |
| 818 EXTENSION_FUNCTION_VALIDATE(params_.get()); | |
| 819 return true; | |
| 820 } | |
| 821 | |
| 822 void SocketSetMulticastLoopbackModeFunction::Work() { | |
| 823 int result = -1; | |
| 824 Socket* socket = GetSocket(params_->socket_id); | |
| 825 if (!socket) { | |
| 826 error_ = kSocketNotFoundError; | |
| 827 SetResult(Value::CreateIntegerValue(result)); | |
| 828 return; | |
| 829 } | |
| 830 | |
| 831 if (socket->GetSocketType() == Socket::TYPE_UDP) { | |
| 832 result = static_cast<UDPSocket*>(socket)-> | |
| 833 SetMulticastLoopbackMode(params_->enabled); | |
| 834 if (result != 0) { | |
| 835 error_ = net::ErrorToString(result); | |
| 836 } | |
| 837 } else { | |
| 838 error_ = kMulticastSocketTypeError; | |
| 839 } | |
| 840 SetResult(Value::CreateIntegerValue(result)); | |
| 841 } | |
| 842 | |
| 843 SocketGetJoinedGroupsFunction::SocketGetJoinedGroupsFunction() | |
| 844 : params_(NULL) {} | |
| 845 | |
| 846 SocketGetJoinedGroupsFunction::~SocketGetJoinedGroupsFunction() {} | |
| 847 | |
| 848 bool SocketGetJoinedGroupsFunction::Prepare() { | |
| 849 params_ = api::socket::GetJoinedGroups::Params::Create(*args_); | |
| 850 EXTENSION_FUNCTION_VALIDATE(params_.get()); | |
| 851 return true; | |
| 852 } | |
| 853 | |
| 854 void SocketGetJoinedGroupsFunction::Work() { | |
| 855 int result = -1; | |
| 856 Socket* socket = GetSocket(params_->socket_id); | |
| 857 if (!socket) { | |
| 858 error_ = kSocketNotFoundError; | |
| 859 SetResult(Value::CreateIntegerValue(result)); | |
| 860 return; | |
| 861 } | |
| 862 | |
| 863 if (socket->GetSocketType() == Socket::TYPE_UDP) { | |
| 864 SocketPermission::CheckParam param( | |
| 865 SocketPermissionRequest::UDP_SEND_TO, | |
| 866 kWildcardArress, | |
| 867 kWildcardPortNumber); | |
| 868 if (!GetExtension()->CheckAPIPermissionWithParam(APIPermission::kSocket, | |
| 869 ¶m)) { | |
| 870 error_ = kPermissionError; | |
| 871 SetResult(Value::CreateIntegerValue(result)); | |
| 872 return; | |
| 873 } | |
| 874 } else { | |
| 875 error_ = kMulticastSocketTypeError; | |
| 876 SetResult(Value::CreateIntegerValue(result)); | |
| 877 return; | |
| 878 } | |
| 879 | |
| 880 base::hash_set<std::string> groups; | |
| 881 result = static_cast<UDPSocket*>(socket)-> | |
| 882 GetJoinedGroups(groups); | |
| 883 if (result != 0) { | |
| 884 error_ = net::ErrorToString(result); | |
| 885 } | |
| 886 base::ListValue* list = new base::ListValue(); | |
| 887 for (base::hash_set<std::string>::iterator it = groups.begin(); | |
| 888 it != groups.end(); ++it) { | |
| 889 list->AppendString(*it); | |
| 890 } | |
| 891 SetResult(list); | |
| 892 } | |
| 683 } // namespace extensions | 893 } // namespace extensions |
|
mmenke
2013/04/12 21:07:41
Line break before end of namespace.
Bei Zhang
2013/04/15 22:30:26
Done.
| |
| OLD | NEW |