From be070af32efe92f12612750cc55831b7320f38d2 Mon Sep 17 00:00:00 2001 From: brainfucker Date: Wed, 20 Jan 2010 20:17:13 +0300 Subject: [PATCH] add async callback to md5_file function --- .lock-wscript | 2 +- README.md | 4 ++-- build/.wafpickle-7 | Bin 2261 -> 2283 bytes build/config.log | 2 +- build/default/hashlib.node | Bin 118418 -> 129856 bytes build/default/hashlib_2.o | Bin 81664 -> 97912 bytes hashlib.cc | 25 +++++++++++++++++++++++-- makefile | 4 +++- md5.js | 5 +++++ test.file | 2 ++ test.js | 15 +++++++++++++++ 11 files changed, 52 insertions(+), 7 deletions(-) create mode 100644 md5.js create mode 100644 test.file diff --git a/.lock-wscript b/.lock-wscript index d7baf71..82f3933 100644 --- a/.lock-wscript +++ b/.lock-wscript @@ -2,7 +2,7 @@ argv = ['/usr/local/bin/node-waf', 'configure', 'build'] blddir = '/home/brainfucker/Projects/hashlib/build' commands = {'dist': 0, 'configure': True, 'distcheck': 0, 'install': 0, 'build': True, 'clean': 0, 'distclean': 0, 'check': 0, 'uninstall': 0} cwd = '/home/brainfucker/Projects/hashlib' -environ = {'GDM_KEYBOARD_LAYOUT': 'us', 'GNOME_DESKTOP_SESSION_ID': 'this-is-deprecated', 'LESSOPEN': '| /usr/bin/lesspipe %s', 'LOGNAME': 'brainfucker', 'USER': 'brainfucker', 'PATH': '/var/lib/gems/1.8/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/brainfucker/Dropbox/Bin', 'HOME': '/home/brainfucker', 'DISPLAY': ':0.0', 'SSH_AGENT_PID': '1998', 'LANG': 'en_US.UTF-8', 'SPEECHD_PORT': '7560', 'TERM': 'xterm', 'SHELL': '/bin/bash', 'XDG_SESSION_COOKIE': '8143f1ef8b2173edae5c4ea34aed6323-1263635224.732645-323512337', 'SESSION_MANAGER': 'local/brainfucker-laptop:@/tmp/.ICE-unix/1576,unix/brainfucker-laptop:/tmp/.ICE-unix/1576', 'SHLVL': '1', '_': '/usr/local/bin/node-waf', 'DESKTOP_AUTOSTART_ID': '10ab6ac4f4a0b815a9126363523039719900000015760000', 'USERNAME': 'brainfucker', 'SSH_AUTH_SOCK': '/tmp/keyring-XIzwzg/socket.ssh', 'GNOME_KEYRING_SOCKET': '/tmp/keyring-XIzwzg/socket', 'GDMSESSION': 'gnome', 'DBUS_SESSION_BUS_ADDRESS': 'unix:abstract=/tmp/dbus-j1hwFNQETS,guid=08713bc948d5417b745764a04b518b1a', 'ORBIT_SOCKETDIR': '/tmp/orbit-brainfucker', 'XAUTHORITY': '/var/run/gdm/auth-for-brainfucker-woi8gU/database', 'DESKTOP_SESSION': 'gnome', 'LESSCLOSE': '/usr/bin/lesspipe %s %s', 'GTK_MODULES': 'canberra-gtk-module', 'OLDPWD': '/home/brainfucker/Projects', 'GDM_LANG': 'en_US.UTF-8', 'HISTCONTROL': 'ignoreboth', 'XDG_DATA_DIRS': '/usr/share/gnome:/usr/local/share/:/usr/share/', 'PWD': '/home/brainfucker/Projects/hashlib', 'GTK_RC_FILES': '/etc/gtk/gtkrc:/home/brainfucker/.gtkrc-1.2-gnome2', 'LS_COLORS': 'rs=0:di=01;34:ln=01;36:hl=44;37:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:'} +environ = {'GDM_KEYBOARD_LAYOUT': 'us', 'GNOME_DESKTOP_SESSION_ID': 'this-is-deprecated', 'LESSOPEN': '| /usr/bin/lesspipe %s', 'LOGNAME': 'brainfucker', 'USER': 'brainfucker', 'HOME': '/home/brainfucker', 'PATH': '/var/lib/gems/1.8/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/brainfucker/Dropbox/Bin', 'DISPLAY': ':0.0', 'MAKEFLAGS': '', 'SSH_AGENT_PID': '2229', 'LANG': 'en_US.UTF-8', 'SPEECHD_PORT': '7560', 'TERM': 'xterm', 'SHELL': '/bin/bash', 'XAUTHORITY': '/var/run/gdm/auth-for-brainfucker-zWjB0A/database', 'SESSION_MANAGER': 'local/brainfucker-laptop:@/tmp/.ICE-unix/1925,unix/brainfucker-laptop:/tmp/.ICE-unix/1925', 'XDG_DATA_DIRS': '/usr/share/gnome:/usr/local/share/:/usr/share/', '_': '/usr/bin/make', 'DESKTOP_AUTOSTART_ID': '109b9a019b6a9c4443126392782668975300000019250000', 'MFLAGS': '', 'USERNAME': 'brainfucker', 'MAKELEVEL': '1', 'SSH_AUTH_SOCK': '/tmp/keyring-wLN2Sw/socket.ssh', 'GNOME_KEYRING_SOCKET': '/tmp/keyring-wLN2Sw/socket', 'GDMSESSION': 'gnome', 'DBUS_SESSION_BUS_ADDRESS': 'unix:abstract=/tmp/dbus-cXAVxLuiPR,guid=f3f6b8a7e87ae6d25b4575d14b560210', 'ORBIT_SOCKETDIR': '/tmp/orbit-brainfucker', 'XDG_SESSION_COOKIE': '8143f1ef8b2173edae5c4ea34aed6323-1263927823.695691-168079962', 'DESKTOP_SESSION': 'gnome', 'LESSCLOSE': '/usr/bin/lesspipe %s %s', 'GTK_MODULES': 'canberra-gtk-module', 'OLDPWD': '/home/brainfucker/Projects/brainfucker-hashlib-b64d1a7', 'GDM_LANG': 'en_US.UTF-8', 'HISTCONTROL': 'ignoreboth', 'SHLVL': '1', 'PWD': '/home/brainfucker/Projects/hashlib', 'GTK_RC_FILES': '/etc/gtk/gtkrc:/home/brainfucker/.gtkrc-1.2-gnome2', 'LS_COLORS': 'rs=0:di=01;34:ln=01;36:hl=44;37:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:'} files = [] hash = 0 options = {'compile_targets': None, 'force': False, 'verbose': 0, 'nocache': False, 'progress_bar': 0, 'destdir': '', 'keep': False, 'zones': '', 'blddir': '', 'prefix': '/usr/local/', 'jobs': 2, 'srcdir': '', 'check_cxx_compiler': 'g++ icpc sunc++', 'check_c_compiler': 'gcc icc suncc'} diff --git a/README.md b/README.md index 42845c9..da1c97a 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Hashlib *Is a FAST nodejs(http://github.com/ry/node/) library for making hashes written in C/C++* -*Supports: md4, md5, md6, sha, sha1, sha256, sha512* +*Supports: md4, md5, md6, sha, sha1, sha256, sha512*, also can make md5 hash of files *Thangs to Vanilla Hsu for speed improvements and md4, sha support* @@ -32,7 +32,7 @@ You should use `var hashlib = require("hashlib");` (from any path) sha256(str); // Returns sha256 hash from sting sha512(str); // Returns sha512 hash from sting md6(str[, length]); // Returns md6 hash from sting, second parametr is optional - md5_file(path); // Returns md5 hash from file (callbacks will be soon) + md5_file(path[, callback]); // Returns md5 hash from file callback is optional and works async ## Usage: var hashlib = require('hashlib'); diff --git a/build/.wafpickle-7 b/build/.wafpickle-7 index f65f943d05409751df16dfe603915811025d52f4..c80dc6c84ae5f300d9a6d62eac740301505d6d0f 100644 GIT binary patch delta 716 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 Zl1<0I+~r`DdWWh$&Og$4;I!J|{{dau)k6RP delta 19607 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 t{=^Ly88{6oWx^vDH>{|j5TNLv5^ diff --git a/build/default/hashlib_2.o b/build/default/hashlib_2.o index 9cdda020509696895fa33e5b9092845ff9930d69..9358cf3cd656870e65600e480d294fe2efb8e5b7 100644 GIT binary patch literal 97912 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 delta 12369 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 diff --git a/hashlib.cc b/hashlib.cc index b366cb1..3b1cb50 100644 --- a/hashlib.cc +++ b/hashlib.cc @@ -1,4 +1,5 @@ #include +#include extern "C" { #include "sha.h" @@ -195,6 +196,18 @@ Handle get_md5_file(char * path) return String::New((char*)hexdigest,32); } +void md5_file_callback(int revents, void *args) { + Persistent *data = + reinterpret_cast*>(args); + + String::Utf8Value path((*data)->Get(String::New("path"))); + v8::Handle callback = v8::Handle::Cast((*data)->Get(String::New("callback"))); + Handle recv = Handle::Cast((*data)->Get(String::New("recv"))); + v8::Handle outArgs[] = {get_md5_file(*path)}; + callback->Call(recv, 1, outArgs); + data->Dispose(); +} + Handle md5_file(const Arguments& args) { @@ -202,8 +215,16 @@ md5_file(const Arguments& args) String::Utf8Value path(args[0]->ToString()); if (args[1]->IsFunction()) { - printf("callback's for md5_file not implemented yet"); - return get_md5_file(*path); + v8::Local arguments = v8::Object::New(); + arguments->Set(String::New("path"),args[0]->ToString()); + arguments->Set(String::New("callback"),args[1]); + arguments->Set(String::New("recv"),args.This()); + Persistent *data = new Persistent(); + *data = Persistent::New(arguments); + + ev_once(0, EV_TIMEOUT, 0, md5_file_callback, (void*)data); + + return v8::Boolean::New(true); } else { return get_md5_file(*path); } diff --git a/makefile b/makefile index c6d9a45..97c9dce 100644 --- a/makefile +++ b/makefile @@ -1,5 +1,7 @@ all: node-waf configure build - @echo "--------\nMODULE FILE SHOULD BE IN ./build/default/\nUSE 'sudo make install' to install it" + @echo "--------\nMODULE FILE SHOULD BE IN ./build/default/\nUSE 'sudo make install' to install it\nAlso you can use 'make tests' to run tests" +tests: + node ./test.js install: cp ./build/default/hashlib.node /usr/local/lib/node/libraries/hashlib.node diff --git a/md5.js b/md5.js new file mode 100644 index 0000000..83beb13 --- /dev/null +++ b/md5.js @@ -0,0 +1,5 @@ +var hashlib = require("./build/default/hashlib"); +var sys = require("sys"); +var md5 = require("./test/md5"); +var c=new hashlib.hashlib(); +sys.puts(c.md5('test')); diff --git a/test.file b/test.file new file mode 100644 index 0000000..019970e --- /dev/null +++ b/test.file @@ -0,0 +1,2 @@ +Don't cahnge this file, +it needs for tests. diff --git a/test.js b/test.js index f16bbfb..11580e4 100644 --- a/test.js +++ b/test.js @@ -2,6 +2,8 @@ var hashlib = require("./build/default/hashlib"); var sys = require("sys"); var md5 = require("./test/md5"); +process.chdir(require("path").dirname(process.ARGV[1])); + if (hashlib.md5('test')=='098f6bcd4621d373cade4e832627b4f6') sys.puts('test 1 PASSED'); else @@ -34,6 +36,17 @@ if (hashlib.sha('test')=='f8d3b312442a67706057aeb45b983221afb4f035') sys.puts('test 8 PASSED'); else sys.puts('test 8 FAILS'); +if (hashlib.md5_file('./test.file')=='bc8aeda5b02f054117bd9979908787dc') + sys.puts('test 9 PASSED'); +else + sys.puts('test 9 FAILS'); +hashlib.md5_file('./test.file',function(value) { + if (value=='bc8aeda5b02f054117bd9979908787dc') + sys.puts('test 10 PASSED'); + else + sys.puts('test 10 FAILS'); + +// End of tests // C++ md5 var m1=new Date().getTime(); @@ -109,3 +122,5 @@ for(i=0;i<100000;i++) { var m2=new Date().getTime(); var c=m2-m1; sys.puts('C++ sha512 result is: '+(c)); + +});