All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.agora.rtm.internal.RtmStorageImpl Maven / Gradle / Ivy

There is a newer version: 2.2.2-beta
Show newest version
package io.agora.rtm.internal;

import io.agora.rtm.ErrorInfo;
import io.agora.rtm.Metadata;
import io.agora.rtm.MetadataOptions;
import io.agora.rtm.ResultCallback;
import io.agora.rtm.RtmConstants;
import io.agora.rtm.RtmConstants.RtmChannelType;
import io.agora.rtm.RtmConstants.RtmErrorCode;
import io.agora.rtm.RtmStorage;
import io.agora.rtm.internal.RequestInfo;
import java.util.HashMap;

class RtmStorageImpl extends RtmStorage {
  private static final String TAG = RtmStorageImpl.class.getSimpleName();

  private long mNativeStorage = 0;
  private RtmClientImpl mRtmClient;

  RtmStorageImpl(long nativeHandle, RtmClientImpl rtmClient) {
    mNativeStorage = nativeHandle;
    mRtmClient = rtmClient;
  }

  @Override
  public synchronized Metadata createMetadata() {
    if (mNativeStorage == 0) {
      return null;
    }

    long handle = nativeCreateMetadata(mNativeStorage);
    if (handle == 0) {
      return null;
    }

    return new MetadataImpl(handle);
  }

  @Override
  public synchronized void setChannelMetadata(String channelName, RtmChannelType channelType,
      Metadata data, MetadataOptions options, String lockName,
      ResultCallback resultCallback) {
    if (mNativeStorage == 0) {
      mRtmClient.processFailureCallback(
          resultCallback, RtmErrorCode.NOT_INITIALIZED, RtmConstants.SET_CHANNEL_METADATA_API_STR);
      return;
    }
    if (data == null) {
      mRtmClient.processFailureCallback(resultCallback,
          RtmErrorCode.STORAGE_INVALID_METADATA_INSTANCE,
          RtmConstants.SET_CHANNEL_METADATA_API_STR);
      return;
    }
    if (options == null) {
      options = new MetadataOptions();
    }

    synchronized (mRtmClient.mRtmCallbackLock) {
      RequestInfo requestInfo = new RequestInfo();
      int ret = nativeSetChannelMetadata(mNativeStorage, channelName,
          RtmChannelType.getValue(channelType), ((MetadataImpl) data).getNativeMetadata(), options,
          lockName, requestInfo);
      RtmErrorCode errorCode = RtmErrorCode.getEnum(ret);
      if (errorCode == RtmErrorCode.OK) {
        mRtmClient.mModifyMetadataCallback.put(requestInfo.requestId, resultCallback);
      } else {
        mRtmClient.processFailureCallback(
            resultCallback, errorCode, RtmConstants.SET_CHANNEL_METADATA_API_STR);
      }
    }
  }

  @Override
  public synchronized void updateChannelMetadata(String channelName, RtmChannelType channelType,
      Metadata data, MetadataOptions options, String lockName,
      ResultCallback resultCallback) {
    if (mNativeStorage == 0) {
      mRtmClient.processFailureCallback(resultCallback, RtmErrorCode.NOT_INITIALIZED,
          RtmConstants.UPDATE_CHANNEL_METADATA_API_STR);
      return;
    }
    if (data == null) {
      mRtmClient.processFailureCallback(resultCallback,
          RtmErrorCode.STORAGE_INVALID_METADATA_INSTANCE,
          RtmConstants.UPDATE_CHANNEL_METADATA_API_STR);
      return;
    }
    if (options == null) {
      options = new MetadataOptions();
    }

    synchronized (mRtmClient.mRtmCallbackLock) {
      RequestInfo requestInfo = new RequestInfo();
      int ret = nativeUpdateChannelMetadata(mNativeStorage, channelName,
          RtmChannelType.getValue(channelType), ((MetadataImpl) data).getNativeMetadata(), options,
          lockName, requestInfo);
      RtmErrorCode errorCode = RtmErrorCode.getEnum(ret);
      if (errorCode == RtmErrorCode.OK) {
        mRtmClient.mModifyMetadataCallback.put(requestInfo.requestId, resultCallback);
      } else {
        mRtmClient.processFailureCallback(
            resultCallback, errorCode, RtmConstants.UPDATE_CHANNEL_METADATA_API_STR);
      }
    }
  }

