| OLD | NEW | 
|---|
| 1 #include <cstdio> | 1 #include <cstdio> | 
| 2 #include <cstdlib> | 2 #include <cstdlib> | 
| 3 | 3 | 
| 4 #include "Subscription.h" | 4 #include "Subscription.h" | 
| 5 #include "DownloadableSubscription.h" | 5 #include "DownloadableSubscription.h" | 
| 6 #include "UserDefinedSubscription.h" | 6 #include "UserDefinedSubscription.h" | 
| 7 #include "../StringMap.h" | 7 #include "../StringMap.h" | 
| 8 | 8 | 
| 9 namespace | 9 namespace | 
| 10 { | 10 { | 
| 11   StringMap<Subscription*> knownSubscriptions(16); | 11   StringMap<Subscription*> knownSubscriptions(16); | 
| 12 } | 12 } | 
| 13 | 13 | 
| 14 Subscription::Subscription(Type type, const String& id) | 14 Subscription::Subscription(Type type, const String& id) | 
| 15     : mType(type), mID(id), mDisabled(false) | 15     : mType(type), mID(id), mDisabled(false) | 
| 16 { | 16 { | 
| 17   annotate_address(this, "Subscription"); | 17   annotate_address(this, "Subscription"); | 
| 18 } | 18 } | 
| 19 | 19 | 
| 20 Subscription::~Subscription() | 20 Subscription::~Subscription() | 
| 21 { | 21 { | 
| 22   knownSubscriptions.erase(mID); | 22   knownSubscriptions.erase(mID); | 
| 23 } | 23 } | 
| 24 | 24 | 
|  | 25 Filter* Subscription::FilterAt(unsigned index) | 
|  | 26 { | 
|  | 27   if (index >= mFilters.size()) | 
|  | 28     return nullptr; | 
|  | 29 | 
|  | 30   FilterPtr result(mFilters[index]); | 
|  | 31   return result.release(); | 
|  | 32 } | 
|  | 33 | 
|  | 34 int Subscription::IndexOfFilter(Filter* filter) | 
|  | 35 { | 
|  | 36   for (unsigned i = 0; i < mFilters.size(); i++) | 
|  | 37     if (mFilters[i] == filter) | 
|  | 38       return i; | 
|  | 39   return -1; | 
|  | 40 } | 
|  | 41 | 
| 25 OwnedString Subscription::Serialize() const | 42 OwnedString Subscription::Serialize() const | 
| 26 { | 43 { | 
| 27   OwnedString result(u"[Subscription]\nurl="_str); | 44   OwnedString result(u"[Subscription]\nurl="_str); | 
| 28   result.append(mID); | 45   result.append(mID); | 
| 29   result.append(u'\n'); | 46   result.append(u'\n'); | 
| 30   if (!mTitle.empty()) | 47   if (!mTitle.empty()) | 
| 31   { | 48   { | 
| 32     result.append(u"title="_str); | 49     result.append(u"title="_str); | 
| 33     result.append(mTitle); | 50     result.append(mTitle); | 
| 34     result.append(u'\n'); | 51     result.append(u'\n'); | 
| 35   } | 52   } | 
| 36   if (mDisabled) | 53   if (mDisabled) | 
| 37     result.append(u"disabled=true\n"_str); | 54     result.append(u"disabled=true\n"_str); | 
| 38 | 55 | 
| 39   return result; | 56   return result; | 
| 40 } | 57 } | 
| 41 | 58 | 
| 42 OwnedString Subscription::SerializeFilters() const | 59 OwnedString Subscription::SerializeFilters() const | 
| 43 { | 60 { | 
| 44   // TODO | 61   if (!mFilters.size()) | 
| 45   return OwnedString(); | 62     return OwnedString(); | 
|  | 63 | 
|  | 64   OwnedString result(u"[Subscription filters]\n"_str); | 
|  | 65   for (unsigned i = 0; i < mFilters.size(); i++) | 
|  | 66   { | 
|  | 67     // TODO: Escape [ characters | 
|  | 68     result.append(mFilters[i]->GetText()); | 
|  | 69     result.append(u'\n'); | 
|  | 70   } | 
|  | 71   return result; | 
| 46 } | 72 } | 
| 47 | 73 | 
| 48 Subscription* Subscription::FromID(const String& id) | 74 Subscription* Subscription::FromID(const String& id) | 
| 49 { | 75 { | 
| 50   if (id.empty()) | 76   if (id.empty()) | 
| 51   { | 77   { | 
| 52     // Generate a new random ID | 78     // Generate a new random ID | 
| 53     unsigned seed = knownSubscriptions.size(); | 79     unsigned seed = knownSubscriptions.size(); | 
| 54     OwnedString randomID(u"~user~000000"_str); | 80     OwnedString randomID(u"~user~000000"_str); | 
| 55     do | 81     do | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 66 | 92 | 
| 67   auto knownSubscription = knownSubscriptions.find(id); | 93   auto knownSubscription = knownSubscriptions.find(id); | 
| 68   if (knownSubscription) | 94   if (knownSubscription) | 
| 69   { | 95   { | 
| 70     knownSubscription->second->AddRef(); | 96     knownSubscription->second->AddRef(); | 
| 71     return knownSubscription->second; | 97     return knownSubscription->second; | 
| 72   } | 98   } | 
| 73 | 99 | 
| 74   SubscriptionPtr subscription; | 100   SubscriptionPtr subscription; | 
| 75   if (!id.empty() && id[0] == '~') | 101   if (!id.empty() && id[0] == '~') | 
| 76     subscription = new UserDefinedSubscription(id); | 102     subscription = SubscriptionPtr(new UserDefinedSubscription(id), false); | 
| 77   else | 103   else | 
| 78     subscription = new DownloadableSubscription(id); | 104     subscription = SubscriptionPtr(new DownloadableSubscription(id), false); | 
| 79 | 105 | 
| 80   // This is a hack: we looked up the entry using id but create it using | 106   // This is a hack: we looked up the entry using id but create it using | 
| 81   // subscription->mID. This works because both are equal at this point. | 107   // subscription->mID. This works because both are equal at this point. | 
| 82   // However, id refers to a temporary buffer which will go away. | 108   // However, id refers to a temporary buffer which will go away. | 
| 83   enter_context("Adding to known subscriptions"); | 109   enter_context("Adding to known subscriptions"); | 
| 84   knownSubscription.assign(subscription->mID, subscription.get()); | 110   knownSubscription.assign(subscription->mID, subscription.get()); | 
| 85   exit_context(); | 111   exit_context(); | 
| 86 | 112 | 
| 87   return subscription.release(); | 113   return subscription.release(); | 
| 88 } | 114 } | 
| OLD | NEW | 
|---|