/*
* 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]);
}
}
}