Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 44bec2e1 authored by Narayan Kamath's avatar Narayan Kamath Committed by Android (Google) Code Review
Browse files

Merge "Allow data uris to be data sources"

parents 1add6848 6c83e3be
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -16,6 +16,11 @@

#include "include/AMRExtractor.h"
#include "include/AVIExtractor.h"

#if CHROMIUM_AVAILABLE
#include "include/DataUriSource.h"
#endif

#include "include/MP3Extractor.h"
#include "include/MPEG4Extractor.h"
#include "include/WAVExtractor.h"
@@ -136,6 +141,10 @@ sp<DataSource> DataSource::CreateFromURI(
            return NULL;
        }
        source = new NuCachedSource2(httpSource);
# if CHROMIUM_AVAILABLE
    } else if (!strncasecmp("data:", uri, 5)) {
        source = new DataUriSource(uri);
#endif
    } else {
        // Assume it's a filename.
        source = new FileSource(uri);
+3 −2
Original line number Diff line number Diff line
@@ -3,8 +3,9 @@ LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES:=       \
        DataUriSource.cpp \
        ChromiumHTTPDataSource.cpp \
        support.cpp                     \
        support.cpp

LOCAL_C_INCLUDES:= \
        $(JNI_H_INCLUDE) \
+68 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2011 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/DataUriSource.h>

#include <net/base/data_url.h>
#include <googleurl/src/gurl.h>


namespace android {

DataUriSource::DataUriSource(const char *uri) :
    mDataUri(uri),
    mInited(NO_INIT) {

    // Copy1: const char *uri -> String8 mDataUri.
    std::string mimeTypeStr, unusedCharsetStr, dataStr;
    // Copy2: String8 mDataUri -> std::string
    const bool ret = net::DataURL::Parse(
            GURL(std::string(mDataUri.string())),
            &mimeTypeStr, &unusedCharsetStr, &dataStr);
    // Copy3: std::string dataStr -> AString mData
    mData.setTo(dataStr.data(), dataStr.length());
    mInited = ret ? OK : UNKNOWN_ERROR;

    // The chromium data url implementation defaults to using "text/plain"
    // if no mime type is specified. We prefer to leave this unspecified
    // instead, since the mime type is sniffed in most cases.
    if (mimeTypeStr != "text/plain") {
        mMimeType = mimeTypeStr.c_str();
    }
}

ssize_t DataUriSource::readAt(off64_t offset, void *out, size_t size) {
    if (mInited != OK) {
        return mInited;
    }

    const off64_t length = mData.size();
    if (offset >= length) {
        return UNKNOWN_ERROR;
    }

    const char *dataBuf = mData.c_str();
    const size_t bytesToCopy =
            offset + size >= length ? (length - offset) : size;

    if (bytesToCopy > 0) {
        memcpy(out, dataBuf + offset, bytesToCopy);
    }

    return bytesToCopy;
}

}  // namespace android
+76 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2011 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.
 */

#ifndef DATA_URI_SOURCE_H_

#define DATA_URI_SOURCE_H_

#include <stdio.h>

#include <media/stagefright/DataSource.h>
#include <media/stagefright/MediaErrors.h>
#include <media/stagefright/foundation/AString.h>

namespace android {

class DataUriSource : public DataSource {
public:
    DataUriSource(const char *uri);

    virtual status_t initCheck() const {
        return mInited;
    }

    virtual ssize_t readAt(off64_t offset, void *data, size_t size);

    virtual status_t getSize(off64_t *size) {
        if (mInited != OK) {
            return mInited;
        }

        *size = mData.size();
        return OK;
    }

    virtual String8 getUri() {
        return mDataUri;
    }

    virtual String8 getMIMEType() const {
        return mMimeType;
    }

protected:
    virtual ~DataUriSource() {
        // Nothing to delete.
    }

private:
    const String8 mDataUri;

    String8 mMimeType;
    // Use AString because individual bytes may not be valid UTF8 chars.
    AString mData;
    status_t mInited;

    // Disallow copy and assign.
    DataUriSource(const DataUriSource &);
    DataUriSource &operator=(const DataUriSource &);
};

}  // namespace android

#endif  // DATA_URI_SOURCE_H_