view src/sprite.c @ 1342:972d749b9656

Move component_manager to a separated object. - component_manager is a mixin for domview. - domview inherit component_manager to mixing-in component_manager. - There is no boundary between component_manager and domview, hard to be managed and reused. - component_manager is a separated object that hold a reference to corresponding domview. - domview delegate attribute accessing to component_manager object to expose attributes and methods of component_manager. (__getattr__()) - component_manager is still a mix-in of domview.
author Thinker K.F. Li <thinker@codemud.net>
date Tue, 08 Feb 2011 13:05:07 +0800
parents 8679b03f72e8
children
line wrap: on
line source

// -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 4; -*-
// vim: sw=4:ts=8:sts=4
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
#include <sys/stat.h>
#include "mb_types.h"
#include "mb_redraw_man.h"
#include "mb_sprite.h"

#define ASSERT(x)
#define OK 0
#define ERR 1

static char *sprite_search_path = NULL;

static char *sprite_search_so(const char *name) {
    struct stat st;
    int fsz;
    char *fullname;
    int r;

    if(sprite_search_path == NULL)
	sprite_search_path = strdup("/usr/share/madbutterffly");

    fsz = strlen(sprite_search_path) + strlen(name) + 5;
    fullname = (char *)malloc(fsz);

    snprintf(fullname, fsz, "%s/%s.so", sprite_search_path, name);
    r = stat(fullname, &st);
    if(r != 0) {
	free(fullname);
	return NULL;
    }

    return fullname;
}

void sprite_set_search_path(const char *path) {
    int sz;

    if (sprite_search_path)
	free(sprite_search_path);

    sprite_search_path = strdup(path);

    sz = strlen(sprite_search_path);
    if(sprite_search_path[sz - 1] == '/')
	sprite_search_path[sz - 1] = 0;
}

mb_sprite_t *
sprite_load(const char *name, redraw_man_t *rdman, coord_t *root) {
    char cnstr_name[256];
    char *so_path;
    const char *bname;
    void *handle;
    mb_sprite_t *(*cnstr)(redraw_man_t *, coord_t *);
    mb_sprite_t *obj;
    int r;

    so_path = sprite_search_so(name);
    if(so_path == NULL)
	return NULL;

    handle = dlopen(so_path, RTLD_LAZY);
    free(so_path);
    if (handle == NULL)
	return NULL;

    bname = strrchr(name, '/');
    if(bname != NULL && strlen(bname) > 250)
	return NULL;

    if(bname == NULL)
	bname = name;
    else
	bname++;

    snprintf(cnstr_name, sizeof(cnstr_name), "%s_new", bname);
    cnstr = dlsym(handle, cnstr_name);
    if (cnstr == NULL)
	return NULL;

    obj = cnstr(rdman, root);

    return obj;
}