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