LCOV - code coverage report
Current view: top level - src/libvalent/contacts - valent-contact.c (source / functions) Coverage Total Hit
Test: Code Coverage Lines: 98.6 % 70 69
Test Date: 2024-11-16 20:34:14 Functions: 100.0 % 1 1
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 65.2 % 46 30

             Branch data     Line data    Source code
       1                 :             : // SPDX-License-Identifier: GPL-3.0-or-later
       2                 :             : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
       3                 :             : 
       4                 :             : #define G_LOG_DOMAIN "valent-contact"
       5                 :             : 
       6                 :             : #include "config.h"
       7                 :             : 
       8                 :             : #include <gio/gio.h>
       9                 :             : #include <libebook-contacts/libebook-contacts.h>
      10                 :             : #include <libtracker-sparql/tracker-sparql.h>
      11                 :             : 
      12                 :             : #include "valent-contact.h"
      13                 :             : 
      14                 :             : 
      15                 :             : //
      16                 :             : 
      17                 :             : TrackerResource *
      18                 :           3 : valent_contact_resource_from_econtact (EContact   *contact)
      19                 :             : {
      20                 :           6 :   g_autoptr (TrackerResource) resource = NULL;
      21                 :           6 :   g_autolist (EVCardAttribute) phone_numbers = NULL;
      22                 :           3 :   g_autolist (EVCardAttribute) email_addresses = NULL;
      23                 :           3 :   g_autolist (EVCardAttribute) urls = NULL;
      24                 :             :   // g_autolist (EVCardAttribute) postal_addresses = NULL;
      25                 :           3 :   g_autoptr (EContactDate) birthdate = NULL;
      26         [ +  + ]:           3 :   g_autofree char *vcard = NULL;
      27                 :           3 :   static struct
      28                 :             :   {
      29                 :             :     EContactField field;
      30                 :             :     const char *property;
      31                 :             :   } contact_fields[] = {
      32                 :             :     {
      33                 :             :       .field = E_CONTACT_UID,
      34                 :             :       .property = "nco:contactUID",
      35                 :             :     },
      36                 :             :     {
      37                 :             :       .field = E_CONTACT_FULL_NAME,
      38                 :             :       .property = "nco:fullname",
      39                 :             :     },
      40                 :             :     {
      41                 :             :       .field = E_CONTACT_NICKNAME,
      42                 :             :       .property = "nco:nickname",
      43                 :             :     },
      44                 :             :     {
      45                 :             :       .field = E_CONTACT_NOTE,
      46                 :             :       .property = "nco:note",
      47                 :             :     },
      48                 :             : #if 0
      49                 :             :     {
      50                 :             :       .field = E_CONTACT_PHOTO,
      51                 :             :       .property = "nco:photo",
      52                 :             :     },
      53                 :             : #endif
      54                 :             :   };
      55                 :             : 
      56   [ +  -  +  -  :           3 :   g_return_val_if_fail (E_IS_CONTACT (contact), NULL);
             -  +  -  - ]
      57                 :             : 
      58                 :             :   /* NOTE: nco:PersonContact is used unconditionally, because it's the only
      59                 :             :    *       class which receives change notification.
      60                 :             :    */
      61                 :           3 :   resource = tracker_resource_new (NULL);
      62                 :           3 :   tracker_resource_set_uri (resource, "rdf:type", "nco:PersonContact");
      63                 :             : 
      64                 :           3 :   vcard = e_vcard_to_string (E_VCARD (contact), EVC_FORMAT_VCARD_21);
      65                 :           3 :   tracker_resource_set_string (resource, "nie:plainTextContent", vcard);
      66                 :             : 
      67         [ +  + ]:          15 :   for (size_t i = 0; i < G_N_ELEMENTS (contact_fields); i++)
      68                 :             :     {
      69                 :          12 :       const char *value = NULL;
      70                 :             : 
      71                 :          12 :       value = e_contact_get_const (contact, contact_fields[i].field);
      72   [ +  +  +  - ]:          12 :       if (value != NULL && *value != '\0')
      73                 :           6 :         tracker_resource_set_string (resource, contact_fields[i].property, value);
      74                 :             :     }
      75                 :             : 
      76                 :           3 :   birthdate = e_contact_get (contact, E_CONTACT_BIRTH_DATE);
      77         [ +  + ]:           3 :   if (birthdate != NULL)
      78                 :             :     {
      79                 :           4 :       g_autoptr (GDateTime) date = NULL;
      80                 :             : 
      81                 :           2 :       date = g_date_time_new_local (birthdate->year,
      82                 :           1 :                                     birthdate->month,
      83                 :           1 :                                     birthdate->day,
      84                 :             :                                     0, 0, 0.0);
      85         [ +  - ]:           1 :       tracker_resource_set_datetime (resource, "nco:birthDate", date);
      86                 :             :     }
      87                 :             : 
      88                 :           3 :   phone_numbers = e_contact_get_attributes (contact, E_CONTACT_TEL);
      89         [ +  + ]:           6 :   for (const GList *iter = phone_numbers; iter != NULL; iter = iter->next)
      90                 :             :     {
      91                 :           3 :       EVCardAttribute *attr = iter->data;
      92                 :           3 :       g_autofree char *medium = NULL;
      93                 :           3 :       g_autoptr (EPhoneNumber) number = NULL;
      94         [ +  - ]:           3 :       g_autofree char *medium_iri = NULL;
      95                 :           3 :       TrackerResource *medium_resource = NULL;
      96                 :           3 :       const char *medium_type = NULL;
      97                 :             : 
      98         [ +  - ]:           3 :       if (e_vcard_attribute_has_type (attr, "CAR"))
      99                 :             :         medium_type = "nco:CarPhoneNumber";
     100         [ +  + ]:           3 :       else if (e_vcard_attribute_has_type (attr, "CELL"))
     101                 :             :         medium_type = "nco:MessagingNumber";
     102         [ +  - ]:           1 :       else if (e_vcard_attribute_has_type (attr, "FAX"))
     103                 :             :         medium_type = "nco:FaxNumber";
     104         [ +  - ]:           1 :       else if (e_vcard_attribute_has_type (attr, "ISDN"))
     105                 :             :         medium_type = "nco:IsdnNumber";
     106         [ +  - ]:           1 :       else if (e_vcard_attribute_has_type (attr, "PAGER"))
     107                 :             :         medium_type = "nco:PagerNumber";
     108         [ +  - ]:           1 :       else if (e_vcard_attribute_has_type (attr, "VOICE"))
     109                 :             :         medium_type = "nco:VoicePhoneNumber";
     110                 :             :       else
     111                 :           1 :         medium_type = "nco:PhoneNumber";
     112                 :             : 
     113                 :           3 :       medium = e_vcard_attribute_get_value (attr);
     114                 :           3 :       number = e_phone_number_from_string (medium, NULL, NULL);
     115         [ +  - ]:           3 :       if (number != NULL)
     116                 :           3 :         medium_iri = e_phone_number_to_string (number, E_PHONE_NUMBER_FORMAT_RFC3966);
     117                 :             :       else
     118                 :           0 :         medium_iri = g_strdup_printf ("tel:%s", medium);
     119                 :             : 
     120                 :           3 :       medium_resource = tracker_resource_new (medium_iri);
     121                 :           3 :       tracker_resource_set_uri (medium_resource, "rdf:type", medium_type);
     122                 :           3 :       tracker_resource_set_string (medium_resource, "nco:phoneNumber", medium);
     123                 :           3 :       tracker_resource_add_take_relation (resource,
     124                 :             :                                           "nco:hasPhoneNumber",
     125                 :           3 :                                           g_steal_pointer (&medium_resource));
     126                 :             :     }
     127                 :             : 
     128                 :           3 :   email_addresses = e_contact_get_attributes (contact, E_CONTACT_EMAIL);
     129         [ +  + ]:           4 :   for (const GList *iter = email_addresses; iter != NULL; iter = iter->next)
     130                 :             :     {
     131                 :           1 :       EVCardAttribute *attr = iter->data;
     132                 :           1 :       g_autofree char *medium = NULL;
     133                 :           1 :       g_autofree char *medium_iri = NULL;
     134                 :           1 :       TrackerResource *medium_resource = NULL;
     135                 :             : 
     136                 :           1 :       medium = e_vcard_attribute_get_value (attr);
     137                 :           1 :       medium_iri = g_strdup_printf ("mailto:%s", medium);
     138                 :           1 :       medium_resource = tracker_resource_new (medium_iri);
     139                 :           1 :       tracker_resource_set_uri (medium_resource, "rdf:type", "nco:EmailAddress");
     140                 :           1 :       tracker_resource_set_string (medium_resource, "nco:emailAddress", medium);
     141                 :           1 :       tracker_resource_add_take_relation (resource,
     142                 :             :                                           "nco:hasEmailAddress",
     143                 :           1 :                                           g_steal_pointer (&medium_resource));
     144                 :             :     }
     145                 :             : 
     146                 :             : #if 0
     147                 :             :   postal_addresses = e_contact_get_attributes (contact, E_CONTACT_ADDRESS);
     148                 :             :   for (const GList *iter = postal_addresses; iter; iter = iter->next)
     149                 :             :     {
     150                 :             :       EVCardAttribute *attr = iter->data;
     151                 :             :       GList *values = e_vcard_attribute_get_values_decoded (attr);
     152                 :             :       g_autofree char *medium = NULL;
     153                 :             :       g_autofree char *medium_iri = NULL;
     154                 :             :       TrackerResource *medium_resource = NULL;
     155                 :             :       const char *medium_type = NULL;
     156                 :             :       uint8_t v = 0;
     157                 :             : 
     158                 :             :       if (e_vcard_attribute_has_type (attr, "DOM"))
     159                 :             :         medium_type = "nco:DomesticDeliveryAddress";
     160                 :             :       else if (e_vcard_attribute_has_type (attr, "INTL"))
     161                 :             :         medium_type = "nco:InternationalDeliveryAddress";
     162                 :             :       else if (e_vcard_attribute_has_type (attr, "PARCEL"))
     163                 :             :         medium_type = "nco:ParcelDeliveryAddress";
     164                 :             :       else
     165                 :             :         medium_type = "nco:PostalAddress";
     166                 :             : 
     167                 :             :       medium = e_vcard_attribute_get_value (attr);
     168                 :             :       medium_iri = g_strdup_printf ("mailto:%s", medium);
     169                 :             :       medium_resource = tracker_resource_new (medium_iri);
     170                 :             :       tracker_resource_set_uri (medium_resource, "rdf:type", medium_type);
     171                 :             : 
     172                 :             :       for (const GList *viter = values; viter != NULL; viter = viter->next)
     173                 :             :         {
     174                 :             :           const GString *decoded = values->data;
     175                 :             :           static const char *adr_fields[] = {
     176                 :             :             "nco:pobox",
     177                 :             :             "nco:extendedAddress",
     178                 :             :             "nco:streetAddress",
     179                 :             :             "nco:locality",
     180                 :             :             "nco:region",
     181                 :             :             "nco:postalcode",
     182                 :             :             "nco:country",
     183                 :             :           };
     184                 :             : 
     185                 :             :           if (v < G_N_ELEMENTS (adr_fields) && decoded->len > 0)
     186                 :             :             {
     187                 :             :               tracker_resource_set_string (medium_resource,
     188                 :             :                                            adr_fields[v],
     189                 :             :                                            decoded->str);
     190                 :             :             }
     191                 :             : 
     192                 :             :           v++;
     193                 :             :         }
     194                 :             : 
     195                 :             :       tracker_resource_add_take_relation (resource,
     196                 :             :                                           "nco:hasPostalAddress",
     197                 :             :                                           g_steal_pointer (&medium_resource));
     198                 :             :     }
     199                 :             : #endif
     200                 :             : 
     201                 :           3 :   urls = e_contact_get_attributes (contact, E_CONTACT_HOMEPAGE_URL);
     202         [ +  + ]:           4 :   for (const GList *iter = urls; iter != NULL; iter = iter->next)
     203                 :             :     {
     204                 :           1 :       EVCardAttribute *attr = iter->data;
     205                 :           1 :       g_autoptr (GString) url = NULL;
     206                 :             : 
     207                 :           1 :       url = e_vcard_attribute_get_value_decoded (attr);
     208   [ +  -  +  - ]:           1 :       if (url != NULL && g_uri_is_valid (url->str, G_URI_FLAGS_PARSE_RELAXED, NULL))
     209                 :           1 :         tracker_resource_add_uri (resource, "nco:url", url->str);
     210                 :             :     }
     211                 :             : 
     212                 :             :   return g_steal_pointer (&resource);
     213                 :             : }
     214                 :             : 
        

Generated by: LCOV version 2.0-1