xref: /haiku/src/kits/textencoding/CharacterSetRoster.cpp (revision e705c841d784f0035a0ef3e9e96f6e017df16681)
1 #include <string.h>
2 #include <strings.h>
3 #include <CharacterSet.h>
4 #include <CharacterSetRoster.h>
5 #include "character_sets.h"
6 
7 namespace BPrivate {
8 
9 BCharacterSetRoster::BCharacterSetRoster()
10 {
11 	index = 0;
12 }
13 
14 BCharacterSetRoster::~BCharacterSetRoster()
15 {
16 	// nothing to do
17 }
18 
19 status_t
20 BCharacterSetRoster::GetNextCharacterSet(BCharacterSet * charset)
21 {
22 	if (charset == 0) {
23 		return B_BAD_VALUE;
24 	}
25 	if (index >= character_sets_by_id_count) {
26 		return B_BAD_VALUE;
27 	}
28 	*charset = *character_sets_by_id[index++];
29 	return B_NO_ERROR;
30 }
31 
32 status_t
33 BCharacterSetRoster::RewindCharacterSets()
34 {
35 	index = 0;
36 	if (index >= character_sets_by_id_count) {
37 		return B_BAD_VALUE;
38 	}
39 	return B_NO_ERROR;
40 }
41 
42 status_t
43 BCharacterSetRoster::StartWatching(BMessenger target)
44 {
45 	// TODO: implement it
46 	return B_ERROR;
47 }
48 
49 status_t
50 BCharacterSetRoster::StopWatching(BMessenger target)
51 {
52 	// TODO: implement it
53 	return B_ERROR;
54 }
55 
56 const BCharacterSet *
57 BCharacterSetRoster::GetCharacterSetByFontID(uint32 id)
58 {
59 	if (id >= character_sets_by_id_count) {
60 		return NULL;
61 	}
62 	return character_sets_by_id[id];
63 }
64 
65 const BCharacterSet *
66 BCharacterSetRoster::GetCharacterSetByConversionID(uint32 id)
67 {
68 	if (id + 1 >= character_sets_by_id_count) {
69 		return NULL;
70 	}
71 	return character_sets_by_id[id+1];
72 }
73 
74 const BCharacterSet *
75 BCharacterSetRoster::GetCharacterSetByMIBenum(uint32 MIBenum)
76 {
77 	if (MIBenum > maximum_valid_MIBenum) {
78 		return NULL;
79 	}
80 	return character_sets_by_MIBenum[MIBenum];
81 }
82 
83 const BCharacterSet *
84 BCharacterSetRoster::FindCharacterSetByPrintName(const char * name)
85 {
86 	for (uint id = 0 ; (id < character_sets_by_id_count) ; id++) {
87 		if (strcmp(character_sets_by_id[id]->GetPrintName(),name) == 0) {
88 			return character_sets_by_id[id];
89 		}
90 	}
91 	return 0;
92 }
93 
94 const BCharacterSet *
95 BCharacterSetRoster::FindCharacterSetByName(const char * name)
96 {
97 	// first search standard names and mime names
98 	for (uint id = 0 ; (id < character_sets_by_id_count) ; id++) {
99 		if (strcasecmp(character_sets_by_id[id]->GetName(),name) == 0) {
100 			return character_sets_by_id[id];
101 		}
102 		const char * mime = character_sets_by_id[id]->GetMIMEName();
103 		if ((mime != NULL) && (strcasecmp(mime,name) == 0)) {
104 			return character_sets_by_id[id];
105 		}
106 	}
107 	// only after searching all the above names do we look at aliases
108 	for (uint id = 0 ; (id < character_sets_by_id_count) ; id++) {
109 		for (int alias = 0 ; (alias < character_sets_by_id[id]->CountAliases()) ; alias++) {
110 			if (strcasecmp(character_sets_by_id[id]->AliasAt(alias),name) == 0) {
111 				return character_sets_by_id[id];
112 			}
113 		}
114 	}
115 	return 0;
116 }
117 
118 }
119