15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file. 45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <stdio.h> 65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/public/cpp/application/application_delegate.h" 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/public/cpp/application/application_impl.h" 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/public/cpp/application/interface_factory_impl.h" 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/services/public/interfaces/content_handler/content_handler.mojom.h" 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace mojo { 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace examples { 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class ContentHandlerApp; 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class ContentHandlerImpl : public InterfaceImpl<ContentHandler> { 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public: 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) explicit ContentHandlerImpl(ContentHandlerApp* content_handler_app) 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : content_handler_app_(content_handler_app) { 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual ~ContentHandlerImpl() {} 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private: 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void OnConnect(const mojo::String& url, 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci URLResponsePtr response, 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InterfaceRequest<ServiceProvider> service_provider) 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MOJO_OVERRIDE; 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ContentHandlerApp* content_handler_app_; 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class ContentHandlerApp : public ApplicationDelegate { 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public: 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ContentHandlerApp() : content_handler_factory_(this) { 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void Initialize(ApplicationImpl* app) MOJO_OVERRIDE { 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual bool ConfigureIncomingConnection(ApplicationConnection* connection) 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MOJO_OVERRIDE { 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) connection->AddService(&content_handler_factory_); 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return true; 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void PrintResponse(ScopedDataPipeConsumerHandle body) const { 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for (;;) { 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) char buf[512]; 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) uint32_t num_bytes = sizeof(buf); 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MojoResult result = ReadDataRaw(body.get(), buf, &num_bytes, 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MOJO_READ_DATA_FLAG_NONE); 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (result == MOJO_RESULT_SHOULD_WAIT) { 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Wait(body.get(), 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MOJO_HANDLE_SIGNAL_READABLE, 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MOJO_DEADLINE_INDEFINITE); 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } else if (result == MOJO_RESULT_OK) { 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (fwrite(buf, num_bytes, 1, stdout) != 1) { 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) printf("\nUnexpected error writing to file\n"); 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) break; 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } else { 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) break; 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) printf("\n>>> EOF <<<\n"); 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private: 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) InterfaceFactoryImplWithContext<ContentHandlerImpl, 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ContentHandlerApp> content_handler_factory_; 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ContentHandlerImpl::OnConnect( 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const mojo::String& url, 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci URLResponsePtr response, 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InterfaceRequest<ServiceProvider> service_provider) { 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) printf("ContentHandler::OnConnect - url:%s - body follows\n\n", 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) url.To<std::string>().c_str()); 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content_handler_app_->PrintResponse(response->body.Pass()); 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace examples 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// static 875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)ApplicationDelegate* ApplicationDelegate::Create() { 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return new examples::ContentHandlerApp(); 895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace mojo 92