1b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*
2b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
3b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
4b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Licensed under the Apache License, Version 2.0 (the "License");
5b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * you may not use this file except in compliance with the License.
6b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * You may obtain a copy of the License at
7b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
8b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *     http://www.apache.org/licenses/LICENSE-2.0
9b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
10b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Unless required by applicable law or agreed to in writing, software
11b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * distributed under the License is distributed on an "AS IS" BASIS,
12b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * See the License for the specific language governing permissions and
14b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * limitations under the License.
15b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
16b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/**
17b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @file picorsrc.c
18b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
19b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
20b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * All rights reserved.
21b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
22b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * History:
23b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - 2009-04-20 -- initial version
24b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
25b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
26b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
27b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picodefs.h"
28b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picoos.h"
29b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picodbg.h"
30b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
31b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* knowledge layer */
32b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picoknow.h"
33b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
34b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picokdt.h"
35b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picoklex.h"
36b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picokfst.h"
37b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picokpdf.h"
38b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picoktab.h"
39b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picokpr.h"
40b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
41b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picorsrc.h"
42b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
43b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef __cplusplus
44b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenextern "C" {
45b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
46b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if 0
47b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
48b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
49b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
50b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
51b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if defined(PICO_DEBUG)
52b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picokdbg.h"
53b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
54b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
55b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
56b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/**  object   : Resource
57b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *   shortcut : rsrc
58b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
59b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
60b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct picorsrc_resource {
61b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 magic;  /* magic number used to validate handles */
62b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* next connects all active resources of a resource manager and the garbaged resources of the manager's free list */
63b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picorsrc_Resource next;
64b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picorsrc_resource_type_t type;
65b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picorsrc_resource_name_t name;
66b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int8 lockCount;  /* count of current subscribers of this resource */
67b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_File file;
68b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 * raw_mem; /* pointer to allocated memory. NULL if preallocated. */
69b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* picoos_uint32 size; */
70b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 * start; /* start of content (after header) */
71b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoknow_KnowledgeBase kbList;
72b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} picorsrc_resource_t;
73b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
74b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
75b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define MAGIC_MASK 0x7049634F  /* pIcO */
76b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
77b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define SET_MAGIC_NUMBER(res) \
78d12fa9eb428db88f399a89566772eaed99b2fe58Marcus Oakland    (res)->magic = ((picoos_uint32) (uintptr_t) (res)) ^ MAGIC_MASK
79b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
80b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define CHECK_MAGIC_NUMBER(res) \
81d12fa9eb428db88f399a89566772eaed99b2fe58Marcus Oakland    ((res)->magic == (((picoos_uint32) (uintptr_t) (res)) ^ MAGIC_MASK))
82b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
83b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
84b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
85b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/**
86b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Returns non-zero if 'this' is a valid resource handle, zero otherwise.
87b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
88b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_int16 picoctrl_isValidResourceHandle(picorsrc_Resource this)
89b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
90b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return (this != NULL) && CHECK_MAGIC_NUMBER(this);
91b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
92b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
93b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
94b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picorsrc_Resource picorsrc_newResource(picoos_MemoryManager mm)
95b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
96b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picorsrc_Resource this = picoos_allocate(mm, sizeof(*this));
97b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL != this) {
98b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        SET_MAGIC_NUMBER(this);
99b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* initialize */
100b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->name[0] = NULLC;
101b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* picoos_strlcpy(this->name, name,PICORSRC_MAX_RSRC_NAME_SIZ); */
102b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->next = NULL;
103b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->type = PICORSRC_TYPE_NULL;
104b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->lockCount = 0;
105b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->file = NULL;
106b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->raw_mem = NULL;
107b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->start = NULL;
108b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->kbList = NULL;
109b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* this->size=0; */
110b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
111b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return this;
112b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
113b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
114b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void picorsrc_disposeResource(picoos_MemoryManager mm, picorsrc_Resource * this)
115b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
116b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL != (*this)) {
117b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        (*this)->magic ^= 0xFFFEFDFC;
118b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* we have to explicitly free 'raw_mem' here because in testing
119b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen           scenarios (where memory protection functionality is enabled)
120b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen           it might be allocated aside from normal memory */
121b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if ((*this)->raw_mem != NULL) {
122b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            picoos_deallocProtMem(mm, (void *) &(*this)->raw_mem);
123b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
124b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_deallocate(mm,(void * *)this);
125b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
126b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
127b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
128b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
129b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
130b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
131b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void picorsrc_initializeVoice(picorsrc_Voice this)
132b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
133b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 i;
134b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL != this) {
135b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* initialize */
136b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        for (i=0; i<PICORSRC_KB_ARRAY_SIZE; i++) {
137b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen          this->kbArray[i] = NULL;
138b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
139b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->numResources = 0;
140b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->next = NULL;
141b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
142b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
143b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
144b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picorsrc_Voice picorsrc_newVoice(picoos_MemoryManager mm)
145b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
146b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picorsrc_Voice this = (picorsrc_Voice) picoos_allocate(mm,sizeof(*this));
147b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picorsrc_initializeVoice(this);
148b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return this;
149b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
150b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
151b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*
152b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void picorsrc_disposeVoice(picoos_MemoryManager mm, picorsrc_Voice * this)
153b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
154b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL != (*this)) {
155b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
156b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_deallocate(mm,(void *)this);
157b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
158b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
159b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen*/
160b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
161b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
162b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/**  object   : VoiceDefinition
163b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *   shortcut : vdef
164b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
165b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
166b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
167b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct picorsrc_voice_definition * picorsrc_VoiceDefinition;
168b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
169b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct picorsrc_voice_definition {
170b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_char voiceName[PICO_MAX_VOICE_NAME_SIZE];
171b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 numResources;
172b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picorsrc_resource_name_t resourceName[PICO_MAX_NUM_RSRC_PER_VOICE];
173b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picorsrc_VoiceDefinition next;
174b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} picorsrc_voice_definition_t;
175b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
176b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
177b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picorsrc_VoiceDefinition picorsrc_newVoiceDefinition(picoos_MemoryManager mm)
178b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
179b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* picoos_uint8 i; */
180b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picorsrc_VoiceDefinition this = (picorsrc_VoiceDefinition) picoos_allocate(mm,sizeof(*this));
181b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL != this) {
182b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* initialize */
183b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->voiceName[0] = NULLC;
184b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->numResources = 0;
185b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /*
186b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        for (i=0; i < PICO_MAX_NUM_RSRC_PER_VOICE; i++) {
187b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            this->resourceName[i][0] = NULLC;
188b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
189b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        */
190b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->next = NULL;
191b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
192b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return this;
193b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
194b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
195b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*
196b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void picorsrc_disposeVoiceDefinition(picoos_MemoryManager mm, picorsrc_VoiceDefinition * this)
197b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
198b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL != (*this)) {
199b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
200b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_deallocate(mm,(void *)this);
201b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
202b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
203b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen*/
204b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
205b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
206b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
207b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/**  object   : ResourceManager
208b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *   shortcut : rm
209b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
210b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
211b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct picorsrc_resource_manager {
212b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_Common common;
213b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 numResources;
214b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picorsrc_Resource resources, freeResources;
215b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 numVoices;
216b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picorsrc_Voice voices, freeVoices;
217b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 numVdefs;
218b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picorsrc_VoiceDefinition vdefs, freeVdefs;
219b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 numKbs;
220b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoknow_KnowledgeBase freeKbs;
221b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_header_string_t tmpHeader;
222b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} picorsrc_resource_manager_t;
223b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
224b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picorsrc_createDefaultResource(picorsrc_ResourceManager this /*,
225b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picorsrc_Resource * resource */);
226b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
227b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
228b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicorsrc_ResourceManager picorsrc_newResourceManager(picoos_MemoryManager mm, picoos_Common common /* , picoos_char * configFile */)
229b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
230b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picorsrc_ResourceManager this = picoos_allocate(mm,sizeof(*this));
231b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL != this) {
232b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* initialize */
233b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->common = common;
234b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->numResources = 0;
235b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->resources = NULL;
236b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->freeResources = NULL;
237b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->numVoices = 0;
238b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->voices = NULL;
239b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->freeVoices = NULL;
240b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->numVdefs = 0;
241b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->vdefs = NULL;
242b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->freeVdefs = NULL;
243b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
244b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return this;
245b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
246b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
247b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenvoid picorsrc_disposeResourceManager(picoos_MemoryManager mm, picorsrc_ResourceManager * this)
248b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
249b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL != (*this)) {
250b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* terminate */
251b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_deallocate(mm,(void *)this);
252b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
253b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
254b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
255b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
256b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ******* accessing resources **************************************/
257b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
258b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
259b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t findResource(picorsrc_ResourceManager this, picoos_char * resourceName, picorsrc_Resource * rsrc) {
260b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picorsrc_Resource r;
261b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this) {
262b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_ERR_NULLPTR_ACCESS;
263b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
264b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    r = this->resources;
265b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while (NULL != r && (0 != picoos_strcmp(r->name,resourceName))) {
266b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        r = r->next;
267b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
268b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *rsrc = r;
269b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
270b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
271b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
272b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 isResourceLoaded(picorsrc_ResourceManager this, picoos_char * resourceName) {
273b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picorsrc_Resource res;
274b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
275b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (PICO_OK == findResource(this, resourceName,&res)){
276b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return (NULL != res);
277b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
278b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
279b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
280b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen }
281b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
282b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t parse_resource_name(picoos_char * fileName)
283b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
284b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("analysing file name %s",fileName));
285b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (picoos_has_extension(fileName,
286b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            (picoos_char *)PICO_BIN_EXTENSION)) {
287b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_OK;
288b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
289b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_EXC_UNEXPECTED_FILE_TYPE;
290b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
291b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
292b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
293b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
294b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
295b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t readHeader(picorsrc_ResourceManager this,
296b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_FileHeader header, picoos_uint32 * headerlen, picoos_File file)
297b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
298b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
299b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 hdrlen1;
300b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 n;
301b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pico_status_t status;
302b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
303b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
304b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* read PICO header */
305b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    status = picoos_readPicoHeader(file, headerlen);
306b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (PICO_OK == status) {
307b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
308b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
309b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(this->common->em,status,NULL,(picoos_char *)"problem reading file header");
310b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
311b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* read header length (excluding length itself) */
312b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    status = picoos_read_pi_uint16(file,&hdrlen1);
313b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("got header size %d",hdrlen1));
314b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
315b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (PICO_OK == status) {
316b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *headerlen += 2;
317b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        status = (hdrlen1 <= PICOOS_MAX_HEADER_STRING_LEN-1) ? PICO_OK : PICO_ERR_OTHER;
318b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (PICO_OK == status) {
319b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            n = hdrlen1;
320b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (picoos_ReadBytes(file, (picoos_uint8 *) this->tmpHeader, &n) && hdrlen1 == n) {
321b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                this->tmpHeader[hdrlen1] = NULLC;
322b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                *headerlen += hdrlen1;
323b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_DEBUG(("got header <%s>",this->tmpHeader));
324b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
325b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                status = PICO_OK;
326b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else {
327b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                status = PICO_ERR_OTHER;
328b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
329b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
330b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (PICO_OK == status) {
331b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            status = picoos_hdrParseHeader(header, this->tmpHeader);
332b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
333b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
334b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return status;
335b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
336b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
337b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t picorsrc_createKnowledgeBase(
338b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picorsrc_ResourceManager this,
339b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint8 * data,
340b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint32 size,
341b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoknow_kb_id_t kbid,
342b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoknow_KnowledgeBase * kb)
343b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
344b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    (*kb) = picoknow_newKnowledgeBase(this->common->mm);
345b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == (*kb)) {
346b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_EXC_OUT_OF_MEM;
347b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
348b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    (*kb)->base = data;
349b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    (*kb)->size = size;
350b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    (*kb)->id = kbid;
351b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    switch (kbid) {
352b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_TPP_MAIN:
353b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_TPP_USER_1:
354b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_TPP_USER_2:
355b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return picokpr_specializePreprocKnowledgeBase(*kb, this->common);
356b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
357b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_TAB_GRAPHS:
358b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return picoktab_specializeGraphsKnowledgeBase(*kb, this->common);
359b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
360b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_TAB_PHONES:
361b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return picoktab_specializePhonesKnowledgeBase(*kb, this->common);
362b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
363b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_TAB_POS:
364b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return picoktab_specializePosKnowledgeBase(*kb, this->common);
365b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
366b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_FIXED_IDS:
367b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return picoktab_specializeIdsKnowledgeBase(*kb, this->common);
368b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
369b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_LEX_MAIN:
370b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_LEX_USER_1:
371b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_LEX_USER_2:
372b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return picoklex_specializeLexKnowledgeBase(*kb, this->common);
373b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
374b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_DT_POSP:
375b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return picokdt_specializeDtKnowledgeBase(*kb, this->common,
376b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                     PICOKDT_KDTTYPE_POSP);
377b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
378b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_DT_POSD:
379b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return picokdt_specializeDtKnowledgeBase(*kb, this->common,
380b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                     PICOKDT_KDTTYPE_POSD);
381b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
382b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_DT_G2P:
383b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return picokdt_specializeDtKnowledgeBase(*kb, this->common,
384b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                     PICOKDT_KDTTYPE_G2P);
385b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
386b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_DT_PHR:
387b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return picokdt_specializeDtKnowledgeBase(*kb, this->common,
388b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                     PICOKDT_KDTTYPE_PHR);
389b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
390b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_DT_ACC:
391b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen             return picokdt_specializeDtKnowledgeBase(*kb, this->common,
392b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                      PICOKDT_KDTTYPE_ACC);
393b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen             break;
394b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_FST_SPHO_1:
395b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_FST_SPHO_2:
396b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_FST_SPHO_3:
397b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_FST_SPHO_4:
398b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_FST_SPHO_5:
399b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_FST_SPHO_6:
400b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_FST_SPHO_7:
401b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_FST_SPHO_8:
402b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_FST_SPHO_9:
403b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_FST_SPHO_10:
404b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_FST_WPHO_1:
405b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_FST_WPHO_2:
406b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_FST_WPHO_3:
407b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_FST_WPHO_4:
408b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_FST_WPHO_5:
409b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_FST_SVOXPA_PARSE:
410b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_FST_XSAMPA_PARSE:
411b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_FST_XSAMPA2SVOXPA:
412b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
413b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen             return picokfst_specializeFSTKnowledgeBase(*kb, this->common);
414b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen             break;
415b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
416b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_DT_DUR:
417b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_DT_LFZ1:
418b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_DT_LFZ2:
419b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_DT_LFZ3:
420b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_DT_LFZ4:
421b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_DT_LFZ5:
422b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_DT_MGC1:
423b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_DT_MGC2:
424b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_DT_MGC3:
425b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_DT_MGC4:
426b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_DT_MGC5:
427b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return picokdt_specializeDtKnowledgeBase(*kb, this->common,
428b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                     PICOKDT_KDTTYPE_PAM);
429b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
430b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_PDF_DUR:
431b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return picokpdf_specializePdfKnowledgeBase(*kb, this->common,
432b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                       PICOKPDF_KPDFTYPE_DUR);
433b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
434b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
435b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_PDF_LFZ:
436b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return picokpdf_specializePdfKnowledgeBase(*kb, this->common,
437b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                       PICOKPDF_KPDFTYPE_MUL);
438b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
439b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_PDF_MGC:
440b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return picokpdf_specializePdfKnowledgeBase(*kb, this->common,
441b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                       PICOKPDF_KPDFTYPE_MUL);
442b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
443b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_PDF_PHS:
444b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return picokpdf_specializePdfKnowledgeBase(*kb, this->common,
445b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                       PICOKPDF_KPDFTYPE_PHS);
446b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
447b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
448b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
449b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
450b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if defined(PICO_DEBUG)
451b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICOKNOW_KBID_DBG:
452b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return picokdbg_specializeDbgKnowledgeBase(*kb, this->common);
453b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
454b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
455b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
456b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        default:
457b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
458b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
459b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
460b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
461b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
462b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
463b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t picorsrc_releaseKnowledgeBase(
464b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picorsrc_ResourceManager this,
465b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoknow_KnowledgeBase * kb)
466b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
467b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    (*kb) = NULL;
468b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
469b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
470b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
471b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t picorsrc_getKbList(picorsrc_ResourceManager this,
472b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint8 * data,
473b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint32 datalen,
474b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoknow_KnowledgeBase * kbList)
475b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
476b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
477b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pico_status_t status = PICO_OK;
478b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 curpos = 0, offset, size;
479b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 i, numKbs, kbid;
480b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_char str[PICOKNOW_MAX_KB_NAME_SIZ];
481b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoknow_KnowledgeBase kb;
482b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
483b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *kbList = NULL;
484b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    datalen = datalen;
485b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* read number of fields */
486b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    numKbs = data[curpos++];
487b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("number of kbs (unrestricted) = %i",numKbs));
488b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    status = (numKbs <= PICOKNOW_MAX_NUM_RESOURCE_KBS) ? PICO_OK : PICO_EXC_FILE_CORRUPT;
489b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* read in all kb names */
490b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("number of kbs = %i",numKbs));
491b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    i = 0;
492b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while ((PICO_OK == status) && (i++ < numKbs)) {
493b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        status = (picoos_get_str((picoos_char *)data,&curpos,str,PICOOS_MAX_FIELD_STRING_LEN)) ? PICO_OK :  PICO_EXC_FILE_CORRUPT;
494b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_DEBUG(("contains knowledge base %s (status: %i)",str, status));
495b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
496b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* consume termination of last str */
497b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    curpos++;
498b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    i = 0;
499b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while ((PICO_OK == status) && (i++ < numKbs)) {
500b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        kbid = data[curpos++];
501b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_DEBUG(("got kb id %i, curpos now %i",kbid, curpos));
502b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        status = picoos_read_mem_pi_uint32(data,&curpos,&offset);
503b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_DEBUG(("got kb offset %i, curpos now %i",offset, curpos));
504b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        status = picoos_read_mem_pi_uint32(data,&curpos,&size);
505b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_DEBUG(("got kb size %i, curpos now %i",size, curpos));
506b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (PICO_OK == status) {
507b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (0 == offset) {
508b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /* currently we consider a kb mentioned in resource but with offset 0 (no knowledge) as
509b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                 * different form a kb not mentioned at all. We might reconsider that later. */
510b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_DEBUG((" kb (id %i) is mentioned but empty (base:%i, size:%i)",kb->id, kb->base, kb->size));
511b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                status = picorsrc_createKnowledgeBase(this, NULL, size, (picoknow_kb_id_t)kbid, &kb);
512b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else {
513b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                status = picorsrc_createKnowledgeBase(this, data+offset, size, (picoknow_kb_id_t)kbid, &kb);
514b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
515b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_DEBUG(("found kb (id %i) starting at %i with size %i",kb->id, kb->base, kb->size));
516b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (PICO_OK == status) {
517b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen              kb->next = *kbList;
518b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen              *kbList = kb;
519b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
520b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
521b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
522b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (PICO_OK != status) {
523b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        kb = *kbList;
524b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        while (NULL != kb) {
525b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            picorsrc_releaseKnowledgeBase(this,&kb);
526b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
527b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
528b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
529b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return status;
530b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
531b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
532b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
533b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* load resource file. the type of resource file etc. are in the header,
534b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * then follows the directory, then the knowledge bases themselves (as byte streams) */
535b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
536b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picorsrc_loadResource(picorsrc_ResourceManager this,
537b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_char * fileName, picorsrc_Resource * resource)
538b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
539b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picorsrc_Resource res;
540b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 headerlen, len,maxlen;
541b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_file_header_t header;
542b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 rem;
543b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pico_status_t status = PICO_OK;
544b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
545b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (resource == NULL) {
546b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_ERR_NULLPTR_ACCESS;
547b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
548b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *resource = NULL;
549b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
550b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
551b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    res = picorsrc_newResource(this->common->mm);
552b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
553b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == res) {
554b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(this->common->em,PICO_EXC_OUT_OF_MEM,NULL,NULL);
555b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
556b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
557b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (PICO_MAX_NUM_RESOURCES <= this->numResources) {
558b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_deallocate(this->common->mm, (void *) &res);
559b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(this->common->em,PICO_EXC_MAX_NUM_EXCEED,NULL,(picoos_char *)"no more than %i resources",PICO_MAX_NUM_RESOURCES);
560b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
561b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
562b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* ***************** parse file name for file type and parameters */
563b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
564b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (PICO_OK != parse_resource_name(fileName)) {
565b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_deallocate(this->common->mm, (void *) &res);
566b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_EXC_UNEXPECTED_FILE_TYPE;
567b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
568b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
569b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* ***************** get header info */
570b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
571b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* open binary file for reading (no key, nrOfBufs, bufSize) */
572b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("trying to open file %s",fileName));
573b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (!picoos_OpenBinary(this->common, &res->file, fileName)) {
574b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* open didn't succeed */
575b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        status = PICO_EXC_CANT_OPEN_FILE;
576b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("can't open file %s",fileName));
577b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_emRaiseException(this->common->em, PICO_EXC_CANT_OPEN_FILE,
578b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                NULL, (picoos_char *) "%s", fileName);
579b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
580b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (PICO_OK == status) {
581b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        status = readHeader(this, &header, &headerlen, res->file);
582b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* res->file now positioned at first pos after header */
583b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
584b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
585b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* ***************** check header values */
586b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (PICO_OK == status && isResourceLoaded(this, header.field[PICOOS_HEADER_NAME].value)) {
587b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* lingware is allready loaded, do nothing */
588b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_WARN((">>> lingware '%s' allready loaded",header.field[PICOOS_HEADER_NAME].value));
589b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_emRaiseWarning(this->common->em,PICO_WARN_RESOURCE_DOUBLE_LOAD,NULL,(picoos_char *)"%s",header.field[PICOOS_HEADER_NAME].value);
590b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        status = PICO_WARN_RESOURCE_DOUBLE_LOAD;
591b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
592b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
593b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (PICO_OK == status) {
594b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /* get data length */
595b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        status = picoos_read_pi_uint32(res->file, &len);
596b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_DEBUG(("found net resource len of %i",len));
597b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* allocate memory */
598b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (PICO_OK == status) {
599b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_TRACE((">>> 2"));
600b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            maxlen = len + PICOOS_ALIGN_SIZE; /* once would be sufficient? */
601b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            res->raw_mem = picoos_allocProtMem(this->common->mm, maxlen);
602b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /* res->size = maxlen; */
603b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            status = (NULL == res->raw_mem) ? PICO_EXC_OUT_OF_MEM : PICO_OK;
604b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
605b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (PICO_OK == status) {
606d12fa9eb428db88f399a89566772eaed99b2fe58Marcus Oakland            rem = (uintptr_t) res->raw_mem % PICOOS_ALIGN_SIZE;
607b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (rem > 0) {
608b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                res->start = res->raw_mem + (PICOOS_ALIGN_SIZE - rem);
609b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else {
610b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                res->start = res->raw_mem;
611b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
612b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
613b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /* read file contents into memory */
614b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            status = (picoos_ReadBytes(res->file, res->start, &len)) ? PICO_OK
615b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    : PICO_ERR_OTHER;
616b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /* resources are read-only; the following write protection
617b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen             has an effect in test configurations only */
618b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            picoos_protectMem(this->common->mm, res->start, len, /*enable*/TRUE);
619b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
620b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* note resource unique name */
621b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (PICO_OK == status) {
622b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (picoos_strlcpy(res->name,header.field[PICOOS_HEADER_NAME].value,PICORSRC_MAX_RSRC_NAME_SIZ) < PICORSRC_MAX_RSRC_NAME_SIZ) {
623b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_DEBUG(("assigned name %s to resource",res->name));
624b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                status = PICO_OK;
625b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else {
626b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                status = PICO_ERR_INDEX_OUT_OF_RANGE;
627b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_ERROR(("failed assigning name %s to resource",
628b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                               res->name));
629b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                picoos_emRaiseException(this->common->em,
630b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        PICO_ERR_INDEX_OUT_OF_RANGE, NULL,
631b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        (picoos_char *)"resource %s",res->name);
632b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
633b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
634b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
635b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* get resource type */
636b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (PICO_OK == status) {
637b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (!picoos_strcmp(header.field[PICOOS_HEADER_CONTENT_TYPE].value, PICORSRC_FIELD_VALUE_TEXTANA)) {
638b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                res->type = PICORSRC_TYPE_TEXTANA;
639b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else if (!picoos_strcmp(header.field[PICOOS_HEADER_CONTENT_TYPE].value, PICORSRC_FIELD_VALUE_SIGGEN)) {
640b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                res->type = PICORSRC_TYPE_SIGGEN;
641b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else if (!picoos_strcmp(header.field[PICOOS_HEADER_CONTENT_TYPE].value, PICORSRC_FIELD_VALUE_SIGGEN)) {
642b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                res->type = PICORSRC_TYPE_USER_LEX;
643b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else if (!picoos_strcmp(header.field[PICOOS_HEADER_CONTENT_TYPE].value, PICORSRC_FIELD_VALUE_SIGGEN)) {
644b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                res->type = PICORSRC_TYPE_USER_PREPROC;
645b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else {
646b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                res->type = PICORSRC_TYPE_OTHER;
647b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
648b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
649b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
650b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (PICO_OK == status) {
651b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /* create kb list from resource */
652b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            status = picorsrc_getKbList(this, res->start, len, &res->kbList);
653b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
654b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
655b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
656b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (status == PICO_OK) {
657b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* add resource to rm */
658b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        res->next = this->resources;
659b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->resources = res;
660b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->numResources++;
661b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *resource = res;
662b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_DEBUG(("done loading resource %s from %s", res->name, fileName));
663b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
664b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picorsrc_disposeResource(this->common->mm, &res);
665b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("failed to load resource"));
666b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
667b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
668b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (status < 0) {
669b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return status;
670b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
671b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_OK;
672b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
673b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
674b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
675b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t picorsrc_releaseKbList(picorsrc_ResourceManager this, picoknow_KnowledgeBase * kbList)
676b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
677b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoknow_KnowledgeBase kbprev, kb;
678b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kb = *kbList;
679b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while (NULL != kb) {
680b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        kbprev = kb;
681b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        kb = kb->next;
682b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoknow_disposeKnowledgeBase(this->common->mm,&kbprev);
683b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
684b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *kbList = NULL;
685b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
686b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
687b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
688b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* unload resource file. (if resource file is busy, warn and don't unload) */
689b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picorsrc_unloadResource(picorsrc_ResourceManager this, picorsrc_Resource * resource) {
690b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
691b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picorsrc_Resource r1, r2, rsrc;
692b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
693b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (resource == NULL) {
694b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_ERR_NULLPTR_ACCESS;
695b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
696b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        rsrc = *resource;
697b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
698b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
699b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (rsrc->lockCount > 0) {
700b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_EXC_RESOURCE_BUSY;
701b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
702b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* terminate */
703b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (rsrc->file != NULL) {
704b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_CloseBinary(this->common, &rsrc->file);
705b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
706b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL != rsrc->raw_mem) {
707b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_deallocProtMem(this->common->mm, (void *) &rsrc->raw_mem);
708b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_DEBUG(("deallocated raw mem"));
709b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
710b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
711b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    r1 = NULL;
712b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    r2 = this->resources;
713b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while (r2 != NULL && r2 != rsrc) {
714b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        r1 = r2;
715b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        r2 = r2->next;
716b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
717b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == r1) {
718b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->resources = rsrc->next;
719b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else if (NULL == r2) {
720b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* didn't find resource in rm! */
721b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_ERR_OTHER;
722b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
723b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        r1->next = rsrc->next;
724b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
725b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
726b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL != rsrc->kbList) {
727b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picorsrc_releaseKbList(this, &rsrc->kbList);
728b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
729b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
730b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_deallocate(this->common->mm,(void **)resource);
731b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->numResources--;
732b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
733b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
734b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
735b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
736b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
737b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picorsrc_createDefaultResource(picorsrc_ResourceManager this
738b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /*, picorsrc_Resource * resource */)
739b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
740b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picorsrc_Resource res;
741b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pico_status_t status = PICO_OK;
742b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
743b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
744b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* *resource = NULL; */
745b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
746b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (PICO_MAX_NUM_RESOURCES <= this->numResources) {
747b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(this->common->em,PICO_EXC_MAX_NUM_EXCEED,NULL,(picoos_char *)"no more than %i resources",PICO_MAX_NUM_RESOURCES);
748b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
749b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
750b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    res = picorsrc_newResource(this->common->mm);
751b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
752b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == res) {
753b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(this->common->em,PICO_EXC_OUT_OF_MEM,NULL,NULL);
754b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
755b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
756b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (picoos_strlcpy(res->name,PICOKNOW_DEFAULT_RESOURCE_NAME,PICORSRC_MAX_RSRC_NAME_SIZ) < PICORSRC_MAX_RSRC_NAME_SIZ) {
757b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_DEBUG(("assigned name %s to default resource",res->name));
758b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        status = PICO_OK;
759b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
760b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("failed assigning name %s to default resource",res->name));
761b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        status = PICO_ERR_INDEX_OUT_OF_RANGE;
762b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
763b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    status = picorsrc_createKnowledgeBase(this, NULL, 0, (picoknow_kb_id_t)PICOKNOW_KBID_FIXED_IDS, &res->kbList);
764b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
765b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (PICO_OK == status) {
766b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        res->next = this->resources;
767b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->resources = res;
768b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->numResources++;
769b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* *resource = res; */
770b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
771b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
772b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
773b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
774b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return status;
775b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
776b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
777b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
778b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picorsrc_rsrcGetName(picorsrc_Resource this,
779b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_char * name, picoos_uint32 maxlen) {
780b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (!picoctrl_isValidResourceHandle(this)) {
781b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_ERR_INVALID_ARGUMENT;
782b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
783b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_strlcpy(name, this->name,maxlen);
784b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
785b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
786b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
787b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
788b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ******* accessing voice definitions **************************************/
789b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
790b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
791b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t findVoiceDefinition(picorsrc_ResourceManager this,
792b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        const picoos_char * voiceName, picorsrc_VoiceDefinition * vdef)
793b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
794b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picorsrc_VoiceDefinition v;
795b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("finding voice name %s",voiceName));
796b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this) {
797b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_ERR_NULLPTR_ACCESS;
798b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
799b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    v = this->vdefs;
800b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while (NULL != v && (0 != picoos_strcmp(v->voiceName,voiceName))) {
801b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_DEBUG(("%s doesnt match",v->voiceName));
802b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        v = v->next;
803b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
804b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *vdef = v;
805b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (v == NULL) {
806b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_DEBUG(("didnt find voice name %s",voiceName));
807b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
808b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_DEBUG(("found voice name %s",voiceName));
809b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   }
810b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
811b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
812b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
813b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
814b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picorsrc_addResourceToVoiceDefinition(picorsrc_ResourceManager this,
815b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_char * voiceName, picoos_char * resourceName)
816b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
817b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picorsrc_VoiceDefinition vdef;
818b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
819b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this) {
820b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("this is NULL"));
821b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_ERR_NULLPTR_ACCESS;
822b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
823b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((PICO_OK == findVoiceDefinition(this,voiceName,&vdef)) && (NULL != vdef)) {
824b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (PICO_MAX_NUM_RSRC_PER_VOICE <= vdef->numResources) {
825b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return picoos_emRaiseException(this->common->em,PICO_EXC_MAX_NUM_EXCEED,NULL,(picoos_char *)"no more than %i resources per voice",PICO_MAX_NUM_RSRC_PER_VOICE);
826b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
827b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (picoos_strlcpy(vdef->resourceName[vdef->numResources++], resourceName,
828b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            PICORSRC_MAX_RSRC_NAME_SIZ) < PICORSRC_MAX_RSRC_NAME_SIZ) {
829b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_DEBUG(("vdef added resource '%s' to voice '%s'",resourceName,voiceName));
830b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICO_OK;
831b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } else {
832b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_ERROR(("illegal name (%s)",resourceName));
833b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return picoos_emRaiseException(this->common->em,PICO_EXC_NAME_ILLEGAL,NULL,(picoos_char *)"%s",resourceName);
834b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
835b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
836b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
837b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(this->common->em,PICO_EXC_NAME_UNDEFINED,NULL,(picoos_char *)"%s",voiceName);
838b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
839b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
840b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
841b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
842b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picorsrc_createVoiceDefinition(picorsrc_ResourceManager this,
843b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_char * voiceName)
844b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
845b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picorsrc_VoiceDefinition vdef;
846b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
847b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this) {
848b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("this is NULL"));
849b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_ERR_NULLPTR_ACCESS;
850b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
851b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((PICO_OK == findVoiceDefinition(this,voiceName,&vdef)) && (NULL != vdef)) {
852b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("voice %s allready defined",voiceName));
853b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(this->common->em,PICO_EXC_NAME_CONFLICT,NULL,NULL);
854b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
855b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (PICO_MAX_NUM_VOICE_DEFINITIONS <= this->numVdefs) {
856b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("max number of vdefs exceeded (%i)",this->numVdefs));
857b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(this->common->em,PICO_EXC_MAX_NUM_EXCEED,NULL,(picoos_char *)"no more than %i voice definitions",PICO_MAX_NUM_VOICE_DEFINITIONS);
858b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
859b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this->freeVdefs) {
860b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        vdef = picorsrc_newVoiceDefinition(this->common->mm);
861b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
862b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        vdef = this->freeVdefs;
863b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->freeVdefs = vdef->next;
864b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        vdef->voiceName[0] = NULLC;
865b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        vdef->numResources = 0;
866b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        vdef->next = NULL;
867b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
868b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == vdef) {
869b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(this->common->em,PICO_EXC_OUT_OF_MEM,NULL,NULL);
870b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
871b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (picoos_strlcpy(vdef->voiceName, voiceName,
872b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICO_MAX_VOICE_NAME_SIZE) < PICO_MAX_VOICE_NAME_SIZE) {
873b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        vdef->next = this->vdefs;
874b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->vdefs = vdef;
875b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->numVdefs++;
876b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (PICO_OK != picorsrc_addResourceToVoiceDefinition(this,voiceName,PICOKNOW_DEFAULT_RESOURCE_NAME)) {
877b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return picoos_emRaiseException(this->common->em,PICO_ERR_OTHER,NULL,(picoos_char *)"problem loading default resource %s",voiceName);
878b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
879b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_DEBUG(("vdef created (%s)",voiceName));
880b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_OK;
881b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
882b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("illegal name (%s)",voiceName));
883b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(this->common->em,PICO_EXC_NAME_ILLEGAL,NULL,(picoos_char *)"%s",voiceName);
884b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
885b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
886b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
887b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
888b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picorsrc_releaseVoiceDefinition(picorsrc_ResourceManager this,
889b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_char *voiceName)
890b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
891b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picorsrc_VoiceDefinition v, l;
892b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
893b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (this == NULL) {
894b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_ERR_NULLPTR_ACCESS;
895b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
896b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
897b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    l = NULL;
898b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    v = this->vdefs;
899b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while ((v != NULL) && (picoos_strcmp(v->voiceName, voiceName) != 0)) {
900b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        l = v;
901b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        v = v->next;
902b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
903b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (v != NULL) {
904b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* remove v from vdefs list */
905b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (l != NULL) {
906b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            l->next = v->next;
907b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } else {
908b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            this->vdefs = v->next;
909b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
910b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* insert v at head of freeVdefs list */
911b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        v->next = this->freeVdefs;
912b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->freeVdefs = v;
913b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->numVdefs--;
914b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_OK;
915b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
916b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* we should rather return a warning, here */
917b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* return picoos_emRaiseException(this->common->em,PICO_EXC_NAME_UNDEFINED,"%s", NULL); */
918b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_OK;
919b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
920b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
921b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
922b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
923b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
924b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ******* accessing voices **************************************/
925b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
926b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
927b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* create voice, given a voice name. the corresponding lock counts are incremented */
928b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
929b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picorsrc_createVoice(picorsrc_ResourceManager this, const picoos_char * voiceName, picorsrc_Voice * voice) {
930b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
931b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picorsrc_VoiceDefinition vdef;
932b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picorsrc_Resource rsrc;
933b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 i, required;
934b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoknow_KnowledgeBase kb;
935b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* pico_status_t status = PICO_OK; */
936b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
937b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("creating voice %s",voiceName));
938b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
939b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this) {
940b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("this is NULL"));
941b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_ERR_NULLPTR_ACCESS;
942b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
943b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
944b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* check number of voices */
945b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (PICORSRC_MAX_NUM_VOICES <= this->numVoices) {
946b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("PICORSRC_MAX_NUM_VOICES exceeded"));
947b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(this->common->em,PICO_EXC_MAX_NUM_EXCEED,NULL,(picoos_char *)"no more than %i voices",PICORSRC_MAX_NUM_VOICES);
948b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
949b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
950b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* find voice definition for that name */
951b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (!(PICO_OK == findVoiceDefinition(this,voiceName,&vdef)) || (NULL == vdef)) {
952b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("no voice definition for %s",voiceName));
953b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(this->common->em,PICO_EXC_NAME_UNDEFINED,NULL,(picoos_char *)"voice definition %s",voiceName);
954b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
955b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
956b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("found voice definition for %s",voiceName));
957b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
958b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* check that resources are loaded */
959b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; i < vdef->numResources; i++) {
960b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        required = (NULLC != vdef->resourceName[i][0]);
961b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (required && !isResourceLoaded(this,vdef->resourceName[i])) {
962b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_ERROR(("resource missing"));
963b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return picoos_emRaiseException(this->common->em,PICO_EXC_RESOURCE_MISSING,NULL,(picoos_char *)"resource %s for voice %s",vdef->resourceName[i],voiceName);
964b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
965b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
966b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
967b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* allocate new voice */
968b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this->freeVoices) {
969b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *voice = picorsrc_newVoice(this->common->mm);
970b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
971b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *voice = this->freeVoices;
972b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->freeVoices = (*voice)->next;
973b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picorsrc_initializeVoice(*voice);
974b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
975b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (*voice == NULL) {
976b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(this->common->em, PICO_EXC_OUT_OF_MEM, NULL, NULL);
977b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
978b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->numVoices++;
979b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
980b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* copy resource kb pointers into kb array of voice */
981b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; i < vdef->numResources; i++) {
982b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        required = (NULLC != vdef->resourceName[i][0]);
983b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (required) {
984b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            findResource(this,vdef->resourceName[i],&rsrc);
985b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen           (*voice)->resourceArray[(*voice)->numResources++] = rsrc;
986b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            rsrc->lockCount++;
987b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            kb = rsrc->kbList;
988b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            while (NULL != kb) {
989b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if (NULL != (*voice)->kbArray[kb->id]) {
990b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    picoos_emRaiseWarning(this->common->em,PICO_WARN_KB_OVERWRITE,NULL, (picoos_char *)"%i", kb->id);
991b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    PICODBG_WARN(("overwriting knowledge base of id %i", kb->id));
992b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
993b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
994b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_DEBUG(("setting knowledge base of id %i", kb->id));
995b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
996b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                (*voice)->kbArray[kb->id] = kb;
997b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                kb = kb->next;
998b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
999b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1000b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } /* for */
1001b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1002b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
1003b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1004b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1005b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* dispose voice. the corresponding lock counts are decremented. */
1006b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1007b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picorsrc_releaseVoice(picorsrc_ResourceManager this, picorsrc_Voice * voice)
1008b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
1009b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 i;
1010b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picorsrc_Voice v = *voice;
1011b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this || NULL == v) {
1012b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_ERR_NULLPTR_ACCESS;
1013b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1014b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; i < v->numResources; i++) {
1015b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        v->resourceArray[i]->lockCount--;
1016b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1017b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    v->next = this->freeVoices;
1018b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->freeVoices = v;
1019b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->numVoices--;
1020b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1021b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
1022b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1023b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1024b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef __cplusplus
1025b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1026b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
1027b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1028b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* end picorsrc.c */
1029