Path: blob/master/platform/android/net_socket_android.cpp
10277 views
/**************************************************************************/1/* net_socket_android.cpp */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#include "net_socket_android.h"3132#include "thread_jandroid.h"3334jobject NetSocketAndroid::net_utils = nullptr;35jclass NetSocketAndroid::cls = nullptr;36jmethodID NetSocketAndroid::_multicast_lock_acquire = nullptr;37jmethodID NetSocketAndroid::_multicast_lock_release = nullptr;3839void NetSocketAndroid::setup(jobject p_net_utils) {40JNIEnv *env = get_jni_env();4142net_utils = env->NewGlobalRef(p_net_utils);4344jclass c = env->GetObjectClass(net_utils);45cls = (jclass)env->NewGlobalRef(c);4647_multicast_lock_acquire = env->GetMethodID(cls, "multicastLockAcquire", "()V");48_multicast_lock_release = env->GetMethodID(cls, "multicastLockRelease", "()V");49}5051void NetSocketAndroid::terminate() {52JNIEnv *env = get_jni_env();53ERR_FAIL_NULL(env);5455env->DeleteGlobalRef(cls);56env->DeleteGlobalRef(net_utils);57}5859void NetSocketAndroid::multicast_lock_acquire() {60if (_multicast_lock_acquire) {61JNIEnv *env = get_jni_env();62env->CallVoidMethod(net_utils, _multicast_lock_acquire);63}64}6566void NetSocketAndroid::multicast_lock_release() {67if (_multicast_lock_release) {68JNIEnv *env = get_jni_env();69env->CallVoidMethod(net_utils, _multicast_lock_release);70}71}7273NetSocket *NetSocketAndroid::_create_func() {74return memnew(NetSocketAndroid);75}7677void NetSocketAndroid::make_default() {78_create = _create_func;79}8081NetSocketAndroid::~NetSocketAndroid() {82close();83}8485void NetSocketAndroid::close() {86NetSocketUnix::close();87if (wants_broadcast) {88multicast_lock_release();89}90if (multicast_groups) {91multicast_lock_release();92}93wants_broadcast = false;94multicast_groups = 0;95}9697Error NetSocketAndroid::set_broadcasting_enabled(bool p_enabled) {98Error err = NetSocketUnix::set_broadcasting_enabled(p_enabled);99if (err != OK) {100return err;101}102103if (p_enabled != wants_broadcast) {104if (p_enabled) {105multicast_lock_acquire();106} else {107multicast_lock_release();108}109110wants_broadcast = p_enabled;111}112113return OK;114}115116Error NetSocketAndroid::join_multicast_group(const IPAddress &p_multi_address, const String &p_if_name) {117Error err = NetSocketUnix::join_multicast_group(p_multi_address, p_if_name);118if (err != OK) {119return err;120}121122if (!multicast_groups) {123multicast_lock_acquire();124}125multicast_groups++;126127return OK;128}129130Error NetSocketAndroid::leave_multicast_group(const IPAddress &p_multi_address, const String &p_if_name) {131Error err = NetSocketUnix::leave_multicast_group(p_multi_address, p_if_name);132if (err != OK) {133return err;134}135136ERR_FAIL_COND_V(multicast_groups == 0, ERR_BUG);137138multicast_groups--;139if (!multicast_groups) {140multicast_lock_release();141}142143return OK;144}145146147