/*
 *   Copyright (c) 2021 Project CHIP Authors
 *   All rights reserved.
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 *
 */
package chip.platform;

import java.util.Map;

public class ChipMdnsCallbackImpl implements ChipMdnsCallback {
  public native void handleServiceResolve(
      String instanceName,
      String serviceType,
      String hostName,
      String address,
      int port,
      Map<String, byte[]> textEntries,
      long callbackHandle,
      long contextHandle);

  public native void handleServiceBrowse(
      String[] instanceName, String serviceType, long callbackHandle, long contextHandle);

  public String[] getTextEntryKeys(Map<String, byte[]> textEntries) {
    return textEntries.keySet().toArray(new String[textEntries.size()]);
  }

  public byte[] getTextEntryData(Map<String, byte[]> textEntries, String key) {
    return textEntries.get(key);
  }
}
