[macruby-changes] [469] MacRuby/trunk/lib/hotcocoa

source_changes at macosforge.org source_changes at macosforge.org
Thu Aug 21 23:00:58 PDT 2008


Revision: 469
          http://trac.macosforge.org/projects/ruby/changeset/469
Author:   rich at infoether.com
Date:     2008-08-21 23:00:58 -0700 (Thu, 21 Aug 2008)
Log Message:
-----------
add vfs support, will support after 0.3

Modified Paths:
--------------
    MacRuby/trunk/lib/hotcocoa/application_builder.rb

Added Paths:
-----------
    MacRuby/trunk/lib/hotcocoa/virtual_file_system.rb

Modified: MacRuby/trunk/lib/hotcocoa/application_builder.rb
===================================================================
--- MacRuby/trunk/lib/hotcocoa/application_builder.rb	2008-08-22 05:23:29 UTC (rev 468)
+++ MacRuby/trunk/lib/hotcocoa/application_builder.rb	2008-08-22 06:00:58 UTC (rev 469)
@@ -6,7 +6,7 @@
     
     ApplicationBundlePackage = "APPL????"
     
-    attr_accessor :name, :load_file, :sources, :overwrite, :icon, :version, :info_string
+    attr_accessor :name, :load_file, :sources, :overwrite, :icon, :version, :info_string, :secure
     
     def self.build(build_options)
       build_options.each do |key, value|
@@ -17,6 +17,7 @@
         build_options = YAML.load(File.read(build_options[:file]))
       end
       ab = new
+      ab.secure = (build_options[:secure] == true)
       ab.name = build_options[:name]
       ab.load_file = build_options[:load]
       ab.icon = build_options[:icon] if build_options[:icon] && File.exist?(build_options[:icon])
@@ -52,6 +53,10 @@
       end
     end
     
+    def secure?
+      secure
+    end
+    
     private
     
       def check_for_bundle_root
@@ -79,11 +84,22 @@
       end
       
       def copy_sources
-        FileUtils.cp_r load_file, resources_root unless sources.include?(load_file)
-        sources.each do |source|
-          destination = File.join(resources_root, source)
-          FileUtils.mkdir_p(File.dirname(destination)) unless File.exist?(File.dirname(destination))
-          FileUtils.cp_r source, destination
+        if secure?
+          data = {}
+          data["/"+load_file] = File.open(load_file, "r") {|f| f.read}
+          sources.each do |source|
+            data["/"+source] = File.open(source, "r") {|f| f.read}
+          end
+          File.open(File.join(resources_root, "vfs.db"), "wb") do |db|
+            db.write Marshal.dump(data)
+          end
+        else
+          FileUtils.cp_r load_file, resources_root unless sources.include?(load_file)
+          sources.each do |source|
+            destination = File.join(resources_root, source)
+            FileUtils.mkdir_p(File.dirname(destination)) unless File.exist?(File.dirname(destination))
+            FileUtils.cp_r source, destination
+          end
         end
       end
       
@@ -146,10 +162,15 @@
       
       def write_ruby_main
         File.open(main_ruby_source_file, "wb") do |f|
-          f.puts %{
-            $:.unshift NSBundle.mainBundle.resourcePath.fileSystemRepresentation
-            load '#{load_file}'
-          }
+          if secure?
+            require 'hotcocoa/virtual_file_system'
+            f.puts VirtualFileSystem.code_to_load(load_file)
+          else
+            f.puts %{
+              $:.unshift NSBundle.mainBundle.resourcePath.fileSystemRepresentation
+              load '#{load_file}'
+            }
+          end
         end
       end
       

