⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 commreg.cpp

📁 著名的 helix realplayer 基于手机 symbian 系统的 播放器全套源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/*
 *  Function Name:  	CommonRegistry::GetPropList const
 *  Input Params:   	const char* prop_name, IHXValues*& pValues
 *  Return Value:   	HX_RESULT
 *  Description:
 *  	given a PT_COMPOSITE property, it returns back a list of triples
 *  one for each property under the PT_COMPOSITE. each of which consists 
 *  of property name, type and the hash key
 *
 *  XXXAAK -- return a list of hash keys if the list element is PT_COMPOSITE.
 */
HX_RESULT
CommonRegistry::GetPropList(const char* prop_name, IHXValues*& pValues) const
{
    DB_node*  d = 0;
    Property* p = 0;

    if (_find(&d, &p, prop_name) == HXR_OK)
    {
	if (p)
	{
	    switch(p->get_type())
	    {
		case PT_COMPOSITE:
		{
		    DB_implem* ldb = 0;

		    p->get_db_val(&ldb);
		    return _getPropList(ldb, pValues);
		}
		default:
		    DPRINTF(D_REGISTRY, ("%s -- is NOT a COMPOSITE property\n", 
		                         prop_name));
		    break;
	    }
	}
    }
    return HXR_FAIL;
}

HX_RESULT
CommonRegistry::Copy(const char* pFrom, const char* pTo)
{
    HXPropType type;
    type = GetType(pFrom);
    char buf[256]; /* Flawfinder: ignore */
    INT32 Int;
    UINT32 ul;
    IHXBuffer* pBuffer = 0;
    HX_RESULT res;
    IHXValues* pValues = 0;
    const char* pName;

    switch (type)
    {
    case PT_COMPOSITE:
	/*
	 * Get all props and recurse copy all of them.
	 */
	if (HXR_OK != (res = GetPropList(pFrom, pValues)))
	{
	    break;
	}
	if (HXR_OK == pValues->GetFirstPropertyULONG32(pName, ul))
	{
	    SafeStrCpy(buf, pTo, 256);
	    SafeStrCat(buf, pName + strlen(pFrom), 256);
	    res = Copy(pName, buf);
	    while (HXR_OK == pValues->GetNextPropertyULONG32(pName, ul))
	    {
		SafeStrCpy(buf, pTo, 256);
		SafeStrCat(buf, pName + strlen(pFrom), 256);
		res = Copy(pName, buf);
	    }
	}
	HX_RELEASE(pValues);
	break;

    case PT_INTEGER:
	if (HXR_OK != (res = GetInt(pFrom, &Int)))
	{
	    break;
	}
	if (AddInt(pTo, Int))
	{
	    res = HXR_OK;
	}
	else
	{
	    res = HXR_FAIL;
	}
	break;

    case PT_STRING:
	if (HXR_OK != (res = GetStr(pFrom, pBuffer)))
	{
	    break;
	}
	if (AddStr(pTo, pBuffer))
	{
	    res = HXR_OK;
	}
	else
	{
	    res = HXR_FAIL;
	}
	if (pBuffer)
	{
	    pBuffer->Release();
	}
	pBuffer = 0;
	break;

    case PT_BUFFER:
	if (HXR_OK != (res = GetBuf(pFrom, &pBuffer)))
	{
	    break;
	}
	if (AddBuf(pTo, pBuffer))
	{
	    res = HXR_OK;
	}
	else
	{
	    res = HXR_FAIL;
	}
	if (pBuffer)
	{
	    pBuffer->Release();
	}
	pBuffer = 0;
	break;
    
    default:
	res = HXR_FAIL;
    }

    return res;
}

HX_RESULT
CommonRegistry::SetStringAccessAsBufferById(UINT32 hash_key)
{
    DB_node*  d = 0;
    Property* p = 0;

    d = (DB_node *)_ids->get(hash_key);
    if (!d)
    {
	DPRINTF(D_REGISTRY, ("SetStringAccessAsBufferById(%lu) failed\n",
	    hash_key));
	return HXR_FAIL;
    }
    p = d->get_data();

    if (p)
    {
	switch(p->get_type())
	{
	    case PT_STRING:
		p->SetStringAccessAsBufferById();
		return HXR_OK;

	    default:
		DPRINTF(D_REGISTRY, ("%lu -- Property<-->Type MISMATCH\n",
		                     hash_key));
		return HXR_PROP_TYPE_MISMATCH;
	}
    }
    return HXR_FAIL;
}

