From: Srikrishna Gurugubelli Date: Fri, 13 Jan 2017 23:23:04 +0000 (-0800) Subject: Introspection support X-Git-Tag: 1.3.0~797 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=387ebd38c10d4878e2c93f81a0ee3f66c2bcfc41;p=platform%2Fupstream%2Fiotivity.git Introspection support Change-Id: Ic1524b10e7ab44831ee09503b5a2bb69ad3ff0b8 Signed-off-by: Srikrishna Gurugubelli Reviewed-on: https://gerrit.iotivity.org/gerrit/16405 Tested-by: jenkins-iotivity Reviewed-by: Alex Kelley Reviewed-by: Dave Thaler Reviewed-by: Mike Fenelon --- diff --git a/cloud/samples/client/airconditioner/aircon_controlee.cpp b/cloud/samples/client/airconditioner/aircon_controlee.cpp index a18f1fd..e5d33af 100644 --- a/cloud/samples/client/airconditioner/aircon_controlee.cpp +++ b/cloud/samples/client/airconditioner/aircon_controlee.cpp @@ -495,9 +495,16 @@ void handleLoginoutCB(const HeaderOptions &, g_callbackLock.notify_all(); } -static FILE *client_open(const char * /*path*/, const char *mode) +static FILE *client_open(const char *path, const char *mode) { - return fopen("./aircon_controlee.dat", mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen("./aircon_controlee.dat", mode); + } + else + { + return fopen(path, mode); + } } OCStackResult SetDeviceInfo() diff --git a/cloud/samples/client/airconditioner/aircon_controller.cpp b/cloud/samples/client/airconditioner/aircon_controller.cpp index 087a631..e5e43b4 100644 --- a/cloud/samples/client/airconditioner/aircon_controller.cpp +++ b/cloud/samples/client/airconditioner/aircon_controller.cpp @@ -267,9 +267,16 @@ void presenceDevice(OCStackResult , const unsigned int i, const string &str) cout << "Presence received, i=" << i << " str=" << str << endl; } -static FILE *client_open(const char * /*path*/, const char *mode) +static FILE *client_open(const char *path, const char *mode) { - return fopen("./aircon_controller.dat", mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen("./aircon_controller.dat", mode); + } + else + { + return fopen(path, mode); + } } int main(int argc, char *argv[]) diff --git a/cloud/samples/client/group_invite/group_light_share.cpp b/cloud/samples/client/group_invite/group_light_share.cpp index 02c223c..da91c3d 100644 --- a/cloud/samples/client/group_invite/group_light_share.cpp +++ b/cloud/samples/client/group_invite/group_light_share.cpp @@ -319,12 +319,19 @@ void handleLoginoutCB(const HeaderOptions &, const OCRepresentation &rep, const string g_option; -static FILE *client_open(const char * /*path*/, const char *mode) +static FILE *client_open(const char *path, const char *mode) { - string option = "./"; - option += g_option; - option += ".dat"; - return fopen(option.c_str(), mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + string option = "./"; + option += g_option; + option += ".dat"; + return fopen(option.c_str(), mode); + } + else + { + return fopen(path, mode); + } } int main(int argc, char **argv) diff --git a/cloud/samples/client/messagequeue/mq_publisher.cpp b/cloud/samples/client/messagequeue/mq_publisher.cpp index 743b794..ad8afdc 100644 --- a/cloud/samples/client/messagequeue/mq_publisher.cpp +++ b/cloud/samples/client/messagequeue/mq_publisher.cpp @@ -143,9 +143,16 @@ void handleLoginoutCB(const HeaderOptions &, g_callbackLock.notify_all(); } -static FILE *client_open(const char * /*path*/, const char *mode) +static FILE *client_open(const char *path, const char *mode) { - return fopen("./mq_publisher.dat", mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen("./mq_publisher.dat", mode); + } + else + { + return fopen(path, mode); + } } int main(int argc, char *argv[]) diff --git a/cloud/samples/client/messagequeue/mq_subscriber.cpp b/cloud/samples/client/messagequeue/mq_subscriber.cpp index fbebe6e..9b876d5 100644 --- a/cloud/samples/client/messagequeue/mq_subscriber.cpp +++ b/cloud/samples/client/messagequeue/mq_subscriber.cpp @@ -157,9 +157,16 @@ void handleLoginoutCB(const HeaderOptions &, g_callbackLock.notify_all(); } -static FILE *client_open(const char * /*path*/, const char *mode) +static FILE *client_open(const char *path, const char *mode) { - return fopen("./mq_subscriber.dat", mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen("./mq_subscriber.dat", mode); + } + else + { + return fopen(path, mode); + } } int main(int argc, char *argv[]) diff --git a/cloud/samples/client/thin_light/thin_room_light.cpp b/cloud/samples/client/thin_light/thin_room_light.cpp index d8df6d0..a54e72b 100644 --- a/cloud/samples/client/thin_light/thin_room_light.cpp +++ b/cloud/samples/client/thin_light/thin_room_light.cpp @@ -636,9 +636,16 @@ void PrintUsage() } -static FILE *client_open(const char * /*path*/, const char *mode) +static FILE *client_open(const char *path, const char *mode) { - return fopen("./thin_resource_server.dat", mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen("./thin_resource_server.dat", mode); + } + else + { + return fopen(path, mode); + } } int main(int argc, char *argv[]) diff --git a/java/jni/JniOcSecurity.cpp b/java/jni/JniOcSecurity.cpp index 54821ee..a0d8dae 100644 --- a/java/jni/JniOcSecurity.cpp +++ b/java/jni/JniOcSecurity.cpp @@ -54,7 +54,14 @@ namespace OC { FILE* JniOcSecurity::client_open(const char *path, const char *mode) { - LOGI("Opening SVR Database file '%s' with mode '%s'\n", store_path().c_str(), mode); - return fopen(store_path().c_str(), mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + LOGI("Opening SVR Database file '%s' with mode '%s'\n", store_path().c_str(), mode); + return fopen(store_path().c_str(), mode); + } + else + { + return fopen(path, mode); + } } } diff --git a/resource/csdk/include/octypes.h b/resource/csdk/include/octypes.h index 481db4c..3083503 100755 --- a/resource/csdk/include/octypes.h +++ b/resource/csdk/include/octypes.h @@ -75,6 +75,11 @@ extern "C" { /** KeepAlive URI.*/ #define OC_RSRVD_KEEPALIVE_URI "/oic/ping" +/** Introspection URI.*/ +#define OC_RSRVD_INTROSPECTION_URI "/oic/introspection" + +/** Introspection payload URI.*/ +#define OC_RSRVD_INTROSPECTION_PAYLOAD_URI "/oic/introspection/payload" /** Presence */ @@ -167,6 +172,11 @@ extern "C" { /** To represent content type with MQ Topic.*/ #define OC_RSRVD_RESOURCE_TYPE_MQ_TOPIC "oic.wk.ps.topic" +/** To represent resource type with introspection.*/ +#define OC_RSRVD_RESOURCE_TYPE_INTROSPECTION "oic.wk.introspection" + +/** To represent resource type with introspection payload.*/ +#define OC_RSRVD_RESOURCE_TYPE_INTROSPECTION_PAYLOAD "oic.wk.introspection.payload" /** To represent interface.*/ #define OC_RSRVD_INTERFACE "if" @@ -225,6 +235,12 @@ extern "C" { /** For security.*/ #define OC_RSRVD_SECURE "sec" +/** Security Database persistent store name(json).*/ +#define OC_SECURITY_DB_FILE_NAME "oic_svr_db.json" + +/** Security Database persistent store name(dat).*/ +#define OC_SECURITY_DB_DAT_FILE_NAME "oic_svr_db.dat" + /** Port. */ #define OC_RSRVD_HOSTING_PORT "port" @@ -311,6 +327,42 @@ extern "C" { #define OC_RSRVD_PROTOCOL_INDEPENDENT_ID "piid" /** +* Introspection. +*/ +/** Name.*/ +#define OC_RSRVD_INTROSPECTION_NAME "name" + +/** Value of name.*/ +#define OC_RSRVD_INTROSPECTION_NAME_VALUE "Introspection" + +/** Url info Object.*/ +#define OC_RSRVD_INTROSPECTION_URL_INFO "urlInfo" + +/** Url property.*/ +#define OC_RSRVD_INTROSPECTION_URL "url" + +/** Protocol property.*/ +#define OC_RSRVD_INTROSPECTION_PROTOCOL "protocol" + +/** Content-Type property.*/ +#define OC_RSRVD_INTROSPECTION_CONTENT_TYPE "content-type" + +/** Content-Type property value.*/ +#define OC_RSRVD_INTROSPECTION_CONTENT_TYPE_VALUE "application/cbor" + +/** Version property.*/ +#define OC_RSRVD_INTROSPECTION_VERSION "version" + +/** Version property value.*/ +#define OC_RSRVD_INTROSPECTION_VERSION_VALUE 1 + +/** Introspection payload data property name.*/ +#define OC_RSRVD_INTROSPECTION_DATA_NAME "data" + +/** Introspection persistent store name.*/ +#define OC_INTROSPECTION_FILE_NAME "introspection.json" + +/** * These provide backward compatibility - their use is deprecated. */ #ifndef GOING_AWAY diff --git a/resource/csdk/security/provisioning/sample/cloud/cloudCommon.c b/resource/csdk/security/provisioning/sample/cloud/cloudCommon.c index c0223b2..fd32c48 100644 --- a/resource/csdk/security/provisioning/sample/cloud/cloudCommon.c +++ b/resource/csdk/security/provisioning/sample/cloud/cloudCommon.c @@ -598,8 +598,14 @@ static void userRequests(void *data) FILE* server_fopen(const char *path, const char *mode) { - OC_UNUSED(path); - return fopen(fname, mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen(fname, mode); + } + else + { + return fopen(path, mode); + } } /** diff --git a/resource/csdk/security/provisioning/sample/provisioningclient.c b/resource/csdk/security/provisioning/sample/provisioningclient.c index b84ae26..e2266cf 100644 --- a/resource/csdk/security/provisioning/sample/provisioningclient.c +++ b/resource/csdk/security/provisioning/sample/provisioningclient.c @@ -25,7 +25,7 @@ #ifdef HAVE_UNISTD_H #include #endif - +#include #include "utlist.h" #include "logger.h" #include "oic_malloc.h" @@ -73,6 +73,8 @@ extern "C" #endif //MULTIPLE_OWNER #define _80_SELECT_PROTOCOL_ 80 #define _81_SELECT_VERIF_METHOD_ 81 +#define _91_SELECT_INTROSPECTION_METHOD_ 91 +#define _92_SELECT_INTROSPECTION_PAYLOAD_METHOD_ 92 #define _99_EXIT_PRVN_CLT_ 99 #define ACL_RESRC_MAX_NUM 16 @@ -1992,6 +1994,218 @@ static int printResultList(const OCProvisionResult_t* rslt_lst, const int rslt_c return lst_cnt; } +const char* getResult(OCStackResult result) +{ + switch (result) + { + case OC_STACK_OK: + return "OC_STACK_OK"; + case OC_STACK_RESOURCE_CREATED: + return "OC_STACK_RESOURCE_CREATED"; + case OC_STACK_RESOURCE_DELETED: + return "OC_STACK_RESOURCE_DELETED"; + case OC_STACK_RESOURCE_CHANGED: + return "OC_STACK_RESOURCE_CHANGED"; + case OC_STACK_INVALID_URI: + return "OC_STACK_INVALID_URI"; + case OC_STACK_INVALID_QUERY: + return "OC_STACK_INVALID_QUERY"; + case OC_STACK_INVALID_IP: + return "OC_STACK_INVALID_IP"; + case OC_STACK_INVALID_PORT: + return "OC_STACK_INVALID_PORT"; + case OC_STACK_INVALID_CALLBACK: + return "OC_STACK_INVALID_CALLBACK"; + case OC_STACK_INVALID_METHOD: + return "OC_STACK_INVALID_METHOD"; + case OC_STACK_NO_MEMORY: + return "OC_STACK_NO_MEMORY"; + case OC_STACK_COMM_ERROR: + return "OC_STACK_COMM_ERROR"; + case OC_STACK_INVALID_PARAM: + return "OC_STACK_INVALID_PARAM"; + case OC_STACK_NOTIMPL: + return "OC_STACK_NOTIMPL"; + case OC_STACK_NO_RESOURCE: + return "OC_STACK_NO_RESOURCE"; + case OC_STACK_RESOURCE_ERROR: + return "OC_STACK_RESOURCE_ERROR"; + case OC_STACK_SLOW_RESOURCE: + return "OC_STACK_SLOW_RESOURCE"; + case OC_STACK_NO_OBSERVERS: + return "OC_STACK_NO_OBSERVERS"; + case OC_STACK_UNAUTHORIZED_REQ: + return "OC_STACK_UNAUTHORIZED_REQ"; + case OC_STACK_ERROR: + return "OC_STACK_ERROR"; + default: + return "UNKNOWN"; + } +} + +OCStackApplicationResult getReqCB(void* ctx, OCDoHandle handle, + OCClientResponse* clientResponse) +{ + if (clientResponse == NULL) + { + OIC_LOG(INFO, TAG, "getReqCB received NULL clientResponse"); + return OC_STACK_DELETE_TRANSACTION; + } + + OIC_LOG_V(INFO, TAG, "StackResult: %s", getResult(clientResponse->result)); + OIC_LOG_V(INFO, TAG, "SEQUENCE NUMBER: %d", clientResponse->sequenceNumber); + OIC_LOG_V(INFO, TAG, "Payload Size: %d", + ((OCRepPayload*)clientResponse->payload)->values->str); + OIC_LOG_PAYLOAD(INFO, clientResponse->payload); + OIC_LOG(INFO, TAG, ("=============> Get Response")); + + if (clientResponse->numRcvdVendorSpecificHeaderOptions > 0) + { + OIC_LOG(INFO, TAG, "Received vendor specific options"); + uint8_t i = 0; + OCHeaderOption* rcvdOptions = clientResponse->rcvdVendorSpecificHeaderOptions; + for (i = 0; i < clientResponse->numRcvdVendorSpecificHeaderOptions; i++) + { + if ((rcvdOptions[i]).protocolID == OC_COAP_ID) + { + OIC_LOG_V(INFO, TAG, "Received option with OC_COAP_ID and ID %u with", + (rcvdOptions[i]).optionID); + + OIC_LOG_BUFFER(INFO, TAG, rcvdOptions[i].optionData, + MAX_HEADER_OPTION_DATA_LENGTH); + } + } + } + g_doneCB = true; // flag done + return OC_STACK_DELETE_TRANSACTION; +} + +int obtainUserSelectionForDeviceNumber(int numDevices) +{ + int dev_num = -1; + for (; ; ) + { + printf(" > Enter Device Number: "); + for (int ret = 0; 1 != ret; ) + { + ret = scanf("%d", &dev_num); + for (; 0x20 <= getchar(); ); // for removing overflow garbages + // '0x20<=code' is character region + } + if ((0 < dev_num) && (numDevices >= dev_num)) + { + break; + } + printf(" Entered Wrong Number. Please Enter Again\n"); + } + return dev_num; +} + +void selectIntrospectionMethod() +{ + OCStackResult ret; + OCCallbackData cbData; + OCDoHandle handle; + static OCDevAddr serverAddr; + cbData.cb = &getReqCB; + int dev_num = 1; + OCProvisionDev_t *device = NULL; + + // check |own_list| for devices that can be used for introspection + if (!g_own_list || (1 > g_own_cnt)) + { + printf(" > Owned Device List, to do introspection, is Empty\n"); + printf(" > Please Register Unowned Devices first, with [20] Menu\n"); + return; + } + + if (g_own_cnt != 1) + { + // we have more than one option - ask user to select one + printf(" > Multiple devices found - select a device for Introspection\n"); + dev_num = obtainUserSelectionForDeviceNumber(g_own_cnt); + } + + device = getDevInst(g_own_list, dev_num); + if (device) + { + serverAddr = device->endpoint; + cbData.context = NULL; + cbData.cd = NULL; + OIC_LOG_V(INFO, TAG, "Performing Introspection"); + g_doneCB = false; + + ret = OCDoResource(&handle, OC_REST_GET, OC_RSRVD_INTROSPECTION_URI, &serverAddr, + NULL, + CT_ADAPTER_IP, OC_LOW_QOS, &cbData, NULL, 0); + + if (ret != OC_STACK_OK) + { + OIC_LOG_V(ERROR, TAG, "OCDoResource returned error %d with method", ret); + } + if (waitCallbackRet()) // input |g_doneCB| flag implicitly + { + OIC_LOG(ERROR, TAG, "selectIntrospectionMethod callback error"); + } + } + else + { + OIC_LOG(ERROR, TAG, "Selected device does not exist"); + } +} + +void selectIntrospectionPayloadMethod() +{ + OCStackResult ret; + OCCallbackData cbData; + OCDoHandle handle; + static OCDevAddr serverAddr; + cbData.cb = &getReqCB; + int dev_num = 1; + OCProvisionDev_t *device = NULL; + + // check |own_list| for devices that can be used for introspection payload + if (!g_own_list || (1 > g_own_cnt)) + { + printf(" > Owned Device List, to get introspection payload, is Empty\n"); + printf(" > Please Register Unowned Devices first, with [20] Menu\n"); + return; + } + + if (g_own_cnt != 1) + { + // we have more than one option - ask user to select one + printf(" > Multiple devices found - select a device for Introspection payload\n"); + dev_num = obtainUserSelectionForDeviceNumber(g_own_cnt); + } + + device = getDevInst(g_own_list, dev_num); + if (device) + { + serverAddr = device->endpoint; + cbData.context = g_ctx; + cbData.cd = NULL; + OIC_LOG_V(INFO, TAG, "Performing Introspection Payload"); + g_doneCB = false; + ret = OCDoResource(&handle, OC_REST_GET, OC_RSRVD_INTROSPECTION_PAYLOAD_URI, &serverAddr, + NULL, + CT_ADAPTER_IP, OC_LOW_QOS, &cbData, NULL, 0); + + if (ret != OC_STACK_OK) + { + OIC_LOG_V(ERROR, TAG, "OCDoResource returned error %d with method", ret); + } + if (waitCallbackRet()) // input |g_doneCB| flag implicitly + { + OIC_LOG(ERROR, TAG, "selectIntrospectionPayloadMethod callback error"); + } + } + else + { + OIC_LOG(ERROR, TAG, "Selected device does not exist"); + } +} + static void printUuid(const OicUuid_t* uid) { for(int i=0; i -t <1..20> -c <0|1>"); + OIC_LOG(INFO, TAG, "Usage : occlient -u <0|1> -t <1..20> -c <0|1> -i<0|1>"); OIC_LOG(INFO, TAG, "-u <0|1> : Perform multicast/unicast discovery of resources"); OIC_LOG(INFO, TAG, "-c 0 : Use Default connectivity(IP)"); OIC_LOG(INFO, TAG, "-c 1 : IP Connectivity Type"); @@ -145,7 +148,7 @@ static void PrintUsage() "using server's endpoints information"); OIC_LOG(INFO, TAG, "-t 23 : Discover Resources and Perform Get Requests by IPv4 + COAP + TCP "\ "using server's endpoints information"); - + OIC_LOG(INFO, TAG, "-t 24 : Discover Introspection Resources and Perform Get Request"); } OCStackResult InvokeOCDoResource(std::ostringstream &query, @@ -492,6 +495,9 @@ OCStackApplicationResult discoveryReqCB(void* ctx, OCDoHandle /*handle*/, case TEST_GET_REQ_TCP: InitGetRequestWithCoap(payload, false); break; + case TEST_INTROSPECTION: + InitIntrospection(payload); + break; default: PrintUsage(); break; @@ -598,13 +604,22 @@ int InitGetRequestToUnavailableResource(OCQualityOfService qos) getReqCB, NULL, 0)); } +int InitIntrospection(OCDiscoveryPayload* dis) +{ + std::ostringstream query; + query << coapIntrospectionResource; + OIC_LOG_V(INFO, TAG, "\nExecuting %s with query %s", __func__, query.str().c_str()); + return (InvokeOCDoResource(query, &serverAddr, OC_REST_GET, OC_LOW_QOS, + getReqCB, NULL, 0)); +} + int InitObserveRequest(OCQualityOfService qos) { std::ostringstream query; query << coapServerResource; OIC_LOG_V(INFO, TAG, "\nExecuting %s with query %s", __func__, query.str().c_str()); return (InvokeOCDoResource(query, &serverAddr, OC_REST_OBSERVE, - (qos == OC_HIGH_QOS)? OC_HIGH_QOS:OC_LOW_QOS, obsReqCB, NULL, 0)); + (qos == OC_HIGH_QOS)? OC_HIGH_QOS:OC_LOW_QOS, obsReqCB, NULL, 0)); } int InitPutRequest(OCQualityOfService qos) @@ -809,6 +824,31 @@ int InitDeviceDiscovery(OCQualityOfService qos) return ret; } +int InitIntrospectionDiscovery(OCQualityOfService qos) +{ + OIC_LOG_V(INFO, TAG, "\n\nExecuting %s", __func__); + + OCStackResult ret; + OCCallbackData cbData; + char szQueryUri[MAX_QUERY_LENGTH] = { 0 }; + + snprintf(szQueryUri, sizeof(szQueryUri) - 1, INTROSPECTION_DISCOVERY_QUERY, discoveryAddr); + + cbData.cb = DeviceDiscoveryReqCB; + cbData.context = (void*)DEFAULT_CONTEXT_VALUE; + cbData.cd = NULL; + + ret = OCDoResource(NULL, OC_REST_DISCOVER, szQueryUri, NULL, 0, CT_DEFAULT, + (qos == OC_HIGH_QOS) ? OC_HIGH_QOS : OC_LOW_QOS, + &cbData, NULL, 0); + if (ret != OC_STACK_OK) + { + OIC_LOG(ERROR, TAG, "OCStack device error"); + } + + return ret; +} + int InitDiscovery(OCQualityOfService qos) { OCStackResult ret; @@ -923,11 +963,17 @@ void showEndpointsInfo(OCResourcePayload* res) } } +static FILE* server_fopen(const char* path, const char* mode) +{ + return fopen(path, mode); +} + int main(int argc, char* argv[]) { int opt; + OCPersistentStorage ps{ server_fopen, fread, fwrite, fclose, unlink }; - while ((opt = getopt(argc, argv, "u:t:c:")) != -1) + while ((opt = getopt(argc, argv, "u:t:c:i:")) != -1) { switch(opt) { @@ -940,6 +986,9 @@ int main(int argc, char* argv[]) case 'c': Connectivity = atoi(optarg); break; + case 'i': + Introspection = atoi(optarg); + break; default: PrintUsage(); return -1; @@ -954,12 +1003,20 @@ int main(int argc, char* argv[]) return -1; } - if (OCInit1(OC_CLIENT, OC_DEFAULT_FLAGS, OC_DEFAULT_FLAGS) != OC_STACK_OK) + if (OCInit1(OC_CLIENT_SERVER, OC_DEFAULT_FLAGS, OC_DEFAULT_FLAGS) != OC_STACK_OK) { OIC_LOG(ERROR, TAG, "OCStack init error"); return 0; } + if (Introspection != 0) + { + if (OC_STACK_OK != OCRegisterPersistentStorageHandler(&ps)) + { + OIC_LOG(ERROR, TAG, "OCRegisterPersistentStorageHandler"); + } + } + #ifdef ROUTING_GATEWAY /* * Before invoking Discover resource, we process the gateway requests diff --git a/resource/csdk/stack/samples/linux/SimpleClientServer/occlient.h b/resource/csdk/stack/samples/linux/SimpleClientServer/occlient.h index dfe3acb..c96fa0c 100644 --- a/resource/csdk/stack/samples/linux/SimpleClientServer/occlient.h +++ b/resource/csdk/stack/samples/linux/SimpleClientServer/occlient.h @@ -68,6 +68,7 @@ typedef enum { TEST_DISCOVER_REQ_SHOW_EPS, TEST_GET_REQ_UDP, TEST_GET_REQ_TCP, + TEST_INTROSPECTION, MAX_TESTS } CLIENT_TEST; @@ -116,6 +117,7 @@ int InitDeviceDiscovery(OCQualityOfService qos); int InitPlatformDiscovery(OCQualityOfService qos); int InitDiscovery(OCQualityOfService qos); int InitGetRequestWithCoap(OCDiscoveryPayload* dis, bool isUdp); +int InitIntrospection(OCDiscoveryPayload* dis); /* Call delete operation on already deleted resource */ void* RequestDeleteDeathResourceTask(void* myqos); diff --git a/resource/csdk/stack/samples/linux/SimpleClientServer/ocserver.cpp b/resource/csdk/stack/samples/linux/SimpleClientServer/ocserver.cpp index 2e8f9fe..b68bfc6 100644 --- a/resource/csdk/stack/samples/linux/SimpleClientServer/ocserver.cpp +++ b/resource/csdk/stack/samples/linux/SimpleClientServer/ocserver.cpp @@ -119,6 +119,12 @@ OCRepPayload* getPayload(const char* uri, int64_t power, bool state) return payload; } +static FILE* server_fopen(const char* path, const char* mode) +{ + OIC_LOG_V(DEBUG, TAG, "Got file open call for %s",path); + return fopen(path, mode); +} + //This function takes the request as an input and returns the response OCRepPayload* constructResponse(OCEntityHandlerRequest *ehRequest) { @@ -1116,7 +1122,20 @@ int main(int argc, char* argv[]) OCSetRAInfo(&rainfo); #endif + OIC_LOG(DEBUG, TAG, "OCServer is starting..."); + OCPersistentStorage pstStr { + server_fopen, + fread, + fwrite, + fclose, + unlink + }; + if (OC_STACK_OK != OCRegisterPersistentStorageHandler(&pstStr)) + { + OIC_LOG(ERROR, TAG, "OCRegisterPersistentStorageHandler error"); + return -1; + } if (OCInit(NULL, 0, OC_SERVER) != OC_STACK_OK) { diff --git a/resource/csdk/stack/samples/linux/secure/ocamsservice.cpp b/resource/csdk/stack/samples/linux/secure/ocamsservice.cpp index e7262a8..819c059 100644 --- a/resource/csdk/stack/samples/linux/secure/ocamsservice.cpp +++ b/resource/csdk/stack/samples/linux/secure/ocamsservice.cpp @@ -36,8 +36,14 @@ void handleSigInt(int signum) FILE* service_fopen(const char *path, const char *mode) { - (void)path; - return fopen(AMSS_DB_FILE, mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen(AMSS_DB_FILE, mode); + } + else + { + return fopen(path, mode); + } } int main(int /*argc*/, char* /*argv*/[]) diff --git a/resource/csdk/stack/samples/linux/secure/occlientbasicops.cpp b/resource/csdk/stack/samples/linux/secure/occlientbasicops.cpp index cfd3fc8..005e386 100644 --- a/resource/csdk/stack/samples/linux/secure/occlientbasicops.cpp +++ b/resource/csdk/stack/samples/linux/secure/occlientbasicops.cpp @@ -338,14 +338,26 @@ int InitDiscovery() FILE* client_fopen_devowner(const char *path, const char *mode) { - (void)path; - return fopen(CRED_FILE_DEVOWNER, mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen(CRED_FILE_DEVOWNER, mode); + } + else + { + return fopen(path, mode); + } } FILE* client_fopen_nondevowner(const char *path, const char *mode) { - (void)path; - return fopen(CRED_FILE_NONDEVOWNER, mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen(CRED_FILE_NONDEVOWNER, mode); + } + else + { + return fopen(path, mode); + } } int main(int argc, char* argv[]) { diff --git a/resource/csdk/stack/samples/linux/secure/occlientdirectpairing.cpp b/resource/csdk/stack/samples/linux/secure/occlientdirectpairing.cpp index 5ae096b..4442997 100644 --- a/resource/csdk/stack/samples/linux/secure/occlientdirectpairing.cpp +++ b/resource/csdk/stack/samples/linux/secure/occlientdirectpairing.cpp @@ -412,8 +412,14 @@ OCStackResult SendGetRequest(OCDPDev_t* peer) FILE* client_fopen(const char *path, const char *mode) { - (void)path; - return fopen(CRED_FILE, mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen(CRED_FILE, mode); + } + else + { + return fopen(path, mode); + } } void *CLInterface(void *data) diff --git a/resource/csdk/stack/samples/linux/secure/ocserverbasicops.cpp b/resource/csdk/stack/samples/linux/secure/ocserverbasicops.cpp index 9e161ef..745c280 100644 --- a/resource/csdk/stack/samples/linux/secure/ocserverbasicops.cpp +++ b/resource/csdk/stack/samples/linux/secure/ocserverbasicops.cpp @@ -316,8 +316,14 @@ void handleSigInt(int signum) FILE* server_fopen(const char *path, const char *mode) { - (void)path; - return fopen(CRED_FILE, mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen(CRED_FILE, mode); + } + else + { + return fopen(path, mode); + } } int main(int /*argc*/, char* /*argv*/[]) diff --git a/resource/csdk/stack/src/ocpayloadconvert.c b/resource/csdk/stack/src/ocpayloadconvert.c index 1a361a1..aab39d3 100755 --- a/resource/csdk/stack/src/ocpayloadconvert.c +++ b/resource/csdk/stack/src/ocpayloadconvert.c @@ -121,7 +121,8 @@ OCStackResult OCConvertPayload(OCPayload* payload, uint8_t** outPayload, size_t* if (err == CborNoError) { - if (curSize < INIT_SIZE && PAYLOAD_TYPE_SECURITY != payload->type) + if ((curSize < INIT_SIZE) && + (PAYLOAD_TYPE_SECURITY != payload->type)) { uint8_t *out2 = (uint8_t *)OICRealloc(out, curSize); VERIFY_PARAM_NON_NULL(TAG, out2, "Failed to increase payload size"); diff --git a/resource/csdk/stack/src/ocresource.c b/resource/csdk/stack/src/ocresource.c index 614c1ac..2cd0681 100755 --- a/resource/csdk/stack/src/ocresource.c +++ b/resource/csdk/stack/src/ocresource.c @@ -61,6 +61,9 @@ /// Module Name #define TAG "OIC_RI_RESOURCE" +// using 1k as block size since most persistent storage implementations use a power of 2. +#define INTROSPECTION_FILE_SIZE_BLOCK 1024 + #define VERIFY_SUCCESS(op) { if (op != (OC_STACK_OK)) \ {OIC_LOG_V(FATAL, TAG, "%s failed!!", #op); goto exit;} } @@ -259,6 +262,14 @@ static OCVirtualResources GetTypeOfVirtualURI(const char *uriInRequest) { return OC_RESOURCE_TYPES_URI; } + else if (strcmp(uriInRequest, OC_RSRVD_INTROSPECTION_URI) == 0) + { + return OC_INTROSPECTION_URI; + } + else if (strcmp(uriInRequest, OC_RSRVD_INTROSPECTION_PAYLOAD_URI) == 0) + { + return OC_INTROSPECTION_PAYLOAD_URI; + } #ifdef ROUTING_GATEWAY else if (0 == strcmp(uriInRequest, OC_RSRVD_GATEWAY_URI)) { @@ -475,6 +486,400 @@ OCStackResult BuildResponseRepresentation(const OCResource *resourcePtr, return OC_STACK_OK; } +static size_t GetIntrospectionDataSize(const OCPersistentStorage *ps) +{ + size_t size = 0; + char buffer[INTROSPECTION_FILE_SIZE_BLOCK]; + FILE *fp; + + if (!ps) + { + return 0; + } + + fp = ps->open(OC_INTROSPECTION_FILE_NAME, "rb"); + if (fp) + { + size_t bytesRead = 0; + do + { + bytesRead = ps->read(buffer, 1, INTROSPECTION_FILE_SIZE_BLOCK, fp); + size += bytesRead; + } while (bytesRead); + ps->close(fp); + } + return size; +} + +OCStackResult GetIntrospectionDataFromPS(char **data, size_t *size) +{ + OIC_LOG(DEBUG, TAG, "GetIntrospectionDataFromPS IN"); + + FILE *fp = NULL; + uint8_t *fsData = NULL; + size_t fileSize = 0; + OCStackResult ret = OC_STACK_ERROR; + OCPersistentStorage *ps = NULL; + + if (!data || *data || !size) + { + return OC_STACK_INVALID_PARAM; + } + + ps = OCGetPersistentStorageHandler(); + if (!ps) + { + OIC_LOG(ERROR, TAG, "Persistent Storage handler is NULL"); + goto exit; + } + + fileSize = GetIntrospectionDataSize(ps); + OIC_LOG_V(DEBUG, TAG, "File Read Size: %zu", fileSize); + if (fileSize) + { + // allocate one more byte to accomodate null terminator for string we are reading. + fsData = (uint8_t *)OICCalloc(1, fileSize + 1); + if (!fsData) + { + OIC_LOG(ERROR, TAG, "Could not allocate memory for introspection data"); + goto exit; + } + + fp = ps->open(OC_INTROSPECTION_FILE_NAME, "rb"); + if (!fp) + { + OIC_LOG(ERROR, TAG, "Could not open persistent storage file for introspection data"); + goto exit; + } + if (ps->read(fsData, 1, fileSize, fp) == fileSize) + { + *size = fileSize; + fsData[fileSize] = '\0'; + *data = (char *)fsData; + fsData = NULL; + ret = OC_STACK_OK; + } + } + OIC_LOG(DEBUG, TAG, "GetIntrospectionDataFromPS OUT"); + +exit: + if (fp) + { + ps->close(fp); + } + if (fsData) + { + OICFree(fsData); + } + return ret; +} + +OCStackResult BuildIntrospectionPayloadResponse(const OCResource *resourcePtr, + OCRepPayload** payload, OCDevAddr *devAddr) +{ + OCRepPayload *tempPayload = NULL; + OCStackResult ret; + char *introspectionData = NULL; + size_t size = 0; + ret = GetIntrospectionDataFromPS(&introspectionData, &size); + if (OC_STACK_OK == ret) + { + OCRepPayload *tempPayload = OCRepPayloadCreate(); + if (tempPayload) + { + if (OCRepPayloadSetPropStringAsOwner(tempPayload, OC_RSRVD_INTROSPECTION_DATA_NAME, introspectionData)) + { + *payload = tempPayload; + } + } + else + { + ret = OC_STACK_NO_MEMORY; + } + } + if (ret != OC_STACK_OK) + { + OICFree(introspectionData); + OCRepPayloadDestroy(tempPayload); + } + + return ret; +} + +OCRepPayload *BuildUrlInfoWithProtocol(const char *protocol) +{ + OCStackResult result = OC_STACK_OK; + OCRepPayload *urlInfoPayload = OCRepPayloadCreate(); + if (!urlInfoPayload) + { + OIC_LOG_V(ERROR, TAG, "Failed to create a new RepPayload"); + result = OC_STACK_NO_MEMORY; + goto exit; + } + + if (!OCRepPayloadSetPropString(urlInfoPayload, OC_RSRVD_INTROSPECTION_URL, OC_RSRVD_INTROSPECTION_PAYLOAD_URI)) + { + OIC_LOG_V(ERROR, TAG, "Failed to add url"); + result = OC_STACK_ERROR; + goto exit; + } + if (!OCRepPayloadSetPropString(urlInfoPayload, OC_RSRVD_INTROSPECTION_PROTOCOL, protocol)) + { + OIC_LOG_V(ERROR, TAG, "Failed to add protocol"); + result = OC_STACK_ERROR; + goto exit; + } + if (!OCRepPayloadSetPropString(urlInfoPayload, OC_RSRVD_INTROSPECTION_CONTENT_TYPE, OC_RSRVD_INTROSPECTION_CONTENT_TYPE_VALUE)) + { + OIC_LOG_V(ERROR, TAG, "Failed to add content type"); + result = OC_STACK_ERROR; + goto exit; + } + if (!OCRepPayloadSetPropInt(urlInfoPayload, OC_RSRVD_INTROSPECTION_VERSION, OC_RSRVD_INTROSPECTION_VERSION_VALUE)) + { + OIC_LOG_V(ERROR, TAG, "Failed to add version"); + result = OC_STACK_ERROR; + goto exit; + } + +exit: + if (result != OC_STACK_OK) + { + OCRepPayloadDestroy(urlInfoPayload); + urlInfoPayload = NULL; + } + return urlInfoPayload; +} + +OCStackResult AddProtocolToLL(OCStringLL **protoLL, const char *protocol) +{ + OCStringLL* cur = *protoLL; + // Check if protocol is already in list + while (cur) + { + if (strcmp(cur->value, protocol) == 0) + { + break; + } + cur = cur->next; + } + if (cur) + { + // The intent of the protocol list is to collect all unique protocols available on this + // endpoint. Set an error that can be used to skip processing this protocol further as + // it already exists in the list. + return OC_STACK_INVALID_PARAM; + } + else + { + cur = (OCStringLL*)OICCalloc(1, sizeof(OCStringLL)); + if (!cur) + { + return OC_STACK_NO_MEMORY; + } + } + + cur->value = OICStrdup(protocol); + if (!cur->value) + { + OICFree(cur); + return OC_STACK_NO_MEMORY; + } + + cur->next = *protoLL; + *protoLL = cur; + return OC_STACK_OK; +} + +void FreeProtocolLL(OCStringLL *protoLL) +{ + OCStringLL* cur = protoLL; + while (cur) + { + OCStringLL *temp = cur; + cur = cur->next; + OICFree(temp->value); + OICFree(temp); + } +} + +OCStackResult BuildIntrospectionResponseRepresentation(const OCResource *resourcePtr, + OCRepPayload** payload, OCDevAddr *devAddr) +{ + size_t dimensions[3] = { 0, 0, 0 }; + OCRepPayload *tempPayload = NULL; + OCRepPayload **urlInfoPayload = NULL; + OCStringLL *protoLL = NULL; + OCStackResult ret = OC_STACK_OK; + OCResourceType *resType = NULL; + OCResourceInterface *resInterface = NULL; + + if (!resourcePtr) + { + ret = OC_STACK_INVALID_PARAM; + goto exit; + } + + tempPayload = OCRepPayloadCreate(); + if (!tempPayload) + { + ret = OC_STACK_NO_MEMORY; + goto exit; + } + + if (!OCRepPayloadSetUri(tempPayload, resourcePtr->uri)) + { + OIC_LOG_V(ERROR, TAG, "Failed to set payload URI"); + ret = OC_STACK_ERROR; + goto exit; + } + + resType = resourcePtr->rsrcType; + while (resType) + { + if (!OCRepPayloadAddResourceType(tempPayload, resType->resourcetypename)) + { + OIC_LOG_V(ERROR, TAG, "Failed at add resource type"); + ret = OC_STACK_ERROR; + goto exit; + } + resType = resType->next; + } + + resInterface = resourcePtr->rsrcInterface; + while (resInterface) + { + if (!OCRepPayloadAddInterface(tempPayload, resInterface->name)) + { + OIC_LOG_V(ERROR, TAG, "Failed to add interface"); + ret = OC_STACK_ERROR; + goto exit; + } + resInterface = resInterface->next; + } + if (!OCRepPayloadSetPropString(tempPayload, OC_RSRVD_INTROSPECTION_NAME, OC_RSRVD_INTROSPECTION_NAME_VALUE)) + { + OIC_LOG_V(ERROR, TAG, "Failed to set Name property."); + ret = OC_STACK_ERROR; + goto exit; + } + + // figure out which protocols this endpoint supports + if (resourcePtr->endpointType | OC_COAP) + { + if (OC_STACK_OK == AddProtocolToLL(&protoLL, COAP_STR)) + { + dimensions[0]++; + } + } + if (resourcePtr->endpointType | OC_COAPS) + { + if (OC_STACK_OK == AddProtocolToLL(&protoLL, COAPS_STR)) + { + dimensions[0]++; + } + } +#ifdef TCP_ADAPTER + if (resourcePtr->endpointType | OC_COAP_TCP) + { + if (OC_STACK_OK == AddProtocolToLL(&protoLL, COAP_STR)) + { + dimensions[0]++; + } + } + if (resourcePtr->endpointType | OC_COAPS_TCP) + { + if (OC_STACK_OK == AddProtocolToLL(&protoLL, COAPS_STR)) + { + dimensions[0]++; + } + } +#endif +#ifdef HTTP_ADAPTER + if (resourcePtr->endpointType | OC_HTTP) + { + if (OC_STACK_OK == AddProtocolToLL(&protoLL, HTTP_STR)) + { + dimensions[0]++; + } + } + if (resourcePtr->endpointType | OC_HTTPS) + { + if (OC_STACK_OK == AddProtocolToLL(&protoLL, HTTPS_STR)) + { + dimensions[0]++; + } + } +#endif +#ifdef EDR_ADAPTER + if (resourcePtr->endpointType | OC_COAP_RFCOMM) + { + if (OC_STACK_OK == AddProtocolToLL(&protoLL, COAP_STR)) + { + dimensions[0]++; + } + } +#endif + // Add a urlInfo object for each protocol supported + if (dimensions[0] >= 0) + { + urlInfoPayload = (OCRepPayload **)OICMalloc(dimensions[0] * sizeof(OCRepPayload)); + if (urlInfoPayload) + { + OCStringLL *proto = protoLL; + size_t i = 0; + while (proto) + { + urlInfoPayload[i] = BuildUrlInfoWithProtocol(proto->value); + if (!urlInfoPayload[i]) + { + OIC_LOG_V(ERROR, TAG, "Unable to build urlInfo object for protocol"); + ret = OC_STACK_ERROR; + goto exit; + } + proto = proto->next; + i++; + } + if (!OCRepPayloadSetPropObjectArrayAsOwner(tempPayload, + OC_RSRVD_INTROSPECTION_URL_INFO, + urlInfoPayload, + dimensions)) + { + OIC_LOG_V(ERROR, TAG, "Unable to add urlInfo object to introspection payload "); + ret = OC_STACK_ERROR; + goto exit; + } + } + else + { + OIC_LOG_V(ERROR, TAG, "Unable to allocate memory for urlInfo "); + ret = OC_STACK_NO_MEMORY; + goto exit; + } + } + + if (!*payload) + { + *payload = tempPayload; + } + else + { + OCRepPayloadAppend(*payload, tempPayload); + } +exit: + if (ret != OC_STACK_OK) + { + OCRepPayloadDestroy(tempPayload); + if (urlInfoPayload) + { + OICFree(urlInfoPayload); + } + } + FreeProtocolLL(protoLL); + + return OC_STACK_OK; +} + OCStackResult BuildVirtualResourceResponse(const OCResource *resourcePtr, OCDiscoveryPayload *payload, OCDevAddr *devAddr, @@ -1076,7 +1481,22 @@ static OCStackResult HandleVirtualResource (OCServerRequest *request, OCResource discoveryResult = RMHandleGatewayRequest(request, resource); } #endif - + else if (OC_INTROSPECTION_URI == virtualUriInRequest) + { + // Received request for introspection + OCResource *resourcePtr = FindResourceByUri(OC_RSRVD_INTROSPECTION_URI); + VERIFY_PARAM_NON_NULL(TAG, resourcePtr, "Introspection URI not found."); + discoveryResult = BuildIntrospectionResponseRepresentation(resourcePtr, (OCRepPayload **)&payload, &request->devAddr); + OIC_LOG(INFO, TAG, "Request is for Introspection"); + } + else if (OC_INTROSPECTION_PAYLOAD_URI == virtualUriInRequest) + { + // Received request for introspection payload + OCResource *resourcePtr = FindResourceByUri(OC_RSRVD_INTROSPECTION_PAYLOAD_URI); + VERIFY_PARAM_NON_NULL(TAG, resourcePtr, "Introspection Payload URI not found."); + discoveryResult = BuildIntrospectionPayloadResponse(resourcePtr, (OCRepPayload **)&payload, &request->devAddr); + OIC_LOG(INFO, TAG, "Request is for Introspection Payload"); + } /** * Step 2: Send the discovery response * diff --git a/resource/csdk/stack/src/ocstack.c b/resource/csdk/stack/src/ocstack.c index 0ef6c1a..36a7508 100644 --- a/resource/csdk/stack/src/ocstack.c +++ b/resource/csdk/stack/src/ocstack.c @@ -120,6 +120,8 @@ OCResource *headResource = NULL; static OCResource *tailResource = NULL; static OCResourceHandle platformResource = {0}; static OCResourceHandle deviceResource = {0}; +static OCResourceHandle introspectionResource = {0}; +static OCResourceHandle introspectionPayloadResource = {0}; #ifdef MQ_BROKER static OCResourceHandle brokerResource = {0}; #endif @@ -144,6 +146,8 @@ static const char CORESPEC[] = "core"; CAAdapterStateChangedCB g_adapterHandler = NULL; CAConnectionStateChangedCB g_connectionHandler = NULL; +// Persistent Storage callback handler for open/read/write/close/unlink +static OCPersistentStorage *g_PersistentStorageHandler = NULL; //----------------------------------------------------------------------------- // Macros @@ -1346,7 +1350,14 @@ void OCHandleResponse(const CAEndpoint_t* endPoint, const CAResponseInfo_t* resp { type = PAYLOAD_TYPE_REPRESENTATION; } - + else if (strcmp(cbNode->requestUri, OC_RSRVD_INTROSPECTION_URI) == 0) + { + type = PAYLOAD_TYPE_REPRESENTATION; + } + else if (strcmp(cbNode->requestUri, OC_RSRVD_INTROSPECTION_PAYLOAD_URI) == 0) + { + type = PAYLOAD_TYPE_REPRESENTATION; + } #ifdef ROUTING_GATEWAY else if (strcmp(cbNode->requestUri, OC_RSRVD_GATEWAY_URI) == 0) { @@ -3054,7 +3065,13 @@ OCStackResult OCRegisterPersistentStorageHandler(OCPersistentStorage* persistent return OC_STACK_INVALID_PARAM; } } - return SRMRegisterPersistentStorageHandler(persistentStorageHandler); + g_PersistentStorageHandler = persistentStorageHandler; + return OC_STACK_OK; +} + +OCPersistentStorage *OCGetPersistentStorageHandler() +{ + return g_PersistentStorageHandler; } #ifdef WITH_PRESENCE @@ -4346,6 +4363,38 @@ OCStackResult initResources() } } + if (result == OC_STACK_OK) + { + result = OCCreateResource(&introspectionResource, + OC_RSRVD_RESOURCE_TYPE_INTROSPECTION, + OC_RSRVD_INTERFACE_DEFAULT, + OC_RSRVD_INTROSPECTION_URI, + NULL, + NULL, + OC_DISCOVERABLE); + if (result == OC_STACK_OK) + { + result = BindResourceInterfaceToResource((OCResource *)introspectionResource, + OC_RSRVD_INTERFACE_READ); + } + } + + if (result == OC_STACK_OK) + { + result = OCCreateResource(&introspectionPayloadResource, + OC_RSRVD_RESOURCE_TYPE_INTROSPECTION_PAYLOAD, + OC_RSRVD_INTERFACE_DEFAULT, + OC_RSRVD_INTROSPECTION_PAYLOAD_URI, + NULL, + NULL, + OC_OBSERVABLE); + if (result == OC_STACK_OK) + { + result = BindResourceInterfaceToResource((OCResource *)introspectionPayloadResource, + OC_RSRVD_INTERFACE_READ); + } + } + return result; } diff --git a/resource/examples/SConscript b/resource/examples/SConscript index f8b3999..59d9564 100644 --- a/resource/examples/SConscript +++ b/resource/examples/SConscript @@ -122,6 +122,9 @@ clientjson = examples_env.Install(examples_env.get('BUILD_DIR') + '/resource/exa examples_env.get('SRC_DIR') + '/resource/examples/' + 'oic_svr_db_client.dat') serverjson = examples_env.Install(examples_env.get('BUILD_DIR') + '/resource/examples/', examples_env.get('SRC_DIR') + '/resource/examples/' + 'oic_svr_db_server.dat') +light_introspection_json = examples_env.Install(examples_env.get('BUILD_DIR') + '/resource/examples/', + examples_env.get('SRC_DIR') + '/resource/examples/' + 'light_introspection.json') + directpairingdat = examples_env.Install(examples_env.get('BUILD_DIR') + '/resource/examples/', examples_env.get('SRC_DIR') + '/resource/examples/' + 'oic_svr_db_client_directpairing.dat') diff --git a/resource/examples/directpairingclient.cpp b/resource/examples/directpairingclient.cpp index 46b36a6..703c378 100644 --- a/resource/examples/directpairingclient.cpp +++ b/resource/examples/directpairingclient.cpp @@ -64,9 +64,16 @@ using namespace OC; static int ask = 1; static PairedDevices discoveredDeviceList, pairedDeviceList; -static FILE* client_open(const char* /*fileName*/, const char *mode) +static FILE* client_open(const char* path, const char* mode) { - return fopen(DAT_DB_PATH, mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen(DAT_DB_PATH, mode); + } + else + { + return fopen(path, mode); + } } diff --git a/resource/examples/light_introspection.json b/resource/examples/light_introspection.json new file mode 100644 index 0000000..baab37f --- /dev/null +++ b/resource/examples/light_introspection.json @@ -0,0 +1,272 @@ +{ + "swagger": "2.0", + "info": { + "title": "my_example_device", + "version": "my device version" + }, + + + "schemes": [ + "http" + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "paths": { + "/switch": { + + "get": { + + + "parameters": [ + { + "name": "if", + "in": "query", + "description": "", + "enum": [ "oic.if.a","oic.if.baseline" ], + + "type": "string" + } + ], + "responses": { + "200" : { + "description" : "", + "schema" : + { + "$ref": "#/definitions/BinarySwitch" + } + } + } + + }, + + "post": { + + + "parameters": [ + { + "name": "if", + "in": "query", + "description": "", + "enum": [ "oic.if.a","oic.if.baseline" ], + + "type": "string" + } + ,{ + "name": "body", + "in": "body", + "required": false, + "schema" : + { + "$ref": "#/definitions/BinarySwitch" + } + + } + ], + "responses": { + "200" : { + "description" : "", + "schema" : + { + "$ref": "#/definitions/BinarySwitch" + } + + } + } + } + }, + "/brightness": { + + "get": { + + + "parameters": [ + { + "name": "if", + "in": "query", + "description": "", + "enum": [ "oic.if.a","oic.if.baseline" ], + + "type": "string" + } + ], + "responses": { + "200" : { + "description" : "", + "schema" : + { + "$ref": "#/definitions/Brightness" + } + } + } + + }, + + "post": { + + + "parameters": [ + { + "name": "if", + "in": "query", + "description": "", + "enum": [ "oic.if.a","oic.if.baseline" ], + + "type": "string" + } + ,{ + "name": "body", + "in": "body", + "required": false, + "schema" : + { + "$ref": "#/definitions/Brightness" + } + } + ], + "responses": { + "200" : { + "description" : "", + "schema" : + { + "$ref": "#/definitions/Brightness" + } + + } + } + + } + } + }, + "definitions": + { + "BinarySwitch": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "value": { + "type": "boolean", + "description": "Status of the switch" + }, + "rt": { + "type": "array", + "items" : [ + { + "type" : "string", + "maxLength": 64 + } + ], + "minItems" : 1, + "description": "Resource Type", + "readOnly" : true, + "default" : [ "oic.r.switch.binary" ] + }, + "if": { + "type": "array", + "description": "The interface set supported by this resource", + "readOnly" : true, + "items": { + "type": "string", + "enum": [ + "oic.if.baseline", + "oic.if.a" + ] + } + }, + "p": { + "type": "integer", + "description": "Bitmap indicating observable and discoverable", + "readOnly" : true + }, + "n": { + "type": "string", + "description": "Friendly name of the resource", + "readOnly" : true + }, + "id": { + "type": "string", + "description": "Instance ID of this specific resource", + "readOnly" : true + }, + "range": { + "type": "array", + "description": "The valid range for the value Property", + "readOnly" : true, + "minItems": 2, + "maxItems": 2, + "items": { + "type": "number" + } + } + } + }, + "Brightness": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "brighness": { + "type": "integer", + "description": "Current sensed or set value for Brightness" + }, + "rt": { + "type": "array", + "items" : [ + { + "type" : "string", + "maxLength": 64 + } + ], + "minItems" : 1, + "description": "Resource Type", + "readOnly" : true, + "default" : [ "oic.r.light.brightness" ] + }, + "if": { + "type": "array", + "description": "The interface set supported by this resource", + "readOnly" : true, + "items": { + "type": "string", + "enum": [ + "oic.if.baseline", + "oic.if.a" + ] + } + }, + "p": { + "type": "integer", + "description": "Bitmap indicating observable and discoverable", + "readOnly" : true + }, + "n": { + "type": "string", + "description": "Friendly name of the resource", + "readOnly" : true + }, + "id": { + "type": "string", + "description": "Instance ID of this specific resource", + "readOnly" : true + }, + "range": { + "type": "array", + "description": "The valid range for the value Property", + "readOnly" : true, + "minItems": 2, + "maxItems": 2, + "items": { + "type": "number" + } + } + } + } + } + +} diff --git a/resource/examples/lightserver.cpp b/resource/examples/lightserver.cpp index 2baf79f..127b858 100644 --- a/resource/examples/lightserver.cpp +++ b/resource/examples/lightserver.cpp @@ -387,15 +387,31 @@ OCStackResult SetDeviceInfo() return OC_STACK_OK; } +FILE* server_fopen(const char* path, const char* mode) +{ + if (0 == strcmp(path, OC_INTROSPECTION_FILE_NAME)) + { + return fopen("light_introspection.json", mode); + } + else + { + return fopen(path, mode); + } +} + + int main(int /*argc*/, char** /*argv[]*/) { + // Create persistent storage handlers + OCPersistentStorage ps{server_fopen, fread, fwrite, fclose, unlink}; // Create PlatformConfig object PlatformConfig cfg { OC::ServiceType::InProc, OC::ModeType::Server, "0.0.0.0", // By setting to "0.0.0.0", it binds to all available interfaces 0, // Uses randomly available port - OC::QualityOfService::LowQos + OC::QualityOfService::LowQos, + &ps }; OCPlatform::Configure(cfg); diff --git a/resource/examples/mediaserver.cpp b/resource/examples/mediaserver.cpp index 457349b..0f07e86 100644 --- a/resource/examples/mediaserver.cpp +++ b/resource/examples/mediaserver.cpp @@ -525,9 +525,16 @@ void PrintUsage() cout << " 4 - Non-secure resource, GET slow response, notify all observers\n"; } -static FILE* client_open(const char* /*path*/, const char* mode) +static FILE* client_open(const char* path, const char* mode) { - return fopen("./oic_svr_db_server.dat", mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen("./oic_svr_db_server.dat", mode); + } + else + { + return fopen(path, mode); + } } void playPause() diff --git a/resource/examples/rdclient.cpp b/resource/examples/rdclient.cpp index 4368f6b..5960fa2 100644 --- a/resource/examples/rdclient.cpp +++ b/resource/examples/rdclient.cpp @@ -218,9 +218,16 @@ static void printUsage() std::cout<<"Usage: rdserver \n"; } -static FILE* client_open(const char* /*path*/, const char *mode) +static FILE* client_open(const char* path, const char* mode) { - return fopen(SVR_DB_FILE_NAME, mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen(SVR_DB_FILE_NAME, mode); + } + else + { + return fopen(path, mode); + } } int main(int argc, char* argv[]) diff --git a/resource/examples/simpleclient.cpp b/resource/examples/simpleclient.cpp index 924e88c..885d9aa 100644 --- a/resource/examples/simpleclient.cpp +++ b/resource/examples/simpleclient.cpp @@ -468,9 +468,16 @@ void checkTransportValue(int value) } } -static FILE* client_open(const char* /*path*/, const char *mode) +static FILE* client_open(const char* path, const char* mode) { - return fopen(SVR_DB_FILE_NAME, mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen(SVR_DB_FILE_NAME, mode); + } + else + { + return fopen(path, mode); + } } int main(int argc, char* argv[]) { diff --git a/resource/examples/simpleserver.cpp b/resource/examples/simpleserver.cpp index 6185e3d..79b83d4 100644 --- a/resource/examples/simpleserver.cpp +++ b/resource/examples/simpleserver.cpp @@ -617,9 +617,16 @@ void PrintUsage() std::cout << " 4 - Non-secure resource, GET slow response, notify all observers\n"; } -static FILE* client_open(const char* /*path*/, const char *mode) +static FILE* client_open(const char* path, const char* mode) { - return fopen(SVR_DB_FILE_NAME, mode); + if (strcmp(path, OC_INTROSPECTION_FILE_NAME) == 0) + { + return fopen("light_introspection.json", mode); + } + else + { + return fopen(SVR_DB_FILE_NAME, mode); + } } int main(int argc, char* argv[]) diff --git a/resource/examples/winuiclientgui.cpp b/resource/examples/winuiclientgui.cpp index 596bb4e..c6921ce 100644 --- a/resource/examples/winuiclientgui.cpp +++ b/resource/examples/winuiclientgui.cpp @@ -48,9 +48,16 @@ HWND WINAPI CreateTrackbar(HWND parent, int x, int y, int w, int h,UINT iMin, UI HWND WINAPI CreateLabel(HWND parent, LPCTSTR lpText, int x, int y, int w, int h); HWND WINAPI CreateButton(HWND parent, UINT_PTR id, LPCTSTR caption, int x, int y, int w, int h); -FILE* client_open(const char* /*path*/, const char *mode) +FILE* client_open(const char* path, const char* mode) { - return fopen("./oic_svr_db_client.dat", mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen("./oic_svr_db_client.dat", mode); + } + else + { + return fopen(path, mode); + } } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, diff --git a/resource/provisioning/examples/cloudClient.cpp b/resource/provisioning/examples/cloudClient.cpp index 642fe81..9ea5f2c 100644 --- a/resource/provisioning/examples/cloudClient.cpp +++ b/resource/provisioning/examples/cloudClient.cpp @@ -427,8 +427,14 @@ static void userRequests(void *data) FILE* server_fopen(const char *path, const char *mode) { - OC_UNUSED(path); - return fopen(fname, mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen(fname, mode); + } + else + { + return fopen(path, mode); + } } /** diff --git a/resource/provisioning/examples/provisioningclient.cpp b/resource/provisioning/examples/provisioningclient.cpp index 6a4e9f5..1b6905a 100644 --- a/resource/provisioning/examples/provisioningclient.cpp +++ b/resource/provisioning/examples/provisioningclient.cpp @@ -70,10 +70,16 @@ static int transferDevIdx, ask = 1; static OicSecPconf_t g_pconf; static uint16_t g_credId = 0; -static FILE* client_open(const char *UNUSED_PARAM, const char *mode) +static FILE* client_open(const char *path, const char *mode) { - (void)UNUSED_PARAM; - return fopen(DAT_DB_PATH, mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen(DAT_DB_PATH, mode); + } + else + { + return fopen(path, mode); + } } void printMenu() diff --git a/resource/provisioning/examples/subownerclient.cpp b/resource/provisioning/examples/subownerclient.cpp index f662526..cf6f036 100644 --- a/resource/provisioning/examples/subownerclient.cpp +++ b/resource/provisioning/examples/subownerclient.cpp @@ -63,10 +63,16 @@ using namespace OC; DeviceList_t pMOwnedDeviceList, pMOTEnabledDeviceList; static int transferDevIdx, ask = 1; -static FILE* client_open(const char *UNUSED_PARAM, const char *mode) +static FILE* client_open(const char *path, const char *mode) { - (void)UNUSED_PARAM; - return fopen(DAT_DB_PATH, mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen(DAT_DB_PATH, mode); + } + else + { + return fopen(path, mode); + } } void printMenu() diff --git a/resource/unittests/OCPlatformTest.cpp b/resource/unittests/OCPlatformTest.cpp index 5a26944..63ffecc 100644 --- a/resource/unittests/OCPlatformTest.cpp +++ b/resource/unittests/OCPlatformTest.cpp @@ -35,11 +35,18 @@ namespace OCPlatformTest OCResourceHandle resourceHandle; //OCPersistent Storage Handlers - static FILE* client_open(const char * /*path*/, const char *mode) + static FILE* client_open(const char *path, const char *mode) { - std::cout << "<===Opening SVR DB file = './oic_svr_db_client.dat' with mode = '" << mode + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + std::cout << "<===Opening SVR DB file = './oic_svr_db_client.dat' with mode = '" << mode << "' " << std::endl; - return fopen(SVR_DB_FILE_NAME, mode); + return fopen(SVR_DB_FILE_NAME, mode); + } + else + { + return fopen(path, mode); + } } OCPersistentStorage gps {client_open, fread, fwrite, fclose, unlink }; diff --git a/service/easy-setup/sampleapp/enrollee/linux/enrolleewifi.c b/service/easy-setup/sampleapp/enrollee/linux/enrolleewifi.c index 2f0c6f2..9caada0 100755 --- a/service/easy-setup/sampleapp/enrollee/linux/enrolleewifi.c +++ b/service/easy-setup/sampleapp/enrollee/linux/enrolleewifi.c @@ -133,8 +133,14 @@ ESProvisioningCallbacks gCallbacks = { FILE* server_fopen(const char *path, const char *mode) { - (void) path; - return fopen(CRED_FILE, mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen(CRED_FILE, mode); + } + else + { + return fopen(path, mode); + } } void EnableSecurity() diff --git a/service/easy-setup/sampleapp/enrollee/tizen-sdb/EnrolleeSample/enrolleewifi.cpp b/service/easy-setup/sampleapp/enrollee/tizen-sdb/EnrolleeSample/enrolleewifi.cpp index 83c2fc7..ce8d673 100755 --- a/service/easy-setup/sampleapp/enrollee/tizen-sdb/EnrolleeSample/enrolleewifi.cpp +++ b/service/easy-setup/sampleapp/enrollee/tizen-sdb/EnrolleeSample/enrolleewifi.cpp @@ -145,8 +145,14 @@ ESProvisioningCallbacks gCallbacks = { FILE* server_fopen(const char *path, const char *mode) { - (void) path; - return fopen(CRED_FILE, mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen(CRED_FILE, mode); + } + else + { + return fopen(path, mode); + } } void EnableSecurity() diff --git a/service/easy-setup/sampleapp/mediator/linux/richsdk_sample/mediator.cpp b/service/easy-setup/sampleapp/mediator/linux/richsdk_sample/mediator.cpp index 54beb20..47313f1 100755 --- a/service/easy-setup/sampleapp/mediator/linux/richsdk_sample/mediator.cpp +++ b/service/easy-setup/sampleapp/mediator/linux/richsdk_sample/mediator.cpp @@ -417,10 +417,16 @@ void DisplayMenu() }; } -static FILE* client_open(const char *UNUSED_PARAM, const char *mode) +static FILE* client_open(const char *path, const char *mode) { - (void)UNUSED_PARAM; - return fopen(JSON_DB_PATH, mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen(JSON_DB_PATH, mode); + } + else + { + return fopen(path, mode); + } } int main() diff --git a/service/easy-setup/sampleapp/mediator/linux/richsdk_sample/submediator.cpp b/service/easy-setup/sampleapp/mediator/linux/richsdk_sample/submediator.cpp index 2737f06..dc181e1 100755 --- a/service/easy-setup/sampleapp/mediator/linux/richsdk_sample/submediator.cpp +++ b/service/easy-setup/sampleapp/mediator/linux/richsdk_sample/submediator.cpp @@ -418,10 +418,16 @@ void DisplayMenu() }; } -static FILE* client_open(const char *UNUSED_PARAM, const char *mode) +static FILE* client_open(const char *path, const char *mode) { - (void)UNUSED_PARAM; - return fopen(JSON_DB_PATH, mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen(JSON_DB_PATH, mode); + } + else + { + return fopen(path, mode); + } } int main() diff --git a/service/notification/cpp-wrapper/examples/linux/notificationserviceconsumer.cpp b/service/notification/cpp-wrapper/examples/linux/notificationserviceconsumer.cpp index cdf20f3..b6eb079 100755 --- a/service/notification/cpp-wrapper/examples/linux/notificationserviceconsumer.cpp +++ b/service/notification/cpp-wrapper/examples/linux/notificationserviceconsumer.cpp @@ -39,8 +39,14 @@ uint64_t mainMessageId = 0; FILE *server_fopen(const char *path, const char *mode) { - (void)path; - return fopen("oic_ns_provider_db.dat", mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen("oic_ns_provider_db.dat", mode); + } + else + { + return fopen(path, mode); + } } void onNotificationPostedCb(OIC::Service::NSMessage *notification) diff --git a/service/notification/examples/linux/notificationconsumer.c b/service/notification/examples/linux/notificationconsumer.c index 8c14cd3..9fe1559 100644 --- a/service/notification/examples/linux/notificationconsumer.c +++ b/service/notification/examples/linux/notificationconsumer.c @@ -48,8 +48,14 @@ NSTopicLL * g_topicLL = NULL; FILE* server_fopen(const char *path, const char *mode) { - (void)path; - return fopen("oic_ns_provider_db.dat", mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen("oic_ns_provider_db.dat", mode); + } + else + { + return fopen(path, mode); + } } void printProviderTopicList(NSTopicLL * topics) diff --git a/service/notification/examples/linux/notificationprovider.c b/service/notification/examples/linux/notificationprovider.c index 221013a..534973a 100644 --- a/service/notification/examples/linux/notificationprovider.c +++ b/service/notification/examples/linux/notificationprovider.c @@ -97,8 +97,14 @@ void syncCallback(NSSyncInfo *sync) FILE* server_fopen(const char *path, const char *mode) { - (void)path; - return fopen("oic_ns_provider_db.dat", mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen("oic_ns_provider_db.dat", mode); + } + else + { + return fopen(path, mode); + } } void printTopics(NSTopicLL * topics) diff --git a/service/resource-container/examples/ContainerSampleClient.cpp b/service/resource-container/examples/ContainerSampleClient.cpp index d4d2729..f239415 100644 --- a/service/resource-container/examples/ContainerSampleClient.cpp +++ b/service/resource-container/examples/ContainerSampleClient.cpp @@ -644,9 +644,14 @@ void checkObserverValue(int value) static FILE *client_open(const char *path, const char *mode) { - (void)path; - - return fopen("./oic_svr_db_client.json", mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen("./oic_svr_db_client.json", mode); + } + else + { + return fopen(path, mode); + } } int main(int argc, char *argv[]) diff --git a/service/resource-encapsulation/examples/linux/secureResourceExample/SampleAuthorizedClient.cpp b/service/resource-encapsulation/examples/linux/secureResourceExample/SampleAuthorizedClient.cpp index 5b53677..1302101 100644 --- a/service/resource-encapsulation/examples/linux/secureResourceExample/SampleAuthorizedClient.cpp +++ b/service/resource-encapsulation/examples/linux/secureResourceExample/SampleAuthorizedClient.cpp @@ -314,9 +314,16 @@ void runDiscovery() g_currentRun = runResourceSelection; } -static FILE *client_open(const char * /*path*/, const char *mode) +static FILE *client_open(const char *path, const char *mode) { - return fopen("./oic_svr_db_client.json", mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen("./oic_svr_db_client.json", mode); + } + else + { + return fopen(path, mode); + } } int main() diff --git a/service/resource-encapsulation/examples/linux/secureResourceExample/SampleSecureServer.cpp b/service/resource-encapsulation/examples/linux/secureResourceExample/SampleSecureServer.cpp index 2457bb0..415df43 100644 --- a/service/resource-encapsulation/examples/linux/secureResourceExample/SampleSecureServer.cpp +++ b/service/resource-encapsulation/examples/linux/secureResourceExample/SampleSecureServer.cpp @@ -204,9 +204,16 @@ void runPresenceSelection() g_currentRun = runResourceModeSelection; } -static FILE *client_open(const char * /*path*/, const char *mode) +static FILE *client_open(const char *path, const char *mode) { - return fopen("./oic_svr_db_server.json", mode); + if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME)) + { + return fopen("./oic_svr_db_server.json", mode); + } + else + { + return fopen(path, mode); + } } int main(void)