Left: | ||
Right: |
OLD | NEW |
---|---|
(Empty) | |
1 /* | |
2 * This file is part of Adblock Plus <https://adblockplus.org/>, | |
3 * Copyright (C) 2006-2017 eyeo GmbH | |
4 * | |
5 * Adblock Plus is free software: you can redistribute it and/or modify | |
6 * it under the terms of the GNU General Public License version 3 as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * Adblock Plus is distributed in the hope that it will be useful, | |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 * GNU General Public License for more details. | |
13 * | |
14 * You should have received a copy of the GNU General Public License | |
15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | |
16 */ | |
17 | |
18 #include <cstdio> | |
19 #include <cstdlib> | |
20 | |
21 #include "Subscription.h" | |
22 #include "DownloadableSubscription.h" | |
23 #include "UserDefinedSubscription.h" | |
24 #include "../StringMap.h" | |
25 | |
26 namespace | |
27 { | |
28 StringMap<Subscription*> knownSubscriptions(16); | |
29 } | |
30 | |
31 Subscription::Subscription(Type type, const String& id) | |
32 : mType(type), mID(id), mDisabled(false) | |
33 { | |
34 annotate_address(this, "Subscription"); | |
35 } | |
36 | |
37 Subscription::~Subscription() | |
38 { | |
39 knownSubscriptions.erase(mID); | |
40 } | |
41 | |
42 OwnedString Subscription::Serialize() const | |
43 { | |
44 OwnedString result(u"[Subscription]\nurl="_str); | |
45 result.append(mID); | |
46 result.append(u'\n'); | |
47 if (!mTitle.empty()) | |
48 { | |
49 result.append(u"title="_str); | |
50 result.append(mTitle); | |
51 result.append(u'\n'); | |
52 } | |
53 if (mDisabled) | |
54 result.append(u"disabled=true\n"_str); | |
55 | |
56 return result; | |
57 } | |
58 | |
59 OwnedString Subscription::SerializeFilters() const | |
60 { | |
61 // TODO | |
62 return OwnedString(); | |
63 } | |
64 | |
65 Subscription* Subscription::FromID(const String& id) | |
66 { | |
67 if (id.empty()) | |
68 { | |
69 // Generate a new random ID | |
70 unsigned seed = knownSubscriptions.size(); | |
sergei
2017/04/12 12:04:33
it would be better to put "unsigned int" (int is a
Wladimir Palant
2017/04/13 13:04:41
Done.
| |
71 OwnedString randomID(u"~user~000000"_str); | |
72 do | |
73 { | |
74 int number = rand_r(&seed); | |
75 for (int i = randomID.length() - 6; i < randomID.length(); i++) | |
76 { | |
77 randomID[i] = '0' + (number % 10); | |
78 number /= 10; | |
79 } | |
80 } while (knownSubscriptions.find(randomID)); | |
81 return FromID(randomID); | |
82 } | |
83 | |
84 auto knownSubscription = knownSubscriptions.find(id); | |
85 if (knownSubscription) | |
86 { | |
87 knownSubscription->second->AddRef(); | |
88 return knownSubscription->second; | |
89 } | |
90 | |
91 SubscriptionPtr subscription; | |
92 if (!id.empty() && id[0] == '~') | |
sergei
2017/04/12 12:04:33
id cannot be empty here, though maybe it's still g
Wladimir Palant
2017/04/13 13:04:41
No, it cannot - with the current logic. I just ver
| |
93 subscription = new UserDefinedSubscription(id); | |
94 else | |
95 subscription = new DownloadableSubscription(id); | |
96 | |
97 // This is a hack: we looked up the entry using id but create it using | |
98 // subscription->mID. This works because both are equal at this point. | |
99 // However, id refers to a temporary buffer which will go away. | |
100 enter_context("Adding to known subscriptions"); | |
101 knownSubscription.assign(subscription->mID, subscription.get()); | |
102 exit_context(); | |
103 | |
104 return subscription.release(); | |
105 } | |
OLD | NEW |