/*
 *  Function Name:  	CommonRegistry::GetPropList const
 *  Input Params:   	const UINT32 hash_key, IHXValues*& pValues
 *  Return Value:   	HX_RESULT
 *  Description:
 *  	given a PT_COMPOSITE property, it returns back a list of triples
 *  one for each property under the PT_COMPOSITE. each of which consists 
 *  of property name, type and the hash key
 *
 *  XXXAAK -- return a list of hash keys if the list element is PT_COMPOSITE.
 */
HX_RESULT
CommonRegistry::GetPropList(const UINT32 hash_key, IHXValues*& pValues) const
{
    if (!hash_key)
	return _getPropList(_logdb_imp, pValues);

    DB_node*  d = 0;
    Property* p = 0;

    d = (DB_node *)_ids->get(hash_key);
    if (!d)
    {
	DPRINTF(D_REGISTRY, ("could not get PropList for %lu -- no data\n",
	                     hash_key));
	return HXR_FAIL;
    }
    p = d->get_data();

    if (p)
    {
	switch(p->get_type())
	{
	    case PT_COMPOSITE:
	    {
		DB_implem* ldb = 0;

		p->get_db_val(&ldb);
		return _getPropList(ldb, pValues);
	    }
	    default:
		DPRINTF(D_REGISTRY, ("%s(%lu) -- is NOT a COMPOSITE property\n",
		                     p->get_key_str(), hash_key));
		break;
	}
    }
    return HXR_FAIL;
}

/*
 *  Function Name:  	CommonRegistry::GetPropName const
 *  Input Params:   	const UINT32 id, IHXBuffer*& prop_name
 *  Return Value:   	HX_RESULT
 *  Description:
 *  	return a pointer to the key string of the Property whose
 *  id is given.
 */
HX_RESULT
CommonRegistry::GetPropName(const UINT32 id, IHXBuffer*& prop_name) const
{
    DB_node* d = (DB_node *)_ids->get(id);
    if (d)
    {
	Property* p = d->get_data();
	if (p)
	{
	    prop_name = new CHXBuffer;
	    prop_name->Set((const unsigned char *)p->get_key_str(), 
			   p->get_key_str_len());
	    prop_name->AddRef();
	    return HXR_OK;
	}
    }
    return HXR_FAIL;
}

/*
 *  Function Name:  	GetId
 *  Input Params:   	const char* prop_name
 *  Return Value:   	UINT32
 *  Description:
 *  	returns the ID value for the Property name (prop_name) passed
 *  as a parameter. the main CONDITION is that the Property MUST EXIST,
 *  otherwise it returns a ZERO (0).
 */
UINT32
CommonRegistry::GetId(const char* prop_name) const
{
    DPRINTF(D_REGISTRY&D_ENTRY, ("CommonRegistry::GetId(%s)\n", prop_name));
    DB_node* d = 0;
    Property* p = 0;

    if (_find(&d, &p, prop_name) == HXR_OK)
	if (d)
        return d->get_id();
    return 0;
}

UINT32
CommonRegistry::FindParentKey(const char* prop_name)
{
    DB_node* d = 0;
    Property* p = 0;

    if (_find(&d, &p, prop_name) == HXR_OK)
    {
	if (d)
	{
	    // find the DB that contains this node
	    DB_implem* ldb = d->get_db();
	    if (ldb)
	    {
		// find the node that owns this DB
		d = ldb->owner_node();
		if (d)
		    return d->get_id();
	    }
	}
    }
    return 0;
}

UINT32
CommonRegistry::FindParentKey(const UINT32 hash_key)
{
    DB_node* d = (DB_node *)_ids->get(hash_key);

    // find the node with the hash key
    if (d)
    {
	// find the DB that contains this node
	DB_implem* ldb = d->get_db();
	if (ldb)
	{
	    // find the node that owns this DB
	    d = ldb->owner_node();
	    if (d)
		return d->get_id();
	}
    }
    return 0;
}

