/rusxmms/librcc

To get this branch, use:
bzr branch http://suren.me/webbzr/rusxmms/librcc

« back to all changes in this revision

Viewing changes to src/rccxml.c

  • Committer: Suren A. Chilingaryan
  • Date: 2005-07-13 16:49:47 UTC
  • Revision ID: Arch-1:ds@dside.dyndns.org--darksoft-2004%librcc--main--0.1--patch-12
Engine Plugins

Show diffs side-by-side

added added

removed removed

Lines of Context:
13
13
 
14
14
#include "internal.h"
15
15
#include "rccconfig.h"
 
16
#include "plugin.h"
16
17
 
17
18
#define MAX_HOME_CHARS 96
18
19
#define XPATH_LANGUAGE "//Language[@name]"
27
28
    if ((node)&&(node->children)&&(node->children->type == XML_TEXT_NODE)&&(node->children->content)) return node->children->content;
28
29
}
29
30
 
30
 
int rccXmlInit() {
 
31
int rccXmlInit(int LoadConfiguration) {
31
32
    FILE *f;
32
33
    char config[MAX_HOME_CHARS + 32];
33
34
 
35
36
    xmlXPathObjectPtr obj;
36
37
    xmlNodeSetPtr node_set;
37
38
    unsigned long i, nnodes;
38
 
    xmlNodePtr cnode, pnode, node;
 
39
    xmlNodePtr enode, cnode, pnode, node;
39
40
    xmlAttrPtr attr;
40
 
    const char *lang, *fullname;
41
 
    unsigned int pos, cpos;
 
41
    const char *lang, *fullname, *engine_name;
 
42
    unsigned int pos, lpos, epos, cpos;
 
43
    
 
44
    rcc_engine *engine;
42
45
    
43
46
    xmlInitParser();
44
47
    xmlInitCharEncodingHandlers();
45
48
    xmlKeepBlanksDefault(0);
46
49
 
47
 
    if (strlen(rcc_home_dir)>MAX_HOME_CHARS) config[0] = 0;
48
 
    else {
49
 
        sprintf(config, "%s/.rcc/rcc.xml", rcc_home_dir);
50
 
        f = fopen(config, "r");
51
 
        if (f) fclose(f);
52
 
        else config[0] = 0;
53
 
    }
54
 
    if (!config[0]) {
55
 
        strcpy(config, "/etc/rcc.xml");
56
 
        f = fopen(config, "r");
57
 
        if (f) fclose(f);
58
 
        else config[0] = 0;
59
 
    }
 
50
    if (LoadConfiguration) {
 
51
        if (strlen(rcc_home_dir)>MAX_HOME_CHARS) config[0] = 0;
 
52
        else {
 
53
            sprintf(config, "%s/.rcc/rcc.xml", rcc_home_dir);
 
54
            f = fopen(config, "r");
 
55
            if (f) fclose(f);
 
56
            else config[0] = 0;
 
57
        }
 
58
        if (!config[0]) {
 
59
            strcpy(config, "/etc/rcc.xml");
 
60
            f = fopen(config, "r");
 
61
            if (f) fclose(f);
 
62
            else config[0] = 0;
 
63
        }
 
64
    } else config[0] = 0;
60
65
 
61
66
    
62
67
        // Load Extra Languages
73
78
        node_set = obj->nodesetval;
74
79
        if (!node_set) goto clear;
75
80
        
76
 
        for (pos = 0; rcc_default_languages[pos].sn; pos++);
77
 
        if (pos == RCC_MAX_LANGUAGES) goto clear;
 
81
        for (lpos = 0; rcc_default_languages[lpos].sn; lpos++);
78
82
 
79
83
        nnodes = node_set->nodeNr;
80
84
        for (i=0;i<nnodes;i++) {
84
88
            
85
89
            if ((!lang)||(!lang[0])) continue;
86
90
            
87
 
            for (cpos=1,node=pnode->children;node;node=node->next) {
 
91
            pos = rccDefaultGetLanguageByName(lang);
 
92
            if (!pos) continue;
 
93
            if (pos == (rcc_language_id)-1) pos = lpos;
 
94
            else if (pos == RCC_MAX_LANGUAGES) continue; 
 
95
            
 
96
            for (epos = 1, cpos = 1,node=pnode->children;node;node=node->next) {
88
97
                if (node->type != XML_ELEMENT_NODE) continue;
89
98
                if (!xmlStrcmp(node->name, "Charsets")) {
90
 
                    for (cpos = 0, cnode=node->children;cnode;cnode=cnode->next) {
 
99
                    for (cnode=node->children;cnode;cnode=cnode->next) {
91
100
                        if (cnode->type != XML_ELEMENT_NODE) continue;
92
101
                        if ((!xmlStrcmp(cnode->name, "Charset"))&&(rccXmlGetText(cnode))&&(cpos<RCC_MAX_CHARSETS)) {
93
102
                                rcc_default_languages[pos].charsets[cpos++] = rccXmlGetText(cnode);
94
103
                        }
95
104
                    }
96
105
                } 
97
 
            }
98
 
            
99
 
            if (cpos > 1) {
100
 
                rcc_default_languages[pos].sn = lang;
101
 
                rcc_default_languages[pos].charsets[0] = "Default";
102
 
                rcc_default_languages[pos].charsets[cpos] = NULL;
103
 
                rcc_default_languages[pos].engines[0] = &rcc_default_engine;
104
 
                rcc_default_languages[pos].engines[1] = NULL;
105
 
 
106
 
                rcc_default_languages[++pos].sn = NULL;
107
 
                if (pos == RCC_MAX_LANGUAGES) break;
108
 
            }
 
106
                if (!xmlStrcmp(node->name, "Engines")) {
 
107
                    for (enode=node->children;enode;enode=enode->next) {
 
108
                        if (enode->type != XML_ELEMENT_NODE) continue;
 
109
                        if ((!xmlStrcmp(enode->name, "Engine"))&&(rccXmlGetText(enode))&&(epos<RCC_MAX_ENGINES)) {
 
110
                                engine_name = rccXmlGetText(enode);
 
111
                                if (!engine_name) continue;
 
112
                                engine = rccPluginEngineGetInfo(engine_name, lang);
 
113
                                if (!engine) continue;
 
114
                                 
 
115
                                rcc_default_languages[pos].engines[epos++] = engine;
 
116
                        }
 
117
                    }
 
118
                }
 
119
            }
 
120
            
 
121
            rcc_default_languages[pos].sn = lang;
 
122
            rcc_default_languages[pos].charsets[0] = rcc_default_charset;
 
123
            if (cpos > 1) rcc_default_languages[pos].charsets[cpos] = NULL;
 
124
            else {
 
125
                rcc_default_languages[pos].charsets[1] = rcc_utf8_charset;
 
126
                rcc_default_languages[pos].charsets[2] = NULL;
 
127
            }
 
128
            rcc_default_languages[pos].engines[0] = &rcc_default_engine;
 
129
            rcc_default_languages[pos].engines[epos] = NULL;
 
130
            
 
131
            if (pos == lpos) rcc_default_languages[++lpos].sn = NULL;
109
132
        }
110
133
        
111
134
clear: