Revert "Add JavaInputStreamAdaptor files into third_party directory."
This reverts commit cf8b723ffd
.
Reason for revert: reverting and relanding to make the google3
roller happy
Original change's description:
> Add JavaInputStreamAdaptor files into third_party directory.
>
> This code needs to be migrated out of the main Skia directory due to its
> use of the Apache 2.0 license. A followup CL will remove these files
> from their current home at platform_tools/android/apps/skottie/src/
> main/cpp.
>
> Change-Id: I939b05afcebb29e1deab1d4ae1b38012f719cf7e
> Bug: skia:10310
> Reviewed-on: https://skia-review.googlesource.com/c/skia/+/295082
> Reviewed-by: Ben Wagner <bungeman@google.com>
> Reviewed-by: Weston Tracey <westont@google.com>
> Commit-Queue: John Stiles <johnstiles@google.com>
TBR=bungeman@google.com,westont@google.com,johnstiles@google.com
Change-Id: Ib3cbad92b8c5616735a013d06e3345ac50f78c84
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: skia:10310, skia:10353
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/295200
Reviewed-by: John Stiles <johnstiles@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
This commit is contained in:
parent
cb40620540
commit
9d79ac6b81
256
third_party/aosp/JavaInputStreamAdaptor.cpp
vendored
256
third_party/aosp/JavaInputStreamAdaptor.cpp
vendored
@ -1,256 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2018 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include "include/core/SkTypes.h"
|
|
||||||
#include "platform_tools/android/apps/skottie/src/main/cpp/JavaInputStreamAdaptor.h"
|
|
||||||
|
|
||||||
static jclass findClassCheck(JNIEnv* env, const char classname[]) {
|
|
||||||
jclass clazz = env->FindClass(classname);
|
|
||||||
SkASSERT(!env->ExceptionCheck());
|
|
||||||
return clazz;
|
|
||||||
}
|
|
||||||
|
|
||||||
static jmethodID getMethodIDCheck(JNIEnv* env, jclass clazz,
|
|
||||||
const char methodname[], const char type[]) {
|
|
||||||
jmethodID id = env->GetMethodID(clazz, methodname, type);
|
|
||||||
SkASSERT(!env->ExceptionCheck());
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
static jmethodID gInputStream_readMethodID;
|
|
||||||
static jmethodID gInputStream_skipMethodID;
|
|
||||||
|
|
||||||
static JNIEnv* get_env_or_die(JavaVM* jvm) {
|
|
||||||
JNIEnv* env;
|
|
||||||
if (jvm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
|
|
||||||
char errorMessage[256];
|
|
||||||
sprintf(errorMessage, "Failed to get JNIEnv for JavaVM: %p", jvm);
|
|
||||||
SK_ABORT(errorMessage);
|
|
||||||
}
|
|
||||||
return env;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrapper for a Java InputStream.
|
|
||||||
*/
|
|
||||||
class JavaInputStreamAdaptor : public SkStream {
|
|
||||||
JavaInputStreamAdaptor(JavaVM* jvm, jobject js, jbyteArray ar, jint capacity,
|
|
||||||
bool swallowExceptions)
|
|
||||||
: fJvm(jvm)
|
|
||||||
, fJavaInputStream(js)
|
|
||||||
, fJavaByteArray(ar)
|
|
||||||
, fCapacity(capacity)
|
|
||||||
, fBytesRead(0)
|
|
||||||
, fIsAtEnd(false)
|
|
||||||
, fSwallowExceptions(swallowExceptions) {}
|
|
||||||
|
|
||||||
public:
|
|
||||||
static JavaInputStreamAdaptor* Create(JNIEnv* env, jobject js, jbyteArray ar,
|
|
||||||
bool swallowExceptions) {
|
|
||||||
JavaVM* jvm;
|
|
||||||
if (env->GetJavaVM(&jvm) != JNI_OK) {
|
|
||||||
SK_ABORT("Failed to get JavaVM");
|
|
||||||
}
|
|
||||||
|
|
||||||
js = env->NewGlobalRef(js);
|
|
||||||
if (!js) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
ar = (jbyteArray) env->NewGlobalRef(ar);
|
|
||||||
if (!ar) {
|
|
||||||
env->DeleteGlobalRef(js);
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
jint capacity = env->GetArrayLength(ar);
|
|
||||||
return new JavaInputStreamAdaptor(jvm, js, ar, capacity, swallowExceptions);
|
|
||||||
}
|
|
||||||
|
|
||||||
~JavaInputStreamAdaptor() override {
|
|
||||||
auto* env = get_env_or_die(fJvm);
|
|
||||||
env->DeleteGlobalRef(fJavaInputStream);
|
|
||||||
env->DeleteGlobalRef(fJavaByteArray);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t read(void* buffer, size_t size) override {
|
|
||||||
auto* env = get_env_or_die(fJvm);
|
|
||||||
if (!fSwallowExceptions && checkException(env)) {
|
|
||||||
// Just in case the caller did not clear from a previous exception.
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (NULL == buffer) {
|
|
||||||
if (0 == size) {
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
/* InputStream.skip(n) can return <=0 but still not be at EOF
|
|
||||||
If we see that value, we need to call read(), which will
|
|
||||||
block if waiting for more data, or return -1 at EOF
|
|
||||||
*/
|
|
||||||
size_t amountSkipped = 0;
|
|
||||||
do {
|
|
||||||
size_t amount = this->doSkip(size - amountSkipped, env);
|
|
||||||
if (0 == amount) {
|
|
||||||
char tmp;
|
|
||||||
amount = this->doRead(&tmp, 1, env);
|
|
||||||
if (0 == amount) {
|
|
||||||
// if read returned 0, we're at EOF
|
|
||||||
fIsAtEnd = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
amountSkipped += amount;
|
|
||||||
} while (amountSkipped < size);
|
|
||||||
return amountSkipped;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return this->doRead(buffer, size, env);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isAtEnd() const override { return fIsAtEnd; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
size_t doRead(void* buffer, size_t size, JNIEnv* env) {
|
|
||||||
size_t bytesRead = 0;
|
|
||||||
// read the bytes
|
|
||||||
do {
|
|
||||||
jint requested = 0;
|
|
||||||
if (size > static_cast<size_t>(fCapacity)) {
|
|
||||||
requested = fCapacity;
|
|
||||||
} else {
|
|
||||||
// This is safe because requested is clamped to (jint)
|
|
||||||
// fCapacity.
|
|
||||||
requested = static_cast<jint>(size);
|
|
||||||
}
|
|
||||||
|
|
||||||
jint n = env->CallIntMethod(fJavaInputStream,
|
|
||||||
gInputStream_readMethodID, fJavaByteArray, 0, requested);
|
|
||||||
if (checkException(env)) {
|
|
||||||
SkDebugf("---- read threw an exception\n");
|
|
||||||
return bytesRead;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (n < 0) { // n == 0 should not be possible, see InputStream read() specifications.
|
|
||||||
fIsAtEnd = true;
|
|
||||||
break; // eof
|
|
||||||
}
|
|
||||||
|
|
||||||
env->GetByteArrayRegion(fJavaByteArray, 0, n,
|
|
||||||
reinterpret_cast<jbyte*>(buffer));
|
|
||||||
if (checkException(env)) {
|
|
||||||
SkDebugf("---- read:GetByteArrayRegion threw an exception\n");
|
|
||||||
return bytesRead;
|
|
||||||
}
|
|
||||||
|
|
||||||
buffer = (void*)((char*)buffer + n);
|
|
||||||
bytesRead += n;
|
|
||||||
size -= n;
|
|
||||||
fBytesRead += n;
|
|
||||||
} while (size != 0);
|
|
||||||
|
|
||||||
return bytesRead;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t doSkip(size_t size, JNIEnv* env) {
|
|
||||||
jlong skipped = env->CallLongMethod(fJavaInputStream,
|
|
||||||
gInputStream_skipMethodID, (jlong)size);
|
|
||||||
if (checkException(env)) {
|
|
||||||
SkDebugf("------- skip threw an exception\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (skipped < 0) {
|
|
||||||
skipped = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (size_t)skipped;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool checkException(JNIEnv* env) {
|
|
||||||
if (!env->ExceptionCheck()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
env->ExceptionDescribe();
|
|
||||||
if (fSwallowExceptions) {
|
|
||||||
env->ExceptionClear();
|
|
||||||
}
|
|
||||||
|
|
||||||
// There is no way to recover from the error, so consider the stream
|
|
||||||
// to be at the end.
|
|
||||||
fIsAtEnd = true;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
JavaVM* fJvm;
|
|
||||||
jobject fJavaInputStream;
|
|
||||||
jbyteArray fJavaByteArray;
|
|
||||||
const jint fCapacity;
|
|
||||||
size_t fBytesRead;
|
|
||||||
bool fIsAtEnd;
|
|
||||||
const bool fSwallowExceptions;
|
|
||||||
};
|
|
||||||
|
|
||||||
static SkStream* CreateJavaInputStreamAdaptor(JNIEnv* env, jobject stream, jbyteArray storage,
|
|
||||||
bool swallowExceptions = true) {
|
|
||||||
return JavaInputStreamAdaptor::Create(env, stream, storage, swallowExceptions);
|
|
||||||
}
|
|
||||||
|
|
||||||
static SkMemoryStream* adaptor_to_mem_stream(SkStream* stream) {
|
|
||||||
SkASSERT(stream != NULL);
|
|
||||||
size_t bufferSize = 4096;
|
|
||||||
size_t streamLen = 0;
|
|
||||||
size_t len;
|
|
||||||
char* data = (char*)sk_malloc_throw(bufferSize);
|
|
||||||
|
|
||||||
while ((len = stream->read(data + streamLen,
|
|
||||||
bufferSize - streamLen)) != 0) {
|
|
||||||
streamLen += len;
|
|
||||||
if (streamLen == bufferSize) {
|
|
||||||
bufferSize *= 2;
|
|
||||||
data = (char*)sk_realloc_throw(data, bufferSize);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
data = (char*)sk_realloc_throw(data, streamLen);
|
|
||||||
|
|
||||||
SkMemoryStream* streamMem = new SkMemoryStream();
|
|
||||||
streamMem->setMemoryOwned(data, streamLen);
|
|
||||||
return streamMem;
|
|
||||||
}
|
|
||||||
|
|
||||||
SkStreamRewindable* CopyJavaInputStream(JNIEnv* env, jobject stream,
|
|
||||||
jbyteArray storage) {
|
|
||||||
std::unique_ptr<SkStream> adaptor(CreateJavaInputStreamAdaptor(env, stream, storage));
|
|
||||||
if (NULL == adaptor.get()) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return adaptor_to_mem_stream(adaptor.get());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) {
|
|
||||||
JNIEnv* env;
|
|
||||||
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
jclass inputStream_Clazz = findClassCheck(env, "java/io/InputStream");
|
|
||||||
gInputStream_readMethodID = getMethodIDCheck(env, inputStream_Clazz, "read", "([BII)I");
|
|
||||||
gInputStream_skipMethodID = getMethodIDCheck(env, inputStream_Clazz, "skip", "(J)J");
|
|
||||||
|
|
||||||
return JNI_VERSION_1_6;
|
|
||||||
}
|
|
24
third_party/aosp/JavaInputStreamAdaptor.h
vendored
24
third_party/aosp/JavaInputStreamAdaptor.h
vendored
@ -1,24 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2018 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "include/core/SkStream.h"
|
|
||||||
#include "include/private/SkMalloc.h"
|
|
||||||
#include <jni.h>
|
|
||||||
|
|
||||||
SkStreamRewindable* CopyJavaInputStream(JNIEnv* env, jobject stream,
|
|
||||||
jbyteArray storage);
|
|
161
third_party/aosp/LICENSE
vendored
161
third_party/aosp/LICENSE
vendored
@ -1,161 +0,0 @@
|
|||||||
Apache License
|
|
||||||
|
|
||||||
Version 2.0, January 2004
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction, and
|
|
||||||
distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by the
|
|
||||||
copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all other
|
|
||||||
entities that control, are controlled by, or are under common control with
|
|
||||||
that entity. For the purposes of this definition, "control" means (i) the
|
|
||||||
power, direct or indirect, to cause the direction or management of such
|
|
||||||
entity, whether by contract or otherwise, or (ii) ownership of fifty
|
|
||||||
percent (50%) or more of the outstanding shares, or (iii) beneficial
|
|
||||||
ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity exercising
|
|
||||||
permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical transformation
|
|
||||||
or translation of a Source form, including but not limited to compiled
|
|
||||||
object code, generated documentation, and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or Object
|
|
||||||
form, made available under the License, as indicated by a copyright
|
|
||||||
notice that is included in or attached to the work (an example is
|
|
||||||
provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including the original
|
|
||||||
version of the Work and any modifications or additions to that Work or
|
|
||||||
Derivative Works thereof, that is intentionally submitted to Licensor
|
|
||||||
for inclusion in the Work by the copyright owner or by an individual or
|
|
||||||
Legal Entity authorized to submit on behalf of the copyright owner. For
|
|
||||||
the purposes of this definition, "submitted" means any form of electronic,
|
|
||||||
verbal, or written communication sent to the Licensor or its
|
|
||||||
representatives, including but not limited to communication on electronic
|
|
||||||
mailing lists, source code control systems, and issue tracking systems that
|
|
||||||
are managed by, or on behalf of, the Licensor for the purpose of discussing
|
|
||||||
and improving the Work, but excluding communication that is conspicuously
|
|
||||||
marked or otherwise designated in writing by the copyright owner as "Not
|
|
||||||
a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity on
|
|
||||||
behalf of whom a Contribution has been received by Licensor and subsequently
|
|
||||||
incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of this
|
|
||||||
License, each Contributor hereby grants to You a perpetual, worldwide,
|
|
||||||
non-exclusive, no-charge, royalty-free, irrevocable copyright license to
|
|
||||||
reproduce, prepare Derivative Works of, publicly display, publicly perform,
|
|
||||||
sublicense, and distribute the Work and such Derivative Works in Source or
|
|
||||||
Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of this
|
|
||||||
License, each Contributor hereby grants to You a perpetual, worldwide,
|
|
||||||
non-exclusive, no-charge, royalty-free, irrevocable (except as stated in
|
|
||||||
this section) patent license to make, have made, use, offer to sell, sell,
|
|
||||||
import, and otherwise transfer the Work, where such license applies only to
|
|
||||||
those patent claims licensable by such Contributor that are necessarily
|
|
||||||
infringed by their Contribution(s) alone or by combination of their
|
|
||||||
Contribution(s) with the Work to which such Contribution(s) was submitted.
|
|
||||||
If You institute patent litigation against any entity (including a cross-claim
|
|
||||||
or counterclaim in a lawsuit) alleging that the Work or a Contribution
|
|
||||||
incorporated within the Work constitutes direct or contributory patent
|
|
||||||
infringement, then any patent licenses granted to You under this License
|
|
||||||
for that Work shall terminate as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the Work or
|
|
||||||
Derivative Works thereof in any medium, with or without modifications, and
|
|
||||||
in Source or Object form, provided that You meet the following conditions:
|
|
||||||
|
|
||||||
You must give any other recipients of the Work or Derivative Works a copy of
|
|
||||||
this License; and
|
|
||||||
You must cause any modified files to carry prominent notices stating that
|
|
||||||
You changed the files; and
|
|
||||||
You must retain, in the Source form of any Derivative Works that You
|
|
||||||
distribute, all copyright, patent, trademark, and attribution notices
|
|
||||||
from the Source form of the Work, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works; and
|
|
||||||
If the Work includes a "NOTICE" text file as part of its distribution,
|
|
||||||
then any Derivative Works that You distribute must include a readable
|
|
||||||
copy of the attribution notices contained within such NOTICE file, excluding
|
|
||||||
those notices that do not pertain to any part of the Derivative Works, in
|
|
||||||
at least one of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or documentation, if
|
|
||||||
provided along with the Derivative Works; or, within a display generated by
|
|
||||||
the Derivative Works, if and wherever such third-party notices normally
|
|
||||||
appear. The contents of the NOTICE file are for informational purposes
|
|
||||||
only and do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside or as
|
|
||||||
an addendum to the NOTICE text from the Work, provided that such additional
|
|
||||||
attribution notices cannot be construed as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and may provide
|
|
||||||
additional or different license terms and conditions for use, reproduction, or
|
|
||||||
distribution of Your modifications, or for any such Derivative Works as a
|
|
||||||
whole, provided Your use, reproduction, and distribution of the Work otherwise
|
|
||||||
complies with the conditions stated in this License.
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise, any
|
|
||||||
Contribution intentionally submitted for inclusion in the Work by You to the
|
|
||||||
Licensor shall be under the terms and conditions of this License, without any
|
|
||||||
additional terms or conditions. Notwithstanding the above, nothing herein
|
|
||||||
shall supersede or modify the terms of any separate license agreement you
|
|
||||||
may have executed with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade names,
|
|
||||||
trademarks, service marks, or product names of the Licensor, except as
|
|
||||||
required for reasonable and customary use in describing the origin of the
|
|
||||||
Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or agreed to
|
|
||||||
in writing, Licensor provides the Work (and each Contributor provides its
|
|
||||||
Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
|
||||||
ANY KIND, either express or implied, including, without limitation, any
|
|
||||||
warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining
|
|
||||||
the appropriateness of using or redistributing the Work and assume any risks
|
|
||||||
associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory, whether in
|
|
||||||
tort (including negligence), contract, or otherwise, unless required by
|
|
||||||
applicable law (such as deliberate and grossly negligent acts) or agreed to
|
|
||||||
in writing, shall any Contributor be liable to You for damages, including
|
|
||||||
any direct, indirect, special, incidental, or consequential damages of any
|
|
||||||
character arising as a result of this License or out of the use or inability
|
|
||||||
to use the Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all other
|
|
||||||
commercial damages or losses), even if such Contributor has been advised
|
|
||||||
of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing the
|
|
||||||
Work or Derivative Works thereof, You may choose to offer, and charge a
|
|
||||||
fee for, acceptance of support, warranty, indemnity, or other liability
|
|
||||||
obligations and/or rights consistent with this License. However, in accepting
|
|
||||||
such obligations, You may act only on Your own behalf and on Your sole
|
|
||||||
responsibility, not on behalf of any other Contributor, and only if You
|
|
||||||
agree to indemnify, defend, and hold each Contributor harmless for any
|
|
||||||
liability incurred by, or claims asserted against, such Contributor by
|
|
||||||
reason of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
Loading…
Reference in New Issue
Block a user