/*
 *  Function Name:  	CommonRegistry::Count const
 *  Input Params:   	
 *  Return Value:   	INT32
 *  Description:
 *  	returns the total number of Properties (including COMPOSITE types)
 *  in the registry.
 */
INT32
CommonRegistry::Count() const
{
    return _count;
}

/*
 *  Function Name:  	CommonRegistry::Count
 *  Input Params:   	const char* prop_name
 *  Return Value:   	UINT32
 *  Description:
 *  	returns the number of Properties below the COMPOSITE whose
 *  name has been specified. if the Property is not a COMPOSITE then
 *  ZERO is returned.
 */
INT32
CommonRegistry::Count(const char* prop_name) const
{
    DB_node* d = 0;
    Property* p = 0;
    DB_implem* ldb = 0;
    UINT32 h = 0;

    if (_find(&d, &p, prop_name) != HXR_OK)
	return 0;

    if (p)
    {
	if (p->get_type() == PT_COMPOSITE)
	{
	    p->get_db_val(&ldb);
	    if (ldb)
		return ldb->count();
	}
    }
    return 0;
}

/*
 *  Function Name:  	CommonRegistry::Count
 *  Input Params:   	const UINT32 hash_key
 *  Return Value:   	UINT32
 *  Description:
 *  	returns the number of Properties below the COMPOSITE whose
 *  hash key has been specified. if the Property is not a COMPOSITE
 *  then ZERO is returned.
 */
INT32
CommonRegistry::Count(const UINT32 hash_key) const
{
    DB_node* d = 0;
    Property* p = 0;
    DB_implem* ldb = 0;

    d = (DB_node *)_ids->get(hash_key);
    if (!d)
    {
	DPRINTF(D_REGISTRY, ("%lu -- does not exist\n", hash_key));
	return HXR_FAIL;
    }

    p = d->get_data();
    if (p)
    {
	if (p->get_type() == PT_COMPOSITE)
	{
	    p->get_db_val(&ldb);
	    if (ldb)
		return ldb->count();
	}
    }
    return 0;
}

/*
 *  Function Name:  	CommonRegistry::_del
 *  Input Params:   	DB_implem* db
 *  Return Value:   	HX_RESULT
 *  Description:
 *  	recursive delete down the database, which simultaneously
 *  deletes nodes from the hash tree. this method gets called from
 *  Del() when the user wants to delete a COMPOSITE Property. the
 *  default action is to delete all Properties under that COMPOSITE.
 */
HX_RESULT
CommonRegistry::_del(DB_implem* db)
{
    DPRINTF(D_REGISTRY, ("_del(db(%p)\n", db));
    DB_node* d = db->first();

    while (d)
    {
	Property* pnode = d->get_data();
	DPRINTF(D_REGISTRY, ("_del(db(%p)) -- %s(%lu)\n", db, 
		pnode->get_key_str(), d->get_id()));
	if (pnode)
	{
	    if (pnode->get_type() == PT_COMPOSITE)
	    {
		DB_implem* ldb;
		pnode->get_db_val(&ldb);
		if (!ldb)
		{
		    DPRINTF(D_REGISTRY, ("invalid Property(%lu) not deleted\n",
		                         d->get_id()));
		    return HXR_FAIL;
		}
		_del(ldb);
	    }
	    // fire off the callbacks if someone is watching this prop
	    DeleteDone(db, d, pnode);

	    _ids->destroy(d->get_id());
	    db->del(d);
	    _count--;
	}
	else
	{
	    DPRINTF(D_REGISTRY, ("data corrputed for Property(%lu)\n",
	                         d->get_id()));
	    return HXR_FAIL;
	}
	d = db->first();
    }
    return HXR_OK;
}

/*
 *  Function Name:  	CommonRegistry::_getPropList const
 *  Input Params:   	DB_implem* ldb, IHXValues*& pValues
 *  Return Value:   	HX_RESULT
 *  Description:
 *  	return back a list of triples (name, type, hash) consisting of
 *  all the properties in the database level specified by "ldb". this
 *  method is generally called from GetPropList() when a user requests 
 *  for a list of Properties under some COMPOSITE Property.
 */
