8
conkeror => '{a79fe89b-6662-4ff4-8e88-09950ad4dfde}',
9
emusic => 'dlm@emusic.com',
10
fennec => '{a23983c0-fd0e-11dc-95ff-0800200c9a66}',
11
firefox => '{ec8030f7-c20a-464f-9b0e-13a3a9e97384}',
12
midbrowser => '{aa5ca914-c309-495d-91cf-3141bbb04115}',
13
prism => 'prism@developer.mozilla.org',
14
seamonkey => '{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}',
15
songbird => 'songbird@songbirdnest.com',
16
thunderbird => '{3550f703-e582-4d05-9a08-453d09bdfdc6}',
17
toolkit => 'toolkit@mozilla.org',
8
22
my ($class, $params) = @_;
23
my ($self, $versionFile) = @_;
25
open(local *FILE, $versionFile) or die "Could not open version file $versionFile";
26
$self->{version} = <FILE>;
27
$self->{version} =~ s/[^\w\.]//gs;
37
my ($self, $metadataFile) = @_;
39
my $data = $self->readFile($metadataFile);
40
die "Could not read metadata file $metadataFile" unless defined $data;
42
$self->{settings} = {};
44
my %lists = map {$_ => 1} qw(contributor);
45
foreach my $line (split(/[\r\n]+/, $data))
50
next unless length($line);
52
if ($line =~ /^\[(.*)\]$/)
56
elsif ($line =~ /(.+)=(.*)/)
58
if (defined $curSection)
60
$self->{settings}{$curSection} = {} unless exists $self->{settings}{$curSection};
61
if (exists($lists{$1}))
63
$self->{settings}{$curSection}{$1} = [] unless exists $self->{settings}{$curSection}{$1};
64
push @{$self->{settings}{$curSection}{$1}}, $2;
68
$self->{settings}{$curSection}{$1} = $2;
73
warn "Setting outside section in metadata file: $line";
78
warn "Unrecognized line in metadata file: $line";
82
warn "Version not set in metadata file" unless exists($self->{settings}{general}{version});
83
$self->{version} = $self->{settings}{general}{version};
28
84
if (exists $self->{devbuild})
30
$self->{version} .= ".0" while ($self->{version} =~ tr/././ < 2);
31
$self->{version} .= $self->{devbuild};
86
unless ($self->{version} =~ /\D$/)
88
$self->{version} .= ".0" while ($self->{version} =~ tr/././ < 2);
89
$self->{version} .= "+";
91
$self->{version} .= "." . $self->{devbuild};
38
my ($self, $manifestFile) = @_;
40
my $data = $self->readFile($manifestFile);
41
die "Could not open manifest file $manifestFile" unless defined $data;
42
die "Could not find JAR file name in $manifestFile" unless $data =~ /\bjar:chrome\/(\S+?)\.jar\b/;
44
$self->{baseName} = $1;
87
135
$self->{name} = $self->{localeData}{"en-US"}{name} if exists($self->{localeData}{"en-US"}{name});
88
136
$self->{description} = $self->{localeData}{"en-US"}{description} if exists($self->{localeData}{"en-US"}{description});
91
# HACK: Read author name and homepage from install manifest
92
if (defined($installManifestFile))
94
my $installRDF = $self->readFile($installManifestFile);
95
$self->{author} = $1 if $installRDF && $installRDF =~ /<em:creator>\s*([^<>]+?)\s*<\/em:creator>/;
96
$self->{homepage} = $1 if $installRDF && $installRDF =~ /<em:homepageURL>\s*([^<>]+?)\s*<\/em:homepageURL>/;
100
my %translators = ();
101
foreach my $locale (sort {$a->{id} cmp $b->{id}} values %{$self->{localeData}})
103
next unless (exists($locale->{translator}) && $locale->{translator}) ||
104
(exists($locale->{name}) && $locale->{name} && $locale->{name} ne $self->{name}) ||
105
(exists($locale->{description}) && $locale->{description} && $locale->{description} ne $self->{description});
107
if (exists($locale->{translator}))
109
foreach my $translator (split(/,/, $locale->{translator}))
111
$translator =~ s/^\s+//g;
112
$translator =~ s/\s+$//g;
113
$translators{$translator} = 1 if $translator ne "";
116
$locale->{name} = $self->{name} unless exists($locale->{name}) && $locale->{name} && $locale->{name} ne $self->{name};
117
$locale->{description} = $self->{description} unless exists($locale->{description}) && $locale->{description} && $locale->{description} ne $self->{description};
119
my $id = $self->encodeXML($locale->{id});
120
my $name = $self->encodeXML($locale->{name});
121
my $description = $self->encodeXML($locale->{description});
123
# Duplicate author and homepage in each locale to work around bug 416350
124
my $author = $self->encodeXML($self->{author});
125
my $homepage = $self->encodeXML($self->{homepage});
130
\t\t\t<em:locale>$id</em:locale>
131
\t\t\t<em:name>$name</em:name>
132
\t\t\t<em:description>$description</em:description>
133
\t\t\t<em:creator>$author</em:creator>
134
\t\t\t<em:homepageURL>$homepage</em:homepageURL>
142
foreach my $translator (sort keys %translators)
144
$translator = $self->encodeXML($translator);
146
\t<em:translator>$translator</em:translator>
150
$self->{localizedInfo} = $info;
153
sub readNameFromManifest
155
my ($self, $installManifestFile) = @_;
157
my $installRDF = $self->readFile($installManifestFile);
158
return unless $installRDF;
160
$installRDF =~ s/<em:(requires|targetApplication)>.*?<\/em:\1>//gs;
162
$self->{name} = $1 if $installRDF =~ /<em:name>\s*([^<>]+?)\s*<\/em:name>/;
138
$self->{homepage} = $self->{settings}{homepage}{default};
139
$self->{author} = $self->{settings}{general}{author};
141
# Fix up locale data if missing
142
foreach my $locale (values %{$self->{localeData}})
144
$locale->{name} = $self->{name} unless exists($locale->{name}) && $locale->{name};
145
$locale->{description} = $self->{description} unless exists($locale->{description}) && $locale->{description};
147
if (exists($self->{settings}{homepage}{$locale->{id}}))
149
$locale->{homepage} = $self->{settings}{homepage}{$locale->{id}};
151
elsif ($locale->{id} =~ /^(\w+)/ && exists($self->{settings}{homepage}{$1}))
153
$locale->{homepage} = $self->{settings}{homepage}{$1};
157
$locale->{homepage} = $self->{settings}{homepage}{default};
159
warn "Failed to get homepage for $locale->{id}" unless $locale->{homepage};
360
350
unlink $fileName if $invalid;
355
my ($self, $manifestFile) = @_;
357
my $id = $self->encodeXML($self->{settings}{general}{id});
358
my $version = $self->encodeXML($self->{version});
359
my $name = $self->encodeXML($self->{name});
360
my $description = $self->encodeXML($self->{description});
361
my $author = $self->encodeXML($self->{author});
362
my $homepage = $self->encodeXML($self->{homepage});
364
open(local *FILE, '>', $manifestFile) or die "Failed to write manifest file $manifestFile";
367
<?xml version="1.0"?>
369
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
370
\t\txmlns:em="http://www.mozilla.org/2004/em-rdf#">
372
\t<Description about="urn:mozilla:install-manifest">
374
\t\t<em:id>$id</em:id>
375
\t\t<em:version>$version</em:version>
376
\t\t<em:name>$name</em:name>
377
\t\t<em:description>$description</em:description>
378
\t\t<em:creator>$author</em:creator>
379
\t\t<em:homepageURL>$homepage</em:homepageURL>
380
\t\t<em:type>2</em:type>
383
if ($self->{devbuild})
386
\t\t<em:updateURL><![CDATA[https://adblockplus.org/devbuilds/update.rdf?baseName=$self->{settings}{general}{basename}&reqVersion=%REQ_VERSION%&id=%ITEM_ID%&version=%ITEM_VERSION%&maxAppVersion=%ITEM_MAXAPPVERSION%&status=%ITEM_STATUS%&appID=%APP_ID%&appVersion=%APP_VERSION%&appOS=%APP_OS%&appABI=%APP_ABI%&locale=%APP_LOCALE%¤tAppVersion=%CURRENT_APP_VERSION%&updateType=%UPDATE_TYPE%]]></em:updateURL>
390
if (exists($self->{settings}{general}{icon}))
392
my $icon = $self->encodeXML($self->{settings}{general}{icon});
394
\t\t<em:iconURL>$icon</em:iconURL>
397
if (exists($self->{settings}{general}{about}))
399
my $about = $self->encodeXML($self->{settings}{general}{about});
401
\t\t<em:aboutURL>$about</em:aboutURL>
404
if (exists($self->{settings}{general}{options}))
406
my $options = $self->encodeXML($self->{settings}{general}{options});
408
\t\t<em:optionsURL>$options</em:optionsURL>
414
if (exists($self->{settings}{general}{contributor}))
416
foreach my $contributor (map {$self->encodeXML($_)} @{$self->{settings}{general}{contributor}})
419
\t\t<em:contributor>$contributor</em:contributor>
425
my %translators = ();
426
foreach my $locale (values %{$self->{localeData}})
428
if (exists($locale->{translator}))
430
foreach my $translator (split(/,/, $locale->{translator}))
432
$translator =~ s/^\s+//g;
433
$translator =~ s/\s+$//g;
434
$translators{$translator} = 1 if $translator ne "";
438
foreach my $translator (sort keys %translators)
440
$translator = $self->encodeXML($translator);
442
\t\t<em:translator>$translator</em:translator>
447
foreach my $locale (sort {$a->{id} cmp $b->{id}} values %{$self->{localeData}})
449
my $id = $self->encodeXML($locale->{id});
450
my $name = $self->encodeXML($locale->{name});
451
my $description = $self->encodeXML($locale->{description});
452
my $homepage = $self->encodeXML($locale->{homepage});
454
# Duplicate author in each locale to work around bug 416350
455
my $author = $self->encodeXML($self->{author});
460
\t\t\t\t<em:locale>$id</em:locale>
461
\t\t\t\t<em:name>$name</em:name>
462
\t\t\t\t<em:description>$description</em:description>
463
\t\t\t\t<em:creator>$author</em:creator>
464
\t\t\t\t<em:homepageURL>$homepage</em:homepageURL>
471
foreach my $app (sort keys %{$self->{settings}{compat}})
473
if (!exists($apps{$app}))
475
warn "Unrecognized application in manifest: $app";
479
my $id = $self->encodeXML($apps{$app});
480
my ($min, $max) = map {$self->encodeXML($_)} split(/\//, $self->{settings}{compat}{$app});
483
\t\t<em:targetApplication>
485
\t\t\t\t<!-- $app -->
486
\t\t\t\t<em:id>$id</em:id>
487
\t\t\t\t<em:minVersion>$min</em:minVersion>
488
\t\t\t\t<em:maxVersion>$max</em:maxVersion>
490
\t\t</em:targetApplication>
365
504
my ($self, $jarFile, @files) = @_;