Jacob and I are now collaborating on wrapping the liboauth library, if anyone else is interested:
https://github.com/randyzwitch/OAuth.jl On Tuesday, September 9, 2014 8:41:49 AM UTC-4, Randy Zwitch wrote: > > Yes I do want to collaborate Jacob, because I probably need some of the > functionality too! I'll put it up when I get home tonight and add you to > the repo. > > On Tuesday, September 9, 2014 8:32:41 AM UTC-4, Jacob Quinn wrote: >> >> Hey Randy, >> >> Any update on the liboath wrapping? I'd be willing to help if you've >> started as I need the functionality. Want to throw up what you have in a >> repo and collaborate? >> >> -Jacob >> >> >> On Monday, September 1, 2014 6:10:49 PM UTC-4, Randy Zwitch wrote: >>> >>> Kevin, adding const in front gave me this error: >>> >>> type: ccall: expected Symbol, got Ptr{None} >>> >>> while loading In[3], in expression starting on line 3 >>> >>> Luckily João, your code finally worked for me! So if I understand this >>> correctly, the problem was that we were originally passing a Ptr to ccall, >>> when all I should've been doing is passing a string declared as a constant? >>> >>> >>> >>> On Monday, September 1, 2014 4:46:07 PM UTC-4, João Felipe Santos wrote: >>>> >>>> I'm sorry, there was a mistake in my example. The dlopen step should be >>>> used just to check whether the file is accessible as a shared library. >>>> ccall expects the full path to the .dylib file in case the library is not >>>> at a "standard" location. >>>> >>>> Do something like this instead: >>>> >>>> const liboauth = "/path/to/liboauth" >>>> (dlopen_e(liboauth) == C_NULL) && error("Unable to load shared >>>> library at the given path.") >>>> b64d = ccall((:oauth_sign_hmac_sha1, liboauth), Ptr{Uint8}, >>>> (Ptr{Uint8}, Ptr{Uint8}), testurl, testkey) >>>> println(bytestring(b64d)) >>>> >>>> Note that you have to use bytestring and not string. string will create >>>> a string from printing the pointer (which will show something like >>>> Ptr{Uint8} @0x0000012345). bytestring converts a C string from a pointer >>>> to >>>> an ASCIIString, which is what you want. >>>> >>>> -- >>>> João Felipe Santos >>>> >>>> >>>> On Mon, Sep 1, 2014 at 4:24 PM, Randy Zwitch <[email protected]> >>>> wrote: >>>> >>>>> Thanks for the suggestions everyone. Unfortunately, neither the code >>>>> from Ivar nor João worked for me. >>>>> >>>>> liboauth = dlopen("/usr/local/lib/liboauth.dylib") >>>>> >>>>> Out[8]: >>>>> >>>>> Ptr{Void} @0x00007fdc665c5ca0 >>>>> >>>>> In [9]: >>>>> >>>> >> >>> function oauth_sign_hmac_sha1(m::String,k::String) >>>>> >>>>> res = >>>>> ccall((:oauth_sign_hmac_sha1,liboauth),Ptr{Uint8},(Ptr{Uint8},Ptr{Uint8}),m,k) >>>>> >>>>> if res == C_NULL >>>>> >>>>> error("oauth_sign_hmac_sha1 failed") >>>>> >>>>> end >>>>> >>>>> return string(res) >>>>> >>>>> end >>>>> >>>>> >>>>> >>>>> testurl = >>>>> "GET&http%3A%2F%2Fphotos.example.net%2Fphotos&file%3Dvacation.jpg%26oauth_consumer_key%3Ddpf43f3p2l4k3l03%26oauth_nonce%3Dkllo9940pd9333jh%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1191242096%26oauth_token%3Dnnch734d00sl2jdk%26oauth_version%3D1.0%26size%3Doriginal" >>>>> >>>>> testkey = "kd94hf93k423kf44&pfkkdhi9sl3r4s00" >>>>> >>>>> oauth_sign_hmac_sha1(testurl, testkey) >>>>> >>>>> type: oauth_sign_hmac_sha1: in ccall: first argument not a pointer or >>>>> valid constant expression, expected DataType, got Type{(Any...,)} >>>>> while loading In[9], in expression starting on line 11 >>>>> >>>>> in oauth_sign_hmac_sha1 at In[9]:2 >>>>> >>>>> >>>>> >>>>> >>>>> testurl = >>>>> "GET&http%3A%2F%2Fphotos.example.net%2Fphotos&file%3Dvacation.jpg%26oauth_consumer_key%3Ddpf43f3p2l4k3l03%26oauth_nonce%3Dkllo9940pd9333jh%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1191242096%26oauth_token%3Dnnch734d00sl2jdk%26oauth_version%3D1.0%26size%3Doriginal" >>>>> >>>>> testkey = "kd94hf93k423kf44&pfkkdhi9sl3r4s00" >>>>> >>>>> b64d = ccall((:oauth_sign_hmac_sha1, liboauth), Ptr{Uint8}, (Ptr{Uint8}, >>>>> Ptr{Uint8}), testurl, testkey) >>>>> >>>>> bytestring(b64d) >>>>> >>>>> type: anonymous: in ccall: first argument not a pointer or valid >>>>> constant expression, expected DataType, got Type{(Any...,)} >>>>> while loading In[10], in expression starting on line 3 >>>>> >>>>> in anonymous at no file >>>>> >>>>> >>>>> Does this mean I compiled the library wrong? When I did the 'make' >>>>> step, after it was complete, I did 'make installcheck' and the 3 tests >>>>> reported that they completed successfully. >>>>> >>>>> At a higher level, I like Isaiah's suggestion of doing this process by >>>>> hand to really get to understanding what is going on. Is there an eaier >>>>> external library that one of you could suggest that I could use to walk >>>>> through the entire process? I've done the examples in the manual using >>>>> :clock and :getenv and understand what is going on, so now I want to work >>>>> with a user-installed library to make sure I really get the process. I >>>>> started with OAuth to see if I could make something usable to work with >>>>> my >>>>> Twitter package, but maybe it's not the best starting place. >>>>> >>>>> >>>>> On Monday, September 1, 2014 10:47:22 AM UTC-4, João Felipe Santos >>>>> wrote: >>>>> >>>>>> You need to do ccalls using Ptr{Uint8}. What you can do actually is >>>>>> wrap the Clang.jl-generated functions with your own functions with an >>>>>> alternative signature, and then convert from ASCIIString to Ptr{Uint8}. >>>>>> Note that you probably will need to do it anyways to wrap the return >>>>>> types, >>>>>> since you probably do not want to work with pointers from Julia :) >>>>>> >>>>>> In that specific example, if m and k are ASCIIStrings, conversions >>>>>> will be done automatically: >>>>>> >>>>>> testurl = "GET&http%3A%2F%2Fphotos.example.net%2Fphotos&file% >>>>>> 3Dvacation.jpg%26oauth_consumer_key%3Ddpf43f3p2l4k3l03%26oauth_ >>>>>> nonce%3Dkllo9940pd9333jh%26oauth_signature_method% >>>>>> 3DHMAC-SHA1%26oauth_timestamp%3D1191242096%26oauth_token% >>>>>> 3Dnnch734d00sl2jdk%26oauth_version%3D1.0%26size%3Doriginal" >>>>>> testkey = "kd94hf93k423kf44&pfkkdhi9sl3r4s00" >>>>>> b64d = ccall((:oauth_sign_hmac_sha1, liboauth), Ptr{Uint8}, >>>>>> (Ptr{Uint8}, Ptr{Uint8}), testurl, testkey) >>>>>> >>>>>> Note that b64d here will be a Ptr{Uint8}, which you can convert to a >>>>>> Julia string by using bytestring(b64d). >>>>>> >>>>>> -- >>>>>> João Felipe Santos >>>>>> >>>>>> >>>>>>
