2011-08-27 01:40:47 +02:00
< ? php
/* Copyright ( C ) Kai Blankenhorn < kaib @ bitfolge . de >
2017-03-03 14:04:40 +01:00
* Copyright ( C ) 2005 - 2017 Laurent Destailleur < eldy @ users . sourceforge . org >
2020-04-24 14:12:43 +02:00
* Copyright ( C ) 2020 Tobias Sekan < tobias . sekan @ startmail . com >
2020-04-24 14:38:46 +02:00
*
2011-08-27 01:40:47 +02:00
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
2013-01-16 15:36:08 +01:00
* the Free Software Foundation ; either version 3 of the License , or
2011-08-27 01:40:47 +02:00
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
2019-09-23 21:55:30 +02:00
* along with this program . If not , see < https :// www . gnu . org / licenses />.
2011-08-27 01:40:47 +02:00
*/
/**
* \file htdocs / core / class / vcard . class . php
* \brief Class to manage vCard files
*/
/**
* Encode a string for vCard
*
2011-09-21 15:33:59 +02:00
* @ param string $string String to encode
* @ return string String encoded
2011-08-27 01:40:47 +02:00
*/
function encode ( $string )
{
2019-01-27 11:55:16 +01:00
return str_replace ( " ; " , " \ ; " , ( dol_quoted_printable_encode ( utf8_decode ( $string ))));
2011-08-27 01:40:47 +02:00
}
/**
* Taken from php documentation comments
* No more used
*
2011-09-21 15:33:59 +02:00
* @ param string $input String
* @ param int $line_max Max length of lines
* @ return string Encoded string
2011-08-27 01:40:47 +02:00
*/
2019-01-27 15:20:16 +01:00
function dol_quoted_printable_encode ( $input , $line_max = 76 )
2011-08-27 01:40:47 +02:00
{
2020-04-10 10:59:32 +02:00
$hex = array ( '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , 'A' , 'B' , 'C' , 'D' , 'E' , 'F' );
2011-08-27 01:40:47 +02:00
$lines = preg_split ( " /( \ ?: \r \n | \r | \n )/ " , $input );
$eol = " \r \n " ;
$linebreak = " =0D=0A " ;
$escape = " = " ;
$output = " " ;
2011-09-21 15:33:59 +02:00
2011-09-20 18:12:52 +02:00
$num = count ( $lines );
for ( $j = 0 ; $j < $num ; $j ++ )
{
2011-08-27 01:40:47 +02:00
$line = $lines [ $j ];
$linlen = strlen ( $line );
$newline = " " ;
2020-04-10 10:59:32 +02:00
for ( $i = 0 ; $i < $linlen ; $i ++ ) {
2011-08-27 01:40:47 +02:00
$c = substr ( $line , $i , 1 );
$dec = ord ( $c );
2020-04-10 10:59:32 +02:00
if (( $dec == 32 ) && ( $i == ( $linlen - 1 ))) { // convert space at eol only
2011-08-27 01:40:47 +02:00
$c = " =20 " ;
2020-04-10 10:59:32 +02:00
} elseif (( $dec == 61 ) || ( $dec < 32 ) || ( $dec > 126 )) { // always encode "\t", which is *not* required
$h2 = floor ( $dec / 16 ); $h1 = floor ( $dec % 16 );
2011-08-27 01:40:47 +02:00
$c = $escape . $hex [ " $h2 " ] . $hex [ " $h1 " ];
}
2020-04-10 10:59:32 +02:00
if (( strlen ( $newline ) + strlen ( $c )) >= $line_max ) { // CRLF is not counted
2011-08-27 01:40:47 +02:00
$output .= $newline . $escape . $eol ; // soft line break; " =\r\n" is okay
$newline = " " ;
}
$newline .= $c ;
} // end of for
$output .= $newline ;
2020-04-10 10:59:32 +02:00
if ( $j < count ( $lines ) - 1 ) $output .= $linebreak ;
2011-08-27 01:40:47 +02:00
}
return trim ( $output );
}
/**
2012-03-12 15:09:46 +01:00
* Class to buld vCard files
2011-08-27 01:40:47 +02:00
*/
class vCard
{
2019-02-25 22:27:04 +01:00
public $properties ;
public $filename ;
2011-08-27 01:40:47 +02:00
//var $encoding="UTF-8";
2020-04-10 10:59:32 +02:00
public $encoding = " ISO-8859-1;ENCODING=QUOTED-PRINTABLE " ;
2011-08-27 01:40:47 +02:00
/**
2019-02-26 22:42:19 +01:00
* mise en forme du numero de telephone
2011-08-27 01:40:47 +02:00
*
2019-02-26 22:42:19 +01:00
* @ param int $number numero de telephone
* @ param string $type Type
* @ return void
2011-08-27 01:40:47 +02:00
*/
2019-02-26 22:42:19 +01:00
public function setPhoneNumber ( $number , $type = " " )
2011-09-21 15:33:59 +02:00
{
2011-08-27 01:40:47 +02:00
// type may be PREF | WORK | HOME | VOICE | FAX | MSG | CELL | PAGER | BBS | CAR | MODEM | ISDN | VIDEO or any senseful combination, e.g. "PREF;WORK;VOICE"
$key = " TEL " ;
2020-04-10 10:59:32 +02:00
if ( $type != " " ) $key .= " ; " . $type ;
$key .= " ;CHARSET= " . $this -> encoding ;
2011-08-27 01:40:47 +02:00
$this -> properties [ $key ] = encode ( $number );
}
/**
* mise en forme de la photo
* warning NON TESTE !
*
2018-08-15 18:14:02 +02:00
* @ param string $type Type
* @ param string $photo Photo
* @ return void
*/
2019-02-26 22:42:19 +01:00
public function setPhoto ( $type , $photo )
2018-08-15 18:14:02 +02:00
{
// $type = "GIF" | "JPEG"
2011-08-27 01:40:47 +02:00
$this -> properties [ " PHOTO;TYPE= $type ;ENCODING=BASE64 " ] = base64_encode ( $photo );
}
/**
* mise en forme du nom formate
*
2011-09-21 15:33:59 +02:00
* @ param string $name Name
* @ return void
2011-08-27 01:40:47 +02:00
*/
2019-02-26 22:42:19 +01:00
public function setFormattedName ( $name )
2011-09-21 15:33:59 +02:00
{
2011-08-27 01:40:47 +02:00
$this -> properties [ " FN;CHARSET= " . $this -> encoding ] = encode ( $name );
}
/**
* mise en forme du nom complet
*
2020-04-24 14:12:43 +02:00
* @ param string $family Family name
* @ param string $first First name
* @ param string $additional Additional ( e . g . second name , nick name )
* @ param string $prefix Prefix ( e . g . " Mr. " , " Ms. " , " Prof. " )
* @ param string $suffix Suffix ( e . g . " sen. " for senior , " jun. " for junior )
2011-09-21 15:33:59 +02:00
* @ return void
2011-08-27 01:40:47 +02:00
*/
2019-02-26 22:42:19 +01:00
public function setName ( $family = " " , $first = " " , $additional = " " , $prefix = " " , $suffix = " " )
2011-09-21 15:33:59 +02:00
{
2011-08-27 01:40:47 +02:00
$this -> properties [ " N;CHARSET= " . $this -> encoding ] = encode ( $family ) . " ; " . encode ( $first ) . " ; " . encode ( $additional ) . " ; " . encode ( $prefix ) . " ; " . encode ( $suffix );
$this -> filename = " $first %20 $family .vcf " ;
2015-07-19 11:38:44 +02:00
if ( empty ( $this -> properties [ " FN " ])) $this -> setFormattedName ( trim ( " $prefix $first $additional $family $suffix " ));
2011-08-27 01:40:47 +02:00
}
/**
* mise en forme de l ' anniversaire
*
2019-04-04 18:33:12 +02:00
* @ param integer $date Date
2011-09-21 15:33:59 +02:00
* @ return void
2011-08-27 01:40:47 +02:00
*/
2019-02-26 22:42:19 +01:00
public function setBirthday ( $date )
2018-08-15 18:14:02 +02:00
{
2017-03-03 14:04:40 +01:00
// $date format is YYYY-MM-DD - RFC 2425 and RFC 2426
$this -> properties [ " BDAY " ] = dol_print_date ( $date , 'dayrfc' );
2011-08-27 01:40:47 +02:00
}
/**
* mise en forme de l ' adresse
*
2011-09-21 15:33:59 +02:00
* @ param string $postoffice Postoffice
* @ param string $extended Extended
* @ param string $street Street
* @ param string $city City
* @ param string $region Region
* @ param string $zip Zip
* @ param string $country Country
* @ param string $type Type
* @ return void
2011-08-27 01:40:47 +02:00
*/
2019-02-26 22:42:19 +01:00
public function setAddress ( $postoffice = " " , $extended = " " , $street = " " , $city = " " , $region = " " , $zip = " " , $country = " " , $type = " HOME;POSTAL " )
2011-09-21 15:33:59 +02:00
{
2011-08-27 01:40:47 +02:00
// $type may be DOM | INTL | POSTAL | PARCEL | HOME | WORK or any combination of these: e.g. "WORK;PARCEL;POSTAL"
$key = " ADR " ;
2020-04-10 10:59:32 +02:00
if ( $type != " " ) $key .= " ; $type " ;
$key .= " ;CHARSET= " . $this -> encoding ;
2011-12-05 19:03:36 +01:00
$this -> properties [ $key ] = " ; " . encode ( $extended ) . " ; " . encode ( $street ) . " ; " . encode ( $city ) . " ; " . encode ( $region ) . " ; " . encode ( $zip ) . " ; " . encode ( $country );
2011-08-27 01:40:47 +02:00
2011-09-21 15:33:59 +02:00
if ( $this -> properties [ " LABEL; $type ;CHARSET= " . $this -> encoding ] == " " )
{
2011-08-27 01:40:47 +02:00
//$this->setLabel($postoffice, $extended, $street, $city, $region, $zip, $country, $type);
}
}
/**
2019-02-26 22:42:19 +01:00
* mise en forme du label
2011-08-27 01:40:47 +02:00
*
2019-02-26 22:42:19 +01:00
* @ param string $postoffice Postoffice
* @ param string $extended Extended
* @ param string $street Street
* @ param string $city City
* @ param string $region Region
* @ param string $zip Zip
* @ param string $country Country
* @ param string $type Type
* @ return void
2011-08-27 01:40:47 +02:00
*/
2019-02-26 22:42:19 +01:00
public function setLabel ( $postoffice = " " , $extended = " " , $street = " " , $city = " " , $region = " " , $zip = " " , $country = " " , $type = " HOME;POSTAL " )
2018-08-15 18:14:02 +02:00
{
2011-08-27 01:40:47 +02:00
$label = " " ;
2020-04-10 10:59:32 +02:00
if ( $postoffice != " " ) $label .= " $postoffice\r\n " ;
if ( $extended != " " ) $label .= " $extended\r\n " ;
if ( $street != " " ) $label .= " $street\r\n " ;
if ( $zip != " " ) $label .= " $zip " ;
if ( $city != " " ) $label .= " $city\r\n " ;
if ( $region != " " ) $label .= " $region\r\n " ;
if ( $country != " " ) $country .= " $country\r\n " ;
2011-08-27 01:40:47 +02:00
$this -> properties [ " LABEL; $type ;CHARSET= " . $this -> encoding ] = encode ( $label );
}
/**
2020-04-24 14:12:43 +02:00
* Add a e - mail address to this vCard
2011-08-27 01:40:47 +02:00
*
2020-04-24 14:12:43 +02:00
* @ param string $address E - mail address
* @ param string $type ( optional ) The type of the e - mail ( typical " PREF;INTERNET " or " INTERNET " )
2011-09-21 15:33:59 +02:00
* @ return void
2011-08-27 01:40:47 +02:00
*/
2020-04-24 14:12:43 +02:00
public function setEmail ( $address , $type = " TYPE=INTERNET;PREF " )
2011-09-21 15:33:59 +02:00
{
2020-04-24 14:12:43 +02:00
$key = " EMAIL " ;
if ( $type != " " ) $key .= " ; " . $type ;
$this -> properties [ $key ] = $address ;
2011-08-27 01:40:47 +02:00
}
/**
* mise en forme de la note
*
2011-09-21 15:33:59 +02:00
* @ param string $note Note
* @ return void
2011-08-27 01:40:47 +02:00
*/
2019-02-26 22:42:19 +01:00
public function setNote ( $note )
2011-09-21 15:33:59 +02:00
{
2011-08-27 01:40:47 +02:00
$this -> properties [ " NOTE;CHARSET= " . $this -> encoding ] = encode ( $note );
}
/**
* mise en forme de la fonction
*
2011-09-21 15:33:59 +02:00
* @ param string $title Title
* @ return void
2011-08-27 01:40:47 +02:00
*/
2019-02-26 22:42:19 +01:00
public function setTitle ( $title )
2011-09-21 15:33:59 +02:00
{
2011-08-27 01:40:47 +02:00
$this -> properties [ " TITLE;CHARSET= " . $this -> encoding ] = encode ( $title );
}
/**
2019-02-26 22:42:19 +01:00
* mise en forme de la societe
2011-08-27 01:40:47 +02:00
*
2019-02-26 22:42:19 +01:00
* @ param string $org Org
* @ return void
2011-08-27 01:40:47 +02:00
*/
2019-02-26 22:42:19 +01:00
public function setOrg ( $org )
2011-09-21 15:33:59 +02:00
{
2011-08-27 01:40:47 +02:00
$this -> properties [ " ORG;CHARSET= " . $this -> encoding ] = encode ( $org );
}
/**
* mise en forme du logiciel generateur
*
2011-09-21 15:33:59 +02:00
* @ param string $prodid Prodid
* @ return void
2011-08-27 01:40:47 +02:00
*/
2019-02-26 22:42:19 +01:00
public function setProdId ( $prodid )
2011-09-21 15:33:59 +02:00
{
2011-08-27 01:40:47 +02:00
$this -> properties [ " PRODID;CHARSET= " . $this -> encoding ] = encode ( $prodid );
}
/**
* mise en forme du logiciel generateur
*
2011-09-21 15:33:59 +02:00
* @ param string $uid Uid
* @ return void
2011-08-27 01:40:47 +02:00
*/
2019-02-26 22:42:19 +01:00
public function setUID ( $uid )
2011-09-21 15:33:59 +02:00
{
2011-08-27 01:40:47 +02:00
$this -> properties [ " UID;CHARSET= " . $this -> encoding ] = encode ( $uid );
}
/**
* mise en forme de l ' url
*
2011-09-21 15:33:59 +02:00
* @ param string $url URL
* @ param string $type Type
* @ return void
2011-08-27 01:40:47 +02:00
*/
2019-02-26 22:42:19 +01:00
public function setURL ( $url , $type = " " )
2011-09-21 15:33:59 +02:00
{
2011-08-27 01:40:47 +02:00
// $type may be WORK | HOME
$key = " URL " ;
2020-04-10 10:59:32 +02:00
if ( $type != " " ) $key .= " ; $type " ;
2011-08-27 01:40:47 +02:00
$this -> properties [ $key ] = $url ;
}
/**
* permet d ' obtenir une vcard
2011-09-21 15:33:59 +02:00
*
2015-02-10 13:32:00 +01:00
* @ return string
2011-08-27 01:40:47 +02:00
*/
2019-02-26 22:42:19 +01:00
public function getVCard ()
2011-09-21 15:33:59 +02:00
{
2011-08-27 01:40:47 +02:00
$text = " BEGIN:VCARD \r \n " ;
2020-04-10 10:59:32 +02:00
$text .= " VERSION:3.0 \r \n " ;
2018-12-06 00:26:54 +01:00
//$text.= "VERSION:2.1\r\n";
2020-04-10 10:59:32 +02:00
foreach ( $this -> properties as $key => $value )
2011-09-21 15:33:59 +02:00
{
2020-04-10 10:59:32 +02:00
$text .= " $key : $value\r\n " ;
2011-08-27 01:40:47 +02:00
}
2020-04-10 10:59:32 +02:00
$text .= " REV: " . date ( " Y-m-d " ) . " T " . date ( " H:i:s " ) . " Z \r \n " ;
$text .= " MAILER: Dolibarr \r \n " ;
$text .= " END:VCARD \r \n " ;
2011-08-27 01:40:47 +02:00
return $text ;
}
/**
* permet d ' obtenir le nom de fichier
2011-09-21 15:33:59 +02:00
*
* @ return string Filename
2011-08-27 01:40:47 +02:00
*/
2019-02-26 22:42:19 +01:00
public function getFileName ()
2011-09-21 15:33:59 +02:00
{
2011-08-27 01:40:47 +02:00
return $this -> filename ;
}
2020-04-24 14:38:46 +02:00
2020-04-24 14:12:43 +02:00
/* Example from Microsoft Outlook 2019
BEGIN : VCARD
VERSION : 2.1
N ; LANGUAGE = de : surename ; forename ; secondname ; Sir ; jun .
FN : Sir surename secondname forename jun .
ORG : Companyname
TITLE : position
TEL ; WORK ; VOICE : work - phone - number
TEL ; HOME ; VOICE : private - phone - number
TEL ; CELL ; VOICE : mobile - phone - number
TEL ; WORK ; FAX : fax - phone - number
ADR ; WORK ; PREF : ;; street and number ; town ; region ; 012345 ; Deutschland
LABEL ; WORK ; PREF ; ENCODING = QUOTED - PRINTABLE : street and number = 0 D = 0 A =
= 0 D = 0 A =
012345 town region
X - MS - OL - DEFAULT - POSTAL - ADDRESS : 2
URL ; WORK : www . mywebpage . de
EMAIL ; PREF ; INTERNET : test1 @ test1 . de
EMAIL ; INTERNET : test2 @ test2 . de
EMAIL ; INTERNET : test3 @ test3 . de
X - MS - IMADDRESS : test @ jabber . org
REV : 20200424 T104242Z
END : VCARD
*/
2011-08-27 01:40:47 +02:00
}