]> jfr.im git - irc/blitzed-org/charybdis.git/commitdiff
capability: add capability_require().
authorWilliam Pitcock <redacted>
Sat, 4 Feb 2012 08:00:33 +0000 (02:00 -0600)
committerWilliam Pitcock <redacted>
Sat, 4 Feb 2012 08:00:33 +0000 (02:00 -0600)
include/capability.h
src/capability.c

index e8e029f3ab407466eaf249e45365630867745652..7519263328f42f2aef9837504944fece2853032a 100644 (file)
@@ -27,10 +27,12 @@ struct CapabilityEntry;
 extern unsigned int capability_get(struct CapabilityIndex *index, const char *cap);
 extern unsigned int capability_put(struct CapabilityIndex *index, const char *cap);
 extern void capability_orphan(struct CapabilityIndex *index, const char *cap);
+extern void capability_require(struct CapabilityIndex *index, const char *cap);
 
 extern struct CapabilityIndex *capability_index_create(void);
 extern void capability_index_destroy(struct CapabilityIndex *);
 extern const char *capability_index_list(struct CapabilityIndex *, unsigned int capability_mask);
 extern unsigned int capability_index_mask(struct CapabilityIndex *);
+extern unsigned int capability_index_get_required(struct CapabilityIndex *);
 
 #endif
index de124f2eb37b8a564519ff8c15fae1ccd9b8e9f2..44d5579407b62cc94f20549711ff6a402e33a331 100644 (file)
@@ -28,6 +28,7 @@ struct CapabilityIndex {
 };
 
 #define CAP_ORPHANED   0x1
+#define CAP_REQUIRED   0x2
 
 struct CapabilityEntry {
        unsigned int value;
@@ -85,7 +86,22 @@ capability_orphan(struct CapabilityIndex *index, const char *cap)
 
        entry = irc_dictionary_retrieve(index->cap_dict, cap);
        if (entry != NULL)
+       {
+               entry->flags &= ~CAP_REQUIRED;
                entry->flags |= CAP_ORPHANED;
+       }
+}
+
+void
+capability_require(struct CapabilityIndex *index, const char *cap)
+{
+       struct CapabilityEntry *entry;
+
+       s_assert(index != NULL);
+
+       entry = irc_dictionary_retrieve(index->cap_dict, cap);
+       if (entry != NULL)
+               entry->flags |= CAP_REQUIRED;
 }
 
 static void
@@ -162,3 +178,21 @@ capability_index_mask(struct CapabilityIndex *index)
 
        return mask;
 }
+
+unsigned int
+capability_index_get_required(struct CapabilityIndex *index)
+{
+       struct DictionaryIter iter;
+       struct CapabilityEntry *entry;
+       unsigned int mask = 0;
+
+       s_assert(index != NULL);
+
+       DICTIONARY_FOREACH(entry, &iter, index->cap_dict)
+       {
+               if (!(entry->flags & CAP_ORPHANED) && (entry->flags & CAP_REQUIRED))
+                       mask |= entry->value;
+       }
+
+       return mask;
+}