// Copyright 2014 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.

#ifndef SERVICES_DART_DART_APP_H_
#define SERVICES_DART_DART_APP_H_

#include "base/files/scoped_temp_dir.h"
#include "mojo/application/content_handler_factory.h"
#include "mojo/dart/embedder/dart_controller.h"
#include "mojo/public/cpp/system/message_pipe.h"
#include "mojo/public/interfaces/application/application.mojom.h"
#include "mojo/public/interfaces/application/shell.mojom.h"

namespace dart {

class DartApp;
class ApplicationDelegateImpl;

// Each Dart app started by content handler runs on its own thread and
// in its own Dart isolate. This class represents one running Dart app.

class DartApp : public mojo::ContentHandlerFactory::HandledApplicationHolder {
 public:
  DartApp(mojo::InterfaceRequest<mojo::Application> application_request,
          mojo::URLResponsePtr response);
  virtual ~DartApp();

 private:
  void OnAppLoaded();

  // Extracts the target application into a temporary directory. This directory
  // is deleted at the end of the life of the DartContentHandler object.
  void ExtractApplication(mojo::URLResponsePtr response);

  // Reads all the data out of a pipe into a string.
  std::string CopyToString(mojo::ScopedDataPipeConsumerHandle body);

  mojo::InterfaceRequest<mojo::Application> application_request_;
  mojo::dart::DartControllerConfig config_;

  // A reference to our unpacked application. This directory gets cleaned up
  // once we go out of scope.
  base::ScopedTempDir unpacked_app_directory_;

  DISALLOW_COPY_AND_ASSIGN(DartApp);
};

}  // namespace dart

#endif  // SERVICES_DART_DART_APP_H_
