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> ¬ify, 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é 547a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé sp<AMessage> msg = new AMessage(kWhatLoad, id()); 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é 1087a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé off64_t sdpSize; 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