| // Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file | 
 | // for details. All rights reserved. Use of this source code is governed by a | 
 | // BSD-style license that can be found in the LICENSE file. | 
 |  | 
 | #ifndef RUNTIME_BIN_NAMESPACE_H_ | 
 | #define RUNTIME_BIN_NAMESPACE_H_ | 
 |  | 
 | #include "bin/builtin.h" | 
 | #include "bin/dartutils.h" | 
 | #include "bin/reference_counting.h" | 
 | #include "platform/syslog.h" | 
 |  | 
 | namespace dart { | 
 | namespace bin { | 
 |  | 
 | class NamespaceImpl; | 
 |  | 
 | class Namespace : public ReferenceCounted<Namespace> { | 
 |  public: | 
 |   // Assumes namespc is a value that can be directly used as namespc_. | 
 |   static Namespace* Create(intptr_t namespc); | 
 |  | 
 |   // Uses path to compute a value that can be used as namespc_. | 
 |   static Namespace* Create(const char* path); | 
 |  | 
 |   // Gives a safe default value for namespc_ for the standalone Dart VM. | 
 |   static intptr_t Default(); | 
 |  | 
 |   // Tells whether the given namespace is the default namespace. | 
 |   static bool IsDefault(Namespace* namespc); | 
 |  | 
 |   // Returns the native namespace wrapper if the argument at the supplied index | 
 |   // is a _NamespaceImpl object. If it is not, calls Dart_PropagateError(). | 
 |   static Namespace* GetNamespace(Dart_NativeArguments args, intptr_t index); | 
 |  | 
 |   // Get and set the current working directory through the namespace if there | 
 |   // is one. | 
 |   static const char* GetCurrent(Namespace* namespc); | 
 |   static bool SetCurrent(Namespace* namespc, const char* path); | 
 |  | 
 |   NamespaceImpl* namespc() const { return namespc_; } | 
 |  | 
 |  private: | 
 |   // When namespc_ has this value, it indicates that there is currently | 
 |   // no namespace for resolving absolute paths. | 
 |   static constexpr intptr_t kNone = 0; | 
 |  | 
 |   explicit Namespace(NamespaceImpl* namespc) | 
 |       : ReferenceCounted(), namespc_(namespc) {} | 
 |  | 
 |   ~Namespace(); | 
 |  | 
 |   // When the native argument at |index| is a _NamespaceImpl object, | 
 |   // write the valueof its native field into |namespc|. | 
 |   static Dart_Handle GetNativeNamespaceArgument(Dart_NativeArguments args, | 
 |                                                 intptr_t index, | 
 |                                                 Namespace** namespc); | 
 |  | 
 |   // Given a namespace and a path, computes the information needed to access the | 
 |   // path relative to the namespace. This can include massaging the path and | 
 |   // returning a platform specific value in dirfd that together are used to | 
 |   // access the path. | 
 |   static void ResolvePath(Namespace* namespc, | 
 |                           const char* path, | 
 |                           intptr_t* dirfd, | 
 |                           const char** resolved_path); | 
 |  | 
 |   NamespaceImpl* namespc_; | 
 |   // TODO(zra): When Isolate-specific cwds are added, we'll need some more | 
 |   // fields here to track them. | 
 |  | 
 |   friend class NamespaceScope; | 
 |   friend class ReferenceCounted<Namespace>; | 
 |   DISALLOW_COPY_AND_ASSIGN(Namespace); | 
 | }; | 
 |  | 
 | class NamespaceScope { | 
 |  public: | 
 |   NamespaceScope(Namespace* namespc, const char* path); | 
 |   ~NamespaceScope(); | 
 |  | 
 |   intptr_t fd() const { return fd_; } | 
 |   const char* path() const { return path_; } | 
 |  | 
 |  private: | 
 |   intptr_t fd_; | 
 |   const char* path_; | 
 |  | 
 |   DISALLOW_ALLOCATION(); | 
 |   DISALLOW_COPY_AND_ASSIGN(NamespaceScope); | 
 | }; | 
 |  | 
 | }  // namespace bin | 
 | }  // namespace dart | 
 |  | 
 | #endif  // RUNTIME_BIN_NAMESPACE_H_ |