  @Override
  public synchronized void removeChannelMetadata(String channelName, RtmChannelType channelType,
      Metadata data, MetadataOptions options, String lockName,
      ResultCallback resultCallback) {
    if (mNativeStorage == 0) {
      mRtmClient.processFailureCallback(resultCallback, RtmErrorCode.NOT_INITIALIZED,
          RtmConstants.REMOVE_CHANNEL_METADATA_API_STR);
      return;
    }
    if (data == null) {
      mRtmClient.processFailureCallback(resultCallback,
          RtmErrorCode.STORAGE_INVALID_METADATA_INSTANCE,
          RtmConstants.REMOVE_CHANNEL_METADATA_API_STR);
      return;
    }
    if (options == null) {
      options = new MetadataOptions();
    }

    synchronized (mRtmClient.mRtmCallbackLock) {
      RequestInfo requestInfo = new RequestInfo();
      int ret = nativeRemoveChannelMetadata(mNativeStorage, channelName,
          RtmChannelType.getValue(channelType), ((MetadataImpl) data).getNativeMetadata(), options,
          lockName, requestInfo);
      RtmErrorCode errorCode = RtmErrorCode.getEnum(ret);
      if (errorCode == RtmErrorCode.OK) {
        mRtmClient.mModifyMetadataCallback.put(requestInfo.requestId, resultCallback);
      } else {
        mRtmClient.processFailureCallback(
            resultCallback, errorCode, RtmConstants.REMOVE_CHANNEL_METADATA_API_STR);
      }
    }
  }

  @Override
  public synchronized void getChannelMetadata(
      String channelName, RtmChannelType channelType, ResultCallback resultCallback) {
    if (resultCallback == null) {
      return;
    }
    if (mNativeStorage == 0) {
      resultCallback.onFailure(new ErrorInfo(RtmErrorCode.NOT_INITIALIZED,
          mRtmClient.getErrorReason(RtmErrorCode.NOT_INITIALIZED),
          RtmConstants.GET_CHANNEL_METADATA_API_STR));
      return;
    }

    synchronized (mRtmClient.mRtmCallbackLock) {
      RequestInfo requestInfo = new RequestInfo();
      int ret = nativeGetChannelMetadata(
          mNativeStorage, channelName, RtmChannelType.getValue(channelType), requestInfo);
      RtmErrorCode errorCode = RtmErrorCode.getEnum(ret);
      if (errorCode == RtmErrorCode.OK) {
        mRtmClient.mGetMetadataCallback.put(requestInfo.requestId, resultCallback);
      } else {
        resultCallback.onFailure(new ErrorInfo(
            errorCode, mRtmClient.getErrorReason(ret), RtmConstants.GET_CHANNEL_METADATA_API_STR));
      }
    }
  }

  @Override
  public synchronized void setUserMetadata(
      String userId, Metadata data, MetadataOptions options, ResultCallback resultCallback) {
    if (mNativeStorage == 0) {
      mRtmClient.processFailureCallback(
          resultCallback, RtmErrorCode.NOT_INITIALIZED, RtmConstants.SET_USER_METADATA_API_STR);
      return;
    }
    if (data == null) {
      mRtmClient.processFailureCallback(resultCallback,
          RtmErrorCode.STORAGE_INVALID_METADATA_INSTANCE, RtmConstants.SET_USER_METADATA_API_STR);
      return;
    }
    if (options == null) {
      options = new MetadataOptions();
    }

    synchronized (mRtmClient.mRtmCallbackLock) {
      RequestInfo requestInfo = new RequestInfo();
      int ret = nativeSetUserMetadata(
          mNativeStorage, userId, ((MetadataImpl) data).getNativeMetadata(), options, requestInfo);
      RtmErrorCode errorCode = RtmErrorCode.getEnum(ret);
      if (errorCode == RtmErrorCode.OK) {
        mRtmClient.mModifyMetadataCallback.put(requestInfo.requestId, resultCallback);
      } else {
        mRtmClient.processFailureCallback(
            resultCallback, errorCode, RtmConstants.SET_USER_METADATA_API_STR);
      }
    }
  }