Added: MacRuby/trunk/lib/hotcocoa/virtual_file_system.rb
===================================================================
--- MacRuby/trunk/lib/hotcocoa/virtual_file_system.rb	                        (rev 0)
+++ MacRuby/trunk/lib/hotcocoa/virtual_file_system.rb	2008-08-22 06:00:58 UTC (rev 469)
@@ -0,0 +1,172 @@
+class VirtualFileSystem
+  
+  def self.code_to_load(main_file, password = "\320\302\354\024\215\360P\235\2244\261\214\276:'\274%\270<\350t\212\003\340\t'\004\345\334\256\315\277")
+    <<-VFS
+    module DatabaseRuntime
+
+      class VirtualFilesystem
+
+        attr_reader :password, :encryption_method
+
+        def initialize(password, encryption_method="aes256")
+          @password = password
+          @encryption_method = encryption_method
+        end
+
+        def open_database(main_database)
+          @main_database = main_database
+          begin
+            @db = Marshal.load(File.open(main_database, "rb") {|f| f.read})
+          rescue 
+            puts $!
+            puts $!.backtrace.join("\\n")
+          end
+        end
+
+        def read_file_and_key(filename)
+          data, key = read_file_using_path(filename)
+          if data.nil? && filename[0,1] != "/"
+            $:.each do |loadpath|
+              data, key = read_file_using_path(filename, expand_path(loadpath))
+              break if data
+            end
+          end
+          [data, key]
+        end
+
+        def read_file_using_path(filename, pathname="/")
+          path = expand_path(File.join(pathname, filename))
+          rb_ext = false
+          if has_key?(path)
+            key = filename
+          elsif self.has_key?(path+".rb")
+            key = filename+".rb"
+            rb_ext = true
+          end
+          if key
+            result = rb_ext ? self[path+".rb"] : self[path]
+            if result
+              result.gsub!(/__FILE__/, "'\#{path + (rb_ext ? ".rb" : '')}'")
+              return result, key
+            end
+          end
+          nil
+        end
+
+        def has_key?(key)
+          @db.has_key?(key)
+        end
+
+        def delete(key)
+        end
+
+        def [](key)
+          read(@db, key)
+        end
+
+        def close
+        end
+
+        def keys
+          @db.keys
+        end
+
+        def []=(key, value)
+        end
+
+        def normalize(filename)
+          f = filename.split(File::Separator)
+          f.delete(".")
+          while f.include?("..")
+            f[f.index("..")-1,2] = []
+          end
+          f.join(File::Separator)
+        end
+
+        private 
+
+          def expand_path(filename, dirstring=nil)
+            filename = File.join(dirstring, filename) if dirstring
+            f = filename.split(File::Separator)
+            f.delete(".")
+            f.delete("")
+            while f.include?("..")
+              f[f.index("..")-1,2] = []
+            end
+            "/"+f.join(File::Separator)
+          end
+
+
+          def read(db, key)
+            if db.has_key?(key)
+              #decrypt = OpenSSL::Cipher::Cipher.new(encryption_method)
+              #decrypt.decrypt
+              #decrypt.key = password
+              #data = decrypt.update(db[key])
+              #data << decrypt.final
+              #::Zlib::Inflate.inflate(data)
+              db[key]
+            else
+              nil
+            end
+          end
+
+      end
+
+    end
+
+    $ROOT_BINDING = binding
+
+    module Kernel
+
+      def virtual_filesystems(options)
+        vfs = DatabaseRuntime::VirtualFilesystem.new(options["password"])
+        vfs.open_database(options["database"])
+        Kernel.const_set("VIRTUAL_FILESYSTEM", vfs)
+        vfs
+      end
+
+      alias_method :original_require, :require
+
+      def require(path)
+        path = VIRTUAL_FILESYSTEM.normalize(path)
+        path_loaded =  $".include?(path) || $".include?(path+".rb") || $".include?(path+".so")
+        unless path_loaded
+          data, key = VIRTUAL_FILESYSTEM.read_file_and_key(path)
+          if data
+            $" << key
+            eval(data, $ROOT_BINDING, key, 0)
+            return true
+          else
+            original_require(path)
+          end
+        else
+          return false
+        end
+      end
+
+      alias_method :original_load, :load
+
+      def load(path)
+        path = VIRTUAL_FILESYSTEM.normalize(path)
+        data, key = VIRTUAL_FILESYSTEM.read_file_and_key(path)
+        if data
+          eval(data, $ROOT_BINDING, key, 0)
+          return true
+        else
+          begin
+            original_load(path)
+          rescue LoadError => e
+            raise e
+          end
+        end
+      end
+
+    end
+
+    virtual_filesystems("database"=>File.join(NSBundle.mainBundle.resourcePath.fileSystemRepresentation, 'vfs.db'), "password"=>#{password.inspect})
+    $:.unshift "/lib"
+    load '#{main_file}'
+    VFS
+  end
+end
\ No newline at end of file
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macruby-changes/attachments/20080821/f2b20931/attachment.html 


More information about the macruby-changes mailing list