From 561e217e0be3a4979c55bc74af23de46c155f387 Mon Sep 17 00:00:00 2001 From: Gabriel Schulhof Date: Tue, 2 Jun 2015 11:45:33 +0300 Subject: [PATCH] Addon: Re-format using clang-format -style=Google and update README.md --- README.md | 10 +- src/callback-info.c | 117 ++-- src/callback-info.h | 42 +- src/common.cc | 12 +- src/common.h | 60 +- src/enums.cc | 656 +++++++++------------ src/enums.h | 2 +- src/functions.cc | 62 +- src/functions.h | 2 +- src/functions/oc-create-delete-resource.cc | 262 ++++---- src/functions/oc-create-delete-resource.h | 6 +- src/functions/oc-do-resource.cc | 204 ++++--- src/functions/oc-do-resource.h | 2 +- src/functions/oc-do-response.cc | 24 +- src/functions/oc-do-response.h | 2 +- src/functions/oc-notify.cc | 133 +++-- src/functions/oc-notify.h | 4 +- src/functions/simple.cc | 114 ++-- src/functions/simple.h | 14 +- src/main.cc | 28 +- src/structures.cc | 538 +++++++++-------- src/structures.h | 30 +- 22 files changed, 1110 insertions(+), 1214 deletions(-) diff --git a/README.md b/README.md index e86c5e1f..b0ffa20f 100644 --- a/README.md +++ b/README.md @@ -43,5 +43,11 @@ If you wish to run the client one one machine and the server on another, make su To run the tests, simply run ```npm test```. A script called ```dist.sh``` is also provided. It runs ```npm install```, runs the tests, then runs ```npm prune --production``` to remove all sources, headers, and build dependencies. After that, it copies relevant files to ```dist/``` and creates a tarball from them. This is followed by running ```npm install``` again to restore the development environment. ## Coding Style - -Please follow the [jQuery](http://contribute.jquery.org/style-guide/js/) coding style, even for C++! +Please follow the [jQuery](http://contribute.jquery.org/style-guide/js/) coding style for the JavaScript files. + +The C++ files can be formatted using ```clang-format -style=Google```: +```BASH +find src -type f | while read; do + clang-format -style=Google "$REPLY" > "$REPLY".new && mv "$REPLY".new "$REPLY" +done +``` diff --git a/src/callback-info.c b/src/callback-info.c index 901be4b3..64b5fd5d 100644 --- a/src/callback-info.c +++ b/src/callback-info.c @@ -9,80 +9,65 @@ extern "C" { #include "callback-info.h" -callback_info *callback_info_free( callback_info *info ) { - if ( info->closure ) { - ffi_closure_free( info->closure ); - } - if ( info->remover ) { - info->remover( info->user_data ); - } - free( info ); +callback_info *callback_info_free(callback_info *info) { + if (info->closure) { + ffi_closure_free(info->closure); + } + if (info->remover) { + info->remover(info->user_data); + } + free(info); - return 0; + return 0; } -callback_info *callback_info_new( - void *user_data, - UserDataRemover remover, - ffi_type *return_type, - Marshaller default_handler, - int argumentCount, ... ) { +callback_info *callback_info_new(void *user_data, UserDataRemover remover, + ffi_type *return_type, + Marshaller default_handler, int argumentCount, + ...) { + // Allocate enough for the callback_info structure + argument types + callback_info *info = (callback_info *)malloc( + sizeof(callback_info) + argumentCount * sizeof(ffi_type *)); + va_list va; + int index; - // Allocate enough for the callback_info structure + argument types - callback_info *info = ( callback_info * )malloc( - sizeof( callback_info ) + - argumentCount * sizeof( ffi_type * ) ); - va_list va; - int index; + // Allocate info structure + if (info) { + memset(info, 0, sizeof(callback_info)); - // Allocate info structure - if ( info ) { - memset( info, 0, sizeof( callback_info ) ); + // Save user data info + info->remover = remover; + info->user_data = user_data; - // Save user data info - info->remover = remover; - info->user_data = user_data; + // Allocate closure + info->closure = (ffi_closure *)ffi_closure_alloc( + sizeof(ffi_closure), (void **)&(info->resultingFunction)); + if (info->closure) { + // Populate argument type list + va_start(va, argumentCount); + for (index = 0; index < argumentCount; index++) { + info->argTypes[index] = va_arg(va, ffi_type *); + } + va_end(va); - // Allocate closure - info->closure = ( ffi_closure * )ffi_closure_alloc( - sizeof( ffi_closure ), - (void **)&( info->resultingFunction ) ); - if ( info->closure ) { + // Set up argument description + if (ffi_prep_cif(&(info->cif), FFI_DEFAULT_ABI, argumentCount, + return_type, info->argTypes) == FFI_OK) { + // Set up closure + if (ffi_prep_closure_loc(info->closure, &(info->cif), default_handler, + user_data, + (void *)(info->resultingFunction)) != FFI_OK) { + info = callback_info_free(info); + } + } else { + info = callback_info_free(info); + } + } else { + info = callback_info_free(info); + } + } - // Populate argument type list - va_start( va, argumentCount ); - for ( index = 0 ; index < argumentCount ; index++ ) { - info->argTypes[ index ] = va_arg( va, ffi_type * ); - } - va_end( va ); - - // Set up argument description - if ( ffi_prep_cif( - &( info->cif ), - FFI_DEFAULT_ABI, - argumentCount, - return_type, - info->argTypes ) == FFI_OK ) { - - // Set up closure - if ( ffi_prep_closure_loc( - info->closure, - &( info->cif ), - default_handler, - user_data, - (void *)( info->resultingFunction ) ) != FFI_OK ) { - - info = callback_info_free( info ); - } - } else { - info = callback_info_free( info ); - } - } else { - info = callback_info_free( info ); - } - } - - return info; + return info; } #ifdef __cplusplus diff --git a/src/callback-info.h b/src/callback-info.h index 7e32c216..d325fec8 100644 --- a/src/callback-info.h +++ b/src/callback-info.h @@ -7,40 +7,40 @@ extern "C" { #include -typedef void ( *Callback )(); -typedef void ( *Marshaller )( ffi_cif*, void*, void**, void* ); -typedef void ( *UserDataRemover )( void* ); +typedef void (*Callback)(); +typedef void (*Marshaller)(ffi_cif *, void *, void **, void *); +typedef void (*UserDataRemover)(void *); typedef struct _callback_info { - ffi_cif cif; - Marshaller resultingFunction; - ffi_closure *closure; - void *user_data; - UserDataRemover remover; - ffi_type *argTypes[]; + ffi_cif cif; + Marshaller resultingFunction; + ffi_closure *closure; + void *user_data; + UserDataRemover remover; + ffi_type *argTypes[]; } callback_info; // Free a callback_info structure. Always returns NULL -callback_info *callback_info_free( callback_info *info ); +callback_info *callback_info_free(callback_info *info); // Create a new callback_info. callback_info *callback_info_new( - // Extra parameter - void *user_data, + // Extra parameter + void *user_data, - // Function that frees the memory for the extra parameter - UserDataRemover remover, + // Function that frees the memory for the extra parameter + UserDataRemover remover, - // The signature of the original function: - // Return type - ffi_type *return_type, + // The signature of the original function: + // Return type + ffi_type *return_type, - // Location - Marshaller default_handler, + // Location + Marshaller default_handler, - // Argument count followed by list of argument types - int argumentCount, ... ); + // Argument count followed by list of argument types + int argumentCount, ...); #ifdef __cplusplus } diff --git a/src/common.cc b/src/common.cc index c9c2d520..36d083c4 100644 --- a/src/common.cc +++ b/src/common.cc @@ -3,12 +3,12 @@ using namespace v8; -Persistent *persistentJSCallback_new( Local callback ) { - Persistent *returnValue = new Persistent; - NanAssignPersistent( *returnValue, callback ); - return returnValue; +Persistent *persistentJSCallback_new(Local callback) { + Persistent *returnValue = new Persistent; + NanAssignPersistent(*returnValue, callback); + return returnValue; } -void persistentJSCallback_free( Persistent *callback ) { - delete callback; +void persistentJSCallback_free(Persistent *callback) { + delete callback; } diff --git a/src/common.h b/src/common.h index 658e580d..b3eff8b5 100644 --- a/src/common.h +++ b/src/common.h @@ -4,33 +4,37 @@ #include #include -#define VALIDATE_CALLBACK_RETURN_VALUE_TYPE( value, typecheck, message ) \ - if ( !value->typecheck() ) { \ - NanThrowTypeError( message " callback return value type must satisfy " #typecheck "()" ); \ - } - -#define VALIDATE_ARGUMENT_COUNT( args, length ) \ - if ( (args).Length() < (length) ) { \ - return NanThrowRangeError( "Need " #length " arguments" ); \ - } - -#define VALIDATE_ARGUMENT_TYPE( args, index, typecheck ) \ - if ( !(args)[ (index) ]->typecheck() ) { \ - return NanThrowTypeError( "Argument " #index " must satisfy " #typecheck "()" ); \ - } - -#define VALIDATE_VALUE_TYPE( value, typecheck, message, failReturn ) \ - if ( !(value)->typecheck() ) { \ - NanThrowTypeError( message " must satisfy " #typecheck "()" ); \ - return failReturn; \ - } - -#define VALIDATE_ARGUMENT_TYPE_OR_NULL( args, index, typecheck ) \ - if ( !( (args)[ (index) ]->typecheck() || (args)[ (index) ]->IsNull() ) ) { \ - return NanThrowTypeError( "Argument " #index " must satisfy " #typecheck "() or IsNull()" ); \ - } - -v8::Persistent *persistentJSCallback_new( v8::Local callback ); -void persistentJSCallback_free( v8::Persistent *callback ); +#define VALIDATE_CALLBACK_RETURN_VALUE_TYPE(value, typecheck, message) \ + if (!value->typecheck()) { \ + NanThrowTypeError( \ + message " callback return value type must satisfy " #typecheck "()"); \ + } + +#define VALIDATE_ARGUMENT_COUNT(args, length) \ + if ((args).Length() < (length)) { \ + return NanThrowRangeError("Need " #length " arguments"); \ + } + +#define VALIDATE_ARGUMENT_TYPE(args, index, typecheck) \ + if (!(args)[(index)]->typecheck()) { \ + return NanThrowTypeError("Argument " #index " must satisfy " #typecheck \ + "()"); \ + } + +#define VALIDATE_VALUE_TYPE(value, typecheck, message, failReturn) \ + if (!(value)->typecheck()) { \ + NanThrowTypeError(message " must satisfy " #typecheck "()"); \ + return failReturn; \ + } + +#define VALIDATE_ARGUMENT_TYPE_OR_NULL(args, index, typecheck) \ + if (!((args)[(index)]->typecheck() || (args)[(index)]->IsNull())) { \ + return NanThrowTypeError("Argument " #index " must satisfy " #typecheck \ + "() or IsNull()"); \ + } + +v8::Persistent *persistentJSCallback_new( + v8::Local callback); +void persistentJSCallback_free(v8::Persistent *callback); #endif /* __IOTIVITY_NODE_FUNCTIONS_INTERNAL_H__ */ diff --git a/src/enums.cc b/src/enums.cc index 2cebcd8b..0528b6c5 100644 --- a/src/enums.cc +++ b/src/enums.cc @@ -2,416 +2,330 @@ #include extern "C" { - #include - } using namespace v8; static Local bind_OCEntityHandlerFlag() { - Local returnValue = NanNew(); - - returnValue->ForceSet( - NanNew( "OC_INIT_FLAG" ), - NanNew( OC_INIT_FLAG ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_REQUEST_FLAG" ), - NanNew( OC_REQUEST_FLAG ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_OBSERVE_FLAG" ), - NanNew( OC_OBSERVE_FLAG ), - static_cast( ReadOnly || DontDelete ) ); - - return returnValue; + Local returnValue = NanNew(); + + returnValue->ForceSet(NanNew("OC_INIT_FLAG"), + NanNew(OC_INIT_FLAG), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_REQUEST_FLAG"), + NanNew(OC_REQUEST_FLAG), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_OBSERVE_FLAG"), + NanNew(OC_OBSERVE_FLAG), + static_cast(ReadOnly || DontDelete)); + + return returnValue; } static Local bind_OCEntityHandlerResult() { - Local returnValue = NanNew(); - - returnValue->ForceSet( - NanNew( "OC_EH_OK" ), - NanNew( OC_EH_OK ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_EH_ERROR" ), - NanNew( OC_EH_ERROR ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_EH_RESOURCE_CREATED" ), - NanNew( OC_EH_RESOURCE_CREATED ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_EH_RESOURCE_DELETED" ), - NanNew( OC_EH_RESOURCE_DELETED ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_EH_SLOW" ), - NanNew( OC_EH_SLOW ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_EH_FORBIDDEN" ), - NanNew( OC_EH_FORBIDDEN ), - static_cast( ReadOnly || DontDelete ) ); - - return returnValue; + Local returnValue = NanNew(); + + returnValue->ForceSet(NanNew("OC_EH_OK"), NanNew(OC_EH_OK), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_EH_ERROR"), + NanNew(OC_EH_ERROR), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_EH_RESOURCE_CREATED"), + NanNew(OC_EH_RESOURCE_CREATED), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_EH_RESOURCE_DELETED"), + NanNew(OC_EH_RESOURCE_DELETED), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_EH_SLOW"), + NanNew(OC_EH_SLOW), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_EH_FORBIDDEN"), + NanNew(OC_EH_FORBIDDEN), + static_cast(ReadOnly || DontDelete)); + + return returnValue; } static Local bind_OCMethod() { - Local returnValue = NanNew(); - - returnValue->ForceSet( - NanNew( "OC_REST_NOMETHOD" ), - NanNew( OC_REST_NOMETHOD ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_REST_GET" ), - NanNew( OC_REST_GET ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_REST_PUT" ), - NanNew( OC_REST_PUT ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_REST_POST" ), - NanNew( OC_REST_POST ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_REST_DELETE" ), - NanNew( OC_REST_DELETE ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_REST_OBSERVE" ), - NanNew( OC_REST_OBSERVE ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_REST_OBSERVE_ALL" ), - NanNew( OC_REST_OBSERVE_ALL ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_REST_CANCEL_OBSERVE" ), - NanNew( OC_REST_CANCEL_OBSERVE ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_REST_PRESENCE" ), - NanNew( OC_REST_PRESENCE ), - static_cast( ReadOnly || DontDelete ) ); - - return returnValue; + Local returnValue = NanNew(); + + returnValue->ForceSet(NanNew("OC_REST_NOMETHOD"), + NanNew(OC_REST_NOMETHOD), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_REST_GET"), + NanNew(OC_REST_GET), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_REST_PUT"), + NanNew(OC_REST_PUT), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_REST_POST"), + NanNew(OC_REST_POST), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_REST_DELETE"), + NanNew(OC_REST_DELETE), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_REST_OBSERVE"), + NanNew(OC_REST_OBSERVE), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_REST_OBSERVE_ALL"), + NanNew(OC_REST_OBSERVE_ALL), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_REST_CANCEL_OBSERVE"), + NanNew(OC_REST_CANCEL_OBSERVE), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_REST_PRESENCE"), + NanNew(OC_REST_PRESENCE), + static_cast(ReadOnly || DontDelete)); + + return returnValue; } static Local bind_OCMode() { - Local returnValue = NanNew(); - - returnValue->ForceSet( - NanNew( "OC_CLIENT" ), - NanNew( OC_CLIENT ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_SERVER" ), - NanNew( OC_SERVER ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_CLIENT_SERVER" ), - NanNew( OC_CLIENT_SERVER ), - static_cast( ReadOnly || DontDelete ) ); - - return returnValue; + Local returnValue = NanNew(); + + returnValue->ForceSet(NanNew("OC_CLIENT"), NanNew(OC_CLIENT), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_SERVER"), NanNew(OC_SERVER), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_CLIENT_SERVER"), + NanNew(OC_CLIENT_SERVER), + static_cast(ReadOnly || DontDelete)); + + return returnValue; } static Local bind_OCObserveAction() { - Local returnValue = NanNew(); - - returnValue->ForceSet( - NanNew( "OC_OBSERVE_REGISTER" ), - NanNew( OC_OBSERVE_REGISTER ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_OBSERVE_DEREGISTER" ), - NanNew( OC_OBSERVE_DEREGISTER ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_OBSERVE_NO_OPTION" ), - NanNew( OC_OBSERVE_NO_OPTION ), - static_cast( ReadOnly || DontDelete ) ); - - return returnValue; + Local returnValue = NanNew(); + + returnValue->ForceSet(NanNew("OC_OBSERVE_REGISTER"), + NanNew(OC_OBSERVE_REGISTER), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_OBSERVE_DEREGISTER"), + NanNew(OC_OBSERVE_DEREGISTER), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_OBSERVE_NO_OPTION"), + NanNew(OC_OBSERVE_NO_OPTION), + static_cast(ReadOnly || DontDelete)); + + return returnValue; } static Local bind_OCQualityOfService() { - Local returnValue = NanNew(); - - returnValue->ForceSet( - NanNew( "OC_LOW_QOS" ), - NanNew( OC_LOW_QOS ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_MEDIUM_QOS" ), - NanNew( OC_MEDIUM_QOS ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_HIGH_QOS" ), - NanNew( OC_HIGH_QOS ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_NA_QOS" ), - NanNew( OC_NA_QOS ), - static_cast( ReadOnly || DontDelete ) ); - - return returnValue; + Local returnValue = NanNew(); + + returnValue->ForceSet(NanNew("OC_LOW_QOS"), + NanNew(OC_LOW_QOS), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_MEDIUM_QOS"), + NanNew(OC_MEDIUM_QOS), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_HIGH_QOS"), + NanNew(OC_HIGH_QOS), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_NA_QOS"), NanNew(OC_NA_QOS), + static_cast(ReadOnly || DontDelete)); + + return returnValue; } static Local bind_OCResourceProperty() { - Local returnValue = NanNew(); - - returnValue->ForceSet( - NanNew( "OC_ACTIVE" ), - NanNew( OC_ACTIVE ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_DISCOVERABLE" ), - NanNew( OC_DISCOVERABLE ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_OBSERVABLE" ), - NanNew( OC_OBSERVABLE ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_SLOW" ), - NanNew( OC_SLOW ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_SECURE" ), - NanNew( OC_SECURE ), - static_cast( ReadOnly || DontDelete ) ); - - return returnValue; + Local returnValue = NanNew(); + + returnValue->ForceSet(NanNew("OC_ACTIVE"), NanNew(OC_ACTIVE), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_DISCOVERABLE"), + NanNew(OC_DISCOVERABLE), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_OBSERVABLE"), + NanNew(OC_OBSERVABLE), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_SLOW"), NanNew(OC_SLOW), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_SECURE"), NanNew(OC_SECURE), + static_cast(ReadOnly || DontDelete)); + + return returnValue; } static Local bind_OCStackApplicationResult() { - Local returnValue = NanNew(); - - returnValue->ForceSet( - NanNew( "OC_STACK_DELETE_TRANSACTION" ), - NanNew( OC_STACK_DELETE_TRANSACTION ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_KEEP_TRANSACTION" ), - NanNew( OC_STACK_KEEP_TRANSACTION ), - static_cast( ReadOnly || DontDelete ) ); - - return returnValue; + Local returnValue = NanNew(); + + returnValue->ForceSet(NanNew("OC_STACK_DELETE_TRANSACTION"), + NanNew(OC_STACK_DELETE_TRANSACTION), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_KEEP_TRANSACTION"), + NanNew(OC_STACK_KEEP_TRANSACTION), + static_cast(ReadOnly || DontDelete)); + + return returnValue; } static Local bind_OCStackResult() { - Local returnValue = NanNew(); - - returnValue->ForceSet( - NanNew( "OC_STACK_OK" ), - NanNew( OC_STACK_OK ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_RESOURCE_CREATED" ), - NanNew( OC_STACK_RESOURCE_CREATED ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_RESOURCE_DELETED" ), - NanNew( OC_STACK_RESOURCE_DELETED ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_CONTINUE" ), - NanNew( OC_STACK_CONTINUE ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_INVALID_URI" ), - NanNew( OC_STACK_INVALID_URI ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_INVALID_QUERY" ), - NanNew( OC_STACK_INVALID_QUERY ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_INVALID_IP" ), - NanNew( OC_STACK_INVALID_IP ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_INVALID_PORT" ), - NanNew( OC_STACK_INVALID_PORT ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_INVALID_CALLBACK" ), - NanNew( OC_STACK_INVALID_CALLBACK ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_INVALID_METHOD" ), - NanNew( OC_STACK_INVALID_METHOD ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_INVALID_PARAM" ), - NanNew( OC_STACK_INVALID_PARAM ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_INVALID_OBSERVE_PARAM" ), - NanNew( OC_STACK_INVALID_OBSERVE_PARAM ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_NO_MEMORY" ), - NanNew( OC_STACK_NO_MEMORY ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_COMM_ERROR" ), - NanNew( OC_STACK_COMM_ERROR ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_NOTIMPL" ), - NanNew( OC_STACK_NOTIMPL ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_NO_RESOURCE" ), - NanNew( OC_STACK_NO_RESOURCE ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_RESOURCE_ERROR" ), - NanNew( OC_STACK_RESOURCE_ERROR ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_SLOW_RESOURCE" ), - NanNew( OC_STACK_SLOW_RESOURCE ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_NO_OBSERVERS" ), - NanNew( OC_STACK_NO_OBSERVERS ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_OBSERVER_NOT_FOUND" ), - NanNew( OC_STACK_OBSERVER_NOT_FOUND ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_VIRTUAL_DO_NOT_HANDLE" ), - NanNew( OC_STACK_VIRTUAL_DO_NOT_HANDLE ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_INVALID_OPTION" ), - NanNew( OC_STACK_INVALID_OPTION ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_MALFORMED_RESPONSE" ), - NanNew( OC_STACK_MALFORMED_RESPONSE ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_PERSISTENT_BUFFER_REQUIRED" ), - NanNew( OC_STACK_PERSISTENT_BUFFER_REQUIRED ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_INVALID_REQUEST_HANDLE" ), - NanNew( OC_STACK_INVALID_REQUEST_HANDLE ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_INVALID_DEVICE_INFO" ), - NanNew( OC_STACK_INVALID_DEVICE_INFO ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_PRESENCE_STOPPED" ), - NanNew( OC_STACK_PRESENCE_STOPPED ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_PRESENCE_TIMEOUT" ), - NanNew( OC_STACK_PRESENCE_TIMEOUT ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_PRESENCE_DO_NOT_HANDLE" ), - NanNew( OC_STACK_PRESENCE_DO_NOT_HANDLE ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_STACK_ERROR" ), - NanNew( OC_STACK_ERROR ), - static_cast( ReadOnly || DontDelete ) ); - - return returnValue; + Local returnValue = NanNew(); + + returnValue->ForceSet(NanNew("OC_STACK_OK"), + NanNew(OC_STACK_OK), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_RESOURCE_CREATED"), + NanNew(OC_STACK_RESOURCE_CREATED), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_RESOURCE_DELETED"), + NanNew(OC_STACK_RESOURCE_DELETED), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_CONTINUE"), + NanNew(OC_STACK_CONTINUE), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_INVALID_URI"), + NanNew(OC_STACK_INVALID_URI), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_INVALID_QUERY"), + NanNew(OC_STACK_INVALID_QUERY), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_INVALID_IP"), + NanNew(OC_STACK_INVALID_IP), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_INVALID_PORT"), + NanNew(OC_STACK_INVALID_PORT), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_INVALID_CALLBACK"), + NanNew(OC_STACK_INVALID_CALLBACK), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_INVALID_METHOD"), + NanNew(OC_STACK_INVALID_METHOD), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_INVALID_PARAM"), + NanNew(OC_STACK_INVALID_PARAM), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_INVALID_OBSERVE_PARAM"), + NanNew(OC_STACK_INVALID_OBSERVE_PARAM), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_NO_MEMORY"), + NanNew(OC_STACK_NO_MEMORY), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_COMM_ERROR"), + NanNew(OC_STACK_COMM_ERROR), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_NOTIMPL"), + NanNew(OC_STACK_NOTIMPL), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_NO_RESOURCE"), + NanNew(OC_STACK_NO_RESOURCE), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_RESOURCE_ERROR"), + NanNew(OC_STACK_RESOURCE_ERROR), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_SLOW_RESOURCE"), + NanNew(OC_STACK_SLOW_RESOURCE), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_NO_OBSERVERS"), + NanNew(OC_STACK_NO_OBSERVERS), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_OBSERVER_NOT_FOUND"), + NanNew(OC_STACK_OBSERVER_NOT_FOUND), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_VIRTUAL_DO_NOT_HANDLE"), + NanNew(OC_STACK_VIRTUAL_DO_NOT_HANDLE), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_INVALID_OPTION"), + NanNew(OC_STACK_INVALID_OPTION), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_MALFORMED_RESPONSE"), + NanNew(OC_STACK_MALFORMED_RESPONSE), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_PERSISTENT_BUFFER_REQUIRED"), + NanNew(OC_STACK_PERSISTENT_BUFFER_REQUIRED), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_INVALID_REQUEST_HANDLE"), + NanNew(OC_STACK_INVALID_REQUEST_HANDLE), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_INVALID_DEVICE_INFO"), + NanNew(OC_STACK_INVALID_DEVICE_INFO), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_PRESENCE_STOPPED"), + NanNew(OC_STACK_PRESENCE_STOPPED), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_PRESENCE_TIMEOUT"), + NanNew(OC_STACK_PRESENCE_TIMEOUT), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_PRESENCE_DO_NOT_HANDLE"), + NanNew(OC_STACK_PRESENCE_DO_NOT_HANDLE), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_STACK_ERROR"), + NanNew(OC_STACK_ERROR), + static_cast(ReadOnly || DontDelete)); + + return returnValue; } static Local bind_OCTransportProtocolID() { - Local returnValue = NanNew(); - - returnValue->ForceSet( - NanNew( "OC_INVALID_ID" ), - NanNew( OC_INVALID_ID ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_COAP_ID" ), - NanNew( OC_COAP_ID ), - static_cast( ReadOnly || DontDelete ) ); - - return returnValue; + Local returnValue = NanNew(); + + returnValue->ForceSet(NanNew("OC_INVALID_ID"), + NanNew(OC_INVALID_ID), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_COAP_ID"), + NanNew(OC_COAP_ID), + static_cast(ReadOnly || DontDelete)); + + return returnValue; } static Local bind_OCVirtualResources() { - Local returnValue = NanNew(); - - returnValue->ForceSet( - NanNew( "OC_WELL_KNOWN_URI" ), - NanNew( OC_WELL_KNOWN_URI ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_DEVICE_URI" ), - NanNew( OC_DEVICE_URI ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_RESOURCE_TYPES_URI" ), - NanNew( OC_RESOURCE_TYPES_URI ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_PRESENCE" ), - NanNew( OC_PRESENCE ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_MAX_VIRTUAL_RESOURCES" ), - NanNew( OC_MAX_VIRTUAL_RESOURCES ), - static_cast( ReadOnly || DontDelete ) ); - - return returnValue; + Local returnValue = NanNew(); + + returnValue->ForceSet(NanNew("OC_WELL_KNOWN_URI"), + NanNew(OC_WELL_KNOWN_URI), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_DEVICE_URI"), + NanNew(OC_DEVICE_URI), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_RESOURCE_TYPES_URI"), + NanNew(OC_RESOURCE_TYPES_URI), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_PRESENCE"), + NanNew(OC_PRESENCE), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_MAX_VIRTUAL_RESOURCES"), + NanNew(OC_MAX_VIRTUAL_RESOURCES), + static_cast(ReadOnly || DontDelete)); + + return returnValue; } static Local bind_OCConnectivityType() { - Local returnValue = NanNew(); - - returnValue->ForceSet( - NanNew( "OC_ETHERNET" ), - NanNew( OC_ETHERNET ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_WIFI" ), - NanNew( OC_WIFI ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_EDR" ), - NanNew( OC_EDR ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_LE" ), - NanNew( OC_LE ), - static_cast( ReadOnly || DontDelete ) ); - returnValue->ForceSet( - NanNew( "OC_ALL" ), - NanNew( OC_ALL ), - static_cast( ReadOnly || DontDelete ) ); - - return returnValue; + Local returnValue = NanNew(); + + returnValue->ForceSet(NanNew("OC_ETHERNET"), + NanNew(OC_ETHERNET), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_WIFI"), NanNew(OC_WIFI), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_EDR"), NanNew(OC_EDR), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_LE"), NanNew(OC_LE), + static_cast(ReadOnly || DontDelete)); + returnValue->ForceSet(NanNew("OC_ALL"), NanNew(OC_ALL), + static_cast(ReadOnly || DontDelete)); + + return returnValue; } -void InitEnums( Handle exports ) { - exports->Set( NanNew( "OCEntityHandlerFlag" ), bind_OCEntityHandlerFlag() ); - exports->Set( NanNew( "OCEntityHandlerResult" ), bind_OCEntityHandlerResult() ); - exports->Set( NanNew( "OCMethod" ), bind_OCMethod() ); - exports->Set( NanNew( "OCMode" ), bind_OCMode() ); - exports->Set( NanNew( "OCObserveAction" ), bind_OCObserveAction() ); - exports->Set( NanNew( "OCQualityOfService" ), bind_OCQualityOfService() ); - exports->Set( NanNew( "OCResourceProperty" ), bind_OCResourceProperty() ); - exports->Set( NanNew( "OCStackApplicationResult" ), bind_OCStackApplicationResult() ); - exports->Set( NanNew( "OCStackResult" ), bind_OCStackResult() ); - exports->Set( NanNew( "OCTransportProtocolID" ), bind_OCTransportProtocolID() ); - exports->Set( NanNew( "OCVirtualResources" ), bind_OCVirtualResources() ); - exports->Set( NanNew( "OCConnectivityType" ), bind_OCConnectivityType() ); +void InitEnums(Handle exports) { + exports->Set(NanNew("OCEntityHandlerFlag"), + bind_OCEntityHandlerFlag()); + exports->Set(NanNew("OCEntityHandlerResult"), + bind_OCEntityHandlerResult()); + exports->Set(NanNew("OCMethod"), bind_OCMethod()); + exports->Set(NanNew("OCMode"), bind_OCMode()); + exports->Set(NanNew("OCObserveAction"), bind_OCObserveAction()); + exports->Set(NanNew("OCQualityOfService"), bind_OCQualityOfService()); + exports->Set(NanNew("OCResourceProperty"), bind_OCResourceProperty()); + exports->Set(NanNew("OCStackApplicationResult"), + bind_OCStackApplicationResult()); + exports->Set(NanNew("OCStackResult"), bind_OCStackResult()); + exports->Set(NanNew("OCTransportProtocolID"), + bind_OCTransportProtocolID()); + exports->Set(NanNew("OCVirtualResources"), bind_OCVirtualResources()); + exports->Set(NanNew("OCConnectivityType"), bind_OCConnectivityType()); } diff --git a/src/enums.h b/src/enums.h index 1b8a69e0..b7c71c22 100644 --- a/src/enums.h +++ b/src/enums.h @@ -6,6 +6,6 @@ using namespace v8; -void InitEnums( Handle exports ); +void InitEnums(Handle exports); #endif /* __IOTIVITY_NODE_ENUMS_H__ */ diff --git a/src/functions.cc b/src/functions.cc index f4fada8a..02cf85ca 100644 --- a/src/functions.cc +++ b/src/functions.cc @@ -9,33 +9,37 @@ using namespace v8; -void InitFunctions( Handle exports, Handle module ) { - exports->Set( NanNew( "OCInit" ), - NanNew( bind_OCInit )->GetFunction() ); - exports->Set( NanNew( "OCStop" ), - NanNew( bind_OCStop )->GetFunction() ); - exports->Set( NanNew( "OCProcess" ), - NanNew( bind_OCProcess )->GetFunction() ); - exports->Set( NanNew( "OCDevAddrToIPv4Addr" ), - NanNew( bind_OCDevAddrToIPv4Addr )->GetFunction() ); - exports->Set( NanNew( "OCDevAddrToPort" ), - NanNew( bind_OCDevAddrToPort )->GetFunction() ); - exports->Set( NanNew( "OCCreateResource" ), - NanNew( bind_OCCreateResource )->GetFunction() ); - exports->Set( NanNew( "OCBindResourceHandler" ), - NanNew( bind_OCBindResourceHandler )->GetFunction() ); - exports->Set( NanNew( "OCDeleteResource" ), - NanNew( bind_OCDeleteResource )->GetFunction() ); - exports->Set( NanNew( "OCStartPresence" ), - NanNew( bind_OCStartPresence )->GetFunction() ); - exports->Set( NanNew( "OCStopPresence" ), - NanNew( bind_OCStopPresence )->GetFunction() ); - exports->Set( NanNew( "OCDoResource" ), - NanNew( bind_OCDoResource )->GetFunction() ); - exports->Set( NanNew( "OCDoResponse" ), - NanNew( bind_OCDoResponse )->GetFunction() ); - exports->Set( NanNew( "OCNotifyAllObservers" ), - NanNew( bind_OCNotifyAllObservers )->GetFunction() ); - exports->Set( NanNew( "OCNotifyListOfObservers" ), - NanNew( bind_OCNotifyListOfObservers )->GetFunction() ); +void InitFunctions(Handle exports, Handle module) { + exports->Set(NanNew("OCInit"), + NanNew(bind_OCInit)->GetFunction()); + exports->Set(NanNew("OCStop"), + NanNew(bind_OCStop)->GetFunction()); + exports->Set(NanNew("OCProcess"), + NanNew(bind_OCProcess)->GetFunction()); + exports->Set( + NanNew("OCDevAddrToIPv4Addr"), + NanNew(bind_OCDevAddrToIPv4Addr)->GetFunction()); + exports->Set(NanNew("OCDevAddrToPort"), + NanNew(bind_OCDevAddrToPort)->GetFunction()); + exports->Set(NanNew("OCCreateResource"), + NanNew(bind_OCCreateResource)->GetFunction()); + exports->Set( + NanNew("OCBindResourceHandler"), + NanNew(bind_OCBindResourceHandler)->GetFunction()); + exports->Set(NanNew("OCDeleteResource"), + NanNew(bind_OCDeleteResource)->GetFunction()); + exports->Set(NanNew("OCStartPresence"), + NanNew(bind_OCStartPresence)->GetFunction()); + exports->Set(NanNew("OCStopPresence"), + NanNew(bind_OCStopPresence)->GetFunction()); + exports->Set(NanNew("OCDoResource"), + NanNew(bind_OCDoResource)->GetFunction()); + exports->Set(NanNew("OCDoResponse"), + NanNew(bind_OCDoResponse)->GetFunction()); + exports->Set( + NanNew("OCNotifyAllObservers"), + NanNew(bind_OCNotifyAllObservers)->GetFunction()); + exports->Set( + NanNew("OCNotifyListOfObservers"), + NanNew(bind_OCNotifyListOfObservers)->GetFunction()); } diff --git a/src/functions.h b/src/functions.h index 54dc6c42..065d5ce8 100644 --- a/src/functions.h +++ b/src/functions.h @@ -6,6 +6,6 @@ using namespace v8; -void InitFunctions( Handle exports, Handle module ); +void InitFunctions(Handle exports, Handle module); #endif /* __IOTIVITY_NODE_FUNCTIONS_H__ */ diff --git a/src/functions/oc-create-delete-resource.cc b/src/functions/oc-create-delete-resource.cc index b207a0e8..81902af6 100644 --- a/src/functions/oc-create-delete-resource.cc +++ b/src/functions/oc-create-delete-resource.cc @@ -18,153 +18,143 @@ using namespace node; static std::map annotation; // Marshaller for OCEntityHandler callback -// defaultEntityHandler is placed in a closure each time someone calls OCCreateResource. Closures -// differ from one another only by the value of jsCallbackInPersistent, which is a persistent -// reference to the JS callback. When the C API executes one of the closures, we construct a call -// to the JS callback we find at jsCallbackInPersistent, and pass the return value from the -// callback back to the C API. -static void defaultEntityHandler( - ffi_cif* cif, - OCEntityHandlerResult *returnValueLocation, - void**arguments, - void *jsCallbackInPersistent ) { - - // Construct arguments to the JS callback and then call it, recording its return value - Local jsCallbackArguments[ 2 ] = { - NanNew( ( double )*( OCEntityHandlerFlag * )( arguments[ 0 ] ) ), - js_OCEntityHandlerRequest( *( OCEntityHandlerRequest ** )( arguments[ 1 ] ) ) - }; - Local returnValue = - NanMakeCallback( - NanGetCurrentContext()->Global(), - NanNew( *( Persistent * )jsCallbackInPersistent ), - 2, - jsCallbackArguments ); - - VALIDATE_CALLBACK_RETURN_VALUE_TYPE( returnValue, IsNumber, "OCEntityHandler" ); - - *returnValueLocation = ( OCEntityHandlerResult )( returnValue->ToNumber()->Value() ); +// defaultEntityHandler is placed in a closure each time someone calls +// OCCreateResource. Closures differ from one another only by the value of +// jsCallbackInPersistent, which is a persistent reference to the JS callback. +// When the C API executes one of the closures, we construct a call to the JS +// callback we find at jsCallbackInPersistent, and pass the return value from +// the callback back to the C API. +static void defaultEntityHandler(ffi_cif *cif, + OCEntityHandlerResult *returnValueLocation, + void **arguments, + void *jsCallbackInPersistent) { + // Construct arguments to the JS callback and then call it, recording its + // return value + Local jsCallbackArguments[2] = { + NanNew((double)*(OCEntityHandlerFlag *)(arguments[0])), + js_OCEntityHandlerRequest(*(OCEntityHandlerRequest **)(arguments[1]))}; + Local returnValue = + NanMakeCallback(NanGetCurrentContext()->Global(), + NanNew(*(Persistent *)jsCallbackInPersistent), + 2, jsCallbackArguments); + + VALIDATE_CALLBACK_RETURN_VALUE_TYPE(returnValue, IsNumber, "OCEntityHandler"); + + *returnValueLocation = + (OCEntityHandlerResult)(returnValue->ToNumber()->Value()); } // Create a callback_info structure for a given JS callback -#define newInfoForJSCallback( callback ) \ - callback_info_new( \ - ( void * )persistentJSCallback_new( (callback) ), \ - ( UserDataRemover )persistentJSCallback_free, \ - &ffi_type_uint32, \ - ( Marshaller )defaultEntityHandler, \ - 2, \ - &ffi_type_uint32, &ffi_type_pointer ) - -NAN_METHOD( bind_OCCreateResource ) { - NanScope(); - - OCResourceHandle handle = 0; - callback_info *info = 0; - - VALIDATE_ARGUMENT_COUNT( args, 6 ); - VALIDATE_ARGUMENT_TYPE( args, 0, IsObject ); - VALIDATE_ARGUMENT_TYPE( args, 1, IsString ); - VALIDATE_ARGUMENT_TYPE( args, 2, IsString ); - VALIDATE_ARGUMENT_TYPE( args, 3, IsString ); - VALIDATE_ARGUMENT_TYPE( args, 4, IsFunction ); - VALIDATE_ARGUMENT_TYPE( args, 5, IsUint32 ); - - // Create a new callback - info = newInfoForJSCallback( Local::Cast( args[ 4 ] ) ); - if ( !info ) { - NanThrowError( "OCCreateResource: Unable to allocate C callback" ); - NanReturnUndefined(); - } - - Local returnValue = NanNew( OCCreateResource( - &handle, - ( const char * )*String::Utf8Value( args[ 1 ] ), - ( const char * )*String::Utf8Value( args[ 2 ] ), - ( const char * )*String::Utf8Value( args[ 3 ] ), - ( OCEntityHandler )( info->resultingFunction ), - ( uint8_t )args[ 5 ]->Uint32Value() ) ); - - // Save info to the handle - annotation[ handle ] = info; - js_OCResourceHandle( args[ 0 ]->ToObject(), handle ); - - NanReturnValue( returnValue ); +#define newInfoForJSCallback(callback) \ + callback_info_new((void *)persistentJSCallback_new((callback)), \ + (UserDataRemover)persistentJSCallback_free, \ + &ffi_type_uint32, (Marshaller)defaultEntityHandler, 2, \ + &ffi_type_uint32, &ffi_type_pointer) + +NAN_METHOD(bind_OCCreateResource) { + NanScope(); + + OCResourceHandle handle = 0; + callback_info *info = 0; + + VALIDATE_ARGUMENT_COUNT(args, 6); + VALIDATE_ARGUMENT_TYPE(args, 0, IsObject); + VALIDATE_ARGUMENT_TYPE(args, 1, IsString); + VALIDATE_ARGUMENT_TYPE(args, 2, IsString); + VALIDATE_ARGUMENT_TYPE(args, 3, IsString); + VALIDATE_ARGUMENT_TYPE(args, 4, IsFunction); + VALIDATE_ARGUMENT_TYPE(args, 5, IsUint32); + + // Create a new callback + info = newInfoForJSCallback(Local::Cast(args[4])); + if (!info) { + NanThrowError("OCCreateResource: Unable to allocate C callback"); + NanReturnUndefined(); + } + + Local returnValue = NanNew( + OCCreateResource(&handle, (const char *)*String::Utf8Value(args[1]), + (const char *)*String::Utf8Value(args[2]), + (const char *)*String::Utf8Value(args[3]), + (OCEntityHandler)(info->resultingFunction), + (uint8_t)args[5]->Uint32Value())); + + // Save info to the handle + annotation[handle] = info; + js_OCResourceHandle(args[0]->ToObject(), handle); + + NanReturnValue(returnValue); } -NAN_METHOD( bind_OCDeleteResource ) { - NanScope(); +NAN_METHOD(bind_OCDeleteResource) { + NanScope(); - OCStackResult returnValue; + OCStackResult returnValue; - VALIDATE_ARGUMENT_COUNT( args, 1 ); - VALIDATE_ARGUMENT_TYPE( args, 0, IsObject ); + VALIDATE_ARGUMENT_COUNT(args, 1); + VALIDATE_ARGUMENT_TYPE(args, 0, IsObject); - // Retrieve OCResourceHandle from JS object - OCResourceHandle handle = c_OCResourceHandle( args[ 0 ]->ToObject() ); - if ( !handle ) { - NanReturnUndefined(); - } + // Retrieve OCResourceHandle from JS object + OCResourceHandle handle = c_OCResourceHandle(args[0]->ToObject()); + if (!handle) { + NanReturnUndefined(); + } - // Delete the resource identified by the handle - returnValue = OCDeleteResource( handle ); + // Delete the resource identified by the handle + returnValue = OCDeleteResource(handle); - if ( returnValue == OC_STACK_OK ) { + if (returnValue == OC_STACK_OK) { + // If deleting the resource worked, get rid of the entity handler + callback_info *info = annotation[handle]; + annotation.erase(handle); + if (info) { + callback_info_free(info); + } + } - // If deleting the resource worked, get rid of the entity handler - callback_info *info = annotation[ handle ]; - annotation.erase( handle ); - if ( info ) { - callback_info_free( info ); - } - } - - NanReturnValue( NanNew( returnValue ) ); + NanReturnValue(NanNew(returnValue)); } -NAN_METHOD( bind_OCBindResourceHandler ) { - NanScope(); - - OCResourceHandle handle = 0; - callback_info *info = 0; - - VALIDATE_ARGUMENT_COUNT( args, 2 ); - VALIDATE_ARGUMENT_TYPE( args, 0, IsObject ); - VALIDATE_ARGUMENT_TYPE( args, 1, IsFunction ); - - // Retrieve OCResourceHandle from JS object - handle = c_OCResourceHandle( args[ 0 ]->ToObject() ); - if ( !handle ) { - NanReturnUndefined(); - } - - // Create a new callback - info = newInfoForJSCallback( Local::Cast( args[ 1 ] ) ); - if ( !info ) { - NanThrowError( "OCBindResourceHandler: Unable to allocate C callback" ); - NanReturnUndefined(); - } - - // Replace the existing entity handler with the new callback - OCStackResult returnValue = OCBindResourceHandler( - handle, - ( OCEntityHandler )( info->resultingFunction ) ); - - if ( returnValue == OC_STACK_OK ) { - - // If setting the new entity handler worked, get rid of the original entity handler and - // associate the new one with the handle. - callback_info *old_info = annotation[ handle ]; - if ( old_info ) { - callback_info_free( old_info ); - } - annotation[ handle ] = info; - } else { - - // If the stack was not able to make use of the new entity handler, get rid of the - // callback we created above. - callback_info_free( info ); - } - - NanReturnValue( NanNew( returnValue ) ); +NAN_METHOD(bind_OCBindResourceHandler) { + NanScope(); + + OCResourceHandle handle = 0; + callback_info *info = 0; + + VALIDATE_ARGUMENT_COUNT(args, 2); + VALIDATE_ARGUMENT_TYPE(args, 0, IsObject); + VALIDATE_ARGUMENT_TYPE(args, 1, IsFunction); + + // Retrieve OCResourceHandle from JS object + handle = c_OCResourceHandle(args[0]->ToObject()); + if (!handle) { + NanReturnUndefined(); + } + + // Create a new callback + info = newInfoForJSCallback(Local::Cast(args[1])); + if (!info) { + NanThrowError("OCBindResourceHandler: Unable to allocate C callback"); + NanReturnUndefined(); + } + + // Replace the existing entity handler with the new callback + OCStackResult returnValue = + OCBindResourceHandler(handle, (OCEntityHandler)(info->resultingFunction)); + + if (returnValue == OC_STACK_OK) { + // If setting the new entity handler worked, get rid of the original entity + // handler and associate the new one with the handle. + callback_info *old_info = annotation[handle]; + if (old_info) { + callback_info_free(old_info); + } + annotation[handle] = info; + } else { + // If the stack was not able to make use of the new entity handler, get rid + // of the callback we created above. + callback_info_free(info); + } + + NanReturnValue(NanNew(returnValue)); } diff --git a/src/functions/oc-create-delete-resource.h b/src/functions/oc-create-delete-resource.h index d686905d..32135f14 100644 --- a/src/functions/oc-create-delete-resource.h +++ b/src/functions/oc-create-delete-resource.h @@ -3,8 +3,8 @@ #include -NAN_METHOD( bind_OCCreateResource ); -NAN_METHOD( bind_OCDeleteResource ); -NAN_METHOD( bind_OCBindResourceHandler ); +NAN_METHOD(bind_OCCreateResource); +NAN_METHOD(bind_OCDeleteResource); +NAN_METHOD(bind_OCBindResourceHandler); #endif /* __IOTIVITY_NODE_OC_CREATE_DELETE_RESOURCE_H__ */ diff --git a/src/functions/oc-do-resource.cc b/src/functions/oc-do-resource.cc index 6119e3a7..90cdd047 100644 --- a/src/functions/oc-do-resource.cc +++ b/src/functions/oc-do-resource.cc @@ -11,115 +11,113 @@ extern "C" { using namespace v8; using namespace node; -// Create an object containing the information from an OCCLientResponse structure +// Create an object containing the information from an OCCLientResponse +// structure static OCStackApplicationResult defaultOCClientResponseHandler( - void *context, OCDoHandle handle, OCClientResponse *clientResponse ) { - - // Call the JS Callback - Local jsCallbackArguments[ 2 ] = { - NanNewBufferHandle( ( char * )&handle, sizeof( OCDoHandle ) ), - js_OCClientResponse( clientResponse ) - }; - Local returnValue = NanMakeCallback( - NanGetCurrentContext()->Global(), - NanNew( *( Persistent * )context ), - 2, jsCallbackArguments ); - - // Validate value we got back from it - VALIDATE_CALLBACK_RETURN_VALUE_TYPE( returnValue, IsUint32, "OCClientResponseHandler" ); - - // Pass on the value to the C API - return ( OCStackApplicationResult )returnValue->Uint32Value(); + void *context, OCDoHandle handle, OCClientResponse *clientResponse) { + // Call the JS Callback + Local jsCallbackArguments[2] = { + NanNewBufferHandle((char *)&handle, sizeof(OCDoHandle)), + js_OCClientResponse(clientResponse)}; + Local returnValue = NanMakeCallback( + NanGetCurrentContext()->Global(), + NanNew(*(Persistent *)context), 2, jsCallbackArguments); + + // Validate value we got back from it + VALIDATE_CALLBACK_RETURN_VALUE_TYPE(returnValue, IsUint32, + "OCClientResponseHandler"); + + // Pass on the value to the C API + return (OCStackApplicationResult)returnValue->Uint32Value(); } -static OCHeaderOption *oc_header_options_new( Handle array ) { - int index, optionIndex, optionLength; - int count = array->Length(); - OCHeaderOption *options = ( OCHeaderOption * )malloc( sizeof( OCHeaderOption ) * count ); - - if ( options ) { - for ( index = 0 ; index < count ; index++ ) { - options[ index ].protocolID = - ( OCTransportProtocolID )array->Get( index )->ToObject() - ->Get( NanNew( "protocolID" ) )->Uint32Value(); - options[ index ].optionID = - ( uint16_t )array->Get( index )->ToObject() - ->Get( NanNew( "optionID" ) )->Uint32Value(); - options[ index ].optionLength = - ( uint16_t )array->Get( index )->ToObject() - ->Get( NanNew( "optionLength" ) )->Uint32Value(); - - Handle jsOption = Handle::Cast( - array->Get( index )->ToObject() - ->Get( NanNew( "optionData" ) ) ) ; - optionLength = jsOption->Length(); - optionLength = ( optionLength > MAX_HEADER_OPTION_DATA_LENGTH ) ? - MAX_HEADER_OPTION_DATA_LENGTH : optionLength; - - for ( optionIndex = 0 ; optionIndex < optionLength ; optionIndex++ ) { - options[ index ].optionData[ optionIndex ] = - ( uint8_t )jsOption->Get( optionIndex )->Uint32Value(); - } - } - } - - return options; +static OCHeaderOption *oc_header_options_new(Handle array) { + int index, optionIndex, optionLength; + int count = array->Length(); + OCHeaderOption *options = + (OCHeaderOption *)malloc(sizeof(OCHeaderOption) * count); + + if (options) { + for (index = 0; index < count; index++) { + options[index].protocolID = (OCTransportProtocolID)array->Get(index) + ->ToObject() + ->Get(NanNew("protocolID")) + ->Uint32Value(); + options[index].optionID = (uint16_t)array->Get(index) + ->ToObject() + ->Get(NanNew("optionID")) + ->Uint32Value(); + options[index].optionLength = (uint16_t)array->Get(index) + ->ToObject() + ->Get(NanNew("optionLength")) + ->Uint32Value(); + + Handle jsOption = Handle::Cast( + array->Get(index)->ToObject()->Get(NanNew("optionData"))); + optionLength = jsOption->Length(); + optionLength = (optionLength > MAX_HEADER_OPTION_DATA_LENGTH) + ? MAX_HEADER_OPTION_DATA_LENGTH + : optionLength; + + for (optionIndex = 0; optionIndex < optionLength; optionIndex++) { + options[index].optionData[optionIndex] = + (uint8_t)jsOption->Get(optionIndex)->Uint32Value(); + } + } + } + + return options; } // Always returns NULL -static OCHeaderOption *oc_header_options_free( OCHeaderOption *options ) { - if ( options ) { - free( ( void * )options ); - } - return 0; +static OCHeaderOption *oc_header_options_free(OCHeaderOption *options) { + if (options) { + free((void *)options); + } + return 0; } -NAN_METHOD( bind_OCDoResource ) { - NanScope(); - - OCHeaderOption *options = 0; - OCDoHandle handle; - OCCallbackData data = { - 0, - defaultOCClientResponseHandler, - ( OCClientContextDeleter )persistentJSCallback_free - }; - - VALIDATE_ARGUMENT_COUNT( args, 9 ); - VALIDATE_ARGUMENT_TYPE( args, 0, IsObject ); - VALIDATE_ARGUMENT_TYPE( args, 1, IsUint32 ); - VALIDATE_ARGUMENT_TYPE( args, 2, IsString ); - VALIDATE_ARGUMENT_TYPE_OR_NULL( args, 3, IsString ); - VALIDATE_ARGUMENT_TYPE_OR_NULL( args, 4, IsString ); - VALIDATE_ARGUMENT_TYPE( args, 5, IsUint32 ); - VALIDATE_ARGUMENT_TYPE( args, 6, IsUint32 ); - VALIDATE_ARGUMENT_TYPE( args, 7, IsFunction ); - VALIDATE_ARGUMENT_TYPE_OR_NULL( args, 8, IsArray ); - VALIDATE_ARGUMENT_TYPE( args, 9, IsUint32 ); - - data.context = ( void * )persistentJSCallback_new( Local::Cast( args[ 7 ] ) ); - - if ( args[ 8 ]->IsArray() ) { - options = oc_header_options_new( Handle::Cast( args[ 8 ] ) ); - } - - Local returnValue = NanNew( - ( double )OCDoResource( - &handle, - ( OCMethod )args[ 1 ]->Uint32Value(), - ( const char * )*String::Utf8Value( args[ 2 ] ), - ( const char * )( args[ 3 ]->IsString() ? ( *String::Utf8Value( args[ 3 ] ) ) : 0 ), - ( const char * )( args[ 4 ]->IsString() ? ( *String::Utf8Value( args[ 4 ] ) ) : 0 ), - ( OCConnectivityType )args[ 5 ]->Uint32Value(), - ( OCQualityOfService )args[ 6 ]->Uint32Value(), - &data, - options, - ( uint8_t )args[ 9 ]->Uint32Value() ) ); - - options = oc_header_options_free( options ); - - args[ 0 ]->ToObject()->Set( NanNew( "handle" ), - NanNewBufferHandle( ( const char * )&handle, sizeof( OCDoHandle ) ) ); - - NanReturnValue( returnValue ); +NAN_METHOD(bind_OCDoResource) { + NanScope(); + + OCHeaderOption *options = 0; + OCDoHandle handle; + OCCallbackData data = {0, defaultOCClientResponseHandler, + (OCClientContextDeleter)persistentJSCallback_free}; + + VALIDATE_ARGUMENT_COUNT(args, 9); + VALIDATE_ARGUMENT_TYPE(args, 0, IsObject); + VALIDATE_ARGUMENT_TYPE(args, 1, IsUint32); + VALIDATE_ARGUMENT_TYPE(args, 2, IsString); + VALIDATE_ARGUMENT_TYPE_OR_NULL(args, 3, IsString); + VALIDATE_ARGUMENT_TYPE_OR_NULL(args, 4, IsString); + VALIDATE_ARGUMENT_TYPE(args, 5, IsUint32); + VALIDATE_ARGUMENT_TYPE(args, 6, IsUint32); + VALIDATE_ARGUMENT_TYPE(args, 7, IsFunction); + VALIDATE_ARGUMENT_TYPE_OR_NULL(args, 8, IsArray); + VALIDATE_ARGUMENT_TYPE(args, 9, IsUint32); + + data.context = + (void *)persistentJSCallback_new(Local::Cast(args[7])); + + if (args[8]->IsArray()) { + options = oc_header_options_new(Handle::Cast(args[8])); + } + + Local returnValue = NanNew((double)OCDoResource( + &handle, (OCMethod)args[1]->Uint32Value(), + (const char *)*String::Utf8Value(args[2]), + (const char *)(args[3]->IsString() ? (*String::Utf8Value(args[3])) : 0), + (const char *)(args[4]->IsString() ? (*String::Utf8Value(args[4])) : 0), + (OCConnectivityType)args[5]->Uint32Value(), + (OCQualityOfService)args[6]->Uint32Value(), &data, options, + (uint8_t)args[9]->Uint32Value())); + + options = oc_header_options_free(options); + + args[0]->ToObject()->Set( + NanNew("handle"), + NanNewBufferHandle((const char *)&handle, sizeof(OCDoHandle))); + + NanReturnValue(returnValue); } diff --git a/src/functions/oc-do-resource.h b/src/functions/oc-do-resource.h index 810d0d09..3501cb20 100644 --- a/src/functions/oc-do-resource.h +++ b/src/functions/oc-do-resource.h @@ -4,6 +4,6 @@ #include #include -NAN_METHOD( bind_OCDoResource ); +NAN_METHOD(bind_OCDoResource); #endif /* __IOTIVITY_NODE_OCDORESOURCE_H__ */ diff --git a/src/functions/oc-do-response.cc b/src/functions/oc-do-response.cc index 140c1a4e..c4dbcea6 100644 --- a/src/functions/oc-do-response.cc +++ b/src/functions/oc-do-response.cc @@ -11,20 +11,20 @@ extern "C" { using namespace v8; using namespace node; -NAN_METHOD( bind_OCDoResponse ) { - NanScope(); +NAN_METHOD(bind_OCDoResponse) { + NanScope(); - OCEntityHandlerResponse response; - char payload[ MAX_RESPONSE_LENGTH ]; + OCEntityHandlerResponse response; + char payload[MAX_RESPONSE_LENGTH]; - VALIDATE_ARGUMENT_COUNT( args, 1 ); - VALIDATE_ARGUMENT_TYPE( args, 0, IsObject ); + VALIDATE_ARGUMENT_COUNT(args, 1); + VALIDATE_ARGUMENT_TYPE(args, 0, IsObject); - response.payload = payload; + response.payload = payload; - if ( c_OCEntityHandlerResponse( &response, args[ 0 ]->ToObject() ) ) { - NanReturnValue( NanNew( OCDoResponse( &response ) ) ); - } else { - NanReturnUndefined(); - } + if (c_OCEntityHandlerResponse(&response, args[0]->ToObject())) { + NanReturnValue(NanNew(OCDoResponse(&response))); + } else { + NanReturnUndefined(); + } } diff --git a/src/functions/oc-do-response.h b/src/functions/oc-do-response.h index 299dd89e..f5fca1ac 100644 --- a/src/functions/oc-do-response.h +++ b/src/functions/oc-do-response.h @@ -3,6 +3,6 @@ #include -NAN_METHOD( bind_OCDoResponse ); +NAN_METHOD(bind_OCDoResponse); #endif /* __IOTIVITY_NODE_OCDORESPONSE_H__ */ diff --git a/src/functions/oc-notify.cc b/src/functions/oc-notify.cc index 5ede1a10..8241f02d 100644 --- a/src/functions/oc-notify.cc +++ b/src/functions/oc-notify.cc @@ -13,73 +13,72 @@ extern "C" { using namespace v8; using namespace node; -NAN_METHOD( bind_OCNotifyAllObservers ) { - NanScope(); - - VALIDATE_ARGUMENT_COUNT( args, 2 ); - VALIDATE_ARGUMENT_TYPE( args, 0, IsObject ); - VALIDATE_ARGUMENT_TYPE( args, 1, IsNumber ); - - OCResourceHandle handle = c_OCResourceHandle( args[ 0 ]->ToObject() ); - - if ( handle ) { - NanReturnValue( NanNew( OCNotifyAllObservers( - handle, - ( OCQualityOfService )args[ 1 ]->Uint32Value() ) ) ); - } else { - NanReturnUndefined(); - } +NAN_METHOD(bind_OCNotifyAllObservers) { + NanScope(); + + VALIDATE_ARGUMENT_COUNT(args, 2); + VALIDATE_ARGUMENT_TYPE(args, 0, IsObject); + VALIDATE_ARGUMENT_TYPE(args, 1, IsNumber); + + OCResourceHandle handle = c_OCResourceHandle(args[0]->ToObject()); + + if (handle) { + NanReturnValue(NanNew(OCNotifyAllObservers( + handle, (OCQualityOfService)args[1]->Uint32Value()))); + } else { + NanReturnUndefined(); + } } -NAN_METHOD( bind_OCNotifyListOfObservers ) { - NanScope(); - - VALIDATE_ARGUMENT_COUNT( args, 5 ); - VALIDATE_ARGUMENT_TYPE( args, 0, IsObject ); - VALIDATE_ARGUMENT_TYPE( args, 1, IsArray ); - VALIDATE_ARGUMENT_TYPE( args, 2, IsNumber ); - VALIDATE_ARGUMENT_TYPE( args, 3, IsString ); - VALIDATE_ARGUMENT_TYPE( args, 4, IsNumber ); - - OCResourceHandle handle = c_OCResourceHandle( args[ 0 ]->ToObject() ); - if ( !handle ) { - NanReturnUndefined(); - } - - // Construct the C array of observation IDs. - Local obsIds = Local::Cast( args[ 1 ] ); - uint8_t arrayLength = ( uint8_t )obsIds->Length(); - uint8_t numberOfIds = ( uint8_t )args[ 2 ]->Uint32Value(); - - // If the array contains fewer IDs than the reported number, we use the lower number - numberOfIds = ( numberOfIds < arrayLength ? numberOfIds : arrayLength ); - - OCObservationId *c_observations = - ( OCObservationId * )malloc( numberOfIds * sizeof( OCObservationId ) ); - if ( !c_observations && numberOfIds > 0 ) { - NanThrowError( "OCNotifyListOfObservers: Failed to allocate list of observers" ); - NanReturnUndefined(); - } - - // Populate a C-like array from the V8 array - int index; - for ( index = 0 ; index < numberOfIds ; index++ ) { - Local oneObservationId = obsIds->Get( index ); - if ( !( oneObservationId->IsNumber() ) ) { - NanThrowTypeError( "OCObservationID must satisfy IsNumber()" ); - NanReturnUndefined(); - } - c_observations[ index ] = ( OCObservationId )oneObservationId->Uint32Value(); - } - - Local returnValue = NanNew( OCNotifyListOfObservers( - handle, - c_observations, - numberOfIds, - ( const char * )*String::Utf8Value( args[ 3 ] ), - ( OCQualityOfService )args[ 4 ]->Uint32Value() ) ); - - free( c_observations ); - - NanReturnValue( returnValue ); +NAN_METHOD(bind_OCNotifyListOfObservers) { + NanScope(); + + VALIDATE_ARGUMENT_COUNT(args, 5); + VALIDATE_ARGUMENT_TYPE(args, 0, IsObject); + VALIDATE_ARGUMENT_TYPE(args, 1, IsArray); + VALIDATE_ARGUMENT_TYPE(args, 2, IsNumber); + VALIDATE_ARGUMENT_TYPE(args, 3, IsString); + VALIDATE_ARGUMENT_TYPE(args, 4, IsNumber); + + OCResourceHandle handle = c_OCResourceHandle(args[0]->ToObject()); + if (!handle) { + NanReturnUndefined(); + } + + // Construct the C array of observation IDs. + Local obsIds = Local::Cast(args[1]); + uint8_t arrayLength = (uint8_t)obsIds->Length(); + uint8_t numberOfIds = (uint8_t)args[2]->Uint32Value(); + + // If the array contains fewer IDs than the reported number, we use the lower + // number + numberOfIds = (numberOfIds < arrayLength ? numberOfIds : arrayLength); + + OCObservationId *c_observations = + (OCObservationId *)malloc(numberOfIds * sizeof(OCObservationId)); + if (!c_observations && numberOfIds > 0) { + NanThrowError( + "OCNotifyListOfObservers: Failed to allocate list of observers"); + NanReturnUndefined(); + } + + // Populate a C-like array from the V8 array + int index; + for (index = 0; index < numberOfIds; index++) { + Local oneObservationId = obsIds->Get(index); + if (!(oneObservationId->IsNumber())) { + NanThrowTypeError("OCObservationID must satisfy IsNumber()"); + NanReturnUndefined(); + } + c_observations[index] = (OCObservationId)oneObservationId->Uint32Value(); + } + + Local returnValue = NanNew( + OCNotifyListOfObservers(handle, c_observations, numberOfIds, + (const char *)*String::Utf8Value(args[3]), + (OCQualityOfService)args[4]->Uint32Value())); + + free(c_observations); + + NanReturnValue(returnValue); } diff --git a/src/functions/oc-notify.h b/src/functions/oc-notify.h index 610200dc..f0d8bef4 100644 --- a/src/functions/oc-notify.h +++ b/src/functions/oc-notify.h @@ -3,7 +3,7 @@ #include -NAN_METHOD( bind_OCNotifyAllObservers ); -NAN_METHOD( bind_OCNotifyListOfObservers ); +NAN_METHOD(bind_OCNotifyAllObservers); +NAN_METHOD(bind_OCNotifyListOfObservers); #endif /* __IOTIVITY_NODE_OC_NOTIFY_H__ */ diff --git a/src/functions/simple.cc b/src/functions/simple.cc index 933e70eb..db6e9e29 100644 --- a/src/functions/simple.cc +++ b/src/functions/simple.cc @@ -8,92 +8,94 @@ extern "C" { using namespace v8; -NAN_METHOD( bind_OCInit ) { - NanScope(); - - VALIDATE_ARGUMENT_COUNT( args, 3 ); - VALIDATE_ARGUMENT_TYPE_OR_NULL( args, 0, IsString ); - VALIDATE_ARGUMENT_TYPE( args, 1, IsUint32 ); - VALIDATE_ARGUMENT_TYPE( args, 2, IsNumber ); - - NanReturnValue( NanNew( OCInit( - ( const char * )( args[ 0 ]->IsString() ? ( *String::Utf8Value( args[ 0 ] ) ) : 0 ), - ( uint16_t )args[ 1 ]->ToUint32()->Value(), - ( OCMode )args[ 2 ]->ToNumber()->Value() ) ) ); +NAN_METHOD(bind_OCInit) { + NanScope(); + + VALIDATE_ARGUMENT_COUNT(args, 3); + VALIDATE_ARGUMENT_TYPE_OR_NULL(args, 0, IsString); + VALIDATE_ARGUMENT_TYPE(args, 1, IsUint32); + VALIDATE_ARGUMENT_TYPE(args, 2, IsNumber); + + NanReturnValue(NanNew(OCInit( + (const char*)(args[0]->IsString() ? (*String::Utf8Value(args[0])) : 0), + (uint16_t)args[1]->ToUint32()->Value(), + (OCMode)args[2]->ToNumber()->Value()))); } -NAN_METHOD( bind_OCStop ) { - NanScope(); +NAN_METHOD(bind_OCStop) { + NanScope(); - NanReturnValue( NanNew( OCStop() ) ); + NanReturnValue(NanNew(OCStop())); } -NAN_METHOD( bind_OCProcess ) { - NanScope(); +NAN_METHOD(bind_OCProcess) { + NanScope(); - NanReturnValue( NanNew( OCProcess() ) ); + NanReturnValue(NanNew(OCProcess())); } -NAN_METHOD( bind_OCStartPresence ) { - NanScope(); +NAN_METHOD(bind_OCStartPresence) { + NanScope(); - VALIDATE_ARGUMENT_COUNT( args, 1 ); - VALIDATE_ARGUMENT_TYPE( args, 0, IsUint32 ); + VALIDATE_ARGUMENT_COUNT(args, 1); + VALIDATE_ARGUMENT_TYPE(args, 0, IsUint32); - NanReturnValue( NanNew( OCStartPresence( ( uint32_t )args[ 0 ]->Uint32Value() ) ) ); + NanReturnValue( + NanNew(OCStartPresence((uint32_t)args[0]->Uint32Value()))); } -NAN_METHOD( bind_OCStopPresence ) { - NanScope(); +NAN_METHOD(bind_OCStopPresence) { + NanScope(); - NanReturnValue( NanNew( OCStopPresence() ) ); + NanReturnValue(NanNew(OCStopPresence())); } -NAN_METHOD( bind_OCDevAddrToIPv4Addr ) { - NanScope(); +NAN_METHOD(bind_OCDevAddrToIPv4Addr) { + NanScope(); - VALIDATE_ARGUMENT_COUNT( args, 2 ); - VALIDATE_ARGUMENT_TYPE( args, 0, IsObject ); - VALIDATE_ARGUMENT_TYPE( args, 1, IsArray ); + VALIDATE_ARGUMENT_COUNT(args, 2); + VALIDATE_ARGUMENT_TYPE(args, 0, IsObject); + VALIDATE_ARGUMENT_TYPE(args, 1, IsArray); - OCDevAddr c_addr; + OCDevAddr c_addr; - if ( !c_OCDevAddr( args[ 0 ]->ToObject(), &c_addr ) ) { - NanReturnUndefined(); - } + if (!c_OCDevAddr(args[0]->ToObject(), &c_addr)) { + NanReturnUndefined(); + } - uint8_t a = 0, b = 0, c = 0, d = 0; + uint8_t a = 0, b = 0, c = 0, d = 0; - OCStackResult result = ( OCStackResult )OCDevAddrToIPv4Addr( &c_addr, &a, &b, &c, &d ); + OCStackResult result = + (OCStackResult)OCDevAddrToIPv4Addr(&c_addr, &a, &b, &c, &d); - Local array = Local::Cast( args[ 1 ] ); + Local array = Local::Cast(args[1]); - array->Set( 0, NanNew( a ) ); - array->Set( 1, NanNew( b ) ); - array->Set( 2, NanNew( c ) ); - array->Set( 3, NanNew( d ) ); + array->Set(0, NanNew(a)); + array->Set(1, NanNew(b)); + array->Set(2, NanNew(c)); + array->Set(3, NanNew(d)); - NanReturnValue( NanNew( result ) ); + NanReturnValue(NanNew(result)); } -NAN_METHOD( bind_OCDevAddrToPort ) { - NanScope(); +NAN_METHOD(bind_OCDevAddrToPort) { + NanScope(); - VALIDATE_ARGUMENT_COUNT( args, 2 ); - VALIDATE_ARGUMENT_TYPE( args, 0, IsObject ); - VALIDATE_ARGUMENT_TYPE( args, 1, IsObject ); + VALIDATE_ARGUMENT_COUNT(args, 2); + VALIDATE_ARGUMENT_TYPE(args, 0, IsObject); + VALIDATE_ARGUMENT_TYPE(args, 1, IsObject); - OCDevAddr c_addr; + OCDevAddr c_addr; - if ( !c_OCDevAddr( args[ 0 ]->ToObject(), &c_addr ) ) { - NanReturnUndefined(); - } + if (!c_OCDevAddr(args[0]->ToObject(), &c_addr)) { + NanReturnUndefined(); + } - uint16_t port = 0; + uint16_t port = 0; - OCStackResult result = ( OCStackResult )OCDevAddrToPort( &c_addr, &port ); + OCStackResult result = (OCStackResult)OCDevAddrToPort(&c_addr, &port); - args[ 1 ]->ToObject()->Set( NanNew( "port" ), NanNew( port ) ); + args[1]->ToObject()->Set(NanNew("port"), NanNew(port)); - NanReturnValue( NanNew( result ) ); + NanReturnValue(NanNew(result)); } diff --git a/src/functions/simple.h b/src/functions/simple.h index 1ec1eeb3..dfd9bc1c 100644 --- a/src/functions/simple.h +++ b/src/functions/simple.h @@ -3,12 +3,12 @@ #include -NAN_METHOD( bind_OCInit ); -NAN_METHOD( bind_OCStop ); -NAN_METHOD( bind_OCProcess ); -NAN_METHOD( bind_OCStartPresence ); -NAN_METHOD( bind_OCStopPresence ); -NAN_METHOD( bind_OCDevAddrToIPv4Addr ); -NAN_METHOD( bind_OCDevAddrToPort ); +NAN_METHOD(bind_OCInit); +NAN_METHOD(bind_OCStop); +NAN_METHOD(bind_OCProcess); +NAN_METHOD(bind_OCStartPresence); +NAN_METHOD(bind_OCStopPresence); +NAN_METHOD(bind_OCDevAddrToIPv4Addr); +NAN_METHOD(bind_OCDevAddrToPort); #endif /* __IOTIVITY_NODE_FUNCTIONS_SIMPLE_H__ */ diff --git a/src/main.cc b/src/main.cc index 5a1f7bac..f830ff47 100644 --- a/src/main.cc +++ b/src/main.cc @@ -10,25 +10,21 @@ extern "C" { using namespace v8; -void Init( Handle exports, Handle module ) { - InitFunctions( exports, module ); - InitEnums( exports ); +void Init(Handle exports, Handle module) { + InitFunctions(exports, module); + InitEnums(exports); - exports->Set( - NanNew( "MAX_RESPONSE_LENGTH" ), - NanNew( MAX_RESPONSE_LENGTH ) ); + exports->Set(NanNew("MAX_RESPONSE_LENGTH"), + NanNew(MAX_RESPONSE_LENGTH)); - exports->Set( - NanNew( "MAX_URI_LENGTH" ), - NanNew( MAX_URI_LENGTH ) ); + exports->Set(NanNew("MAX_URI_LENGTH"), + NanNew(MAX_URI_LENGTH)); - exports->Set( - NanNew( "MAX_HEADER_OPTIONS" ), - NanNew( MAX_HEADER_OPTIONS ) ); + exports->Set(NanNew("MAX_HEADER_OPTIONS"), + NanNew(MAX_HEADER_OPTIONS)); - exports->Set( - NanNew( "MAX_HEADER_OPTION_DATA_LENGTH" ), - NanNew( MAX_HEADER_OPTION_DATA_LENGTH ) ); + exports->Set(NanNew("MAX_HEADER_OPTION_DATA_LENGTH"), + NanNew(MAX_HEADER_OPTION_DATA_LENGTH)); } -NODE_MODULE( iotivity, Init ) +NODE_MODULE(iotivity, Init) diff --git a/src/structures.cc b/src/structures.cc index 47373341..3d2200d2 100644 --- a/src/structures.cc +++ b/src/structures.cc @@ -11,313 +11,309 @@ extern "C" { using namespace v8; using namespace node; -static void addHeaderOptions( - Local jsObject, - uint8_t optionCount, - OCHeaderOption *options ) { - uint32_t optionIndex, optionDataIndex; - - // numRcvdVendorSpecificHeaderOptions - jsObject->Set( - NanNew( "numRcvdVendorSpecificHeaderOptions" ), - NanNew( optionCount ) ); - - // rcvdVendorSpecificHeaderOptions - Local headerOptions = NanNew( optionCount ); - - // rcvdVendorSpecificHeaderOptions[ index ] - for ( optionIndex = 0 ; optionIndex < optionCount ; optionIndex++ ) { - Local headerOption = NanNew(); - - // response.rcvdVendorSpecificHeaderOptions[ index ].protocolID - headerOption->Set( NanNew( "protocolID" ), - NanNew( options[ optionIndex ].protocolID ) ); - - // response.rcvdVendorSpecificHeaderOptions[ index ].optionID - headerOption->Set( NanNew( "optionID" ), - NanNew( options[ optionIndex ].optionID ) ); - - // response.rcvdVendorSpecificHeaderOptions[ index ].optionLength - headerOption->Set( NanNew( "optionLength" ), - NanNew( options[ optionIndex ].optionLength ) ); - - // response.rcvdVendorSpecificHeaderOptions[ index ].optionData - Local headerOptionData = NanNew( - options[ optionIndex ].optionLength ); - for ( optionDataIndex = 0 ; - optionDataIndex < options[ optionIndex ].optionLength ; - optionDataIndex++ ) { - headerOptionData->Set( - optionDataIndex, - NanNew( options[ optionIndex ].optionData[ optionDataIndex ] ) ); - } - headerOption->Set( NanNew( "optionData" ), headerOptionData ); - headerOptions->Set( optionIndex, headerOption ); - } - jsObject->Set( NanNew( "rcvdVendorSpecificHeaderOptions" ), headerOptions ); +static void addHeaderOptions(Local jsObject, uint8_t optionCount, + OCHeaderOption *options) { + uint32_t optionIndex, optionDataIndex; + + // numRcvdVendorSpecificHeaderOptions + jsObject->Set(NanNew("numRcvdVendorSpecificHeaderOptions"), + NanNew(optionCount)); + + // rcvdVendorSpecificHeaderOptions + Local headerOptions = NanNew(optionCount); + + // rcvdVendorSpecificHeaderOptions[ index ] + for (optionIndex = 0; optionIndex < optionCount; optionIndex++) { + Local headerOption = NanNew(); + + // response.rcvdVendorSpecificHeaderOptions[ index ].protocolID + headerOption->Set(NanNew("protocolID"), + NanNew(options[optionIndex].protocolID)); + + // response.rcvdVendorSpecificHeaderOptions[ index ].optionID + headerOption->Set(NanNew("optionID"), + NanNew(options[optionIndex].optionID)); + + // response.rcvdVendorSpecificHeaderOptions[ index ].optionLength + headerOption->Set(NanNew("optionLength"), + NanNew(options[optionIndex].optionLength)); + + // response.rcvdVendorSpecificHeaderOptions[ index ].optionData + Local headerOptionData = + NanNew(options[optionIndex].optionLength); + for (optionDataIndex = 0; + optionDataIndex < options[optionIndex].optionLength; + optionDataIndex++) { + headerOptionData->Set( + optionDataIndex, + NanNew(options[optionIndex].optionData[optionDataIndex])); + } + headerOption->Set(NanNew("optionData"), headerOptionData); + headerOptions->Set(optionIndex, headerOption); + } + jsObject->Set(NanNew("rcvdVendorSpecificHeaderOptions"), + headerOptions); } -Local js_OCClientResponse( OCClientResponse *response ) { - Local jsResponse = NanNew(); +Local js_OCClientResponse(OCClientResponse *response) { + Local jsResponse = NanNew(); - jsResponse->Set( NanNew( "addr" ), js_OCDevAddr( response->addr ) ); + jsResponse->Set(NanNew("addr"), js_OCDevAddr(response->addr)); - // jsResponse.connType - jsResponse->Set( NanNew( "connType" ), NanNew( response->connType ) ); + // jsResponse.connType + jsResponse->Set(NanNew("connType"), + NanNew(response->connType)); - // jsResponse.result - jsResponse->Set( NanNew( "result" ), NanNew( response->result ) ); + // jsResponse.result + jsResponse->Set(NanNew("result"), NanNew(response->result)); - // jsResponse.sequenceNumber - jsResponse->Set( NanNew( "sequenceNumber" ), - NanNew( response->sequenceNumber ) ); + // jsResponse.sequenceNumber + jsResponse->Set(NanNew("sequenceNumber"), + NanNew(response->sequenceNumber)); - // jsResponse.resJSONPayload - if ( response->resJSONPayload ) { - jsResponse->Set( NanNew( "resJSONPayload" ), - NanNew( response->resJSONPayload ) ); - } + // jsResponse.resJSONPayload + if (response->resJSONPayload) { + jsResponse->Set(NanNew("resJSONPayload"), + NanNew(response->resJSONPayload)); + } - addHeaderOptions( - jsResponse, - response->numRcvdVendorSpecificHeaderOptions, - response->rcvdVendorSpecificHeaderOptions ); + addHeaderOptions(jsResponse, response->numRcvdVendorSpecificHeaderOptions, + response->rcvdVendorSpecificHeaderOptions); - return jsResponse; + return jsResponse; } -bool c_OCEntityHandlerResponse( - OCEntityHandlerResponse *destination, - v8::Local jsOCEntityHandlerResponse ) { - - // requestHandle - Local requestHandle = - jsOCEntityHandlerResponse->Get( NanNew( "requestHandle" ) ); - if ( !Buffer::HasInstance( requestHandle ) ) { - NanThrowTypeError( "requestHandle is not a Node::Buffer" ); - return false; - } - destination->requestHandle = *( OCRequestHandle * )Buffer::Data( requestHandle->ToObject() ); - - // responseHandle is filled in by the stack - - // resourceHandle - Local resourceHandle = - jsOCEntityHandlerResponse->Get( NanNew( "resourceHandle" ) ); - if ( !Buffer::HasInstance( resourceHandle ) ) { - NanThrowTypeError( "resourceHandle is not a Node::Buffer" ); - return false; - } - destination->resourceHandle = *( OCResourceHandle * )Buffer::Data( resourceHandle->ToObject() ); - - // ehResult - Local ehResult = jsOCEntityHandlerResponse->Get( NanNew( "ehResult" ) ); - VALIDATE_VALUE_TYPE( ehResult, IsUint32, "ehResult", false ); - destination->ehResult = ( OCEntityHandlerResult )ehResult->Uint32Value(); - - // payload and payloadSize - Local payload = jsOCEntityHandlerResponse->Get( NanNew( "payload" ) ); - VALIDATE_VALUE_TYPE( payload, IsString, "payload", false ); - - // Make sure the size in bytes of the UTF-8 representation, including the terminating NULL - // character, does not exceed MAX_RESPONSE_LENGTH - size_t payloadLength = ( size_t )payload->ToString()->Utf8Length(); - if ( payloadLength >= MAX_RESPONSE_LENGTH ) { - NanThrowRangeError( "payload is longer than MAX_RESPONSE_LENGTH" ); - return false; - } - - // Zero out the destination and copy the string into it, and indicate the payload size - memset( destination->payload, 0, MAX_RESPONSE_LENGTH ); - strncpy( - destination->payload, - ( const char * )*String::Utf8Value( payload ), - MAX_RESPONSE_LENGTH ); - destination->payloadSize = payloadLength; - - // numSendVendorSpecificHeaderOptions - Local numSendVendorSpecificHeaderOptions = jsOCEntityHandlerResponse->Get( - NanNew( "numSendVendorSpecificHeaderOptions" ) ); - VALIDATE_VALUE_TYPE( - numSendVendorSpecificHeaderOptions, - IsUint32, - "numSendVendorSpecificHeaderOptions", - false ); - uint8_t headerOptionCount = ( uint8_t )numSendVendorSpecificHeaderOptions->Uint32Value(); - if ( headerOptionCount > MAX_HEADER_OPTIONS ) { - NanThrowRangeError( - "numSendVendorSpecificHeaderOptions is larger than MAX_HEADER_OPTIONS" ); - return false; - } - destination->numSendVendorSpecificHeaderOptions = headerOptionCount; - - // sendVendorSpecificHeaderOptions - int headerOptionIndex, optionDataIndex; - Local headerOptionsValue = jsOCEntityHandlerResponse->Get( - NanNew( "sendVendorSpecificHeaderOptions" ) ); - VALIDATE_VALUE_TYPE( - headerOptionsValue, - IsArray, - "sendVendorSpecificHeaderOptions", - false ); - Local headerOptions = Local::Cast( headerOptionsValue ); - for ( headerOptionIndex = 0 ; headerOptionIndex < headerOptionCount; headerOptionIndex++ ) { - Local headerOptionValue = headerOptions->Get( headerOptionIndex ); - VALIDATE_VALUE_TYPE( - headerOptionValue, - IsObject, - "sendVendorSpecificHeaderOptions member", - false ); - Local headerOption = headerOptionValue->ToObject(); - - // sendVendorSpecificHeaderOptions[].protocolID - Local protocolIDValue = headerOption->Get( NanNew( "protocolID" ) ); - VALIDATE_VALUE_TYPE( protocolIDValue, IsUint32, "protocolID", false ); - destination->sendVendorSpecificHeaderOptions[ headerOptionIndex ].protocolID = - ( OCTransportProtocolID )protocolIDValue->Uint32Value(); - - // sendVendorSpecificHeaderOptions[].optionID - Local optionIDValue = headerOption->Get( - NanNew( "optionID" ) ); - VALIDATE_VALUE_TYPE( optionIDValue, IsUint32, "optionID", false ); - destination->sendVendorSpecificHeaderOptions[ headerOptionIndex ].optionID = - ( uint16_t )protocolIDValue->Uint32Value(); - - // sendVendorSpecificHeaderOptions[].optionLength - Local optionLengthValue = headerOption->Get( - NanNew( "optionLength" ) ); - VALIDATE_VALUE_TYPE( optionLengthValue, IsUint32, "optionLength", false ); - uint16_t optionLength = ( uint16_t )optionLengthValue->Uint32Value(); - if ( optionLength > MAX_HEADER_OPTION_DATA_LENGTH ) { - NanThrowRangeError( "optionLength is larger than MAX_HEADER_OPTION_DATA_LENGTH" ); - return false; - } - destination->sendVendorSpecificHeaderOptions[ headerOptionIndex ].optionLength = - optionLength; - - // sendVendorSpecificHeaderOptions[].optionData - Local optionDataValue = headerOption->Get( NanNew( "optionData" ) ); - VALIDATE_VALUE_TYPE( optionDataValue, IsArray, "optionData", false ); - Local optionData = Local::Cast( optionDataValue ); - for ( optionDataIndex = 0 ; optionDataIndex < optionLength ; optionDataIndex++ ) { - Local optionDataItemValue = optionData->Get( optionDataIndex ); - VALIDATE_VALUE_TYPE( optionDataItemValue, IsUint32, "optionData item", false ); - destination->sendVendorSpecificHeaderOptions[ headerOptionIndex ] - .optionData[ optionDataIndex ] = ( uint8_t )optionDataItemValue->Uint32Value(); - } - } - - return true; +bool c_OCEntityHandlerResponse(OCEntityHandlerResponse *destination, + v8::Local jsOCEntityHandlerResponse) { + // requestHandle + Local requestHandle = + jsOCEntityHandlerResponse->Get(NanNew("requestHandle")); + if (!Buffer::HasInstance(requestHandle)) { + NanThrowTypeError("requestHandle is not a Node::Buffer"); + return false; + } + destination->requestHandle = + *(OCRequestHandle *)Buffer::Data(requestHandle->ToObject()); + + // responseHandle is filled in by the stack + + // resourceHandle + Local resourceHandle = + jsOCEntityHandlerResponse->Get(NanNew("resourceHandle")); + if (!Buffer::HasInstance(resourceHandle)) { + NanThrowTypeError("resourceHandle is not a Node::Buffer"); + return false; + } + destination->resourceHandle = + *(OCResourceHandle *)Buffer::Data(resourceHandle->ToObject()); + + // ehResult + Local ehResult = + jsOCEntityHandlerResponse->Get(NanNew("ehResult")); + VALIDATE_VALUE_TYPE(ehResult, IsUint32, "ehResult", false); + destination->ehResult = (OCEntityHandlerResult)ehResult->Uint32Value(); + + // payload and payloadSize + Local payload = + jsOCEntityHandlerResponse->Get(NanNew("payload")); + VALIDATE_VALUE_TYPE(payload, IsString, "payload", false); + + // Make sure the size in bytes of the UTF-8 representation, including the + // terminating NULL + // character, does not exceed MAX_RESPONSE_LENGTH + size_t payloadLength = (size_t)payload->ToString()->Utf8Length(); + if (payloadLength >= MAX_RESPONSE_LENGTH) { + NanThrowRangeError("payload is longer than MAX_RESPONSE_LENGTH"); + return false; + } + + // Zero out the destination and copy the string into it, and indicate the + // payload size + memset(destination->payload, 0, MAX_RESPONSE_LENGTH); + strncpy(destination->payload, (const char *)*String::Utf8Value(payload), + MAX_RESPONSE_LENGTH); + destination->payloadSize = payloadLength; + + // numSendVendorSpecificHeaderOptions + Local numSendVendorSpecificHeaderOptions = + jsOCEntityHandlerResponse->Get( + NanNew("numSendVendorSpecificHeaderOptions")); + VALIDATE_VALUE_TYPE(numSendVendorSpecificHeaderOptions, IsUint32, + "numSendVendorSpecificHeaderOptions", false); + uint8_t headerOptionCount = + (uint8_t)numSendVendorSpecificHeaderOptions->Uint32Value(); + if (headerOptionCount > MAX_HEADER_OPTIONS) { + NanThrowRangeError( + "numSendVendorSpecificHeaderOptions is larger than MAX_HEADER_OPTIONS"); + return false; + } + destination->numSendVendorSpecificHeaderOptions = headerOptionCount; + + // sendVendorSpecificHeaderOptions + int headerOptionIndex, optionDataIndex; + Local headerOptionsValue = jsOCEntityHandlerResponse->Get( + NanNew("sendVendorSpecificHeaderOptions")); + VALIDATE_VALUE_TYPE(headerOptionsValue, IsArray, + "sendVendorSpecificHeaderOptions", false); + Local headerOptions = Local::Cast(headerOptionsValue); + for (headerOptionIndex = 0; headerOptionIndex < headerOptionCount; + headerOptionIndex++) { + Local headerOptionValue = headerOptions->Get(headerOptionIndex); + VALIDATE_VALUE_TYPE(headerOptionValue, IsObject, + "sendVendorSpecificHeaderOptions member", false); + Local headerOption = headerOptionValue->ToObject(); + + // sendVendorSpecificHeaderOptions[].protocolID + Local protocolIDValue = + headerOption->Get(NanNew("protocolID")); + VALIDATE_VALUE_TYPE(protocolIDValue, IsUint32, "protocolID", false); + destination->sendVendorSpecificHeaderOptions[headerOptionIndex].protocolID = + (OCTransportProtocolID)protocolIDValue->Uint32Value(); + + // sendVendorSpecificHeaderOptions[].optionID + Local optionIDValue = headerOption->Get(NanNew("optionID")); + VALIDATE_VALUE_TYPE(optionIDValue, IsUint32, "optionID", false); + destination->sendVendorSpecificHeaderOptions[headerOptionIndex].optionID = + (uint16_t)protocolIDValue->Uint32Value(); + + // sendVendorSpecificHeaderOptions[].optionLength + Local optionLengthValue = + headerOption->Get(NanNew("optionLength")); + VALIDATE_VALUE_TYPE(optionLengthValue, IsUint32, "optionLength", false); + uint16_t optionLength = (uint16_t)optionLengthValue->Uint32Value(); + if (optionLength > MAX_HEADER_OPTION_DATA_LENGTH) { + NanThrowRangeError( + "optionLength is larger than MAX_HEADER_OPTION_DATA_LENGTH"); + return false; + } + destination->sendVendorSpecificHeaderOptions[headerOptionIndex] + .optionLength = optionLength; + + // sendVendorSpecificHeaderOptions[].optionData + Local optionDataValue = + headerOption->Get(NanNew("optionData")); + VALIDATE_VALUE_TYPE(optionDataValue, IsArray, "optionData", false); + Local optionData = Local::Cast(optionDataValue); + for (optionDataIndex = 0; optionDataIndex < optionLength; + optionDataIndex++) { + Local optionDataItemValue = optionData->Get(optionDataIndex); + VALIDATE_VALUE_TYPE(optionDataItemValue, IsUint32, "optionData item", + false); + destination->sendVendorSpecificHeaderOptions[headerOptionIndex] + .optionData[optionDataIndex] = + (uint8_t)optionDataItemValue->Uint32Value(); + } + } + + return true; } -Local js_OCResourceHandle( - Local jsHandle, - OCResourceHandle handle ) { +Local js_OCResourceHandle(Local jsHandle, + OCResourceHandle handle) { + jsHandle->Set( + NanNew("handle"), + NanNewBufferHandle((const char *)&handle, sizeof(OCResourceHandle))); - jsHandle->Set( NanNew( "handle" ), - NanNewBufferHandle( ( const char * )&handle, sizeof( OCResourceHandle ) ) ); - - return jsHandle; + return jsHandle; } -OCResourceHandle c_OCResourceHandle( Local jsHandle ) { - - Local handle = jsHandle->Get( NanNew( "handle" ) ); +OCResourceHandle c_OCResourceHandle(Local jsHandle) { + Local handle = jsHandle->Get(NanNew("handle")); - if ( !Buffer::HasInstance( handle ) ) { - NanThrowTypeError( "OCResourceHandle.handle is not a Node::Buffer" ); - return 0; - } + if (!Buffer::HasInstance(handle)) { + NanThrowTypeError("OCResourceHandle.handle is not a Node::Buffer"); + return 0; + } - return *( OCResourceHandle * )Buffer::Data( handle->ToObject() ); + return *(OCResourceHandle *)Buffer::Data(handle->ToObject()); } // Returns the Local which was passed in -static Local js_OCRequestHandle( Local jsHandle, OCRequestHandle handle ) { - jsHandle->Set( NanNew( "handle" ), - NanNewBufferHandle( ( const char * )&handle, sizeof( OCRequestHandle ) ) ); +static Local js_OCRequestHandle(Local jsHandle, + OCRequestHandle handle) { + jsHandle->Set( + NanNew("handle"), + NanNewBufferHandle((const char *)&handle, sizeof(OCRequestHandle))); - return jsHandle; + return jsHandle; } -Local js_OCEntityHandlerRequest( OCEntityHandlerRequest *request ) { - Local jsRequest = NanNew(); +Local js_OCEntityHandlerRequest(OCEntityHandlerRequest *request) { + Local jsRequest = NanNew(); - jsRequest->Set( NanNew( "resource" ), - js_OCResourceHandle( NanNew(), request->resource ) ); + jsRequest->Set(NanNew("resource"), + js_OCResourceHandle(NanNew(), request->resource)); - jsRequest->Set( NanNew( "requestHandle" ), - js_OCRequestHandle( NanNew(), request->requestHandle ) ); + jsRequest->Set(NanNew("requestHandle"), + js_OCRequestHandle(NanNew(), request->requestHandle)); - jsRequest->Set( NanNew( "method" ), NanNew( request->method ) ); - if ( request->query ) { - jsRequest->Set( NanNew( "query" ), NanNew( request->query ) ); - } + jsRequest->Set(NanNew("method"), NanNew(request->method)); + if (request->query) { + jsRequest->Set(NanNew("query"), NanNew(request->query)); + } - Local obsInfo = NanNew(); - obsInfo->Set( NanNew( "action" ), NanNew( request->obsInfo.action ) ); - obsInfo->Set( NanNew( "obsId" ), NanNew( request->obsInfo.obsId ) ); - jsRequest->Set( NanNew( "obsInfo" ), obsInfo ); + Local obsInfo = NanNew(); + obsInfo->Set(NanNew("action"), + NanNew(request->obsInfo.action)); + obsInfo->Set(NanNew("obsId"), NanNew(request->obsInfo.obsId)); + jsRequest->Set(NanNew("obsInfo"), obsInfo); - if ( request->reqJSONPayload ) { - jsRequest->Set( - NanNew( "reqJSONPayload" ), - NanNew( request->reqJSONPayload ) ); - } + if (request->reqJSONPayload) { + jsRequest->Set(NanNew("reqJSONPayload"), + NanNew(request->reqJSONPayload)); + } - addHeaderOptions( - jsRequest, - request->numRcvdVendorSpecificHeaderOptions, - request->rcvdVendorSpecificHeaderOptions ); + addHeaderOptions(jsRequest, request->numRcvdVendorSpecificHeaderOptions, + request->rcvdVendorSpecificHeaderOptions); - return jsRequest; + return jsRequest; } -Local js_OCDevAddr( OCDevAddr *address ) { - uint32_t addressIndex; - Local returnValue = NanNew(); +Local js_OCDevAddr(OCDevAddr *address) { + uint32_t addressIndex; + Local returnValue = NanNew(); - // addr.size - returnValue->Set( NanNew( "size" ), NanNew( address->size ) ); + // addr.size + returnValue->Set(NanNew("size"), NanNew(address->size)); - // addr.addr - Local addrAddr = NanNew( DEV_ADDR_SIZE_MAX ); - for ( addressIndex = 0 ; addressIndex < DEV_ADDR_SIZE_MAX ; addressIndex++ ) { - addrAddr->Set( addressIndex, NanNew( - address->addr[ addressIndex ] ) ); - } - returnValue->Set( NanNew( "addr" ), addrAddr ); + // addr.addr + Local addrAddr = NanNew(DEV_ADDR_SIZE_MAX); + for (addressIndex = 0; addressIndex < DEV_ADDR_SIZE_MAX; addressIndex++) { + addrAddr->Set(addressIndex, NanNew(address->addr[addressIndex])); + } + returnValue->Set(NanNew("addr"), addrAddr); - return returnValue; + return returnValue; } -bool c_OCDevAddr( Local jsDevAddr, OCDevAddr *address ) { - uint32_t addressIndex; - uint8_t addr[ DEV_ADDR_SIZE_MAX ] = { 0 }; - - Local size = jsDevAddr->Get( NanNew( "size" ) ); - VALIDATE_VALUE_TYPE( size, IsNumber, "addr.size", false ); - - Local addrValue = jsDevAddr->Get( NanNew( "addr" ) ); - VALIDATE_VALUE_TYPE( addrValue, IsArray, "addr.addr", false ); - Local addrArray = Local::Cast( addrValue ); - uint32_t addrLength = addrArray->Length(); - if ( addrLength > DEV_ADDR_SIZE_MAX ) { - NanThrowRangeError( - "OCDevAddr: Number of JS structure address bytes exceeds DEV_ADDR_SIZE_MAX" ); - return false; - } - - // Grab each address byte, making sure it's a number - for ( addressIndex = 0 ; addressIndex < DEV_ADDR_SIZE_MAX ; addressIndex++ ) { - Local addressItem = addrArray->Get( addressIndex ); - VALIDATE_VALUE_TYPE( addressItem, IsNumber, "addr.addr item", false ); - addr[ addressIndex ] = addressItem->Uint32Value(); - } - - // Fill in the destination structure - address->size = size->Uint32Value(); - memcpy( address->addr, addr, DEV_ADDR_SIZE_MAX * sizeof( uint8_t ) ); - - return true; +bool c_OCDevAddr(Local jsDevAddr, OCDevAddr *address) { + uint32_t addressIndex; + uint8_t addr[DEV_ADDR_SIZE_MAX] = {0}; + + Local size = jsDevAddr->Get(NanNew("size")); + VALIDATE_VALUE_TYPE(size, IsNumber, "addr.size", false); + + Local addrValue = jsDevAddr->Get(NanNew("addr")); + VALIDATE_VALUE_TYPE(addrValue, IsArray, "addr.addr", false); + Local addrArray = Local::Cast(addrValue); + uint32_t addrLength = addrArray->Length(); + if (addrLength > DEV_ADDR_SIZE_MAX) { + NanThrowRangeError( + "OCDevAddr: Number of JS structure address bytes exceeds " + "DEV_ADDR_SIZE_MAX"); + return false; + } + + // Grab each address byte, making sure it's a number + for (addressIndex = 0; addressIndex < DEV_ADDR_SIZE_MAX; addressIndex++) { + Local addressItem = addrArray->Get(addressIndex); + VALIDATE_VALUE_TYPE(addressItem, IsNumber, "addr.addr item", false); + addr[addressIndex] = addressItem->Uint32Value(); + } + + // Fill in the destination structure + address->size = size->Uint32Value(); + memcpy(address->addr, addr, DEV_ADDR_SIZE_MAX * sizeof(uint8_t)); + + return true; } diff --git a/src/structures.h b/src/structures.h index 23772dcf..0507514c 100644 --- a/src/structures.h +++ b/src/structures.h @@ -7,29 +7,31 @@ extern "C" { #include } -v8::Local js_OCClientResponse( OCClientResponse *response ); +v8::Local js_OCClientResponse(OCClientResponse *response); -// Fills in @destination. @destination->payload is assumed to be allocated of size +// Fills in @destination. @destination->payload is assumed to be allocated of +// size // MAX_RESPONSE_LENGTH -bool c_OCEntityHandlerResponse( - OCEntityHandlerResponse *destination, - v8::Local jsOCEntityHandlerResponse ); +bool c_OCEntityHandlerResponse(OCEntityHandlerResponse *destination, + v8::Local jsOCEntityHandlerResponse); // Returns the Local that was passed in -v8::Local js_OCResourceHandle( - v8::Local jsHandle, - OCResourceHandle handle ); +v8::Local js_OCResourceHandle(v8::Local jsHandle, + OCResourceHandle handle); -// Returns the C OCResourceHandle from the JS handle. @p_info may be null if you don't care -// about the callback info. Return NULL and throws an exception if @jsHandle does not have the +// Returns the C OCResourceHandle from the JS handle. @p_info may be null if you +// don't care +// about the callback info. Return NULL and throws an exception if @jsHandle +// does not have the // right keys -OCResourceHandle c_OCResourceHandle( v8::Local jsHandle ); +OCResourceHandle c_OCResourceHandle(v8::Local jsHandle); -v8::Local js_OCEntityHandlerRequest( OCEntityHandlerRequest *request ); +v8::Local js_OCEntityHandlerRequest( + OCEntityHandlerRequest *request); -v8::Local js_OCDevAddr( OCDevAddr *address ); +v8::Local js_OCDevAddr(OCDevAddr *address); // Fills in @address -bool c_OCDevAddr( v8::Local jsDevAddr, OCDevAddr *address ); +bool c_OCDevAddr(v8::Local jsDevAddr, OCDevAddr *address); #endif /* __IOTIVITY_NODE_STRUCTURES_H__ */