int main(int argc, char* argv[]) {
    srand(time(NULL));
    string id;
    string prefix_id;
    string bin_id;
    string bin_prefix_id;
    Event ev;
    pthread_t event_listener;
    (void) signal(SIGINT, sigfun);
    if (argc > 1) {
        int user_or_kernel = atoi(argv[1]);
        if (user_or_kernel == 0) {
            ba = Blackadder::Instance(true);
        } else {
            ba = Blackadder::Instance(false);
        }
    } else {
        /*By Default I assume blackadder is running in user space*/
        ba = Blackadder::Instance(true);
    }
    cout << "subscribing to the video catalogue information item" << endl;
    id = "0000000000000000";
    prefix_id = "0000000000000000";
    bin_id = hex_to_chararray(id);
    bin_prefix_id = hex_to_chararray(prefix_id);
    ba->subscribe_info(bin_id, bin_prefix_id, DOMAIN_LOCAL, NULL, 0);
    ba->getEvent(ev);
    if (ev.type == PUBLISHED_DATA) {
        if (ev.id.compare(bin_prefix_id + bin_id) == 0) {
            cout << "received Video Catalogue" << endl;
            ba->unsubscribe_info(bin_id, bin_prefix_id, DOMAIN_LOCAL, NULL, 0);
            string video_catalogue((char *) ev.data, ev.data_len);
            cout << video_catalogue << endl;
            cout << "Please select the video stream you want to join" << endl;
            cin >> video_stream;
            cout << "You selected to watch the stream with title " << video_stream << " ...soon it will be here :)" << endl;
            unsigned char *c_channel_id = (unsigned char *) malloc(256);
            /*publish the channel for this info*/
            SHA1((const unsigned char *) video_stream.c_str(), video_stream.length(), c_channel_id);
            string channel_id = string((const char *) c_channel_id).substr(0, PURSUIT_ID_LEN);
            cout << "Subscribing to video channel with ID " << id + chararray_to_hex(channel_id) << endl;
            prefix_id = "0000000000000000";
            bin_prefix_id = hex_to_chararray(prefix_id);
            ba->subscribe_info(channel_id, bin_prefix_id, DOMAIN_LOCAL, NULL, 0);
        } else {
Example #2
0
void eventHandler(event *ev) {
    cout << "Received event" << endl;
    cout << "Type: " << (int) ev->type << endl;
    cout << "Information Identifier: " << chararray_to_hex(ev->id) << endl;
    char *payload;
    char * end_payload;
    int payload_size = 1450;
    if (ev->type == START_PUBLISH) {
        cout << "start publishing " << endl;
        for (int i = 0; i < 50000; i++) {
            payload = (char *) malloc(payload_size);
            memset(payload, 'A', payload_size);
            nb_ba->publish_data(ev->id, NODE_LOCAL, NULL, 0, payload, payload_size);
        }
        for (int i = 0; i < 100; i++) {
            end_payload = (char *) malloc(payload_size);
            memset(end_payload, 'B', payload_size);
            nb_ba->publish_data(ev->id, NODE_LOCAL, NULL, 0, end_payload, payload_size);
        }
    }
    delete ev;
}
string MetaDataPacket::getID(){
  return chararray_to_hex(getID_RAW());
}
Example #4
0
int main(int argc, char* argv[]) {
    (void) signal(SIGINT, sigfun);
    (void) signal(SIGTERM, termfun) ;
    if (argc == 1) {
        int user_or_kernel = atoi(argv[1]);
        if (user_or_kernel == 0) {
            ba = Blackadder::Instance(true);
        } else {
            ba = Blackadder::Instance(false);
        }
    } else {
        /*By Default I assume blackadder is running in user space*/
        ba = Blackadder::Instance(true);
    }
    //cout << "Process ID: " << getpid() << endl;

	if(argc != 4) {
		cout<<"parameter error"<<endl ;
		return 0 ;
	}
	FILESIZE = atoi(argv[1]) ;
	CHUNKSIZE = atoi(argv[2]) ;
	SEGSIZE = atoi(argv[3]) ;
	cout<<"FILESIZE:"<<FILESIZE<<" CHUNKSIZE:"<<CHUNKSIZE<<" SEGSIZE:"<<SEGSIZE<<endl ;

    unsigned int file_num = 1 ;
    string bin_prefix_id ;
    string bin_id ;
    while(file_num <= FILESIZE)
    {
        string fileid ;
        char filename[10] ;
        sprintf(filename, "%X", file_num) ;
        fileid.insert(0, 2*PURSUIT_ID_LEN-strlen(filename), '0') ;
        fileid += filename ;

        string prefix_id ;
        bin_id = hex_to_chararray(fileid);
        bin_prefix_id = hex_to_chararray(prefix_id);
        ba->publish_scope(bin_id, bin_prefix_id, DOMAIN_LOCAL, NULL, 0);
        usleep(10) ;
        file_num++ ;
    }
    file_num = 1 ;
    while(file_num <= FILESIZE)
    {
        string fileid ;
        char filename[10] ;
        sprintf(filename, "%X", file_num) ;
        fileid.insert(0, 2*PURSUIT_ID_LEN-strlen(filename), '0') ;
        fileid += filename ;

        unsigned int chunk_num = 1 ;
        while(chunk_num <= CHUNKSIZE)
        {
            string chunkid ;
            char chunkname[10] ;
            sprintf(chunkname, "%X", chunk_num) ;
            chunkid.insert(0, 2*PURSUIT_ID_LEN - strlen(chunkname), '0') ;
            chunkid += chunkname ;

            bin_id = hex_to_chararray(chunkid) ;
            bin_prefix_id = hex_to_chararray(fileid) ;
            ba->publish_scope(bin_id, bin_prefix_id, DOMAIN_LOCAL, NULL, 0);
            usleep(1000) ;
            chunk_num++ ;
        }
        file_num++ ;
    }

    file_num = 1 ;
    while(file_num <= FILESIZE)
    {
        string fileid ;
        char filename[10] ;
        sprintf(filename, "%X", file_num) ;
        fileid.insert(0, 2*PURSUIT_ID_LEN-strlen(filename), '0') ;
        fileid += filename ;

        unsigned int chunk_num = 1 ;
        while(chunk_num <= CHUNKSIZE)
        {
            string chunkid ;
            char chunkname[10] ;
            sprintf(chunkname, "%X", chunk_num) ;
            chunkid.insert(0, 2*PURSUIT_ID_LEN - strlen(chunkname), '0') ;
            chunkid += chunkname ;

            unsigned int seg_num = 1 ;
            string file_chunk_id = fileid + chunkid ;
            while(seg_num <= SEGSIZE)
            {
                string segid ;
                char segname[10] ;
                sprintf(segname, "%X", seg_num) ;
                segid.insert(0, 2*PURSUIT_ID_LEN - strlen(segname), '0') ;
                segid += segname ;

                bin_id = hex_to_chararray(segid) ;
                bin_prefix_id = hex_to_chararray(file_chunk_id) ;
                ba->publish_info(bin_id, bin_prefix_id, DOMAIN_LOCAL, NULL, 0) ;
                usleep(1000) ;
                seg_num++ ;
            }
            chunk_num++ ;
        }
        file_num++ ;
    }
    cout<<"ready to sent"<<endl ;
    while (true) {
        Event ev;
        ba->getEvent(ev);
        switch (ev.type) {
            case SCOPE_PUBLISHED:
                cout << "SCOPE_PUBLISHED: " << chararray_to_hex(ev.id) << endl;
                break;
            case SCOPE_UNPUBLISHED:
                cout << "SCOPE_UNPUBLISHED: " << chararray_to_hex(ev.id) << endl;
                break;
            case CINC_REQ_DATA_PUB:
                data_sent_num++ ;
                cout << "CINC_REQ_DATA_PUB: " << chararray_to_hex(ev.id) << endl;
                ba->publish_data(PUBLISH_DATA, ev.id, IMPLICIT_RENDEZVOUS, ev.to_sub_FID._data, ev.fid_len, payload, payload_size);
                break;
            case CINC_PUSH_TO_CACHE:
                data_sent_num++ ;
                cout << "CINC_PUSH_TO_CACHE: " << chararray_to_hex(ev.id) << endl;
                ba->publish_data(ev.type, ev.id, IMPLICIT_RENDEZVOUS, ev.to_sub_FID._data, ev.fid_len, payload, payload_size);
                break ;
            case STOP_PUBLISH:
                cout << "STOP_PUBLISH: " << chararray_to_hex(ev.id) << endl;
                break ;
            case PUBLISHED_DATA:
                cout << "PUBLISHED_DATA: " << chararray_to_hex(ev.id) << endl;
                break ;
        }
    }
    sleep(5);
    free(payload);
    ba->disconnect();
    delete ba;
    return 0;
}
void eventHandler(Event *ev) {
    char * payload;
    int payload_size;
    switch (ev->type) {
        case SCOPE_PUBLISHED:
            /*rv_or_implicit =1 -> Clients publish their pings as: AAAAAAAAAAAAAAAA/serverID/clientID/PingSequenceID*/
            /*Therefore Server need to subscribe to the child scope AAAAAAAAAAAAAAAA/serverID/clientID*/
            published_scope_id = chararray_to_hex((string)ev->id);
            id =  string(published_scope_id, (PURSUIT_ID_LEN * 2) * 2, PURSUIT_ID_LEN * 2);
            prefix_id = string(published_scope_id, 0, (PURSUIT_ID_LEN * 2) * 2);
            bin_id = hex_to_chararray(id);
            bin_prefix_id = hex_to_chararray(prefix_id);
            nb_ba->subscribe_scope(bin_id, bin_prefix_id, DOMAIN_LOCAL, NULL, 0);
            break;
        case PUBLISHED_DATA:
            no_pings = atoi((char *)ev->data);
            c_id = chararray_to_hex((string)ev->id);
            if ((no_pings < 1) & (rv_or_implicit == 0)) {
                /*rv_or_implicit = 0 -> firstping is publish_info under (SID/SID/RID) - (AAAAAAAAAAAAAAAA/clientID/serverID)*/
                prefix_id = string(c_id, 0, PURSUIT_ID_LEN * 2) + string(c_id, (PURSUIT_ID_LEN * 2) * 2, PURSUIT_ID_LEN * 2);
                id = string(c_id, PURSUIT_ID_LEN * 2, PURSUIT_ID_LEN * 2);
                bin_prefix_id = hex_to_chararray(prefix_id);
                bin_id = hex_to_chararray(id);
                nb_ba->publish_info(bin_id, bin_prefix_id, DOMAIN_LOCAL, NULL, 0);
            }
            else if ((no_pings >= 1) & (rv_or_implicit == 0)) {
                /*rv_or_implicit = 0 -> subsequent pings are publish_data directly under (SID/SID/RID) - (AAAAAAAAAAAAAAAA/clientID/serverID)*/
                /*No More RV involvement*/
                prefix_id = string(c_id, 0, PURSUIT_ID_LEN * 2) + string(c_id, (PURSUIT_ID_LEN * 2) * 2, PURSUIT_ID_LEN * 2);
                bin_prefix_id = hex_to_chararray(prefix_id);
                id = string(c_id, PURSUIT_ID_LEN * 2, PURSUIT_ID_LEN * 2);
                bin_id = hex_to_chararray(id);
                payload_size = ev->data_len;
                payload = (char *)malloc(payload_size);
                snprintf(payload, payload_size+1, "%d", no_pings);
                nb_ba->publish_data(bin_prefix_id + bin_id, DOMAIN_LOCAL, NULL, 0, payload, payload_size);
                printf("Direct response for ping sequence %d has been successfuly published to %s\n", no_pings, string(prefix_id, PURSUIT_ID_LEN * 3, NODEID_LEN).c_str());
            }
            else {
                /*rv_or_implicit = 1 -> pings published as: (SID/SID/SID/RID) - (AAAAAAAAAAAAAAAA/clientID/serverID/PingSequenceID)*/
                prefix_id = string(published_scope_id, 0, PURSUIT_ID_LEN * 2) + string(published_scope_id, (PURSUIT_ID_LEN * 2) * 2, PURSUIT_ID_LEN * 2) + string(published_scope_id, PURSUIT_ID_LEN * 2, PURSUIT_ID_LEN * 2);
                bin_prefix_id = hex_to_chararray(prefix_id);
                /*ping sequence = information ID*/
                id = string(c_id, (PURSUIT_ID_LEN * 2) * 3, PURSUIT_ID_LEN * 2);
                bin_id = hex_to_chararray(id);
                nb_ba->publish_info(bin_id, bin_prefix_id, DOMAIN_LOCAL, NULL, 0);
            }
            break;
        case START_PUBLISH:
            payload_size = sizeof(no_pings);
            payload = (char *)malloc(payload_size);
            gettimeofday(&live_tv, NULL);
            snprintf(payload, payload_size+1, "%d", no_pings);
            nb_ba->publish_data(bin_prefix_id + bin_id, DOMAIN_LOCAL, NULL, 0, payload, payload_size+1);
            printf("RV response for ping sequence %d has been successfuly published to %s\n", no_pings, string(prefix_id, PURSUIT_ID_LEN * 3, NODEID_LEN).c_str());
            break;
        case RE_PUBLISH:
            cout << "Ping: republish ping " << endl;
            prefix_id = string(ev->id, 0, ev->id.length() - PURSUIT_ID_LEN);
            id = string(ev->id, ev->id.length() - PURSUIT_ID_LEN, PURSUIT_ID_LEN);
            nb_ba->publish_info(id, prefix_id, DOMAIN_LOCAL, NULL, 0);
            break;
            
        default:
            break;
    }
    delete ev;
}