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