// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "flutter/shell/platform/darwin/ios/framework/Source/connection_collection.h"

namespace flutter {
ConnectionCollection::Connection ConnectionCollection::AquireConnection(
    const std::string& name) {
  Connection nextConnection = ++counter_;
  connections_[name] = nextConnection;
  return nextConnection;
}

std::string ConnectionCollection::CleanupConnection(
    ConnectionCollection::Connection connection) {
  if (connection > 0) {
    std::string channel;
    for (auto& keyValue : connections_) {
      if (keyValue.second == connection) {
        channel = keyValue.first;
        break;
      }
    }
    if (channel.length() > 0) {
      connections_.erase(channel);
      return channel;
    }
  }
  return "";
}

bool ConnectionCollection::IsValidConnection(
    ConnectionCollection::Connection connection) {
  return connection > 0;
}

ConnectionCollection::Connection ConnectionCollection::MakeErrorConnection(
    int errCode) {
  if (errCode < 0) {
    return -1 * errCode;
  }
  return errCode;
}

}  // namespace flutter
