#define EFL_BETA_API_SUPPORT 1 #include #include #include #include /* * Eina Value custom examples. * * Eina_Value allows the definition of custom types which can be passed like * any other Eina_Value. This example defines a custom timezone type and all * the methods that must be implemented for a custom type. * As this encapsulates the system timezone struct we initialise it from * the gettimeofday method.. */ static Eina_Bool _tz_setup(const Eina_Value_Type *type, void *mem) { memset(mem, 0, type->value_size); return EINA_TRUE; } static Eina_Bool _tz_flush(const Eina_Value_Type *type EINA_UNUSED, void *mem EINA_UNUSED) { return EINA_TRUE; } static Eina_Bool _tz_copy(const Eina_Value_Type *type EINA_UNUSED, const void *src, void * dst) { struct timezone *tzsrc = (struct timezone *)src; struct timezone *tzdst = dst; *tzdst = *tzsrc; return EINA_TRUE; } static int _tz_compare(const Eina_Value_Type *type EINA_UNUSED, const void *a, const void *b) { struct timezone tza = *(struct timezone*)a; struct timezone tzb = *(struct timezone*)b; if (tza.tz_minuteswest < tzb.tz_minuteswest) return -1; else if (tza.tz_minuteswest > tzb.tz_minuteswest) return 1; return 0; } static Eina_Bool _tz_pset(const Eina_Value_Type *type EINA_UNUSED, void *mem, const void *ptr) { *(struct timezone*)mem = *(struct timezone*)ptr; return EINA_TRUE; } static Eina_Bool _tz_vset(const Eina_Value_Type *type, void *mem, va_list args) { const struct timezone tz = va_arg(args, struct timezone); return _tz_pset(type, mem, &tz); } static Eina_Bool _tz_pget(const Eina_Value_Type *type, const void *mem, void *ptr) { memcpy(ptr, mem, type->value_size); return EINA_TRUE; } static Eina_Bool _tz_convert_to(const Eina_Value_Type *type EINA_UNUSED, const Eina_Value_Type *convert, const void *type_mem, void *convert_mem) { struct timezone v = *(struct timezone*)type_mem; if (convert == EINA_VALUE_TYPE_UCHAR) { unsigned char val_type = v.tz_minuteswest; return eina_value_type_pset(convert, convert_mem, &val_type); } else if (convert == EINA_VALUE_TYPE_USHORT) { unsigned short val_type = v.tz_minuteswest; return eina_value_type_pset(convert, convert_mem, &val_type); } else if (convert == EINA_VALUE_TYPE_UINT) { unsigned int val_type = v.tz_minuteswest; return eina_value_type_pset(convert, convert_mem, &val_type); } else if ((convert == EINA_VALUE_TYPE_ULONG) || (convert == EINA_VALUE_TYPE_TIMESTAMP)) { unsigned long val_type = v.tz_minuteswest; return eina_value_type_pset(convert, convert_mem, &val_type); } else if (convert == EINA_VALUE_TYPE_UINT64) { uint64_t val_type = v.tz_minuteswest; return eina_value_type_pset(convert, convert_mem, &val_type); } else if (convert == EINA_VALUE_TYPE_CHAR) { char val_type = v.tz_minuteswest; return eina_value_type_pset(convert, convert_mem, &val_type); } else if (convert == EINA_VALUE_TYPE_SHORT) { short val_type = v.tz_minuteswest; return eina_value_type_pset(convert, convert_mem, &val_type); } else if (convert == EINA_VALUE_TYPE_INT) { int val_type = v.tz_minuteswest; return eina_value_type_pset(convert, convert_mem, &val_type); } else if (convert == EINA_VALUE_TYPE_LONG) { long val_type = v.tz_minuteswest; return eina_value_type_pset(convert, convert_mem, &val_type); } else if (convert == EINA_VALUE_TYPE_INT64) { int64_t val_type = v.tz_minuteswest; return eina_value_type_pset(convert, convert_mem, &val_type); } else if (convert == EINA_VALUE_TYPE_FLOAT) return eina_value_type_pset(convert, convert_mem, &v.tz_minuteswest); else if (convert == EINA_VALUE_TYPE_DOUBLE) return eina_value_type_pset(convert, convert_mem, &v.tz_minuteswest); else if (convert == EINA_VALUE_TYPE_STRINGSHARE || convert == EINA_VALUE_TYPE_STRING) { const char *buf; buf = eina_slstr_printf("+%03dh", v.tz_minuteswest); return eina_value_type_pset(convert, convert_mem, &buf); } return EINA_FALSE; } static Eina_Value_Type TZ_TYPE = { EINA_VALUE_TYPE_VERSION, sizeof(struct timezone), "struct timezone", _tz_setup, _tz_flush, _tz_copy, _tz_compare, _tz_convert_to, NULL, // No convert from _tz_vset, _tz_pset, _tz_pget }; EAPI_MAIN void efl_main(void *data EINA_UNUSED, const Efl_Event *ev EINA_UNUSED) { Eina_Value value_tz; struct timeval time; struct timezone zone; char *s; eina_value_setup(&value_tz, &TZ_TYPE); gettimeofday(&time, &zone); eina_value_set(&value_tz, zone); s = eina_value_to_string(&value_tz); printf("Current timezone: %s\n", s); free(s); eina_value_free(&value_tz); efl_exit(0); } EFL_MAIN()