You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
4.2 KiB
149 lines
4.2 KiB
/*
|
|
* Copyright (C) 2016 The Android Open Source Project
|
|
* Copyright (C) 2016 Mopria Alliance, Inc.
|
|
* Copyright (C) 2013 Hewlett-Packard Development Company, L.P.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include "plugin_db.h"
|
|
|
|
#define TAG "plugin_db"
|
|
|
|
#define _MAX_MIME_TYPES 32
|
|
#define _MAX_PRINT_FORMATS 8
|
|
#define _MAX_PLUGINS 16
|
|
|
|
typedef struct {
|
|
wprint_plugin_t *plugin;
|
|
const char *name;
|
|
char mime_types[_MAX_MIME_TYPES][MAX_MIME_LENGTH + 1];
|
|
char print_formats[_MAX_PRINT_FORMATS][MAX_MIME_LENGTH + 1];
|
|
int version;
|
|
wprint_priority_t priority;
|
|
} _plugin_db_t;
|
|
|
|
static _plugin_db_t _plugin[_MAX_PLUGINS];
|
|
static int _index = 0;
|
|
|
|
void plugin_reset() {
|
|
_index = 0;
|
|
}
|
|
|
|
int plugin_add(wprint_plugin_t *plugin) {
|
|
char const **mt, **pf;
|
|
int i, j, index;
|
|
|
|
if (plugin == NULL) {
|
|
return ERROR;
|
|
}
|
|
|
|
index = _index;
|
|
mt = plugin->get_mime_types();
|
|
pf = plugin->get_print_formats();
|
|
|
|
if ((mt == NULL) || (pf == NULL)) {
|
|
return ERROR;
|
|
}
|
|
|
|
memset(&_plugin[index], 0, sizeof(_plugin_db_t));
|
|
_plugin[index].version = plugin->version;
|
|
_plugin[index].plugin = plugin;
|
|
_plugin[index].priority = plugin->priority;
|
|
|
|
LOGI("MIME types:");
|
|
// save a pointer to the name for comparison
|
|
|
|
i = j = 0;
|
|
while (mt[i]) {
|
|
if (strlen(mt[i]) < MAX_MIME_LENGTH) {
|
|
LOGI(" %s", mt[i]);
|
|
strncpy(_plugin[index].mime_types[j++], mt[i], MAX_MIME_LENGTH);
|
|
}
|
|
i++;
|
|
}
|
|
if (j < _MAX_MIME_TYPES) {
|
|
_plugin[index].mime_types[j][0] = 0;
|
|
}
|
|
|
|
LOGI("print formats:");
|
|
|
|
i = j = 0;
|
|
while (pf[i]) {
|
|
if (strlen(pf[i]) < MAX_MIME_LENGTH) {
|
|
LOGI(" %s", pf[i]);
|
|
strncpy(_plugin[index].print_formats[j++], pf[i], MAX_MIME_LENGTH);
|
|
}
|
|
i++;
|
|
}
|
|
if (j < _MAX_PRINT_FORMATS) {
|
|
_plugin[index].print_formats[j][0] = 0;
|
|
}
|
|
|
|
_index++;
|
|
|
|
return OK;
|
|
}
|
|
|
|
wprint_plugin_t *plugin_search(const char *mt, const char *pf) {
|
|
int i, j, k;
|
|
_plugin_db_t *match = NULL;
|
|
|
|
for (i = 0; i < _index; i++) {
|
|
j = 0;
|
|
while (strlen(_plugin[i].print_formats[j])) {
|
|
if (strcmp(_plugin[i].print_formats[j], pf) == 0) {
|
|
k = 0;
|
|
while (strlen(_plugin[i].mime_types[k])) {
|
|
if (strcmp(_plugin[i].mime_types[k], mt) == 0) {
|
|
bool use;
|
|
use = ((match == NULL) || (_plugin[i].priority < match->priority));
|
|
if (use) {
|
|
match = &_plugin[i];
|
|
}
|
|
}
|
|
k++;
|
|
}
|
|
}
|
|
j++;
|
|
}
|
|
}
|
|
return ((match != NULL) ? match->plugin : NULL);
|
|
}
|
|
|
|
unsigned long long plugin_get_mime_type_bit(const char *mime_type) {
|
|
unsigned long long bit = 0;
|
|
if (strcmp(MIME_TYPE_PDF, mime_type) == 0) {
|
|
bit = (unsigned long long) (1 << INPUT_MIME_TYPE_PDF);
|
|
} else if (strcmp(MIME_TYPE_PCLM, mime_type) == 0) {
|
|
bit = (unsigned long long) (1 << INPUT_MIME_TYPE_PCLM);
|
|
} else if (strcmp(MIME_TYPE_PWG, mime_type) == 0) {
|
|
bit = (unsigned long long) (1 << INPUT_MIME_TYPE_PWG);
|
|
}
|
|
return bit;
|
|
}
|
|
|
|
void plugin_get_passthru_input_formats(unsigned long long *input_formats) {
|
|
int i;
|
|
*input_formats = 0;
|
|
for (i = 0; i < _index; i++) {
|
|
// is this a passthrough plugin
|
|
if ((strcmp(_plugin[i].mime_types[0], _plugin[i].print_formats[0]) == 0) &&
|
|
(strlen(_plugin[i].print_formats[1]) == 0)
|
|
&& (strlen(_plugin[i].mime_types[1]) == 0)) {
|
|
*input_formats |= plugin_get_mime_type_bit(_plugin[i].mime_types[0]);
|
|
}
|
|
}
|
|
} |