Skip to content
This repository has been archived by the owner on Jun 13, 2019. It is now read-only.

Commit

Permalink
OicClient: _processFindResourceResponse must handle OC_STACK_NO_RESOURCE
Browse files Browse the repository at this point in the history
Fixes gh-34
  • Loading branch information
Gabriel Schulhof committed Nov 15, 2015
1 parent 86f13d5 commit a634b28
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 48 deletions.
123 changes: 75 additions & 48 deletions lib/OicClient.js
Original file line number Diff line number Diff line change
Expand Up @@ -82,31 +82,50 @@ _.extend( OicClient.prototype, {
return returnValue;
},

_processFindResourceResponse: function( response ) {
var i;
var resources = response.payload.resources;
_processFindResourceResponse: function( handle, response, reject ) {
var i, resources, error;
var resourceCount = 0;
var expectResources =
( response.result !== iotivity.OCStackResult.OC_STACK_NO_RESOURCE );
var devAddr = response.devAddr;
var resourceCount = resources.length;

if ( resourceCount > 0 ) {
var deviceId = utils.sidToString( resources[ 0 ].sid );

if ( !this._devices[ deviceId ] ) {
this._devices[ deviceId ] = { address: devAddr };
if ( !response || ( response.result !== ocStackOk && expectResources ) ) {
error = _.extend( new Error( "findResources: OCDoResource failed" ), {
result: response.result
} );
if ( reject ) {
reject( error );
} else {
throw error;
}
return deleteTransaction;
}

for ( i = 0; i < resourceCount; i++ ) {
this.dispatchEvent( "resourcefound",
_.extend( new OicResourceFoundEvent(), {
resource: this._maybeAddResource( _.extend( resources[ i ], {
if ( expectResources ) {
resources = response.payload.resources;
resourceCount = resources.length;

// We use "url", not "uri"
url: resources[ i ].uri,
deviceId: deviceId
} ) )
} ) );
if ( resourceCount > 0 ) {
var deviceId = utils.sidToString( resources[ 0 ].sid );

if ( !this._devices[ deviceId ] ) {
this._devices[ deviceId ] = { address: devAddr };
}

for ( i = 0; i < resourceCount; i++ ) {
this.dispatchEvent( "resourcefound",
_.extend( new OicResourceFoundEvent(), {
resource: this._maybeAddResource( _.extend( resources[ i ], {

// We use "url", not "uri"
url: resources[ i ].uri,
deviceId: deviceId
} ) )
} ) );
}
}
}
return keepTransaction;
},

// Used for create/retrieve/update/delete
Expand All @@ -127,7 +146,8 @@ _.extend( OicClient.prototype, {
if ( response.result === ocStackOk ) {

// In case of success, @createAnswer() knows what to give fulfill()
answer = createAnswer ? createAnswer( response ) : undefined;
answer = createAnswer ? createAnswer( handle, response, reject ) :
undefined;
fulfill.apply( this, answer !== undefined ? [ answer ] : [] );
} else {
reject(
Expand Down Expand Up @@ -174,19 +194,7 @@ _.extend( OicClient.prototype, {
query, destination, null,
iotivity.OCConnectivityType.CT_DEFAULT,
qosMap.known[ this._device.settings.connectionMode ] || qosMap.unknown,
function( handle, response ) {

if ( !response || response.result !== ocStackOk ) {
reject( _.extend( new Error( prefix + ": " + "OCDoResource failed" ), {
result: response.result
} ) );
return deleteTransaction;
}

responseHandler( response );

return keepTransaction;
},
responseHandler,
null,
0 );

Expand Down Expand Up @@ -215,22 +223,41 @@ _.extend( OicClient.prototype, {
return new Promise( _.bind( function( fulfill, reject ) {
this._doDiscovery( "findDevices", fulfill, reject,
iotivity.OC_RSRVD_DEVICE_URI, null,
_.bind( function findDevicesHandler( response ) {
var deviceId = utils.sidToString( response.payload.sid );

this._devices[ deviceId ] = {
address: response.devAddr,
info: {
uuid: deviceId,
name: response.payload.deviceName,
coreSpecVersion: response.payload.specVersion
}
};
_.bind( function findDevicesHandler( handle, response ) {
var deviceId;

this.dispatchEvent( "devicefound",
_.extend( new OicDeviceFoundEvent(), {
device: this._devices[ deviceId ].info
} ) );
if ( !response || response.result !== ocStackOk ) {

// We must throw in the next tick because we must return something to the
// stack
setTimeout( function() {
throw _.extend(
new Error( "findDevices: OCDoResource response failed" ), {
result: response.result
} );
}, 0 );
return deleteTransaction;
}

if ( response.payload ) {
deviceId = utils.sidToString( response.payload.sid );

this._devices[ deviceId ] = {
address: response.devAddr,
info: {
uuid: deviceId,
name: response.payload.deviceName,
coreSpecVersion: response.payload.specVersion
}
};

this.dispatchEvent( "devicefound",
_.extend( new OicDeviceFoundEvent(), {
device: this._devices[ deviceId ].info
} ) );
}

return keepTransaction;
}, this ) );
}, this ) );
},
Expand Down Expand Up @@ -283,7 +310,7 @@ _.extend( OicClient.prototype, {
var resource = this._resources[ id ];

return this._oneShotRequest( "retrieveResource", resource, "OC_REST_GET", null,
function retrieveResourceFromResponse( response ) {
function retrieveResourceFromResponse( handle, response ) {
_.extend( resource.properties, utils.payloadToObject( response.payload.values ) );
return resource;
} );
Expand Down
26 changes: 26 additions & 0 deletions tests/tests/API No Resources.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
var device = require( "../../index" )(),
utils = require( "../assert-to-console" ),
iotivity = require( "../../lowlevel" );

console.log( JSON.stringify( { assertionCount: 1 } ) );

device.configure( {
role: "client",
connectionMode: "acked"
} ).then(
function() {
try {
utils.assert( "strictEqual",
device.client._processFindResourceResponse( null,
{ result: iotivity.OCStackResult.OC_STACK_NO_RESOURCE } ),
iotivity.OCStackApplicationResult.OC_STACK_KEEP_TRANSACTION,
"_processFindResourceRequest() handles OC_STACK_NO_RESOURCE" );
process.exit( 0 );
} catch ( error ) {
utils.assert( "strictEqual", error, undefined,
"_processFindResourceRequest throws no errors" );
}
},
function() {
utils.die( "device.configure() failed" );
} );

0 comments on commit a634b28

Please sign in to comment.