VCardExport   A
last analyzed

Complexity

Total Complexity 15

Size/Duplication

Total Lines 134
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
eloc 49
c 1
b 0
f 1
dl 0
loc 134
rs 10
wmc 15

6 Methods

Rating   Name   Duplication   Size   Complexity  
A setStarredCategory() 0 3 1
A loadContactGroups() 0 12 3
B exportVCard() 0 41 8
A getExportCount() 0 3 1
A setCharset() 0 3 1
A __construct() 0 4 1
1
<?php
2
declare(strict_types=1);
3
4
namespace SKien\Google;
5
6
use SKien\VCard\VCard;
0 ignored issues
show
Bug introduced by
The type SKien\VCard\VCard was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
7
8
/**
9
 * Export one or more GContacts to a VCard file.
10
 *
11
 * A single GContact, all members of a group or all contacts can be exported in
12
 * VCard format (v3.0).
13
 * > The group membership(s) of a contact is stored as category(s) in the VCard
14
 * > contact.
15
 * > If the google system groups should be taken into account, this hve to be
16
 * > activated explicitly.
17
 * > The treatment of the system group 'contactGroups/starred', which is used by
18
 * > Google for 'starred' contacts (i.e. for the 'favorites'), can be configured
19
 * > separately.
20
 *
21
 * Since the GContact contains only a reference (the `resourceName`) to the
22
 * group(s) it belongs to, an internal list (`resourceName` => `groupName`) of
23
 * the available groups is loaded once before the export is started.<br/>
24
 *
25
 * @author Stefanius <[email protected]>
26
 * @copyright MIT License - see the LICENSE file for details
27
 */
28
class VCardExport
29
{
30
    /** also map system groups to catagories */
31
    public const OPT_MAP_GROUPS_TO_CATEGORY = 0x0001;
32
    /** also map system groups to catagories */
33
    public const OPT_MAP_SYSTEM_GROUPS  = 0x0002;
34
    /** export contined photo as portrait */
35
    public const OPT_EXPORT_PHOTO = 0x0004;
36
    /** use default photo from google, if no custom photo is set */
37
    public const OPT_USE_DEFAULT_PHOTO  = 0x0008;
38
39
    /** @var GClient the client we need for the import     */
40
    protected GClient $oClient;
41
    /** @var array<string,string>  array of available google contact groups groupName -> groupResourcename   */
42
    protected array $aGroupNames = [];
43
    /** @var int options for the import     */
44
    protected int $iOptions = 0;
45
    /** @var string charset for the created file     */
46
    protected string $strCharset = 'UTF-8';
47
    /** @var string surrogate category name to use for 'starred' contacts
48
     *              (-> contacts belonging to the predefined system group 'starred')     */
49
    protected string $strStarredCategory = '';
50
    /** @var int count of contacts beeing imported     */
51
    protected int $iExportCount = 0;
52
53
    /**
54
     * Create an instance of the class.
55
     * @param GClient $oClient
56
     * @param int $iOptions
57
     */
58
    public function __construct(GClient &$oClient, int $iOptions = null)
59
    {
60
        $this->oClient = $oClient;
61
        $this->iOptions = $iOptions ?? self::OPT_EXPORT_PHOTO | self::OPT_MAP_GROUPS_TO_CATEGORY;
62
    }
63
64
    /**
65
     * Create the VCard file containing the specified contact(s).
66
     * If param `$strResourceName` specifies a contact group, all member
67
     * of this group are exported, otherwise the specifeid contact is used.
68
     * If `$strResourceName` is empty, all contacts are exported.
69
     * @param string $strResourceName resourcename of contact or group
70
     * @param string $strFilename
71
     * @return bool
72
     */
73
    public function exportVCard(string $strResourceName, string $strFilename) : bool
74
    {
75
        $result = false;
76
77
        $oContacts = new GContacts($this->oClient);
78
        $oContacts->addPersonFields(GContacts::DEF_DETAIL_PERSON_FIELDS);
79
80
        // load list or contact
81
        $aContactList = false;
82
        if (empty($strResourceName) || strpos($strResourceName, 'contactGroups/') === 0) {
83
            $aContactList = $oContacts->list(GContacts::SO_LAST_NAME_ASCENDING, $strResourceName);
84
        } else {
85
            // load specified contact
86
            $oContact = $oContacts->getContact($strResourceName);
87
            if ($oContact !== false) {
88
                $aContactList = [$oContact->getArrayCopy()];
89
            }
90
        }
91
        $this->iExportCount = 0;
92
        if ($aContactList !== false) {
93
            $result = true;
94
            $oVCard = new VCard();
95
            VCard::setEncoding($this->strCharset);
96
97
            foreach ($aContactList as $aContact) {
98
                $oGContact = GContact::fromArray($aContact);
99
                $oVCContact = new GContactToVCard($this->aGroupNames, $this->iOptions);
100
101
                $oVCContact->setStarredCategory($this->strStarredCategory);
102
                if ($oVCContact->loadGContact($oGContact)) {
103
                    $oVCard->addContact($oVCContact);
104
105
                    $this->iExportCount++;
106
                }
107
            }
108
            if ($this->iExportCount > 0) {
109
                // and write to file
110
                $oVCard->write($strFilename, (strlen($strFilename) > 0));
111
            }
112
        }
113
        return $result;
114
    }
115
116
    /**
117
     * @return int
118
     */
119
    public function getExportCount() : int
120
    {
121
        return $this->iExportCount;
122
    }
123
124
    /**
125
     * Sets the category to use for 'starred' contacts.
126
     * @param string $strStarredCategory
127
     */
128
    public function setStarredCategory(string $strStarredCategory) : void
129
    {
130
        $this->strStarredCategory = $strStarredCategory;
131
    }
132
133
    /**
134
     * Sets the charset to use for exportfile.
135
     * If the generated file is to be imported into another Googler account or e.g.
136
     * with Thunderbird, UTF-8 is the correct character set, MS Outlook expects
137
     * (at least in the German/European version) an ISO-1234 encoded file (otherwise
138
     * umlauts will not be imported correctly)
139
     * @param string $strCharset
140
     */
141
    public function setCharset(string $strCharset) : void
142
    {
143
        $this->strCharset = $strCharset;
144
    }
145
146
    /**
147
     * Load available contact groups.
148
     * @return bool
149
     */
150
    private function loadContactGroups() : bool
0 ignored issues
show
Unused Code introduced by
The method loadContactGroups() is not used, and could be removed.

This check looks for private methods that have been defined, but are not used inside the class.

Loading history...
151
    {
152
        $bOK = true;
153
        if (($this->iOptions & self::OPT_MAP_GROUPS_TO_CATEGORY) != 0) {
154
            $oGroups = new GContactGroups($this->oClient);
155
            $aGroups = $oGroups->list(GContactGroups::GT_ALL_CONTACT_GROUPS, GContactGroups::RES_LIST);
156
            if ($aGroups !== false) {
0 ignored issues
show
introduced by
The condition $aGroups !== false is always false.
Loading history...
157
                $this->aGroupResourcenames = $aGroups;
158
            }
159
            $bOK = ($aGroups !== false);
160
        }
161
        return $bOK;
162
    }
163
}