Linux iad1-shared-b7-18 6.6.49-grsec-jammy+ #10 SMP Thu Sep 12 23:23:08 UTC 2024 x86_64
Apache
: 67.205.6.31 | : 216.73.216.47
Cant Read [ /etc/named.conf ]
8.2.29
fernandoquevedo
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
UNLOCK SHELL
HASH IDENTIFIER
README
+ Create Folder
+ Create File
/
usr /
share /
perl5 /
Image /
ExifTool /
[ HOME SHELL ]
Name
Size
Permission
Action
Charset
[ DIR ]
drwxr-xr-x
Lang
[ DIR ]
drwxr-xr-x
AES.pm
18.66
KB
-rw-r--r--
AFCP.pm
10.38
KB
-rw-r--r--
AIFF.pm
9.59
KB
-rw-r--r--
APE.pm
9.06
KB
-rw-r--r--
APP12.pm
10.44
KB
-rw-r--r--
ASF.pm
30.21
KB
-rw-r--r--
Apple.pm
5.43
KB
-rw-r--r--
Audible.pm
11.52
KB
-rw-r--r--
BMP.pm
10.45
KB
-rw-r--r--
BPG.pm
7.53
KB
-rw-r--r--
BZZ.pm
17.46
KB
-rw-r--r--
BigTIFF.pm
11.27
KB
-rw-r--r--
BuildTagLookup.pm
121.94
KB
-rw-r--r--
CBOR.pm
11.51
KB
-rw-r--r--
Canon.pm
375.39
KB
-rw-r--r--
CanonCustom.pm
84.32
KB
-rw-r--r--
CanonRaw.pm
29.68
KB
-rw-r--r--
CanonVRD.pm
75.2
KB
-rw-r--r--
CaptureOne.pm
7.85
KB
-rw-r--r--
Casio.pm
62.21
KB
-rw-r--r--
Charset.pm
16.01
KB
-rw-r--r--
DICOM.pm
245.09
KB
-rw-r--r--
DJI.pm
6.31
KB
-rw-r--r--
DNG.pm
31.59
KB
-rw-r--r--
DPX.pm
9.51
KB
-rw-r--r--
DV.pm
9.75
KB
-rw-r--r--
DarwinCore.pm
15.43
KB
-rw-r--r--
DjVu.pm
12.46
KB
-rw-r--r--
EXE.pm
50.3
KB
-rw-r--r--
Exif.pm
246.64
KB
-rw-r--r--
FITS.pm
5.73
KB
-rw-r--r--
FLAC.pm
9.89
KB
-rw-r--r--
FLIF.pm
11.65
KB
-rw-r--r--
FLIR.pm
59.45
KB
-rw-r--r--
Fixup.pm
12.43
KB
-rw-r--r--
Flash.pm
27.5
KB
-rw-r--r--
FlashPix.pm
87.44
KB
-rw-r--r--
Font.pm
27.34
KB
-rw-r--r--
FotoStation.pm
7.97
KB
-rw-r--r--
FujiFilm.pm
54.47
KB
-rw-r--r--
GE.pm
2
KB
-rw-r--r--
GIF.pm
21.85
KB
-rw-r--r--
GIMP.pm
8.35
KB
-rw-r--r--
GPS.pm
19.53
KB
-rw-r--r--
GeoTiff.pm
87.51
KB
-rw-r--r--
Geotag.pm
62.87
KB
-rw-r--r--
GoPro.pm
28
KB
-rw-r--r--
H264.pm
39.29
KB
-rw-r--r--
HP.pm
8
KB
-rw-r--r--
HTML.pm
22.1
KB
-rw-r--r--
HtmlDump.pm
32.8
KB
-rw-r--r--
ICC_Profile.pm
45.63
KB
-rw-r--r--
ID3.pm
56.91
KB
-rw-r--r--
IPTC.pm
39.54
KB
-rw-r--r--
ISO.pm
6.81
KB
-rw-r--r--
ITC.pm
6.63
KB
-rw-r--r--
Import.pm
12.83
KB
-rw-r--r--
InDesign.pm
10.4
KB
-rw-r--r--
JPEG.pm
24.3
KB
-rw-r--r--
JPEGDigest.pm
212.38
KB
-rw-r--r--
JSON.pm
6.15
KB
-rw-r--r--
JVC.pm
3.57
KB
-rw-r--r--
Jpeg2000.pm
49.65
KB
-rw-r--r--
Kodak.pm
120.47
KB
-rw-r--r--
KyoceraRaw.pm
4.31
KB
-rw-r--r--
LIF.pm
4.66
KB
-rw-r--r--
LNK.pm
22.02
KB
-rw-r--r--
Leaf.pm
16.34
KB
-rw-r--r--
Lytro.pm
7.56
KB
-rw-r--r--
M2TS.pm
37.11
KB
-rw-r--r--
MIE.pm
102.09
KB
-rw-r--r--
MIEUnits.pod
13.68
KB
-rw-r--r--
MIFF.pm
9.05
KB
-rw-r--r--
MNG.pm
16.22
KB
-rw-r--r--
MOI.pm
4.14
KB
-rw-r--r--
MPC.pm
4.05
KB
-rw-r--r--
MPEG.pm
22.32
KB
-rw-r--r--
MPF.pm
8.94
KB
-rw-r--r--
MRC.pm
18.39
KB
-rw-r--r--
MWG.pm
30.64
KB
-rw-r--r--
MXF.pm
252.65
KB
-rw-r--r--
MacOS.pm
30.7
KB
-rw-r--r--
MakerNotes.pm
68.93
KB
-rw-r--r--
Matroska.pm
34.44
KB
-rw-r--r--
Microsoft.pm
52.13
KB
-rw-r--r--
Minolta.pm
99.93
KB
-rw-r--r--
MinoltaRaw.pm
16.49
KB
-rw-r--r--
Motorola.pm
5.31
KB
-rw-r--r--
Nikon.pm
431.96
KB
-rw-r--r--
NikonCapture.pm
28.13
KB
-rw-r--r--
NikonCustom.pm
290.78
KB
-rw-r--r--
NikonSettings.pm
71.88
KB
-rw-r--r--
Nintendo.pm
3.24
KB
-rw-r--r--
OOXML.pm
13.61
KB
-rw-r--r--
Ogg.pm
8.81
KB
-rw-r--r--
Olympus.pm
139.89
KB
-rw-r--r--
OpenEXR.pm
10.26
KB
-rw-r--r--
Opus.pm
2.22
KB
-rw-r--r--
Other.pm
2.63
KB
-rw-r--r--
PCX.pm
3.72
KB
-rw-r--r--
PDF.pm
90.77
KB
-rw-r--r--
PGF.pm
4.04
KB
-rw-r--r--
PICT.pm
33.2
KB
-rw-r--r--
PLIST.pm
17.07
KB
-rw-r--r--
PLUS.pm
147.71
KB
-rw-r--r--
PNG.pm
60.72
KB
-rw-r--r--
PPM.pm
4.97
KB
-rw-r--r--
PSP.pm
9.02
KB
-rw-r--r--
Palm.pm
11.9
KB
-rw-r--r--
Panasonic.pm
96.62
KB
-rw-r--r--
PanasonicRaw.pm
31.77
KB
-rw-r--r--
Parrot.pm
20.95
KB
-rw-r--r--
Pentax.pm
220.46
KB
-rw-r--r--
PhaseOne.pm
26.24
KB
-rw-r--r--
PhotoCD.pm
18.25
KB
-rw-r--r--
PhotoMechanic.pm
8.09
KB
-rw-r--r--
Photoshop.pm
43.36
KB
-rw-r--r--
PostScript.pm
29.11
KB
-rw-r--r--
PrintIM.pm
3.44
KB
-rw-r--r--
Qualcomm.pm
43.43
KB
-rw-r--r--
QuickTime.pm
409.72
KB
-rw-r--r--
QuickTimeStream.pl
126.03
KB
-rw-r--r--
RIFF.pm
70.97
KB
-rw-r--r--
RSRC.pm
9.58
KB
-rw-r--r--
RTF.pm
13.46
KB
-rw-r--r--
Radiance.pm
4.56
KB
-rw-r--r--
Rawzor.pm
6.17
KB
-rw-r--r--
Real.pm
26.89
KB
-rw-r--r--
Reconyx.pm
14.2
KB
-rw-r--r--
Red.pm
10.82
KB
-rw-r--r--
Ricoh.pm
37.18
KB
-rw-r--r--
Samsung.pm
54.64
KB
-rw-r--r--
Sanyo.pm
11.83
KB
-rw-r--r--
Scalado.pm
3.91
KB
-rw-r--r--
Shift.pl
23.28
KB
-rw-r--r--
Shortcuts.pm
9.81
KB
-rw-r--r--
Sigma.pm
33.16
KB
-rw-r--r--
SigmaRaw.pm
23.45
KB
-rw-r--r--
Sony.pm
439.69
KB
-rw-r--r--
SonyIDC.pm
11.95
KB
-rw-r--r--
Stim.pm
4.53
KB
-rw-r--r--
TagInfoXML.pm
33.14
KB
-rw-r--r--
TagLookup.pm
647.18
KB
-rw-r--r--
TagNames.pod
1.76
MB
-rw-r--r--
Text.pm
8.12
KB
-rw-r--r--
Theora.pm
3.41
KB
-rw-r--r--
Torrent.pm
11.58
KB
-rw-r--r--
Unknown.pm
1.69
KB
-rw-r--r--
VCard.pm
17.31
KB
-rw-r--r--
Validate.pm
29.75
KB
-rw-r--r--
Vorbis.pm
8.13
KB
-rw-r--r--
WTV.pm
12.97
KB
-rw-r--r--
WriteCanonRaw.pl
24.29
KB
-rw-r--r--
WriteExif.pl
130.6
KB
-rw-r--r--
WriteIPTC.pl
29.6
KB
-rw-r--r--
WritePDF.pl
29.02
KB
-rw-r--r--
WritePNG.pl
16.07
KB
-rw-r--r--
WritePhotoshop.pl
10.85
KB
-rw-r--r--
WritePostScript.pl
26.71
KB
-rw-r--r--
WriteQuickTime.pl
89.63
KB
-rw-r--r--
WriteXMP.pl
70.49
KB
-rw-r--r--
Writer.pl
301.76
KB
-rw-r--r--
XMP.pm
176.89
KB
-rw-r--r--
XMP2.pl
81.66
KB
-rw-r--r--
XMPStruct.pl
36.66
KB
-rw-r--r--
ZIP.pm
27.61
KB
-rw-r--r--
ZISRAW.pm
7.85
KB
-rw-r--r--
iWork.pm
7.79
KB
-rw-r--r--
Delete
Unzip
Zip
${this.title}
Close
Code Editor : VCard.pm
#------------------------------------------------------------------------------ # File: VCard.pm # # Description: Read vCard and iCalendar meta information # # Revisions: 2015/04/05 - P. Harvey Created # 2015/05/02 - PH Added iCalendar support # # References: 1) http://en.m.wikipedia.org/wiki/VCard # 2) http://tools.ietf.org/html/rfc6350 # 3) http://tools.ietf.org/html/rfc5545 #------------------------------------------------------------------------------ package Image::ExifTool::VCard; use strict; use vars qw($VERSION); use Image::ExifTool qw(:DataAccess :Utils); $VERSION = '1.06'; my %unescapeVCard = ( '\\'=>'\\', ','=>',', 'n'=>"\n", 'N'=>"\n" ); # lookup for iCalendar components (used to generate family 1 group names if top level) my %isComponent = ( Event=>1, Todo=>1, Journal=>1, Freebusy=>1, Timezone=>1, Alarm=>1 ); my %timeInfo = ( # convert common date/time formats to EXIF style ValueConv => q{ $val =~ s/(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(Z?)/$1:$2:$3 $4:$5:$6$7/g; $val =~ s/(\d{4})(\d{2})(\d{2})/$1:$2:$3/g; $val =~ s/(\d{4})-(\d{2})-(\d{2})/$1:$2:$3/g; return $val; }, PrintConv => '$self->ConvertDateTime($val)', ); # vCard tags (ref 1/2/PH) # Note: The case of all tag ID's is normalized to lowercase with uppercase first letter %Image::ExifTool::VCard::Main = ( GROUPS => { 2 => 'Document' }, VARS => { NO_LOOKUP => 1 }, # omit tags from lookup NOTES => q{ This table lists common vCard tags, but ExifTool will also extract any other vCard tags found. Tag names may have "Pref" added to indicate the preferred instance of a vCard property, and other "TYPE" parameters may also added to the tag name. VCF files may contain multiple vCard entries which are distinguished by the ExifTool family 3 group name (document number). See L<http://tools.ietf.org/html/rfc6350> for the vCard 4.0 specification. }, Version => { Name => 'VCardVersion', Description => 'VCard Version' }, Fn => { Name => 'FormattedName', Groups => { 2 => 'Author' } }, N => { Name => 'Name', Groups => { 2 => 'Author' } }, Bday => { Name => 'Birthday', Groups => { 2 => 'Time' }, %timeInfo }, Tz => { Name => 'TimeZone', Groups => { 2 => 'Time' } }, Adr => { Name => 'Address', Groups => { 2 => 'Location' } }, Geo => { Name => 'Geolocation', Groups => { 2 => 'Location' }, # when used as a parameter, VCard 4.0 adds a "geo:" prefix that we need to remove ValueConv => '$val =~ s/^geo://; $val', }, Anniversary => { }, Email => { }, Gender => { }, Impp => 'IMPP', Lang => 'Language', Logo => { }, Nickname => { }, Note => { }, Org => 'Organization', Photo => { Groups => { 2 => 'Preview' } }, Prodid => 'Software', Rev => 'Revision', Sound => { }, Tel => 'Telephone', Title => 'JobTitle', Uid => 'UID', Url => 'URL', 'X-ablabel' => { Name => 'ABLabel', PrintConv => '$val =~ s/^_\$!<(.*)>!\$_$/$1/; $val' }, 'X-abdate' => { Name => 'ABDate', Groups => { 2 => 'Time' }, %timeInfo }, 'X-aim' => 'AIM', 'X-icq' => 'ICQ', 'X-abuid' => 'AB_UID', 'X-abrelatednames' => 'ABRelatedNames', 'X-socialprofile' => 'SocialProfile', ); %Image::ExifTool::VCard::VCalendar = ( GROUPS => { 1 => 'VCalendar', 2 => 'Document' }, VARS => { NO_LOOKUP => 1, # omit tags from lookup LONG_TAGS => 6, # some X-microsoft tags have unavoidably long ID's }, NOTES => q{ The VCard module is also used to process iCalendar ICS files since they use a format similar to vCard. The following table lists standard iCalendar tags, but any existing tags will be extracted. Top-level iCalendar components (eg. Event, Todo, Timezone, etc.) are used for the family 1 group names, and embedded components (eg. Alarm) are added as a prefix to the tag name. See L<http://tools.ietf.org/html/rfc5545> for the official iCalendar 2.0 specification. }, Version => { Name => 'VCalendarVersion', Description => 'VCalendar Version' }, Calscale => 'CalendarScale', Method => { }, Prodid => 'Software', Attach => 'Attachment', Categories => { }, Class => 'Classification', Comment => { }, Description => { }, Geo => { Name => 'Geolocation', Groups => { 2 => 'Location' }, ValueConv => '$val =~ s/^geo://; $val', }, Location => { Name => 'Location', Groups => { 2 => 'Location' } }, 'Percent-complete' => 'PercentComplete', Priority => { }, Resources => { }, Status => { }, Summary => { }, Completed => { Name => 'DateTimeCompleted', Groups => { 2 => 'Time' }, %timeInfo }, Dtend => { Name => 'DateTimeEnd', Groups => { 2 => 'Time' }, %timeInfo }, Due => { Name => 'DateTimeDue', Groups => { 2 => 'Time' }, %timeInfo }, Dtstart => { Name => 'DateTimeStart', Groups => { 2 => 'Time' }, %timeInfo }, Duration => { }, Freebusy => 'FreeBusyTime', Transp => 'TimeTransparency', Tzid => { Name => 'TimezoneID', Groups => { 2 => 'Time' } }, Tzname => { Name => 'TimezoneName', Groups => { 2 => 'Time' } }, Tzoffsetfrom=> { Name => 'TimezoneOffsetFrom', Groups => { 2 => 'Time' } }, Tzoffsetto => { Name => 'TimezoneOffsetTo', Groups => { 2 => 'Time' } }, Tzurl => { Name => 'TimeZoneURL', Groups => { 2 => 'Time' } }, Attendee => { }, Contact => { }, Organizer => { }, 'Recurrence-id' => 'RecurrenceID', 'Related-to' => 'RelatedTo', Url => 'URL', Uid => 'UID', Exdate => { Name => 'ExceptionDateTimes', Groups => { 2 => 'Time' }, %timeInfo }, Rdate => { Name => 'RecurrenceDateTimes', Groups => { 2 => 'Time' }, %timeInfo }, Rrule => { Name => 'RecurrenceRule', Groups => { 2 => 'Time' } }, Action => { }, Repeat => { }, Trigger => { }, Created => { Name => 'DateCreated', Groups => { 2 => 'Time' }, %timeInfo }, Dtstamp => { Name => 'DateTimeStamp', Groups => { 2 => 'Time' }, %timeInfo }, 'Last-modified' => { Name => 'ModifyDate', Groups => { 2 => 'Time' }, %timeInfo }, Sequence => 'SequenceNumber', 'Request-status' => 'RequestStatus', Acknowledged=> { Name => 'Acknowledged', Groups => { 2 => 'Time' }, %timeInfo }, # # Observed X-tags (not a comprehensive list): # 'X-apple-calendar-color'=> 'CalendarColor', 'X-apple-default-alarm' => 'DefaultAlarm', 'X-apple-local-default-alarm' => 'LocalDefaultAlarm', 'X-microsoft-cdo-appt-sequence' => 'AppointmentSequence', 'X-microsoft-cdo-ownerapptid' => 'OwnerAppointmentID', 'X-microsoft-cdo-busystatus' => 'BusyStatus', 'X-microsoft-cdo-intendedstatus' => 'IntendedBusyStatus', 'X-microsoft-cdo-alldayevent' => 'AllDayEvent', 'X-microsoft-cdo-importance' => { Name => 'Importance', PrintConv => { 0 => 'Low', 1 => 'Normal', 2 => 'High', }, }, 'X-microsoft-cdo-insttype' => { Name => 'InstanceType', PrintConv => { 0 => 'Non-recurring Appointment', 1 => 'Recurring Appointment', 2 => 'Single Instance of Recurring Appointment', 3 => 'Exception to Recurring Appointment', }, }, 'X-microsoft-donotforwardmeeting' => 'DoNotForwardMeeting', 'X-microsoft-disallow-counter' => 'DisallowCounterProposal', 'X-microsoft-locations' => { Name => 'MeetingLocations', Groups => { 2 => 'Location' } }, 'X-wr-caldesc' => 'CalendarDescription', 'X-wr-calname' => 'CalendarName', 'X-wr-relcalid' => 'CalendarID', 'X-wr-timezone' => { Name => 'TimeZone2', Groups => { 2 => 'Time' } }, 'X-wr-alarmuid' => 'AlarmUID', ); #------------------------------------------------------------------------------ # Get vCard tag, creating if necessary # Inputs: 0) ExifTool ref, 1) tag table ref, 2) tag ID, 3) tag Name, # 4) source tagInfo ref, 5) lang code # Returns: tagInfo ref sub GetVCardTag($$$$;$$) { my ($et, $tagTablePtr, $tag, $name, $srcInfo, $langCode) = @_; my $tagInfo = $$tagTablePtr{$tag}; unless ($tagInfo) { if ($srcInfo) { $tagInfo = { %$srcInfo }; } else { $tagInfo = { }; $et->VPrint(0, $$et{INDENT}, "[adding $tag]\n"); } $$tagInfo{Name} = $name; delete $$tagInfo{Description}; # create new description AddTagToTable($tagTablePtr, $tag, $tagInfo); } # handle alternate languages (the "language" parameter) $tagInfo = Image::ExifTool::GetLangInfo($tagInfo, $langCode) if $langCode; return $tagInfo; } #------------------------------------------------------------------------------ # Decode vCard text # Inputs: 0) ExifTool ref, 1) vCard text, 2) encoding # Returns: decoded text (or array ref for a list of values) sub DecodeVCardText($$;$) { my ($et, $val, $enc) = @_; $enc = defined($enc) ? lc $enc : ''; if ($enc eq 'b' or $enc eq 'base64') { require Image::ExifTool::XMP; $val = Image::ExifTool::XMP::DecodeBase64($val); } else { if ($enc eq 'quoted-printable') { # convert "=HH" hex codes to characters $val =~ s/=([0-9a-f]{2})/chr(hex($1))/ige; } $val = $et->Decode($val, 'UTF8'); # convert from UTF-8 # convert unescaped commas to nulls to separate list items $val =~ s/(\\.)|(,)/$1 || "\0"/sge; # unescape necessary characters in value $val =~ s/\\(.)/$unescapeVCard{$1}||$1/sge; # split into list if necessary my @vals = split /\0/, $val; $val = \@vals if @vals > 1; } return $val; } #------------------------------------------------------------------------------ # Read information in a vCard file # Inputs: 0) ExifTool ref, 1) dirInfo ref # Returns: 1 on success, 0 if this wasn't a valid vCard file sub ProcessVCard($$) { local $_; my ($et, $dirInfo) = @_; my $raf = $$dirInfo{RAF}; my ($buff, $val, $ok, $component, %compNum, @count); return 0 unless $raf->Read($buff, 24) and $raf->Seek(0,0) and $buff=~/^BEGIN:(VCARD|VCALENDAR)\r\n/i; my ($type, $lbl, $tbl, $ext) = uc($1) eq 'VCARD' ? qw(VCard vCard Main VCF) : qw(ICS iCalendar VCalendar ICS); $et->SetFileType($type, undef, $ext); return 1 if $$et{OPTIONS}{FastScan} and $$et{OPTIONS}{FastScan} == 3; local $/ = "\r\n"; my $tagTablePtr = GetTagTable("Image::ExifTool::VCard::$tbl"); my $more = $raf->ReadLine($buff); # read first line chomp $buff if $more; while ($more) { # retrieve previous line from $buff $val = $buff if defined $buff; # read ahead to next line to see if is a continuation $more = $raf->ReadLine($buff); if ($more) { chomp $buff; # add continuation line if necessary $buff =~ s/^[ \t]// and $val .= $buff, undef($buff), next; } if ($val =~ /^(BEGIN|END):(V?)(\w+)$/i) { my ($begin, $v, $what) = ((lc($1) eq 'begin' ? 1 : 0), $2, ucfirst lc $3); if ($what eq 'Card' or $what eq 'Calendar') { if ($begin) { @count = ( { } ); # reset group counters } else { $ok = 1; # ok if we read at least on full VCARD or VCALENDAR } next; } # absorb top-level component into family 1 group name if ($isComponent{$what}) { if ($begin) { unless ($component) { # begin a new top-level component @count = ( { } ); $component = $what; $compNum{$component} = ($compNum{$component} || 0) + 1; next; } } elsif ($component and $component eq $what) { # this top-level component has ended undef $component; next; } } # keep count of each component at this level if ($begin) { $count[-1]{$what} = ($count[-1]{$what} || 0) + 1 if $v; push @count, { obj => $what }; } elsif (@count > 1) { pop @count; } next; } elsif ($ok) { $ok = 0; $$et{DOC_NUM} = ++$$et{DOC_COUNT}; # read next card as a new document } unless ($val =~ s/^([-A-Za-z0-9.]+)//) { $et->WarnOnce("Unrecognized line in $lbl file"); next; } my $tag = $1; # set group if it exists if ($tag =~ s/^([-A-Za-z0-9]+)\.//) { $$et{SET_GROUP1} = ucfirst lc $1; } elsif ($component) { $$et{SET_GROUP1} = $component . $compNum{$component}; } else { delete $$et{SET_GROUP1}; } my ($name, %param, $p); # vCard tag ID's are case-insensitive, so normalize to lowercase with # an uppercase first letter for use as a tag name $name = ucfirst $tag if $tag =~ /[a-z]/; # preserve mixed case in name if it exists $tag = ucfirst lc $tag; # get source tagInfo reference my $srcInfo = $et->GetTagInfo($tagTablePtr, $tag); if ($srcInfo) { $name = $$srcInfo{Name}; # use our name } else { $name or $name = $tag; # remove leading "X-" from name if it exists $name =~ s/^X-// and $name = ucfirst $name; } # add object name(s) to tag if necessary if (@count > 1) { my $i; for ($i=$#count-1; $i>=0; --$i) { my $pre = $count[$i-1]{obj}; # use containing object name as tag prefix my $c = $count[$i]{$pre}; # add index for object number $c = '' unless defined $c; $tag = $pre . $c . $tag; $name = $pre . $c . $name; } } # parse parameters while ($val =~ s/^;([-A-Za-z0-9]*)(=?)//) { $p = ucfirst lc $1; # convert old vCard 2.x parameters to the new "TYPE=" format $2 or $val = $1 . $val, $p = 'Type'; # read parameter value for (;;) { last unless $val =~ s/^"([^"]*)",?// or $val =~ s/^([^";:,]+,?)//; my $v = $p eq 'Type' ? ucfirst lc $1 : $1; $param{$p} = defined($param{$p}) ? $param{$p} . $v : $v; } if (defined $param{$p}) { $param{$p} =~ s/\\(.)/$unescapeVCard{$1}||$1/sge; } else { $param{$p} = ''; } } $val =~ s/^:// or $et->WarnOnce("Invalid line in $lbl file"), next; # add 'Type' parameter to id and name if it exists $param{Type} and $tag .= $param{Type}, $name .= $param{Type}; # convert base64-encoded data if ($val =~ s{^data:(\w+)/(\w+);base64,}{}) { my $xtra = ucfirst(lc $1) . ucfirst(lc $2); $tag .= $xtra; $name .= $xtra; $param{Encoding} = 'base64'; } $val = DecodeVCardText($et, $val, $param{Encoding}); my $tagInfo = GetVCardTag($et, $tagTablePtr, $tag, $name, $srcInfo, $param{Language}); $et->HandleTag($tagTablePtr, $tag, $val, TagInfo => $tagInfo); # handle some other parameters that we care about (ignore the rest for now) foreach $p (qw(Geo Label Tzid)) { next unless defined $param{$p}; # use tag attributes from our table if it exists my $srcTag2 = $et->GetTagInfo($tagTablePtr, $p); my $pn = $srcTag2 ? $$srcTag2{Name} : $p; $val = DecodeVCardText($et, $param{$p}); # add parameter to tag ID and name my ($tg, $nm) = ($tag . $p, $name . $pn); $tagInfo = GetVCardTag($et, $tagTablePtr, $tg, $nm, $srcTag2, $param{Language}); $et->HandleTag($tagTablePtr, $tg, $val, TagInfo => $tagInfo); } } delete $$et{SET_GROUP1}; delete $$et{DOC_NUM}; $ok or $et->Warn("Missing $lbl end"); return 1; } 1; # end __END__ =head1 NAME Image::ExifTool::VCard - Read vCard and iCalendar meta information =head1 SYNOPSIS This module is used by Image::ExifTool =head1 DESCRIPTION This module contains definitions required by Image::ExifTool to read meta information from vCard VCF and iCalendar ICS files. =head1 AUTHOR Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com) This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 REFERENCES =over 4 =item L<http://en.m.wikipedia.org/wiki/VCard> =item L<http://tools.ietf.org/html/rfc6350> =item L<http://tools.ietf.org/html/rfc5545> =back =head1 SEE ALSO L<Image::ExifTool::TagNames/VCard Tags>, L<Image::ExifTool::TagNames/VCard VCalendar Tags>, L<Image::ExifTool(3pm)|Image::ExifTool> =cut
Close