  @Override
  public synchronized void updateUserMetadata(
      String userId, Metadata data, MetadataOptions options, ResultCallback resultCallback) {
    if (mNativeStorage == 0) {
      mRtmClient.processFailureCallback(
          resultCallback, RtmErrorCode.NOT_INITIALIZED, RtmConstants.UPDATE_USER_METADATA_API_STR);
      return;
    }
    if (data == null) {
      mRtmClient.processFailureCallback(resultCallback,
          RtmErrorCode.STORAGE_INVALID_METADATA_INSTANCE,
          RtmConstants.UPDATE_USER_METADATA_API_STR);
      return;
    }
    if (options == null) {
      options = new MetadataOptions();
    }

    synchronized (mRtmClient.mRtmCallbackLock) {
      RequestInfo requestInfo = new RequestInfo();
      int ret = nativeUpdateUserMetadata(
          mNativeStorage, userId, ((MetadataImpl) data).getNativeMetadata(), options, requestInfo);
      RtmErrorCode errorCode = RtmErrorCode.getEnum(ret);
      if (errorCode == RtmErrorCode.OK) {
        mRtmClient.mModifyMetadataCallback.put(requestInfo.requestId, resultCallback);
      } else {
        mRtmClient.processFailureCallback(
            resultCallback, errorCode, RtmConstants.UPDATE_USER_METADATA_API_STR);
      }
    }
  }

  @Override
  public synchronized void removeUserMetadata(
      String userId, Metadata data, MetadataOptions options, ResultCallback resultCallback) {
    if (mNativeStorage == 0) {
      mRtmClient.processFailureCallback(
          resultCallback, RtmErrorCode.NOT_INITIALIZED, RtmConstants.REMOVE_USER_METADATA_API_STR);
      return;
    }
    if (data == null) {
      mRtmClient.processFailureCallback(resultCallback,
          RtmErrorCode.STORAGE_INVALID_METADATA_INSTANCE,
          RtmConstants.REMOVE_USER_METADATA_API_STR);
      return;
    }
    if (options == null) {
      options = new MetadataOptions();
    }

    synchronized (mRtmClient.mRtmCallbackLock) {
      RequestInfo requestInfo = new RequestInfo();
      int ret = nativeRemoveUserMetadata(
          mNativeStorage, userId, ((MetadataImpl) data).getNativeMetadata(), options, requestInfo);
      RtmErrorCode errorCode = RtmErrorCode.getEnum(ret);
      if (errorCode == RtmErrorCode.OK) {
        mRtmClient.mModifyMetadataCallback.put(requestInfo.requestId, resultCallback);
      } else {
        mRtmClient.processFailureCallback(
            resultCallback, errorCode, RtmConstants.REMOVE_USER_METADATA_API_STR);
      }
    }
  }

