17a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé/*
27a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé * Copyright (C) 2012 The Android Open Source Project
37a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé *
47a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé * Licensed under the Apache License, Version 2.0 (the "License");
57a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé * you may not use this file except in compliance with the License.
67a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé * You may obtain a copy of the License at
77a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé *
87a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé *      http://www.apache.org/licenses/LICENSE-2.0
97a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé *
107a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé * Unless required by applicable law or agreed to in writing, software
117a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé * distributed under the License is distributed on an "AS IS" BASIS,
127a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé * See the License for the specific language governing permissions and
147a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé * limitations under the License.
157a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé */
167a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
177a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé//#define LOG_NDEBUG 0
187a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé#define LOG_TAG "SDPLoader"
197a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé#include <utils/Log.h>
207a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
211b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include "include/SDPLoader.h"
227a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
237a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé#include "ASessionDescription.h"
247a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
251b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <media/IMediaHTTPConnection.h>
261b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <media/IMediaHTTPService.h>
271b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <media/stagefright/MediaHTTP.h>
287a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé#include <media/stagefright/foundation/ABuffer.h>
297a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé#include <media/stagefright/foundation/ADebug.h>
30a1df816c0677185534babba6ffc29970b048e52eLajos Molnar#include <media/stagefright/Utils.h>
317a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
327a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé#define DEFAULT_SDP_SIZE 100000
337a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
347a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhénamespace android {
357a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
361b86fe063badb5f28c467ade39be0f4008688947Andreas HuberSDPLoader::SDPLoader(
371b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        const sp<AMessage> &notify,
381b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        uint32_t flags,
3981e68448f3361eaf8618930471fdc3c21bdf5cbcAndreas Huber        const sp<IMediaHTTPService> &httpService)
407a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    : mNotify(notify),
417a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé      mFlags(flags),
427a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé      mNetLooper(new ALooper),
437a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé      mCancelled(false),
441b86fe063badb5f28c467ade39be0f4008688947Andreas Huber      mHTTPDataSource(new MediaHTTP(httpService->makeHTTPConnection())) {
457a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    mNetLooper->setName("sdp net");
467a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    mNetLooper->start(false /* runOnCallingThread */,
477a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé                      false /* canCallJava */,
487a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé                      PRIORITY_HIGHEST);
497a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé}
507a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
517a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhévoid SDPLoader::load(const char *url, const KeyedVector<String8, String8> *headers) {
527a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    mNetLooper->registerHandler(this);
537a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
541d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar    sp<AMessage> msg = new AMessage(kWhatLoad, this);
557a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    msg->setString("url", url);
567a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
577a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    if (headers != NULL) {
587a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        msg->setPointer(
597a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé                "headers",
607a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé                new KeyedVector<String8, String8>(*headers));
617a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    }
627a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
637a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    msg->post();
647a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé}
657a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
667a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhévoid SDPLoader::cancel() {
677a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    mCancelled = true;
687a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    sp<HTTPBase> HTTPDataSource = mHTTPDataSource;
697a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    HTTPDataSource->disconnect();
707a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé}
717a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
727a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhévoid SDPLoader::onMessageReceived(const sp<AMessage> &msg) {
737a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    switch (msg->what()) {
747a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        case kWhatLoad:
757a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé            onLoad(msg);
767a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé            break;
777a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
787a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        default:
797a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé            TRESPASS();
807a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé            break;
817a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    }
827a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé}
837a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
847a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhévoid SDPLoader::onLoad(const sp<AMessage> &msg) {
857a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    status_t err = OK;
867a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    sp<ASessionDescription> desc = NULL;
877a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    AString url;
887a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    CHECK(msg->findString("url", &url));
897a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
907a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    KeyedVector<String8, String8> *headers = NULL;
917a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    msg->findPointer("headers", (void **)&headers);
927a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
93a1df816c0677185534babba6ffc29970b048e52eLajos Molnar    ALOGV("onLoad %s", uriDebugString(url, mFlags & kFlagIncognito).c_str());
947a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
957a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    if (!mCancelled) {
967a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        err = mHTTPDataSource->connect(url.c_str(), headers);
977a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
987a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        if (err != OK) {
997a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé            ALOGE("connect() returned %d", err);
1007a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        }
1017a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    }
1027a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
1037a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    if (headers != NULL) {
1047a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        delete headers;
1057a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        headers = NULL;
1067a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    }
1077a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
108266299cfb628ce2cadccb76443b0566e1a53dbccBernhard Rosenkränzer    off64_t sdpSize = 0;
1097a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    if (err == OK && !mCancelled) {
1107a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        err = mHTTPDataSource->getSize(&sdpSize);
1117a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
1127a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        if (err != OK) {
1137a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé            //We did not get the size of the sdp file, default to a large value
1147a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé            sdpSize = DEFAULT_SDP_SIZE;
1157a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé            err = OK;
1167a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        }
1177a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    }
1187a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
1197a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    sp<ABuffer> buffer = new ABuffer(sdpSize);
1207a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
1217a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    if (err == OK && !mCancelled) {
1227a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        ssize_t readSize = mHTTPDataSource->readAt(0, buffer->data(), sdpSize);
1237a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
1247a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        if (readSize < 0) {
125b4a7a2df4c28c3f32b5d877b54831d2cc5d78f81Colin Cross            ALOGE("Failed to read SDP, error code = %zu", readSize);
1267a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé            err = UNKNOWN_ERROR;
1277a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        } else {
1287a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé            desc = new ASessionDescription;
1297a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
1307a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé            if (desc == NULL || !desc->setTo(buffer->data(), (size_t)readSize)) {
1317a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé                err = UNKNOWN_ERROR;
1327a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé                ALOGE("Failed to parse SDP");
1337a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé            }
1347a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        }
1357a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    }
1367a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
1377a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    mHTTPDataSource.clear();
1387a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
1397a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    sp<AMessage> notify = mNotify->dup();
1407a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    notify->setInt32("what", kWhatSDPLoaded);
1417a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    notify->setInt32("result", err);
1427a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    notify->setObject("description", desc);
1437a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    notify->post();
1447a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé}
1457a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
1467a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé}  // namespace android
147