예제 #1
0
unsigned char * hc_read_all_len(struct hc * hc, size_t * plen)
{
    struct read_all_data data;
    struct chunk * chunk, * next;
    size_t cur;
    unsigned char * r;

    data.start = data.end = NULL;
    data.total = 0;

    hc_read_pieces(hc, read_all_callback, &data);

    r = malloc(data.total + 1);
    cur = 0;
    for (chunk = data.start; chunk; chunk = next) {
        memcpy(r+cur, chunk->buf, chunk->len);
        cur += chunk->len;
        free(chunk->buf);
        next = chunk->next;
        free(chunk);
    }

    r[data.total] = '\0';
    if (plen)
        *plen = data.total;

    return r;
}
unsigned long guide_client_get_snapshot(unsigned char ** presult,
                                        unsigned char ** ptimestamp,
                                        unsigned long * psize,
                                        const char * address,
                                        const char * cur_timestamp)
{
    struct snapshot_data data;
    char url[512];
    struct hc * hc;

    memset(&data, 0, sizeof data);
    data.firsttime = 1;
    data.status    = -1;

    sprintf(url, "http://%s/http_replay_guide-get_snapshot?"
            "guide_file_name=%s&serial_no=RTV4080K0000000000",
            address,
            cur_timestamp);

    hc = hc_start_request(url);
    if (!hc) {
        perror("Error: guide_client_get_snapshot(): hc_start_request()");
        goto exit;
    }


    hc_send_request(hc);
    hc_read_pieces(hc, get_snapshot_callback, &data);

    hc_free(hc);

    *ptimestamp = (unsigned char*)data.timestamp;
    *presult    = (unsigned char*)data.buf;
    *psize      = data.filesize;

exit:
    return data.status;
}
예제 #3
0
//
// rtv_get_device_info
// returns pointer to replaytv device.
//
int rtv_get_device_info(const char *address, char *queryStr, rtv_device_t **device_p)
{
    char               url[512];
    struct hc         *hc;
    int                rc, new_entry;
    rtv_device_t      *rtv;
    rtv_device_info_t *devinfo;

    RTV_DBGLOG(RTVLOG_DSCVR, "%s: Enter: address=%s: current_rtv_cnt=%d\n", __FUNCTION__, address, rtv_devices.num_rtvs);

    *device_p  = NULL;
    rtv     = rtv_get_device_struct(address, &new_entry);
    devinfo = &(rtv->device);

    if ( !(new_entry) ) {
        RTV_DBGLOG(RTVLOG_DSCVR, "%s: address=%s already exists in device struct. Decrement count.\n", __FUNCTION__, address);
        rtv_devices.num_rtvs--;
    }

    rtv_free_device_info(devinfo);
    devinfo->ipaddr = malloc(strlen(address) + 1);
    strcpy(devinfo->ipaddr, address);

    parser = XML_ParserCreate("US-ASCII");
    XML_SetElementHandler(parser, devinfo_xml_start, devinfo_xml_end);
    XML_SetCharacterDataHandler(parser, devinfo_xml_charhndlr);
    XML_SetDefaultHandler(parser, devinfo_default_handler);
    XML_SetUserData(parser, devinfo);

    if ( queryStr == NULL ) {
        sprintf(url, "http://%s/Device_Descr.xml", address);
        RTV_DBGLOG(RTVLOG_DSCVR, "%s: Build default query str: %s\n", __FUNCTION__, url);
    }
    else {
        strncpy(url, queryStr, 511);
        RTV_DBGLOG(RTVLOG_DSCVR, "%s: Use supplied query str: %s\n", __FUNCTION__, url);
    }

    hc = hc_start_request(url);
    if (!hc) {
        RTV_ERRLOG("%s: hc_start_request(): %d=>%s\n", __FUNCTION__, errno, strerror(errno));
        rtv_free_device_info(devinfo);
        return(-EPROTO);
    }

    hc_send_request(hc, NULL);
    rc = hc_read_pieces(hc, get_deviceinfo_callback, NULL, 0);
    hc_free(hc);
    if ( rc != 0 ) {
        RTV_ERRLOG("%s: hc_read_pieces call failed: rc=%d\n", __FUNCTION__, rc);
        rtv_free_device_info(devinfo);
        return(rc);
    }

    if ( (devinfo->status & RTV_EXPECTED_FIELDS) != RTV_EXPECTED_FIELDS ) {
        RTV_ERRLOG("%s: Missing XML Fields exp=%08X got=%08lX\n", __FUNCTION__, RTV_EXPECTED_FIELDS, devinfo->status);
        rtv_free_device_info(devinfo);
        return(-EBADE);
    }

    if ( (rc = parse_version_info(devinfo)) != 0 ) {

    }

    *device_p = rtv;
    rtv_devices.num_rtvs++;
    if ( RTVLOG_DSCVR ) {
        rtv_print_device_info(devinfo);
    }
    return (rc);
}