Hello,
It is me again.
I have some troubles with PHOTO for synchronised contact.
I used the same idea to extract encoded value to decode it.
I tried with GetValue and  GetValueByID but no chance.
Any idea to get it and encoding type also.
Thanks for help guys.


Regards

2011/9/19 Roger KeIrad <roger.kilrad@gmail.com>
Thanks Lukas. 

2011/9/16 Lukas Zeller <luz@plan44.ch>
Hello Roger,

On Sep 16, 2011, at 16:28 , Roger KeIrad wrote:

> hello,
> any help please?
> thanks in advance.


There are a number of GetValueXXX variants. GetValue() is only for single values.

For arrays, you need to use GetValueByID(), which has a arrIndex parameter. To get the ID for a name, use GetValueID(). You can get the size of the array by appending VALSUFF_ARRSZ to the array field name, and call GetValue() with that - you'll get the number of elements back.

See sysync_SDK/Sources/enginemodulebase.h for more detailed description of all the Get/SetValue functions, and engine_defs.h for the VALNAME_xxx and VALSUFF_xxx explanations.

Pseudo code to get all elements of an array would look like:
SDK_InterfaceType

// get size of array
uInt16 arraySize;
memsize n;
GetValue("arrayFieldName" VALSUFF_ARRSZ, VALTYPE_INT16, &arraySize,sizeof(arraySize),n);

// get elements of array
long arrayFieldID = GetValueID("arrayFieldName");
for (int i=0; i<arraySize; i++) {
 GetValueByID(arrayFieldID, i, VALTYPE_XXX, &buffer, maxSize, n);
 // do something with the value
}



Below is a more elaborate routine, which prints out all values for a given aItemKey, including array fields:


/* Show all fields/variables of item represented by aItemKey */
static void ShowFields(DB_Callback cb, appPointer aItemKey)
{
 const stringSize maxstr = 128;
 appChar fnam[maxstr];
 appChar fval[maxstr];
 appChar ftz[maxstr];
 uInt16 fvaltype;
 uInt16 farrsize;
 uInt16 arridx;
 bool fisarray;
 uInt32 valsize;
 TSyError err;
 uInt32 valueID,nameFlag,typeFlag,arrszFlag,tznamFlag;
 // set desired time mode
 cb->ui.SetTimeMode(cb, aItemKey, TMODE_LINEARTIME+TMODE_FLAG_FLOATING);
 // get flags that can be combined with valueID to get attributes of a value
 nameFlag = cb->ui.GetValueID(cb, aItemKey, ".FLAG.VALNAME");
 typeFlag = cb->ui.GetValueID(cb, aItemKey, ".FLAG.VALTYPE");
 arrszFlag = cb->ui.GetValueID(cb, aItemKey, ".FLAG.ARRAYSIZE");
 tznamFlag = cb->ui.GetValueID(cb, aItemKey, ".FLAG.TZNAME");
 // iterate over all fields
 // - start iteration
 valueID = cb->ui.GetValueID(cb, aItemKey, VALNAME_FIRST);
 while (valueID != KEYVAL_ID_UNKNOWN && valueID != KEYVAL_NO_ID) {
   // get field name
   err = cb->ui.GetValueByID(cb,
     aItemKey,
     valueID + nameFlag,
     0,
     VALTYPE_TEXT,
     fnam,
     maxstr,
     &valsize
   );
   // get field type
   err = cb->ui.GetValueByID(cb,
     aItemKey,
     valueID + typeFlag,
     0,
     VALTYPE_INT16,
     &fvaltype,
     sizeof(fvaltype),
     &valsize
   );
   // check if array, and if array, get number of elements
   err = cb->ui.GetValueByID(cb,
     aItemKey,
     valueID + arrszFlag,
     0,
     VALTYPE_INT16,
     &farrsize,
     sizeof(farrsize),
     &valsize
   );
   fisarray = err==LOCERR_OK;

   if (!fisarray) {
     // single value
     err = cb->ui.GetValueByID(cb, aItemKey, valueID, 0, VALTYPE_TEXT, fval, maxstr, &valsize);
     if (err==LOCERR_OK) {
       if (fvaltype==VALTYPE_TIME64) {
         // for timestamps, get time zone name as well
         cb->ui.GetValueByID(cb, aItemKey, valueID+tznamFlag, 0, VALTYPE_TEXT, ftz, maxstr, &valsize);
         DEBUG_(cb, "- %-20s (VALTYPE=%2hd) = %s timezone=%s",fnam,fvaltype,fval,ftz);
       }
       else
         DEBUG_(cb, "- %-20s (VALTYPE=%2hd) = '%s'",fnam,fvaltype,fval);
     }
     else
       DEBUG_(cb, "- %-20s (VALTYPE=%2hd) : No value, error=%hd",fnam,fvaltype,err);
   }
   else {
     // array
     DEBUG_(cb, "- %-20s (VALTYPE=%2d) = Array with %d elements",fnam,fvaltype,farrsize);
     // show elements
     for (arridx=0; arridx<farrsize; arridx++) {
       err = cb->ui.GetValueByID(cb, aItemKey, valueID, arridx, VALTYPE_TEXT, fval, maxstr, &valsize);
       if (err==LOCERR_OK) {
         if (fvaltype==VALTYPE_TIME64) {
           // for timestamps, get time zone name as well
           cb->ui.GetValueByID(cb, aItemKey, valueID+tznamFlag, arridx, VALTYPE_TEXT, ftz, maxstr, &valsize);
           DEBUG_(cb, "           %20s[%3hd] = %s timezone=%s",fnam,arridx,fval,ftz);
         }
         else
           DEBUG_(cb, "           %20s[%3hd] = '%s'",fnam,arridx,fval);
       }
       else
         DEBUG_(cb, "           %20s[%3hd] : No value, error=%hd",fnam,arridx,err);
     }
   }
   // next value
   valueID = cb->ui.GetValueID(cb, aItemKey, VALNAME_NEXT);
 } // while more values
} /* ShowFields */