HX_RESULT
CommonRegistry::_getPropList(DB_implem* ldb, IHXValues*& pValues) const
{
    DPRINTF(D_REGISTRY, ("_getPropList(ldb(%p))\n", ldb));
    DB_node*  node = 0;

    pValues = new CHXHeader;
    pValues->AddRef();

    node = ldb->first();
    while (node)
    {
	Property* p = node->get_data();

	if (!p)
	{
	    DPRINTF(D_REGISTRY, ("%ld is an empty Registry node, skipping it\n",
	                         node->get_id()));
	}
	pValues->SetPropertyULONG32(p->get_key_str(), node->get_id());

	DB_node* n = ldb->next(node);
	node = n;
    }
    return HXR_OK;
}

/*
 *  Copyright (c) 1996, 1997, 1998 RealNetworks
 *
 *  Function Name:  	CommonRegistry::_setReadOnly
 *  Input Params:   	Property* pProp, BOOL bValue
 *  Return Value:   	HX_RESULT
 *  Description:
 *  	set the read_only flag of this node, and all nodes beneath
 *	this node (if this node is a composite) to bValue.
 */
HX_RESULT
CommonRegistry::_setReadOnly(Property* pProp, BOOL bValue)
{
    DB_implem* ldb  = 0;
    DB_node*   node = 0;

    // Set read_only flag on pProp
    pProp->set_read_only(bValue);

    if (pProp->get_type() == PT_COMPOSITE)
    {
	// Get ldb of pProp
	pProp->get_db_val(&ldb);
	if (ldb)
	{
	    // Set read_only flag on each child
	    node = ldb->first();
	    while (node)
	    {
		Property* p = node->get_data();

		if (!p)
		{
		    DPRINTF(D_REGISTRY, ("%ld is an empty Registry node, "
			"skipping it\n", node->get_id()));
		}
		// Recurse...
		_setReadOnly(p, bValue);

		DB_node* n = ldb->next(node);
		node = n;
	    }
	}
    }

    return HXR_OK;
}

/*
 *  Function Name:  	_find
 *  Input Params:   	DB_node** d, Property** p, 
 *                      UINT32& hash_key, const char* prop_name
 *  Return Value:   	HX_RESULT
 *  Description:
 *  	find a DB_node and its corresponding Property based on the name
 *  or the hash key, whichever is given.
 */
HX_RESULT
CommonRegistry::_find(DB_node** d, Property** p, const char* prop_name) const
{
    DPRINTF(D_REGISTRY, ("CommonRegistry::_find(prop_name(%s))\n", prop_name));

    Key* k = new Key(prop_name);
    if(!k)
    {
        return 0;
    }
    int len = k->size();
    char* curr_key_str = new char[len];
    if(NULL==curr_key_str)
    {
        HX_DELETE(k);
        return 0;
    }
    DB_implem* ldb = _logdb_imp;
    HX_RESULT ret = HXR_OK;

    // find the node that contains the "prop_name"
    *curr_key_str = '\0';
    while(k->append_sub_str(curr_key_str, len))
    {
	if (!ldb)
	{
	    DPRINTF(D_REGISTRY, ("%s -- %s has NO Properties under it!\n",
	                         prop_name, curr_key_str));
	    ret = HXR_FAIL;
	    goto cleanup;
	}
	*d = ldb->find(curr_key_str);
	if (!(*d))
	{
	    DPRINTF(D_REGISTRY, ("%s -- %s was NOT FOUND\n",
	                         prop_name, curr_key_str));
	    ret = HXR_PROP_NOT_FOUND;
	    goto cleanup;
	}

	*p = (*d)->get_data();
        if (!(*p))
	{
	    DPRINTF(D_REGISTRY, ("%s -- %s has NO DATA\n",
	                         prop_name, curr_key_str));
            ret = HXR_FAIL;
	    goto cleanup;
	}
	if ((*p)->get_type() == PT_COMPOSITE)
	    (*p)->get_db_val(&ldb);
    }

    if (*d && *p)
	ret = HXR_OK;
    else
	ret = HXR_FAIL;

cleanup:
    HX_VECTOR_DELETE(curr_key_str);
    delete k;

    return ret;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -