Browse Source

Add JavaScript bindings of asar::Archive.

Cheng Zhao 10 years ago
parent
commit
0d09143a77
5 changed files with 68 additions and 1 deletions
  1. 1 0
      atom.gyp
  2. 64 0
      atom/common/api/atom_api_asar.cc
  3. 1 0
      atom/common/asar/archive.h
  4. 1 0
      atom/common/node_bindings.cc
  5. 1 1
      vendor/native_mate

+ 1 - 0
atom.gyp

@@ -178,6 +178,7 @@
       'atom/browser/window_list.h',
       'atom/browser/window_list_observer.h',
       'atom/common/api/api_messages.h',
+      'atom/common/api/atom_api_asar.cc',
       'atom/common/api/atom_api_clipboard.cc',
       'atom/common/api/atom_api_crash_reporter.cc',
       'atom/common/api/atom_api_id_weak_map.cc',

+ 64 - 0
atom/common/api/atom_api_asar.cc

@@ -0,0 +1,64 @@
+// Copyright (c) 2014 GitHub, Inc. All rights reserved.
+// Use of this source code is governed by the MIT license that can be
+// found in the LICENSE file.
+
+#include "atom/common/asar/archive.h"
+#include "atom/common/asar/archive_factory.h"
+#include "atom/common/native_mate_converters/file_path_converter.h"
+#include "native_mate/arguments.h"
+#include "native_mate/dictionary.h"
+#include "native_mate/object_template_builder.h"
+#include "native_mate/wrappable.h"
+
+#include "atom/common/node_includes.h"
+
+namespace {
+
+class Archive : public mate::Wrappable {
+ public:
+  static v8::Handle<v8::Value> Create(mate::Arguments* args,
+                                      const base::FilePath& path) {
+    static asar::ArchiveFactory archive_factory;
+    scoped_refptr<asar::Archive> archive = archive_factory.GetOrCreate(path);
+    if (!archive)
+      return args->ThrowError("Invalid asar archive");
+    return (new Archive(archive))->GetWrapper(args->isolate());
+  }
+
+ protected:
+  explicit Archive(scoped_refptr<asar::Archive> archive) : archive_(archive) {}
+  virtual ~Archive() {}
+
+  v8::Handle<v8::Value> GetFileInfo(mate::Arguments* args,
+                                    const base::FilePath& path) {
+    asar::Archive::FileInfo info;
+    if (!archive_->GetFileInfo(path, &info))
+      return args->ThrowError("Can not find file");
+    mate::Dictionary dict(args->isolate(), v8::Object::New(args->isolate()));
+    dict.Set("size", info.size);
+    dict.Set("offset", info.offset);
+    return dict.GetHandle();
+  }
+
+  // mate::Wrappable:
+  mate::ObjectTemplateBuilder GetObjectTemplateBuilder(v8::Isolate* isolate) {
+    return mate::ObjectTemplateBuilder(isolate)
+        .SetValue("path", archive_->path())
+        .SetMethod("getFileInfo", &Archive::GetFileInfo);
+  }
+
+ private:
+  scoped_refptr<asar::Archive> archive_;
+
+  DISALLOW_COPY_AND_ASSIGN(Archive);
+};
+
+void Initialize(v8::Handle<v8::Object> exports, v8::Handle<v8::Value> unused,
+                v8::Handle<v8::Context> context, void* priv) {
+  mate::Dictionary dict(context->GetIsolate(), exports);
+  dict.SetMethod("createArchive", &Archive::Create);
+}
+
+}  // namespace
+
+NODE_MODULE_CONTEXT_AWARE_BUILTIN(atom_common_asar, Initialize)

+ 1 - 0
atom/common/asar/archive.h

@@ -31,6 +31,7 @@ class Archive : public base::RefCounted<Archive> {
   bool GetFileInfo(const base::FilePath& path, FileInfo* info);
 
   base::FilePath path() const { return path_; }
+  base::DictionaryValue* header() const { return header_.get(); }
 
  private:
   friend class base::RefCounted<Archive>;

+ 1 - 0
atom/common/node_bindings.cc

@@ -69,6 +69,7 @@ REFERENCE_MODULE(atom_browser_protocol);
 REFERENCE_MODULE(atom_browser_global_shortcut);
 REFERENCE_MODULE(atom_browser_tray);
 REFERENCE_MODULE(atom_browser_window);
+REFERENCE_MODULE(atom_common_asar);
 REFERENCE_MODULE(atom_common_clipboard);
 REFERENCE_MODULE(atom_common_crash_reporter);
 REFERENCE_MODULE(atom_common_id_weak_map);

+ 1 - 1
vendor/native_mate

@@ -1 +1 @@
-Subproject commit 12f4e9b7ea0038e58e52839142eff0a4d17069bf
+Subproject commit c5b39126ee7388acc61a25ac6b5fefb7a2cd6262