// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/extensions/api/rtc_private/rtc_private_api.h" #include "base/json/json_writer.h" #include "base/message_loop.h" #include "base/stringprintf.h" #include "base/time.h" #include "base/utf_string_conversions.h" #include "base/value_conversions.h" #include "base/values.h" #include "chrome/browser/chromeos/contacts/contact.pb.h" #include "chrome/browser/extensions/event_router.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/extensions/state_store.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/chrome_notification_types.h" #include "chrome/common/extensions/api/rtc_private.h" #include "content/public/browser/notification_service.h" using base::DictionaryValue; using base::ListValue; using base::Value; using contacts::Contact; using contacts::Contact_EmailAddress; using contacts::Contact_PhoneNumber; namespace extensions { namespace { // Launch event name. const char kOnLaunchEvent[] = "rtcPrivate.onLaunch"; // Web intent data payload mimetype. const char kMimeTypeJson[] = "application/vnd.chromium.contact"; // Web intent actions. const char kActivateAction[] = "activate"; const char kChatAction[] = "chat"; const char kVoiceAction[] = "voice"; const char kVideoAction[] = "video"; // Web intent data structure fields. const char kNameIntentField[] = "name"; const char kPhoneIntentField[] = "phone"; const char kEmailIntentField[] = "email"; // Returns the ActionType of intent action. api::rtc_private::ActionType GetLaunchAction( RtcPrivateEventRouter::LaunchAction action) { switch (action) { case RtcPrivateEventRouter::LAUNCH_ACTIVATE: return api::rtc_private::RTC_PRIVATE_ACTION_TYPE_NONE; case RtcPrivateEventRouter::LAUNCH_CHAT: return api::rtc_private::RTC_PRIVATE_ACTION_TYPE_CHAT; case RtcPrivateEventRouter::LAUNCH_VOICE: return api::rtc_private::RTC_PRIVATE_ACTION_TYPE_VOICE; case RtcPrivateEventRouter::LAUNCH_VIDEO: return api::rtc_private::RTC_PRIVATE_ACTION_TYPE_VIDEO; } return api::rtc_private::RTC_PRIVATE_ACTION_TYPE_NONE; } // Creates JSON payload string for contact web intent data. void GetContactIntentData(const Contact& contact, DictionaryValue* dict) { // TODO(derat): This might require more name extraction magic than this. dict->SetString(kNameIntentField, contact.full_name()); ListValue* phone_list = new base::ListValue(); dict->Set(kPhoneIntentField, phone_list); for (int i = 0; i < contact.phone_numbers_size(); i++) { const Contact_PhoneNumber& phone_number = contact.phone_numbers(i); StringValue* value = Value::CreateStringValue(phone_number.number()); if (phone_number.primary()) CHECK(phone_list->Insert(0, value)); else phone_list->Append(value); } ListValue* email_list = new base::ListValue(); dict->Set(kEmailIntentField, email_list); for (int i = 0; i < contact.email_addresses_size(); i++) { const Contact_EmailAddress& email_address = contact.email_addresses(i); StringValue* value = Value::CreateStringValue(email_address.address()); if (email_address.primary()) CHECK(email_list->Insert(0, value)); else email_list->Append(value); } } } // namespace void RtcPrivateEventRouter::DispatchLaunchEvent( Profile* profile, LaunchAction action, const Contact* contact) { if (action == RtcPrivateEventRouter::LAUNCH_ACTIVATE) { extensions::ExtensionSystem::Get(profile)->event_router()-> DispatchEventToRenderers( kOnLaunchEvent, scoped_ptr<ListValue>(new ListValue()), profile, GURL()); } else { DCHECK(contact); extensions::api::rtc_private::LaunchData launch_data; launch_data.intent.action = GetLaunchAction(action); GetContactIntentData(*contact, &launch_data.intent.data.additional_properties); launch_data.intent.type = kMimeTypeJson; extensions::ExtensionSystem::Get(profile)->event_router()-> DispatchEventToRenderers( kOnLaunchEvent, extensions::api::rtc_private::OnLaunch::Create(launch_data), profile, GURL()); } } } // namespace extensions