Return an error when datachannel closes due to network error

This is the start of generating compliant errors, including diagnostics,
when datachannels close because of errors.

Bug: chromium:1030631
Change-Id: I39aa41728efb25bca6193a782db4cbdaad8e0dc1
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/161304
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30034}
diff --git a/api/rtc_error.cc b/api/rtc_error.cc
index c9ad7cb..4d3033b 100644
--- a/api/rtc_error.cc
+++ b/api/rtc_error.cc
@@ -26,19 +26,34 @@
     "NETWORK_ERROR",
     "RESOURCE_EXHAUSTED",
     "INTERNAL_ERROR",
+    "OPERATION_ERROR_WITH_DATA",
 };
-static_assert(static_cast<int>(webrtc::RTCErrorType::INTERNAL_ERROR) ==
-                  (arraysize(kRTCErrorTypeNames) - 1),
-              "kRTCErrorTypeNames must have as many strings as RTCErrorType "
-              "has values.");
+static_assert(
+    static_cast<int>(webrtc::RTCErrorType::OPERATION_ERROR_WITH_DATA) ==
+        (arraysize(kRTCErrorTypeNames) - 1),
+    "kRTCErrorTypeNames must have as many strings as RTCErrorType "
+    "has values.");
+
+const char* kRTCErrorDetailTypeNames[] = {
+    "NONE",
+    "DATA_CHANNEL_FAILURE",
+    "DTLS_FAILURE",
+    "FINGERPRINT_FAILURE",
+    "SCTP_FAILURE",
+    "SDP_SYNTAX_ERROR",
+    "HARDWARE_ENCODER_NOT_AVAILABLE",
+    "HARDWARE_ENCODER_ERROR",
+};
+static_assert(
+    static_cast<int>(webrtc::RTCErrorDetailType::HARDWARE_ENCODER_ERROR) ==
+        (arraysize(kRTCErrorDetailTypeNames) - 1),
+    "kRTCErrorDetailTypeNames must have as many strings as "
+    "RTCErrorDetailType has values.");
 
 }  // namespace
 
 namespace webrtc {
 
-RTCError::RTCError(RTCError&& other) = default;
-RTCError& RTCError::operator=(RTCError&& other) = default;
-
 // static
 RTCError RTCError::OK() {
   return RTCError();
@@ -57,4 +72,9 @@
   return kRTCErrorTypeNames[index];
 }
 
+const char* ToString(RTCErrorDetailType error) {
+  int index = static_cast<int>(error);
+  return kRTCErrorDetailTypeNames[index];
+}
+
 }  // namespace webrtc