  @Override
  public synchronized void getUserMetadata(String userId, ResultCallback resultCallback) {
    if (resultCallback == null) {
      return;
    }
    if (mNativeStorage == 0) {
      resultCallback.onFailure(new ErrorInfo(RtmErrorCode.NOT_INITIALIZED,
          mRtmClient.getErrorReason(RtmErrorCode.NOT_INITIALIZED),
          RtmConstants.GET_USER_METADATA_API_STR));
      return;
    }

    synchronized (mRtmClient.mRtmCallbackLock) {
      RequestInfo requestInfo = new RequestInfo();
      int ret = nativeGetUserMetadata(mNativeStorage, userId, requestInfo);
      RtmErrorCode errorCode = RtmErrorCode.getEnum(ret);
      if (errorCode == RtmErrorCode.OK) {
        mRtmClient.mGetMetadataCallback.put(requestInfo.requestId, resultCallback);
      } else {
        resultCallback.onFailure(new ErrorInfo(
            errorCode, mRtmClient.getErrorReason(ret), RtmConstants.GET_USER_METADATA_API_STR));
      }
    }
  }

  @Override
  public synchronized void subscribeUserMetadata(
      String userId, ResultCallback resultCallback) {
    if (mNativeStorage == 0) {
      mRtmClient.processFailureCallback(resultCallback, RtmErrorCode.NOT_INITIALIZED,
          RtmConstants.SUBSCRIBE_USER_METADATA_API_STR);
      return;
    }

    synchronized (mRtmClient.mRtmCallbackLock) {
      RequestInfo requestInfo = new RequestInfo();
      int ret = nativeSubscribeUserMetadata(mNativeStorage, userId, requestInfo);
      RtmErrorCode errorCode = RtmErrorCode.getEnum(ret);
      if (errorCode == RtmErrorCode.OK) {
        mRtmClient.mSubscribeUserMetadataCallback.put(requestInfo.requestId, resultCallback);
      } else {
        mRtmClient.processFailureCallback(
            resultCallback, errorCode, RtmConstants.SUBSCRIBE_USER_METADATA_API_STR);
      }
    }
  }

  @Override
  public synchronized void unsubscribeUserMetadata(
      String userId, ResultCallback resultCallback) {
    if (mNativeStorage == 0) {
      mRtmClient.processFailureCallback(resultCallback, RtmErrorCode.NOT_INITIALIZED,
          RtmConstants.UNSUBSCRIBE_USER_METADATA_API_STR);
      return;
    }
    int ret = nativeUnsubscribeUserMetadata(mNativeStorage, userId);
    mRtmClient.processCallback(ret, resultCallback, RtmConstants.UNSUBSCRIBE_USER_METADATA_API_STR);
  }

  private native long nativeCreateMetadata(long nativeRtmStorageAndroid);

  private native int nativeSetChannelMetadata(long nativeRtmStorageAndroid, String channelName,
      int channelType, Long data, MetadataOptions options, String lockName,
      RequestInfo requestInfo);

  private native int nativeUpdateChannelMetadata(long nativeRtmStorageAndroid, String channelName,
      int channelType, Long data, MetadataOptions options, String lockName,
      RequestInfo requestInfo);

  private native int nativeRemoveChannelMetadata(long nativeRtmStorageAndroid, String channelName,
      int channelType, Long data, MetadataOptions options, String lockName,
      RequestInfo requestInfo);

  private native int nativeGetChannelMetadata(
      long nativeRtmStorageAndroid, String channelName, int channelType, RequestInfo requestInfo);

  private native int nativeSetUserMetadata(long nativeRtmStorageAndroid, String userId, Long data,
      MetadataOptions options, RequestInfo requestInfo);

  private native int nativeUpdateUserMetadata(long nativeRtmStorageAndroid, String userId,
      Long data, MetadataOptions options, RequestInfo requestInfo);

  private native int nativeRemoveUserMetadata(long nativeRtmStorageAndroid, String userId,
      Long data, MetadataOptions options, RequestInfo requestInfo);

  private native int nativeGetUserMetadata(
      long nativeRtmStorageAndroid, String userId, RequestInfo requestInfo);

  private native int nativeSubscribeUserMetadata(
      long nativeRtmStorageAndroid, String userId, RequestInfo requestInfo);

  private native int nativeUnsubscribeUserMetadata(long nativeRtmStorageAndroid, String userId);
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy