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> ¬ify, 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