UserMediaClientImpl.cpp   [plain text]


/*
 * Copyright (C) 2012 Research In Motion Limited. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */

#include "config.h"
#include "UserMediaClientImpl.h"

#if ENABLE(MEDIA_STREAM)
#include "MediaStreamDescriptor.h"
#include "ScriptExecutionContext.h"
#include "SecurityOrigin.h"
#include "WebPage.h"
#include "WebPageClient.h"

#include <BlackBerryPlatformWebMediaStreamDescriptor.h>
#include <BlackBerryPlatformWebUserMediaRequest.h>
#include <wtf/HashMap.h>
#include <wtf/OwnPtr.h>
#include <wtf/PassOwnPtr.h>
#include <wtf/RefPtr.h>
#include <wtf/text/CString.h>

using namespace BlackBerry::Platform;

namespace WebCore {

class WebUserMediaRequestClientImpl;

typedef HashMap<UserMediaRequest*, OwnPtr<WebUserMediaRequestClientImpl> > UserMediaRequestsMap;

static UserMediaRequestsMap& userMediaRequestsMap()
{
    DEFINE_STATIC_LOCAL(UserMediaRequestsMap, requests, ());
    return requests;
}

static PassRefPtr<MediaStreamSource> toMediaStreamSource(const WebMediaStreamSource& src)
{
    return MediaStreamSource::create(WTF::String::fromUTF8(src.id().c_str()), static_cast<MediaStreamSource::Type>(src.type()), WTF::String::fromUTF8(src.name().c_str()));
}

static PassRefPtr<MediaStreamDescriptor> toMediaStreamDescriptor(const WebMediaStreamDescriptor& d)
{
    MediaStreamSourceVector audioSources;
    for (size_t i = 0; i < d.audios().size(); i++) {
        RefPtr<MediaStreamSource> src = toMediaStreamSource(d.audios()[i]);
        audioSources.append(src.release());
    }

    MediaStreamSourceVector videoSources;
    for (size_t i = 0; i < d.videos().size(); i++) {
        RefPtr<MediaStreamSource> src = toMediaStreamSource(d.videos()[i]);
        videoSources.append(src.release());
    }

    return MediaStreamDescriptor::create(WTF::String::fromUTF8(d.label().c_str()), audioSources, videoSources);
}

class WebUserMediaRequestClientImpl : public WebUserMediaRequestClient {
public:
    WebUserMediaRequestClientImpl(PassRefPtr<UserMediaRequest> prpRequest)
        : m_request(prpRequest)
    {
    }

    void requestSucceeded(const WebMediaStreamDescriptor& d)
    {
        if (m_request) {
            RefPtr<MediaStreamDescriptor> descriptor = toMediaStreamDescriptor(d);
            m_request->succeed(descriptor);

            userMediaRequestsMap().remove(m_request.get());
        }
    }

    void requestFailed()
    {
        if (m_request) {
            m_request->fail();
            userMediaRequestsMap().remove(m_request.get());
        }
    }

private:
    RefPtr<UserMediaRequest> m_request;
};

UserMediaClientImpl::UserMediaClientImpl(BlackBerry::WebKit::WebPage* page)
    : m_page(page)
{
}

UserMediaClientImpl::~UserMediaClientImpl()
{
}

void UserMediaClientImpl::pageDestroyed()
{
    delete this;
}

void UserMediaClientImpl::requestUserMedia(PassRefPtr<UserMediaRequest> prpRequest, const MediaStreamSourceVector&, const MediaStreamSourceVector&)
{
    UserMediaRequest* request = prpRequest.get();
    OwnPtr<WebUserMediaRequestClientImpl> requestClient = adoptPtr(new WebUserMediaRequestClientImpl(prpRequest));

    SecurityOrigin* origin = request->scriptExecutionContext()->securityOrigin();
    m_page->client()->requestUserMedia(WebUserMediaRequest(request->audio(), request->video(), origin->toString(), requestClient.get()));
    userMediaRequestsMap().add(request, requestClient.release());
}

void UserMediaClientImpl::cancelUserMediaRequest(UserMediaRequest* request)
{
    UserMediaRequestsMap::iterator it = userMediaRequestsMap().find(request);
    if (it == userMediaRequestsMap().end())
        return;

    SecurityOrigin* origin = request->scriptExecutionContext()->securityOrigin();
    m_page->client()->cancelUserMediaRequest(WebUserMediaRequest(request->audio(), request->video(), origin->toString(), it->value.get()));
    userMediaRequestsMap().remove(it);
}

}
#endif