Stefanius67 /
GContacts
| 1 | <?php |
||
| 2 | declare(strict_types=1); |
||
| 3 | |||
| 4 | namespace SKien\Google; |
||
| 5 | |||
| 6 | use SKien\VCard\VCard; |
||
|
0 ignored issues
–
show
|
|||
| 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
|
|||
| 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
|
|||
| 157 | $this->aGroupResourcenames = $aGroups; |
||
| 158 | } |
||
| 159 | $bOK = ($aGroups !== false); |
||
| 160 | } |
||
| 161 | return $bOK; |
||
| 162 | } |
||
| 163 | } |
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:For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths