SDPLoader.cpp revision 7a33b7740412accf6a1cc912686c8d0acfb2a883
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é
217a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé#include "SDPLoader.h"
227a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
237a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé#include "ASessionDescription.h"
247a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé#include "HTTPBase.h"
257a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
267a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé#include <media/stagefright/foundation/ABuffer.h>
277a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé#include <media/stagefright/foundation/ADebug.h>
287a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
297a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé#define DEFAULT_SDP_SIZE 100000
307a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
317a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhénamespace android {
327a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
337a33b7740412accf6a1cc912686c8d0acfb2a883Oscar RydhéSDPLoader::SDPLoader(const sp<AMessage> &notify, uint32_t flags, bool uidValid, uid_t uid)
347a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    : mNotify(notify),
357a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé      mFlags(flags),
367a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé      mUIDValid(uidValid),
377a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé      mUID(uid),
387a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé      mNetLooper(new ALooper),
397a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé      mCancelled(false),
407a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé      mHTTPDataSource(
417a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé              HTTPBase::Create(
427a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé                  (mFlags & kFlagIncognito)
437a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé                    ? HTTPBase::kFlagIncognito
447a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé                    : 0)) {
457a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    if (mUIDValid) {
467a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        mHTTPDataSource->setUID(mUID);
477a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    }
487a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
497a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    mNetLooper->setName("sdp net");
507a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    mNetLooper->start(false /* runOnCallingThread */,
517a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé                      false /* canCallJava */,
527a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé                      PRIORITY_HIGHEST);
537a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé}
547a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
557a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhévoid SDPLoader::load(const char *url, const KeyedVector<String8, String8> *headers) {
567a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    mNetLooper->registerHandler(this);
577a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
587a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    sp<AMessage> msg = new AMessage(kWhatLoad, id());
597a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    msg->setString("url", url);
607a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
617a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    if (headers != NULL) {
627a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        msg->setPointer(
637a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé                "headers",
647a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé                new KeyedVector<String8, String8>(*headers));
657a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    }
667a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
677a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    msg->post();
687a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé}
697a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
707a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhévoid SDPLoader::cancel() {
717a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    mCancelled = true;
727a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    sp<HTTPBase> HTTPDataSource = mHTTPDataSource;
737a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    HTTPDataSource->disconnect();
747a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé}
757a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
767a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhévoid SDPLoader::onMessageReceived(const sp<AMessage> &msg) {
777a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    switch (msg->what()) {
787a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        case kWhatLoad:
797a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé            onLoad(msg);
807a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé            break;
817a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
827a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        default:
837a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé            TRESPASS();
847a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé            break;
857a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    }
867a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé}
877a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
887a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhévoid SDPLoader::onLoad(const sp<AMessage> &msg) {
897a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    status_t err = OK;
907a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    sp<ASessionDescription> desc = NULL;
917a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    AString url;
927a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    CHECK(msg->findString("url", &url));
937a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
947a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    KeyedVector<String8, String8> *headers = NULL;
957a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    msg->findPointer("headers", (void **)&headers);
967a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
977a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    if (!(mFlags & kFlagIncognito)) {
987a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        ALOGI("onLoad '%s'", url.c_str());
997a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    } else {
1007a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        ALOGI("onLoad <URL suppressed>");
1017a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    }
1027a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
1037a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    if (!mCancelled) {
1047a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        err = mHTTPDataSource->connect(url.c_str(), headers);
1057a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
1067a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        if (err != OK) {
1077a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé            ALOGE("connect() returned %d", err);
1087a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        }
1097a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    }
1107a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
1117a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    if (headers != NULL) {
1127a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        delete headers;
1137a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        headers = NULL;
1147a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    }
1157a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
1167a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    off64_t sdpSize;
1177a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    if (err == OK && !mCancelled) {
1187a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        err = mHTTPDataSource->getSize(&sdpSize);
1197a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
1207a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        if (err != OK) {
1217a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé            //We did not get the size of the sdp file, default to a large value
1227a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé            sdpSize = DEFAULT_SDP_SIZE;
1237a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé            err = OK;
1247a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        }
1257a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    }
1267a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
1277a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    sp<ABuffer> buffer = new ABuffer(sdpSize);
1287a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
1297a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    if (err == OK && !mCancelled) {
1307a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        ssize_t readSize = mHTTPDataSource->readAt(0, buffer->data(), sdpSize);
1317a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
1327a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        if (readSize < 0) {
1337a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé            ALOGE("Failed to read SDP, error code = %ld", readSize);
1347a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé            err = UNKNOWN_ERROR;
1357a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        } else {
1367a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé            desc = new ASessionDescription;
1377a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
1387a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé            if (desc == NULL || !desc->setTo(buffer->data(), (size_t)readSize)) {
1397a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé                err = UNKNOWN_ERROR;
1407a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé                ALOGE("Failed to parse SDP");
1417a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé            }
1427a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé        }
1437a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    }
1447a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
1457a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    mHTTPDataSource.clear();
1467a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
1477a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    sp<AMessage> notify = mNotify->dup();
1487a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    notify->setInt32("what", kWhatSDPLoaded);
1497a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    notify->setInt32("result", err);
1507a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    notify->setObject("description", desc);
1517a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    notify->post();
1527a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé}
1537a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
1547a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé}  // namespace android
155