Dns.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #include "il2cpp-config.h"
  2. #include "icalls/System/System.Net/Dns.h"
  3. #include "il2cpp-class-internals.h"
  4. #include "il2cpp-object-internals.h"
  5. #include "gc/GarbageCollector.h"
  6. #include "vm/Array.h"
  7. #include "vm/String.h"
  8. #include "os/Socket.h"
  9. #include "os/WaitStatus.h"
  10. #include "utils/StringUtils.h"
  11. namespace il2cpp
  12. {
  13. namespace icalls
  14. {
  15. namespace System
  16. {
  17. namespace System
  18. {
  19. namespace Net
  20. {
  21. bool Dns::GetHostByAddr_icall(Il2CppString* addr, Il2CppString** h_name, Il2CppArray** h_aliases, Il2CppArray** h_addr_list, int32_t hint)
  22. {
  23. std::string name;
  24. std::vector<std::string> aliases;
  25. std::vector<std::string> addr_list;
  26. const std::string address = il2cpp::utils::StringUtils::Utf16ToUtf8(addr->chars);
  27. const os::WaitStatus result = os::Socket::GetHostByAddr(address, name, aliases, addr_list);
  28. *h_name = vm::String::New(name.c_str());
  29. *h_aliases = vm::Array::New(il2cpp_defaults.string_class, (il2cpp_array_size_t)aliases.size());
  30. *h_addr_list = vm::Array::New(il2cpp_defaults.string_class, (il2cpp_array_size_t)addr_list.size());
  31. int32_t index = 0;
  32. std::vector<std::string>::const_iterator it = aliases.begin();
  33. while (it != aliases.end())
  34. {
  35. il2cpp_array_setref(*h_aliases, index++, vm::String::New((*it).c_str()));
  36. ++it;
  37. }
  38. index = 0;
  39. it = addr_list.begin();
  40. while (it != addr_list.end())
  41. {
  42. il2cpp_array_setref(*h_addr_list, index++, vm::String::New((*it).c_str()));
  43. ++it;
  44. }
  45. return (result != kWaitStatusFailure);
  46. }
  47. bool Dns::GetHostByName_icall(Il2CppString* host, Il2CppString** h_name, Il2CppArray** h_aliases, Il2CppArray** h_addr_list, int32_t hint)
  48. {
  49. std::string name;
  50. std::vector<std::string> aliases;
  51. std::vector<std::string> addr_list;
  52. const std::string host_name = il2cpp::utils::StringUtils::Utf16ToUtf8(host->chars);
  53. const os::WaitStatus result = os::Socket::GetHostByName(host_name, name, aliases, addr_list);
  54. *h_name = vm::String::New(name.c_str());
  55. il2cpp::gc::GarbageCollector::SetWriteBarrier((void**)h_name);
  56. *h_aliases = vm::Array::New(il2cpp_defaults.string_class, (il2cpp_array_size_t)aliases.size());
  57. il2cpp::gc::GarbageCollector::SetWriteBarrier((void**)h_aliases);
  58. *h_addr_list = vm::Array::New(il2cpp_defaults.string_class, (il2cpp_array_size_t)addr_list.size());
  59. il2cpp::gc::GarbageCollector::SetWriteBarrier((void**)h_addr_list);
  60. int32_t index = 0;
  61. std::vector<std::string>::const_iterator it = aliases.begin();
  62. while (it != aliases.end())
  63. {
  64. il2cpp_array_setref(*h_aliases, index++, vm::String::New((*it).c_str()));
  65. ++it;
  66. }
  67. index = 0;
  68. it = addr_list.begin();
  69. while (it != addr_list.end())
  70. {
  71. il2cpp_array_setref(*h_addr_list, index++, vm::String::New((*it).c_str()));
  72. ++it;
  73. }
  74. return (result != kWaitStatusFailure);
  75. }
  76. bool Dns::GetHostName_icall(Il2CppString** h_name)
  77. {
  78. std::string host_name;
  79. *h_name = (os::Socket::GetHostName(host_name) != kWaitStatusFailure)
  80. ? vm::String::New(host_name.c_str())
  81. : NULL;
  82. il2cpp::gc::GarbageCollector::SetWriteBarrier((void**)h_name);
  83. return *h_name != NULL;
  84. }
  85. } /* namespace Net */
  86. } /* namespace System */
  87. } /* namespace System */
  88. } /* namespace icalls */
  89. } /* namespace il2cpp */