Currently, Samsung implements   the sequence type of 
AttributeValue(OCRepPayload )   in C  like C++ 
I wrote   the sequence type of AttributeValue(OCRepPayload )  because C doesn't 
support vector. 

when I am using *.c from resoruce/csdk/stack/src  because  we cannot use 
OCpresentation.cpp for the thin project ,I have problem to exchaange 
"OCRepPayload array (OCRepPayload[] )"  as a value.

ie . the following format cannot be sent.
.   {  "key1" : {
                      { 
                         "nested key" : "key_01"
                          value"  : 100
                        }, 
                        {
                           "nested key" : "key_02"
                           "value"  : 200
                        } 
                   }
      }           

The based file i tested was   
resource/scdk/stack/smaples/linux/SimpleClientServer/ocserver.cpp, occlient.cpp.
Even though they are .cpp,  they call  c functions intread of c++ functions.. 


while testing and debuging this issue,  I found out that 
OCRepPayloadSetPropObjectArray of ocpayload.c  has a pointer issue
line 953 ;  increasing i  of  array[i]  in  OCRepPayloadClone(array[i])  jumps 
too much  , so it cannot find the next  OCRepPayload  correct.

If   newArray[i] = OCRepPayloadClone(array[i]) is changed to  newArray[i] = 
OCRepPayloadClone((*array +i) )  ;,it seems  it works well as intended 


=============

typedef struct LIGHTRESOURCE
{
    OCResourceHandle handle;
    bool state;
    int power;
    char strArray[STRARRAYNUMBER][STRARRAYLENTH];               // array string
    int64_t  intArray[INTARRAYNUMBER];                          // array int
    OCRepPayload  rcsArray[2];
} LightResource;

-----------------

{
......
       OCRepPayload dupobj[2];
        dimensions[0]=2; dimensions[1]=dimensions[2]=0;
        if(OCRepPayloadGetPropObjectArray(input, "rcsarray", (OCRepPayload 
***)dupobj, dimensions))          {

             memcpy(currLightResource->rcsArray, dupobj, 
RCSTARRAYNUMBER*sizeof(OCRepPayload));
        }

    }
   // when I check   currLightResource->rcsArray,,  it has teh  correct value. 
    return getPayload(gResourceUri, currLightResource->power, 
currLightResource->state, 
        currLightResource->strArray, currLightResource->intArray, 
currLightResource->rcsArray);
}



OCRepPayload* getPayload(const char* uri, int64_t power, bool state, char 
strArray[][STRARRAYLENTH], 
        int64_t* intArray, OCRepPayload*  rcsArray)
{
....
 size_t dimensions[MAX_REP_ARRAY_DEPTH]={2,0,0}; ;; just 2 times.
OCRepPayloadSetPropObjectArray(payload, "rcsarray",( const OCRepPayload**) 
&rcsArray, dimensions );  ///    
....
}


Given that OCRepresentation.cpp doesn't use  OCRepPayloadSetPropObjectArray  
and nobody uses OCRepPayload array (OCRepPayload[] ) yet, I think it is possble 
that it would rather be changed. however I am still believeing  my testing way 
may need to get fixed..  


If you don't mind . Can I submit ocpayload.c directly?  otherwise  please  find 
out the better way or make me correct.. 


thank you
Rami 

Reply via email to