Guest User

Untitled

a guest
Jun 19th, 2018
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.33 KB | None | 0 0
  1. /*
  2.  * Compile with:
  3.  * gcc -o eina_model_example eina_model_example.c `pkg-config --cflags --libs eina`
  4.  */
  5.  
  6. #include <Eina.h>
  7.  
  8. /*
  9.  * Defining type for new model type
  10.  * Model will have two methods
  11.  */
  12. typedef struct _Bank_Account_Type
  13. {
  14.    Eina_Model_Type parent_class;
  15.    void (*bank_account_data_set)(Eina_Model *, const char *name, const char *number);
  16.    void (*print)(Eina_Model *);
  17. } Bank_Account_Type;
  18.  
  19. /*
  20.  * Defining type for Bank Account private data
  21.  */
  22. typedef struct _Bank_Account_Data
  23. {
  24.    char name[30];
  25.    char number[30];
  26. } Bank_Account_Data;
  27.  
  28. /*
  29.  * Defining type for Credit Card model type, which will be inherited from Bank Account model type
  30.  * Model will have two parent's methods and additional one
  31.  */
  32. typedef struct _Credit_Card_Type
  33. {
  34.    Bank_Account_Type parent_class;
  35.    void (*credit_card_data_set)(Eina_Model *, const char *, const char *, int) ;
  36. } Credit_Card_Type;
  37.  
  38. /*
  39.  * Defining type for Credit Card private data
  40.  */
  41. typedef struct _Credit_Card_Data
  42. {
  43.    char number[30];
  44.    char expiry_date[30];
  45.    int pin;
  46. } Credit_Card_Data;
  47.  
  48. static Bank_Account_Type _BANK_ACCOUNT_TYPE;
  49. static Credit_Card_Type _CREDIT_CARD_TYPE;
  50. static Eina_Model_Type *BANK_ACCOUNT_TYPE = (Eina_Model_Type *) &_BANK_ACCOUNT_TYPE;
  51. static Eina_Model_Type *CREDIT_CARD_MODEL = (Eina_Model_Type *) &_CREDIT_CARD_TYPE;
  52.  
  53.  
  54. /*
  55.  * Defining method for for Bank Account data
  56.  */
  57. static void
  58. _bank_account_data_set(Eina_Model *mdl, const char *name, const char *number)
  59. {
  60.    Bank_Account_Data *bdata = eina_model_type_private_data_get(mdl, BANK_ACCOUNT_TYPE);
  61.  
  62.    if (!bdata)
  63.       printf("ERROR\n");
  64.  
  65.    if (name != NULL)
  66.    {
  67.       strncpy(bdata->name, name, sizeof(bdata->name));
  68.       bdata->name[sizeof(bdata->number) - 1] = '\0';
  69.    }
  70.  
  71.    if (number != NULL)
  72.    {
  73.        strncpy(bdata->number, number, sizeof(bdata->number));
  74.        bdata->number[sizeof(bdata->number) - 1] = '\0';
  75.    }
  76.  
  77.    printf("%s :: %s %p\n", eina_model_type_name_get(eina_model_type_get(mdl)) ,__func__, mdl);
  78. }
  79.  
  80.  
  81. static void
  82. _credit_card_data_set(Eina_Model *mdl, const char *number, const char *expiry_date, int pin)
  83. {
  84.    Credit_Card_Data *cdata = eina_model_type_private_data_get(mdl, CREDIT_CARD_MODEL);
  85.  
  86.    if (!cdata)
  87.          printf("ERROR\n");
  88.  
  89.    if (number != NULL)
  90.    {
  91.       strncpy(cdata->number, number, sizeof(cdata->number));
  92.       cdata->number[sizeof(cdata->number) - 1] = '\0';
  93.    }
  94.  
  95.    if (expiry_date != NULL)
  96.    {
  97.       strncpy(cdata->expiry_date, expiry_date, sizeof(cdata->expiry_date));
  98.       cdata->expiry_date[sizeof(cdata->expiry_date) - 1] = '\0';
  99.    }
  100.  
  101.    cdata->pin = pin;
  102.    printf("%s :: %s %p\n", eina_model_type_name_get(eina_model_type_get(mdl)) ,__func__, mdl);
  103. }
  104.  
  105. static void
  106. _bank_account_data_print(Eina_Model *mdl)
  107. {
  108.    const Bank_Account_Data *bdata = eina_model_type_private_data_get(mdl, BANK_ACCOUNT_TYPE);
  109.  
  110.    printf("\n%s :: %s %p \n\tName: %s(%p)\n\tAccount: %s(%p)\n", eina_model_type_name_get(eina_model_type_get(mdl)) ,__func__, mdl
  111.           , bdata->name, bdata->name, bdata->number, bdata->number);
  112. }
  113.  
  114. static void
  115. _credit_card_data_print(Eina_Model *mdl)
  116. {
  117.    void (*pf)(Eina_Model *);
  118.    const Eina_Model_Type *ptype = eina_model_type_parent_get(eina_model_type_get(mdl));
  119.  
  120.    pf = eina_model_type_method_resolve (ptype, mdl,
  121.                                         offsetof(Bank_Account_Type, print));
  122.    if (pf)
  123.       pf(mdl);
  124.    else
  125.       printf("ERROR: %d", __LINE__);
  126.    const Credit_Card_Data *cdata = eina_model_type_private_data_get(mdl, CREDIT_CARD_MODEL);
  127.    printf("%s :: %s %p \n\tNumber: %s(%p)\n\tCC Expiry Date: %s(%p)\n\tCC PIN: %d(%p)\n", eina_model_type_name_get(eina_model_type_get(mdl)) ,__func__, mdl
  128.           , cdata->number, cdata->number, cdata->expiry_date, cdata->expiry_date, cdata->pin, &cdata->pin);
  129. }
  130.  
  131. #define BANK_ACCOUNT(x) ((Bank_Account_Type *) x)
  132. #define CREDIT_CARD(x) ((Credit_Card_Type *) x)
  133.  
  134. void
  135. bank_account_data_set(Eina_Model *mdl, const char *name, char *number)
  136. {
  137.    void (*pf)(Eina_Model *, const char *, const char *);
  138.    pf = eina_model_method_resolve(mdl, offsetof(Bank_Account_Type, bank_account_data_set));
  139.    if (pf)
  140.       pf(mdl, name, number);
  141.    else
  142.       printf("ERROR %d\n", __LINE__);
  143. }
  144.  
  145. void
  146. data_print(Eina_Model *mdl)
  147. {
  148.    void (*pf)(Eina_Model *);
  149.    pf = eina_model_method_resolve(mdl, offsetof(Bank_Account_Type, print));
  150.    if (pf)
  151.       pf(mdl);
  152.    else
  153.       printf("ERROR %d\n", __LINE__);
  154. }
  155.  
  156. void
  157. credit_card_data_set(Eina_Model *mdl, const char *number, const char *expiry_date, int pin)
  158. {
  159.    void (*pf)(Eina_Model *, const char *, const char *, int);
  160.    pf = eina_model_method_resolve(mdl, offsetof(Credit_Card_Type, credit_card_data_set));
  161.    if (pf)
  162.       pf(mdl, number, expiry_date, pin);
  163.    else
  164.       printf("ERROR %d\n", __LINE__);
  165. }
  166.  
  167. int main(void)
  168. {
  169.    Eina_Model *b, *cc;
  170.  
  171.    eina_init();
  172.  
  173.    memset(&_BANK_ACCOUNT_TYPE, 0, sizeof(_BANK_ACCOUNT_TYPE));
  174.    memset(&_CREDIT_CARD_TYPE, 0, sizeof(_CREDIT_CARD_TYPE));
  175.  
  176.    BANK_ACCOUNT_TYPE->version = EINA_MODEL_TYPE_VERSION;
  177.    BANK_ACCOUNT_TYPE->type_size = sizeof(Bank_Account_Type);
  178.    BANK_ACCOUNT_TYPE->private_size = sizeof(Bank_Account_Data);
  179.    BANK_ACCOUNT_TYPE->name = "Bank_Account_Model";
  180.    BANK_ACCOUNT_TYPE->parent = EINA_MODEL_TYPE_GENERIC;
  181.    BANK_ACCOUNT(BANK_ACCOUNT_TYPE)->bank_account_data_set = _bank_account_data_set;
  182.    BANK_ACCOUNT(BANK_ACCOUNT_TYPE)->print = _bank_account_data_print;
  183.  
  184.    CREDIT_CARD_MODEL->version = EINA_MODEL_TYPE_VERSION;
  185.    CREDIT_CARD_MODEL->type_size = sizeof(Credit_Card_Type);
  186.    CREDIT_CARD_MODEL->private_size = sizeof(Credit_Card_Data);
  187.    CREDIT_CARD_MODEL->name = "Credit_Card_Model";
  188.    CREDIT_CARD_MODEL->parent = BANK_ACCOUNT_TYPE;
  189.    CREDIT_CARD(CREDIT_CARD_MODEL)->credit_card_data_set = _credit_card_data_set;
  190.    BANK_ACCOUNT(CREDIT_CARD_MODEL)->print = _credit_card_data_print;
  191.  
  192.    b = eina_model_new(BANK_ACCOUNT_TYPE);   //creating object of bank class
  193.    cc = eina_model_new(CREDIT_CARD_MODEL);   //creating object of credit card class
  194.  
  195.    bank_account_data_set(b, "Bill Clark", "8569214756");
  196.    bank_account_data_set(cc, "John Smith", "3154789");
  197.  
  198.    credit_card_data_set(cc, "01/01/2015", "5803 6589 4786 3279 9173", 1234);
  199.  
  200.    data_print(b);
  201.    data_print(cc);
  202.  
  203.    eina_model_unref(b);
  204.    eina_model_unref(cc);
  205.  
  206.    eina_shutdown();
  207.  
  208.    return 0;
  209. }
Add Comment
Please, Sign In to add comment