blob: ffd22dfc099cedeb830547e28b30062cb94773dc [file] [log] [blame]
/* $Id$
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to you 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.
*/
/*
* etch_resources.c
*/
#include "etch_resources.h"
#include "etch_map.h"
#include "etch_objecttypes.h"
#include "etch_mem.h"
const wchar_t* ETCH_RESXKEY_SOCKET = L"SOCKET";
const wchar_t* ETCH_RESXKEY_ACCEPTED_CONX = L"ACCEPTED_CONX";
const wchar_t* ETCH_RESXKEY_POOLTYPE_FREE = L"FREE_POOL";
const wchar_t* ETCH_RESXKEY_POOLTYPE_QUEUED = L"QUEUED_POOL";
const wchar_t* ETCH_RESXKEY_MSGIZER_FORMAT = L"Messagizer.format";
const wchar_t* ETCH_RESXKEY_MSGIZER_VALUFACT= L"Messagizer.valueFactory";
const wchar_t* ETCH_RESXVAL_XPORTFMT_BINARY = L"binary";;
const wchar_t* ETCH_RESXVAL_XPORTFMT_XML = L"xml";
const wchar_t* ETCH_XFACTKEY_TCP = L"tcp";
const wchar_t* ETCH_XPORTKEY_START = L"START";
const wchar_t* ETCH_XPORTKEY_IS_UP = L"IS_UP";
const wchar_t* ETCH_XPORTKEY_STOP = L"STOP";
const wchar_t* ETCH_XPORTKEY_START_AND_WAIT_UP = L"START_AND_WAIT_UP";
const wchar_t* ETCH_XPORTKEY_STOP_AND_WAIT_DOWN = L"STOP_AND_WAIT_DOWN";
// TODO - lose the above strings, replacing them with integer constants
const int ETCH_RESKEY_SOCKET = 0x100;
const int ETCH_RESKEY_POOLTYPE_FREE = 0x101;
const int ETCH_RESKEY_POOLTYPE_QUEUED = 0x102;
const int ETCH_RESKEY_MSGIZER_FORMAT = 0x104;
const int ETCH_RESKEY_MSGIZER_VALUFACT = 0x105;
const int ETCH_RESVAL_XPORTFMT_BINARY = 0x140;
const int ETCH_RESVAL_XPORTFMT_XML = 0x141;
const int ETCH_XPKEY_TCP = 0x142;
const int ETCH_XPKEY_START = 0x160;
const int ETCH_XPKEY_IS_UP = 0x161;
const int ETCH_XPKEY_STOP = 0x162;
const int ETCH_XPKEY_START_AND_WAITUP = 0x163;
const int ETCH_XPKEY_STOP_AND_WAITDOWN = 0x164;
const int ETCH_XPKEY_XPORTFMT_XML = 0x165;
// TODO - I don't think we need these at all, we should use class_id
// since in this way the object can be identified and we don't need
// to assume that the enclosing object is an etch_int32. however not
// all of these IDs are objects, some are table IDs
const wchar_t* ETCH_RESXKEY_SOCKET;
const wchar_t* ETCH_RESXKEY_ACCEPTED_CONX;
const wchar_t* ETCH_RESXKEY_POOLTYPE_FREE;
const wchar_t* ETCH_RESXKEY_POOLTYPE_QUEUED;
const wchar_t* ETCH_RESXKEY_MSGIZER_FORMAT;
const wchar_t* ETCH_RESXKEY_MSGIZER_VALUFACT;
const wchar_t* ETCH_RESXVAL_XPORTFMT_BINARY;
const wchar_t* ETCH_RESXVAL_XPORTFMT_XML;
const wchar_t* ETCH_XFACTKEY_TCP;
const wchar_t* ETCH_XPORTKEY_START;
const wchar_t* ETCH_XPORTKEY_START_AND_WAIT_UP;
const wchar_t* ETCH_XPORTKEY_IS_UP;
const wchar_t* ETCH_XPORTKEY_STOP;
const wchar_t* ETCH_XPORTKEY_STOP_AND_WAIT_DOWN;
/*
* new_etch_resources
* etch_resources constructor
*/
etch_resources* new_etch_resources(const int initialsize)
{
etch_resources* resx = new_hashtable(initialsize);
resx->content_type = ETCHHASHTABLE_CONTENT_OBJECT;
resx->content_obj_type = ETCHTYPEB_ETCHOBJECT;
resx->content_class_id = CLASSID_ANY;
resx->is_readonly_keys = resx->is_readonly_values = FALSE;
resx->freehook = string_to_object_clear_handler; /* frees memory on clear */
return resx;
}
/*
* etch_resources_add()
* adds specified key/value pair to specified resource map
*/
int etch_resources_add (etch_resources* resources, const wchar_t* key, etch_object* val)
{
const int hashkey = etchmap_insertxw(resources, (wchar_t*) key, val, TRUE);
return hashkey? 0: -1;
}
/*
* etch_resources_get()
*/
etch_object* etch_resources_get (etch_resources* resources, const wchar_t* key)
{
etch_object* founditem = etchmap_findxw(resources, (wchar_t*) key, NULL);
return founditem;
}
/*
* etch_resources_clear()
* clear a resources map, assuming all objects are owned unless marked as a static resource.
* @return count of items both removed from the map and freed.
*/
int etch_resources_clear (etch_resources* resources)
{ // TODO lose this method or augment it to delete the hashtable entry memory also
// it leaves the memory the hashtable allocated for the key intact
int freedcount = 0;
etch_iterator iterator;
wchar_t* thiskey = NULL;
if (!is_etch_hashtable(resources)) return 0;
set_iterator(&iterator, resources, &resources->iterable);
while(iterator.has_next(&iterator))
{
etch_object* value = iterator.current_value;
if (value && !is_etchobj_static_resource(value))
{
etch_object_destroy(value);
freedcount++;
}
thiskey = iterator.current_key;
etch_free(thiskey);
iterator.next(&iterator);
}
return freedcount;
}
/*
* etch_resources_replace()
* adds specified key/value pair to specified resource map, first removing prior item.
*/
int etch_resources_replace (etch_resources* resources, const wchar_t* key, etch_object* val)
{
if (etch_resources_get (resources, key))
{
etch_object* removedobj = etchmap_delxw (resources, (wchar_t*) key);
if (removedobj)
if (!is_etchobj_static_resource(removedobj))
etch_object_destroy(removedobj);
}
return etch_resources_add (resources, key, val);
}