First sync
This commit is contained in:
parent
d8eb74f6e5
commit
69e082faac
1
nasfaq/api/src/cJSON
Submodule
1
nasfaq/api/src/cJSON
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit a6424b85dde200a87cac26451c6f0a6f3426681f
|
2
nasfaq/api/src/common.c
Normal file
2
nasfaq/api/src/common.c
Normal file
@ -0,0 +1,2 @@
|
||||
#include "common.h"
|
||||
|
20
nasfaq/api/src/common.h
Normal file
20
nasfaq/api/src/common.h
Normal file
@ -0,0 +1,20 @@
|
||||
#ifndef _COMMON_H_
|
||||
#define _COMMON_H_
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
|
||||
/**
|
||||
USERINFO
|
||||
*/
|
||||
#define USERINFO_COLOR_SIZE 16
|
||||
#define USERINFO_EMAIL_SIZE 64
|
||||
#define USERINFO_HAT_SIZE 32
|
||||
#define USERINFO_USERNAME_SIZE 64
|
||||
|
||||
|
||||
#endif
|
||||
|
55
nasfaq/api/src/items.c
Normal file
55
nasfaq/api/src/items.c
Normal file
@ -0,0 +1,55 @@
|
||||
// @file items.c
|
||||
#include "items.h"
|
||||
|
||||
void item_init_(item_t *op) {
|
||||
|
||||
op->category = UNDEFINED;
|
||||
strcpy(op->type, "");
|
||||
op->acquiredTimestamp = 0;
|
||||
op->lastPurchasePrice = 0;
|
||||
op->quantity = 0;
|
||||
}
|
||||
|
||||
item_t *item_init() {
|
||||
|
||||
item_t *op = malloc(sizeof(item_t));
|
||||
item_init_(op);
|
||||
return op;
|
||||
}
|
||||
|
||||
void item_set(item_t *op, item_category op1, char *op2, ulong op3, float op4, uint op5) {
|
||||
|
||||
|
||||
op->category = op1;
|
||||
strcpy(op->type, op2);
|
||||
op->acquiredTimestamp = op3;
|
||||
op->lastPurchasePrice = op4;
|
||||
op->quantity = op5;
|
||||
}
|
||||
|
||||
item_t *item_init_set(item_category op1, char *op2, ulong op3, float op4, uint op5) {
|
||||
|
||||
item_t *op = item_init();
|
||||
item_set(op, op1, op2, op3, op4, op5);
|
||||
return op;
|
||||
}
|
||||
|
||||
void item_clear(item_t *op) {
|
||||
|
||||
free(op);
|
||||
}
|
||||
|
||||
void item_print(item_t *op) {
|
||||
|
||||
printf("ITEM\n Category: ");
|
||||
switch (op->category) {
|
||||
case LICENSE: printf("license "); break;
|
||||
case COSMETIC: printf("cosmetic "); break;
|
||||
default: printf("undefined ");
|
||||
}
|
||||
printf("\n Type: %s", op->type);
|
||||
printf("\n Acquired timestamp: %lu", op->acquiredTimestamp);
|
||||
printf("\n Last purchase price: %f", op->lastPurchasePrice);
|
||||
printf("\n Quantity: %u\n", op->quantity);
|
||||
}
|
||||
|
27
nasfaq/api/src/items.h
Normal file
27
nasfaq/api/src/items.h
Normal file
@ -0,0 +1,27 @@
|
||||
#ifndef _ITEMS_H_
|
||||
#define _ITEMS_H_
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#define ITEMS_TYPE_SIZE 32
|
||||
|
||||
typedef enum {LICENSE, COSMETIC, UNDEFINED} item_category;
|
||||
|
||||
typedef struct item_t {
|
||||
|
||||
item_category category;
|
||||
char type[ITEMS_TYPE_SIZE];
|
||||
ulong acquiredTimestamp;
|
||||
float lastPurchasePrice;
|
||||
uint quantity;
|
||||
} item_t;
|
||||
|
||||
item_t *item_init();
|
||||
void item_set(item_t *, item_category, char *, ulong, float, uint);
|
||||
item_t *item_init_set(item_category, char *, ulong, float, uint);
|
||||
void item_clear(item_t *);
|
||||
|
||||
void item_print(item_t *);
|
||||
|
||||
#endif
|
||||
|
43
nasfaq/api/src/mute.c
Normal file
43
nasfaq/api/src/mute.c
Normal file
@ -0,0 +1,43 @@
|
||||
// @file mute.c
|
||||
#include "mute.h"
|
||||
|
||||
void mute_init_(mute_t *op) {
|
||||
|
||||
op->muted = 0;
|
||||
op->until = 0;
|
||||
strcpy(op->message, "");
|
||||
}
|
||||
|
||||
mute_t *mute_init() {
|
||||
|
||||
mute_t *op = malloc(sizeof(mute_t));
|
||||
mute_init_(op);
|
||||
return op;
|
||||
}
|
||||
|
||||
void mute_set(mute_t *op, bool muted, ulong until, char *message) {
|
||||
|
||||
op->muted = 0;
|
||||
op->until = until;
|
||||
strcpy(op->message, message);
|
||||
}
|
||||
|
||||
mute_t *mute_init_set(bool muted, ulong until, char *message) {
|
||||
|
||||
mute_t *op = mute_init();
|
||||
mute_set(op, muted, until, message);
|
||||
return op;
|
||||
}
|
||||
|
||||
void mute_clear(mute_t *op) {
|
||||
|
||||
free(op);
|
||||
}
|
||||
|
||||
void mute_print(mute_t *op) {
|
||||
|
||||
printf("MUTE\n Muted: %d", op->muted);
|
||||
printf("\n Until: %lu", op->until);
|
||||
printf("\n Message: %s\n", op->message);
|
||||
}
|
||||
|
22
nasfaq/api/src/mute.h
Normal file
22
nasfaq/api/src/mute.h
Normal file
@ -0,0 +1,22 @@
|
||||
#ifndef _MUTE_H_
|
||||
#define _MUTE_H_
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#define MUTE_MESSAGE_SIZE 128
|
||||
|
||||
typedef struct mute_t {
|
||||
|
||||
bool muted;
|
||||
ulong until;
|
||||
char message[MUTE_MESSAGE_SIZE];
|
||||
} mute_t;
|
||||
|
||||
mute_t *mute_init();
|
||||
void mute_set(mute_t *, bool, ulong, char *);
|
||||
mute_t *mute_init_set(bool, ulong, char *);
|
||||
void mute_clear(mute_t *);
|
||||
|
||||
void mute_print(mute_t *);
|
||||
#endif
|
||||
|
98
nasfaq/api/src/performance.c
Normal file
98
nasfaq/api/src/performance.c
Normal file
@ -0,0 +1,98 @@
|
||||
// @file performance.c
|
||||
#include "performance.h"
|
||||
|
||||
/**
|
||||
Performance points
|
||||
*/
|
||||
void performance_point_init_(performance_point_t *p) {
|
||||
|
||||
p->worth = 0;
|
||||
p->timestamp = 0;
|
||||
}
|
||||
|
||||
performance_point_t *performance_point_init() {
|
||||
|
||||
performance_point_t *p = malloc(sizeof(performance_point_t));
|
||||
performance_point_init_(p);
|
||||
return p;
|
||||
}
|
||||
|
||||
void performance_point_set(performance_point_t *p, float worth, ulong timestamp) {
|
||||
|
||||
p->worth = worth;
|
||||
p->timestamp = timestamp;
|
||||
}
|
||||
|
||||
void performance_point_init_set_(performance_point_t *p, float worth, ulong timestamp) {
|
||||
|
||||
performance_point_init_(p);
|
||||
performance_point_set(p, worth, timestamp);
|
||||
}
|
||||
|
||||
performance_point_t *performance_point_init_set(float worth, ulong timestamp) {
|
||||
|
||||
performance_point_t *p = performance_point_init();
|
||||
performance_point_set(p, worth, timestamp);
|
||||
return p;
|
||||
}
|
||||
|
||||
void performance_point_clear(performance_point_t *p) {
|
||||
|
||||
free(p);
|
||||
}
|
||||
|
||||
void performance_point_print(performance_point_t *p) {
|
||||
|
||||
printf("PERFORMANCE POINT\n");
|
||||
printf(" Worth: %f\n", p->worth);
|
||||
printf(" Timestamp: %lu\n", p->timestamp);
|
||||
}
|
||||
|
||||
/**
|
||||
Performance data (arrays of points)
|
||||
*/
|
||||
void performance_data_init_(performance_data_t *d) {
|
||||
|
||||
d->size = 0;
|
||||
d->data = malloc(sizeof(performance_data_t) * PERFORMANCE_DATA_SIZE);
|
||||
}
|
||||
|
||||
performance_data_t *performance_data_init() {
|
||||
|
||||
performance_data_t *p = malloc(sizeof(performance_data_t));
|
||||
performance_data_init_(p);
|
||||
return p;
|
||||
}
|
||||
|
||||
void performance_data_set(performance_data_t *d, uint size, performance_point_t *data) {
|
||||
|
||||
d->size = size;
|
||||
memcpy(d->data, data, sizeof(performance_point_t) * size); // Woah mama
|
||||
}
|
||||
|
||||
void performance_data_init_set_(performance_data_t *d, uint size, performance_point_t *data) {
|
||||
|
||||
performance_data_init_(d);
|
||||
performance_data_set(d, size, data);
|
||||
}
|
||||
|
||||
performance_data_t *performance_data_init_set(uint size, performance_point_t *data) {
|
||||
|
||||
performance_data_t *d = performance_data_init();
|
||||
performance_data_set(d, size, data);
|
||||
return d;
|
||||
}
|
||||
|
||||
void performance_data_clear(performance_data_t *d) {
|
||||
|
||||
free(d->data);
|
||||
free(d);
|
||||
}
|
||||
|
||||
void performance_data_print(performance_data_t *d) {
|
||||
|
||||
printf("PERFORMANCE DATA\n");
|
||||
printf(" Size: %u\n", d->size);
|
||||
for(int i = 0; i < d->size; i++) performance_point_print(d->data + i);
|
||||
}
|
||||
|
50
nasfaq/api/src/performance.h
Normal file
50
nasfaq/api/src/performance.h
Normal file
@ -0,0 +1,50 @@
|
||||
#ifndef _PERFORMANCE_H_
|
||||
#define _PERFORMANCE_H_
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#define PERFORMANCE_DATA_SIZE 365*2 // Very dangerous TODO: REPLACE SIZE WITH LENGTH WHEN DEALING WITH ARRAYS
|
||||
|
||||
/**
|
||||
Custom types
|
||||
*/
|
||||
typedef struct performance_point_t {
|
||||
|
||||
float worth;
|
||||
ulong timestamp;
|
||||
} performance_point_t;
|
||||
|
||||
typedef struct performance_data_t {
|
||||
|
||||
uint size;
|
||||
performance_point_t *data;
|
||||
} performance_data_t;
|
||||
|
||||
|
||||
/**
|
||||
Performance points
|
||||
*/
|
||||
void performance_point_init_(performance_point_t *);
|
||||
performance_point_t *performance_point_init();
|
||||
void performance_point_set(performance_point_t *, float, ulong);
|
||||
void performance_point_init_set_(performance_point_t *, float, ulong);
|
||||
performance_point_t *performance_point_init_set(float, ulong);
|
||||
void performance_point_clear(performance_point_t *);
|
||||
|
||||
void performance_point_print(performance_point_t *);
|
||||
|
||||
/**
|
||||
Performance data
|
||||
*/
|
||||
void performance_data_init_(performance_data_t *);
|
||||
performance_data_t *performance_data_init();
|
||||
void performance_data_set(performance_data_t *, uint, performance_point_t *);
|
||||
void performance_data_init_set_(performance_data_t *, uint, performance_point_t *);
|
||||
performance_data_t *performance_data_init_set(uint, performance_point_t *);
|
||||
void performance_data_clear(performance_data_t *);
|
||||
|
||||
void performance_data_print(performance_data_t *);
|
||||
|
||||
|
||||
#endif
|
||||
|
37
nasfaq/api/src/settings.c
Normal file
37
nasfaq/api/src/settings.c
Normal file
@ -0,0 +1,37 @@
|
||||
// @file settings.c
|
||||
#include "settings.h"
|
||||
|
||||
void settings_init_(settings_t *op) {
|
||||
|
||||
op->walletIsPublic = 0;
|
||||
}
|
||||
|
||||
settings_t *settings_init() {
|
||||
|
||||
settings_t *op = malloc(sizeof(settings_t));
|
||||
settings_init_(op);
|
||||
return op;
|
||||
}
|
||||
|
||||
void settings_set(settings_t *op, bool walletIsPublic) {
|
||||
|
||||
op->walletIsPublic = walletIsPublic;
|
||||
}
|
||||
|
||||
settings_t *settings_init_set(bool walletIsPublic) {
|
||||
|
||||
settings_t *op = settings_init();
|
||||
settings_set(op, walletIsPublic);
|
||||
return op;
|
||||
}
|
||||
|
||||
void settings_clear(settings_t *op) {
|
||||
|
||||
free(op);
|
||||
}
|
||||
|
||||
void settings_print(settings_t *op) {
|
||||
|
||||
printf("SETTINGS\n Wallet is public: %d\n", op->walletIsPublic);
|
||||
}
|
||||
|
18
nasfaq/api/src/settings.h
Normal file
18
nasfaq/api/src/settings.h
Normal file
@ -0,0 +1,18 @@
|
||||
#ifndef _SETTINGS_H_
|
||||
#define _SETTINGS_H_
|
||||
|
||||
#include "common.h"
|
||||
|
||||
typedef struct settings_t {
|
||||
|
||||
bool walletIsPublic;
|
||||
} settings_t;
|
||||
|
||||
settings_t *settings_init();
|
||||
void settings_set(settings_t *, bool);
|
||||
settings_t *settings_init_set(bool);
|
||||
void settings_clear(settings_t *);
|
||||
|
||||
void settings_print(settings_t *);
|
||||
#endif
|
||||
|
26
nasfaq/api/src/userInfo.h
Normal file
26
nasfaq/api/src/userInfo.h
Normal file
@ -0,0 +1,26 @@
|
||||
#ifndef _USERINFO_H_
|
||||
#define _USERINFO_H_
|
||||
|
||||
typedef struct userInfo_t {
|
||||
|
||||
bool admin;
|
||||
float brokerFreeTotal;
|
||||
char color[USERINFO_COLOR_SIZE];
|
||||
char email[USERINFO_EMAIL_SIZE];
|
||||
char hat[USERINFO_HAT_SIZE];
|
||||
char icon[USERINFO_ICON_SIZE];
|
||||
char id[USERINFO_ICON_SIZE];
|
||||
bool isBookie;
|
||||
items_t items;
|
||||
bool loggedout;
|
||||
muted_t muted;
|
||||
performance_t performance;
|
||||
settings_t settings;
|
||||
float taxCredits;
|
||||
char username[USERINFO_USERNAME_SIZE];
|
||||
bool verified;
|
||||
wallet_t wallet;
|
||||
} userInfo_t;
|
||||
|
||||
#endif
|
||||
|
8
nasfaq/api/test/compile.sh
Executable file
8
nasfaq/api/test/compile.sh
Executable file
@ -0,0 +1,8 @@
|
||||
gcc ../src/common.c \
|
||||
../src/mute.c \
|
||||
../src/performance.c \
|
||||
../src/settings.c \
|
||||
../src/items.c \
|
||||
../src/cJSON/cJSON.c \
|
||||
./main.c \
|
||||
-Wall -g -o test && ./test
|
12
nasfaq/api/test/main.c
Normal file
12
nasfaq/api/test/main.c
Normal file
@ -0,0 +1,12 @@
|
||||
#include "../src/items.h"
|
||||
#include "../src/mute.h"
|
||||
|
||||
int main() {
|
||||
|
||||
item_t *t = item_init();
|
||||
|
||||
item_print(t);
|
||||
|
||||
item_clear(t);
|
||||
};
|
||||
|
BIN
nasfaq/api/test/test
Executable file
BIN
nasfaq/api/test/test
Executable file
Binary file not shown.
BIN
nasfaq/connections/http/http_connector
Executable file
BIN
nasfaq/connections/http/http_connector
Executable file
Binary file not shown.
171
nasfaq/connections/http/http_connector.cpp
Normal file
171
nasfaq/connections/http/http_connector.cpp
Normal file
@ -0,0 +1,171 @@
|
||||
#include "http_connector.h"
|
||||
|
||||
static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp)
|
||||
{
|
||||
((std::string*)userp)->append((char*)contents, size * nmemb);
|
||||
return size * nmemb;
|
||||
}
|
||||
|
||||
//class http_connection {
|
||||
//public:
|
||||
// http_connection(int id, CURL *hdl, std::string uri)
|
||||
// : m_id(id)
|
||||
// ; m_hdl(hdl)
|
||||
// ; m_uri(uri)
|
||||
// ; m_response("N/A")
|
||||
// {}
|
||||
//
|
||||
//private:
|
||||
// int m_id;
|
||||
// CURL *m_hdl;
|
||||
// std::string m_uri;
|
||||
// CURLcode m_status;
|
||||
// std::string m_response;
|
||||
// std::vector<std::string> m_payloads;
|
||||
//}
|
||||
//
|
||||
//class http_endpoint {
|
||||
//public:
|
||||
// http_endpoint() {
|
||||
//
|
||||
// }
|
||||
//private:
|
||||
//}
|
||||
|
||||
std::string get_sid()
|
||||
{
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
|
||||
static const char *POLLING_URL_0 = "https://nasfaq.biz/socket/?EIO=4&transport=polling&t=Ny7z439";
|
||||
static const char *POLLING_URL_1 = "https://nasfaq.biz/socket/?user=314d0bda-d7f0-4636-aed7-5ea02743604b&EIO=4&transport=polling&t=Ny7z472";
|
||||
static const char *POLLING_URL_2 = "https://nasfaq.biz/socket/?user=314d0bda-d7f0-4636-aed7-5ea02743604b&EIO=4&transport=polling&t=Ny7z4Bn&sid=";
|
||||
static const char *POLLING_URL_3 = "https://nasfaq.biz/socket/?user=314d0bda-d7f0-4636-aed7-5ea02743604b&EIO=4&transport=polling&t=Ny7z4Bp&sid=";
|
||||
static const char *POLLING_URL_4 = "https://nasfaq.biz/socket/?user=314d0bda-d7f0-4636-aed7-5ea02743604b&EIO=4&transport=polling&t=Ny7z4EU&sid=";
|
||||
|
||||
long http_code = 0;
|
||||
std::string sid_final = "";
|
||||
std::string readBuffer = "";
|
||||
|
||||
curl = curl_easy_init();
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
|
||||
curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &http_code);
|
||||
|
||||
/* Header */
|
||||
struct curl_slist *slist1;
|
||||
slist1 = NULL;
|
||||
slist1 = curl_slist_append(slist1 , "Cookie: holosesh=s%3AxmS8xBlQk4kH_rXQOaNjHk_3OuaBDsfA.M0yi%2BZmkiq%2BAmJBRj%2FNg9S%2BaSQpsfHRJcEeYVHLiKXg");
|
||||
slist1 =curl_slist_append(slist1, "referer : https://nasfaq.biz/market");
|
||||
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist1);
|
||||
|
||||
if(curl) {
|
||||
|
||||
/************** ZEROTH STAGE ********/
|
||||
readBuffer = "";
|
||||
curl_easy_setopt(curl, CURLOPT_URL, POLLING_URL_0);
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
/* Check for result */
|
||||
if ( res != CURLE_ABORTED_BY_CALLBACK) {
|
||||
std::cout << "Zeroth stage ok" << std::endl;
|
||||
}else {
|
||||
std::cout << "Failure" << std::endl;
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
/************** FIRST STAGE ********/
|
||||
readBuffer = "";
|
||||
curl_easy_setopt(curl, CURLOPT_URL, POLLING_URL_1);
|
||||
|
||||
/* Perform the request, res will get the return code */
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
/* Check for result */
|
||||
if (res != CURLE_ABORTED_BY_CALLBACK) {
|
||||
std::cout << "First stage ok" << std::endl;
|
||||
}else {
|
||||
std::cout << "Failure" << std::endl;
|
||||
return "";
|
||||
}
|
||||
|
||||
/* Get sid */
|
||||
nlohmann::json r = nlohmann::json::parse(readBuffer.substr(1));
|
||||
sid_final = r["sid"];
|
||||
|
||||
|
||||
/************** SECOND STAGE ********/
|
||||
readBuffer = "";
|
||||
std::string polling_url_2 = POLLING_URL_2 + sid_final;
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_URL, polling_url_2.c_str());
|
||||
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "40");
|
||||
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
|
||||
|
||||
/* Perform the request, res will get the return code */
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
/* Check for result */
|
||||
if (res != CURLE_ABORTED_BY_CALLBACK && readBuffer == "ok") {
|
||||
std::cout << "Second stage ok" << std::endl;
|
||||
}else {
|
||||
std::cout << "Failure" << std::endl;
|
||||
return "";
|
||||
}
|
||||
|
||||
/************** THIRD STAGE ********/
|
||||
readBuffer = "";
|
||||
|
||||
// Format next url
|
||||
std::string polling_url_3 = POLLING_URL_3 + sid_final;
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_URL, polling_url_3.c_str());
|
||||
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "GET");
|
||||
|
||||
/* Perform the request, res will get the return code */
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
|
||||
/* Check for result */
|
||||
if (res != CURLE_ABORTED_BY_CALLBACK) {
|
||||
nlohmann::json r2 = nlohmann::json::parse(readBuffer.substr(2));
|
||||
std::cout << "Third stage ok" << std::endl;
|
||||
}else {
|
||||
std::cout << "Failure" << std::endl;
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
/************** FOURTH STAGE ********/
|
||||
readBuffer = "";
|
||||
std::string polling_url_4 = POLLING_URL_4 + sid_final;
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_URL, polling_url_4.c_str());
|
||||
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "GET");
|
||||
|
||||
/* Perform the request, res will get the return code */
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
/* Check for result */
|
||||
if ( res != CURLE_ABORTED_BY_CALLBACK) {
|
||||
std::cout << "Fourth stage ok" << std::endl;
|
||||
}else {
|
||||
std::cout << "Failure" << std::endl;
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Check for errors */
|
||||
if(res != CURLE_OK)
|
||||
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
||||
curl_easy_strerror(res));
|
||||
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
|
||||
return sid_final;
|
||||
}
|
12
nasfaq/connections/http/http_connector.h
Normal file
12
nasfaq/connections/http/http_connector.h
Normal file
@ -0,0 +1,12 @@
|
||||
#ifndef _HTTP_CONNECTOR_H_
|
||||
#define _HTTP_CONNECTOR_H_
|
||||
|
||||
#include <iostream>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <curl/curl.h>
|
||||
#include <nlohmann/json.hpp>
|
||||
|
||||
std::string get_sid();
|
||||
#endif
|
||||
|
3
nasfaq/connections/test/http_run.sh
Executable file
3
nasfaq/connections/test/http_run.sh
Executable file
@ -0,0 +1,3 @@
|
||||
clang++ ../http/http_connector.cpp \
|
||||
./main_http.cpp \
|
||||
-o main_http -lcurl && ./main_http
|
BIN
nasfaq/connections/test/main
Executable file
BIN
nasfaq/connections/test/main
Executable file
Binary file not shown.
7
nasfaq/connections/test/main.cpp
Normal file
7
nasfaq/connections/test/main.cpp
Normal file
@ -0,0 +1,7 @@
|
||||
#include "../http/http_connector.h"
|
||||
#include "../ws/my_ssl.h"
|
||||
|
||||
int main(void) {
|
||||
connect_ws(get_sid());
|
||||
|
||||
}
|
BIN
nasfaq/connections/test/main_http
Executable file
BIN
nasfaq/connections/test/main_http
Executable file
Binary file not shown.
6
nasfaq/connections/test/main_http.cpp
Normal file
6
nasfaq/connections/test/main_http.cpp
Normal file
@ -0,0 +1,6 @@
|
||||
#include "../http/http_connector.h"
|
||||
|
||||
int main(void) {
|
||||
get_sid();
|
||||
|
||||
}
|
4
nasfaq/connections/test/run.sh
Executable file
4
nasfaq/connections/test/run.sh
Executable file
@ -0,0 +1,4 @@
|
||||
clang++ ../http/http_connector.cpp \
|
||||
../ws/my_ssl.cpp \
|
||||
./main.cpp \
|
||||
-o main -lcurl -lcrypto -lssl -lboost_system -lboost_random -lboost_thread -lpthread && ./main
|
BIN
nasfaq/connections/ws/a.out
Executable file
BIN
nasfaq/connections/ws/a.out
Executable file
Binary file not shown.
335
nasfaq/connections/ws/client.cpp
Normal file
335
nasfaq/connections/ws/client.cpp
Normal file
@ -0,0 +1,335 @@
|
||||
/*
|
||||
* Copyright (c) 2014, Peter Thorson. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the WebSocket++ Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
// **NOTE:** This file is a snapshot of the WebSocket++ utility client tutorial.
|
||||
// Additional related material can be found in the tutorials/utility_client
|
||||
// directory of the WebSocket++ repository.
|
||||
|
||||
#include <websocketpp/config/asio_no_tls_client.hpp>
|
||||
#include <websocketpp/client.hpp>
|
||||
|
||||
#include <websocketpp/common/thread.hpp>
|
||||
#include <websocketpp/common/memory.hpp>
|
||||
|
||||
#include <cstdlib>
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
|
||||
typedef websocketpp::client<websocketpp::config::asio_client> client;
|
||||
|
||||
class connection_metadata {
|
||||
public:
|
||||
typedef websocketpp::lib::shared_ptr<connection_metadata> ptr;
|
||||
|
||||
connection_metadata(int id, websocketpp::connection_hdl hdl, std::string uri)
|
||||
: m_id(id)
|
||||
, m_hdl(hdl)
|
||||
, m_status("Connecting")
|
||||
, m_uri(uri)
|
||||
, m_server("N/A")
|
||||
{}
|
||||
|
||||
void on_open(client * c, websocketpp::connection_hdl hdl) {
|
||||
m_status = "Open";
|
||||
|
||||
client::connection_ptr con = c->get_con_from_hdl(hdl);
|
||||
m_server = con->get_response_header("Server");
|
||||
}
|
||||
|
||||
void on_fail(client * c, websocketpp::connection_hdl hdl) {
|
||||
m_status = "Failed";
|
||||
|
||||
client::connection_ptr con = c->get_con_from_hdl(hdl);
|
||||
m_server = con->get_response_header("Server");
|
||||
m_error_reason = con->get_ec().message();
|
||||
}
|
||||
|
||||
void on_close(client * c, websocketpp::connection_hdl hdl) {
|
||||
m_status = "Closed";
|
||||
client::connection_ptr con = c->get_con_from_hdl(hdl);
|
||||
std::stringstream s;
|
||||
s << "close code: " << con->get_remote_close_code() << " ("
|
||||
<< websocketpp::close::status::get_string(con->get_remote_close_code())
|
||||
<< "), close reason: " << con->get_remote_close_reason();
|
||||
m_error_reason = s.str();
|
||||
}
|
||||
|
||||
void on_message(websocketpp::connection_hdl, client::message_ptr msg) {
|
||||
if (msg->get_opcode() == websocketpp::frame::opcode::text) {
|
||||
m_messages.push_back("<< " + msg->get_payload());
|
||||
} else {
|
||||
m_messages.push_back("<< " + websocketpp::utility::to_hex(msg->get_payload()));
|
||||
}
|
||||
}
|
||||
|
||||
websocketpp::connection_hdl get_hdl() const {
|
||||
return m_hdl;
|
||||
}
|
||||
|
||||
int get_id() const {
|
||||
return m_id;
|
||||
}
|
||||
|
||||
std::string get_status() const {
|
||||
return m_status;
|
||||
}
|
||||
|
||||
void record_sent_message(std::string message) {
|
||||
m_messages.push_back(">> " + message);
|
||||
}
|
||||
|
||||
friend std::ostream & operator<< (std::ostream & out, connection_metadata const & data);
|
||||
private:
|
||||
int m_id;
|
||||
websocketpp::connection_hdl m_hdl;
|
||||
std::string m_status;
|
||||
std::string m_uri;
|
||||
std::string m_server;
|
||||
std::string m_error_reason;
|
||||
std::vector<std::string> m_messages;
|
||||
};
|
||||
|
||||
std::ostream & operator<< (std::ostream & out, connection_metadata const & data) {
|
||||
out << "> URI: " << data.m_uri << "\n"
|
||||
<< "> Status: " << data.m_status << "\n"
|
||||
<< "> Remote Server: " << (data.m_server.empty() ? "None Specified" : data.m_server) << "\n"
|
||||
<< "> Error/close reason: " << (data.m_error_reason.empty() ? "N/A" : data.m_error_reason) << "\n";
|
||||
out << "> Messages Processed: (" << data.m_messages.size() << ") \n";
|
||||
|
||||
std::vector<std::string>::const_iterator it;
|
||||
for (it = data.m_messages.begin(); it != data.m_messages.end(); ++it) {
|
||||
out << *it << "\n";
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
class websocket_endpoint {
|
||||
public:
|
||||
websocket_endpoint () : m_next_id(0) {
|
||||
m_endpoint.clear_access_channels(websocketpp::log::alevel::all);
|
||||
m_endpoint.clear_error_channels(websocketpp::log::elevel::all);
|
||||
|
||||
m_endpoint.init_asio();
|
||||
m_endpoint.start_perpetual();
|
||||
|
||||
m_thread = websocketpp::lib::make_shared<websocketpp::lib::thread>(&client::run, &m_endpoint);
|
||||
}
|
||||
|
||||
~websocket_endpoint() {
|
||||
m_endpoint.stop_perpetual();
|
||||
|
||||
for (con_list::const_iterator it = m_connection_list.begin(); it != m_connection_list.end(); ++it) {
|
||||
if (it->second->get_status() != "Open") {
|
||||
// Only close open connections
|
||||
continue;
|
||||
}
|
||||
|
||||
std::cout << "> Closing connection " << it->second->get_id() << std::endl;
|
||||
|
||||
websocketpp::lib::error_code ec;
|
||||
m_endpoint.close(it->second->get_hdl(), websocketpp::close::status::going_away, "", ec);
|
||||
if (ec) {
|
||||
std::cout << "> Error closing connection " << it->second->get_id() << ": "
|
||||
<< ec.message() << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
m_thread->join();
|
||||
}
|
||||
|
||||
int connect(std::string const & uri) {
|
||||
websocketpp::lib::error_code ec;
|
||||
|
||||
client::connection_ptr con = m_endpoint.get_connection(uri, ec);
|
||||
|
||||
if (ec) {
|
||||
std::cout << "> Connect initialization error: " << ec.message() << std::endl;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int new_id = m_next_id++;
|
||||
connection_metadata::ptr metadata_ptr = websocketpp::lib::make_shared<connection_metadata>(new_id, con->get_handle(), uri);
|
||||
m_connection_list[new_id] = metadata_ptr;
|
||||
|
||||
con->set_open_handler(websocketpp::lib::bind(
|
||||
&connection_metadata::on_open,
|
||||
metadata_ptr,
|
||||
&m_endpoint,
|
||||
websocketpp::lib::placeholders::_1
|
||||
));
|
||||
con->set_fail_handler(websocketpp::lib::bind(
|
||||
&connection_metadata::on_fail,
|
||||
metadata_ptr,
|
||||
&m_endpoint,
|
||||
websocketpp::lib::placeholders::_1
|
||||
));
|
||||
con->set_close_handler(websocketpp::lib::bind(
|
||||
&connection_metadata::on_close,
|
||||
metadata_ptr,
|
||||
&m_endpoint,
|
||||
websocketpp::lib::placeholders::_1
|
||||
));
|
||||
con->set_message_handler(websocketpp::lib::bind(
|
||||
&connection_metadata::on_message,
|
||||
metadata_ptr,
|
||||
websocketpp::lib::placeholders::_1,
|
||||
websocketpp::lib::placeholders::_2
|
||||
));
|
||||
|
||||
m_endpoint.connect(con);
|
||||
|
||||
return new_id;
|
||||
}
|
||||
|
||||
void close(int id, websocketpp::close::status::value code, std::string reason) {
|
||||
websocketpp::lib::error_code ec;
|
||||
|
||||
con_list::iterator metadata_it = m_connection_list.find(id);
|
||||
if (metadata_it == m_connection_list.end()) {
|
||||
std::cout << "> No connection found with id " << id << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
m_endpoint.close(metadata_it->second->get_hdl(), code, reason, ec);
|
||||
if (ec) {
|
||||
std::cout << "> Error initiating close: " << ec.message() << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
void send(int id, std::string message) {
|
||||
websocketpp::lib::error_code ec;
|
||||
|
||||
con_list::iterator metadata_it = m_connection_list.find(id);
|
||||
if (metadata_it == m_connection_list.end()) {
|
||||
std::cout << "> No connection found with id " << id << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
m_endpoint.send(metadata_it->second->get_hdl(), message, websocketpp::frame::opcode::text, ec);
|
||||
if (ec) {
|
||||
std::cout << "> Error sending message: " << ec.message() << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
metadata_it->second->record_sent_message(message);
|
||||
}
|
||||
|
||||
connection_metadata::ptr get_metadata(int id) const {
|
||||
con_list::const_iterator metadata_it = m_connection_list.find(id);
|
||||
if (metadata_it == m_connection_list.end()) {
|
||||
return connection_metadata::ptr();
|
||||
} else {
|
||||
return metadata_it->second;
|
||||
}
|
||||
}
|
||||
private:
|
||||
typedef std::map<int,connection_metadata::ptr> con_list;
|
||||
|
||||
client m_endpoint;
|
||||
websocketpp::lib::shared_ptr<websocketpp::lib::thread> m_thread;
|
||||
|
||||
con_list m_connection_list;
|
||||
int m_next_id;
|
||||
};
|
||||
|
||||
int main() {
|
||||
bool done = false;
|
||||
std::string input;
|
||||
websocket_endpoint endpoint;
|
||||
|
||||
while (!done) {
|
||||
std::cout << "Enter Command: ";
|
||||
std::getline(std::cin, input);
|
||||
|
||||
if (input == "quit") {
|
||||
done = true;
|
||||
} else if (input == "help") {
|
||||
std::cout
|
||||
<< "\nCommand List:\n"
|
||||
<< "connect <ws uri>\n"
|
||||
<< "send <connection id> <message>\n"
|
||||
<< "close <connection id> [<close code:default=1000>] [<close reason>]\n"
|
||||
<< "show <connection id>\n"
|
||||
<< "help: Display this help text\n"
|
||||
<< "quit: Exit the program\n"
|
||||
<< std::endl;
|
||||
} else if (input.substr(0,7) == "connect") {
|
||||
int id = endpoint.connect(input.substr(8));
|
||||
if (id != -1) {
|
||||
std::cout << "> Created connection with id " << id << std::endl;
|
||||
}
|
||||
} else if (input.substr(0,4) == "send") {
|
||||
std::stringstream ss(input);
|
||||
|
||||
std::string cmd;
|
||||
int id;
|
||||
std::string message;
|
||||
|
||||
ss >> cmd >> id;
|
||||
std::getline(ss,message);
|
||||
|
||||
endpoint.send(id, message);
|
||||
} else if (input.substr(0,5) == "close") {
|
||||
std::stringstream ss(input);
|
||||
|
||||
std::string cmd;
|
||||
int id;
|
||||
int close_code = websocketpp::close::status::normal;
|
||||
std::string reason;
|
||||
|
||||
ss >> cmd >> id >> close_code;
|
||||
std::getline(ss,reason);
|
||||
|
||||
endpoint.close(id, close_code, reason);
|
||||
} else if (input.substr(0,4) == "show") {
|
||||
int id = atoi(input.substr(5).c_str());
|
||||
|
||||
connection_metadata::ptr metadata = endpoint.get_metadata(id);
|
||||
if (metadata) {
|
||||
std::cout << *metadata << std::endl;
|
||||
} else {
|
||||
std::cout << "> Unknown connection id " << id << std::endl;
|
||||
}
|
||||
} else {
|
||||
std::cout << "> Unrecognized Command" << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
clang++ -std=c++11 -stdlib=libc++ -I/Users/zaphoyd/software/websocketpp/ -I/Users/zaphoyd/software/boost_1_55_0/ -D_WEBSOCKETPP_CPP11_STL_ step4.cpp /Users/zaphoyd/software/boost_1_55_0/stage/lib/libboost_system.a
|
||||
|
||||
clang++ -I/Users/zaphoyd/software/websocketpp/ -I/Users/zaphoyd/software/boost_1_55_0/ step4.cpp /Users/zaphoyd/software/boost_1_55_0/stage/lib/libboost_system.a /Users/zaphoyd/software/boost_1_55_0/stage/lib/libboost_thread.a /Users/zaphoyd/software/boost_1_55_0/stage/lib/libboost_random.a
|
||||
|
||||
clang++ -std=c++11 -stdlib=libc++ -I/Users/zaphoyd/Documents/websocketpp/ -I/Users/zaphoyd/Documents/boost_1_53_0_libcpp/ -D_WEBSOCKETPP_CPP11_STL_ step4.cpp /Users/zaphoyd/Documents/boost_1_53_0_libcpp/stage/lib/libboost_system.a
|
||||
|
||||
*/
|
1
nasfaq/connections/ws/curlpp
Submodule
1
nasfaq/connections/ws/curlpp
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 2c9c5b46bc1f5d3b0ae7623bd66eea4d9426a6c5
|
335
nasfaq/connections/ws/my_ssl.cpp
Normal file
335
nasfaq/connections/ws/my_ssl.cpp
Normal file
@ -0,0 +1,335 @@
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <websocketpp/config/asio_client.hpp>
|
||||
#include <websocketpp/client.hpp>
|
||||
|
||||
#include <websocketpp/common/thread.hpp>
|
||||
#include <websocketpp/common/memory.hpp>
|
||||
|
||||
typedef websocketpp::client<websocketpp::config::asio_tls_client> client;
|
||||
typedef std::shared_ptr<boost::asio::ssl::context> context_ptr;
|
||||
|
||||
class connection_metadata {
|
||||
public:
|
||||
typedef websocketpp::lib::shared_ptr<connection_metadata> ptr;
|
||||
|
||||
connection_metadata(client *endpoint, int id, websocketpp::connection_hdl hdl, std::string uri)
|
||||
: m_id(id)
|
||||
, m_hdl(hdl)
|
||||
, m_status("Connecting")
|
||||
, m_uri(uri)
|
||||
, m_server("N/A")
|
||||
, m_endpoint(endpoint)
|
||||
{}
|
||||
|
||||
void on_open(client *c, websocketpp::connection_hdl hdl) {
|
||||
websocketpp::lib::error_code ec;
|
||||
m_status = "Open";
|
||||
|
||||
client::connection_ptr con = c->get_con_from_hdl(hdl);
|
||||
m_server = con->get_response_header("Server");
|
||||
|
||||
sleep(1); /* How to wait for status? */
|
||||
m_endpoint->send(m_hdl, "2probe", websocketpp::frame::opcode::text, ec);
|
||||
if (ec) {
|
||||
std::cout << "> Error sending 2probe: " << ec.message() << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
sleep(1); /* How to wait for status? */
|
||||
m_endpoint->send(m_hdl, "5", websocketpp::frame::opcode::text, ec);
|
||||
if (ec) {
|
||||
std::cout << "> Error sending 5: " << ec.message() << std::endl;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void on_fail(client *c, websocketpp::connection_hdl hdl) {
|
||||
m_status = "Failed";
|
||||
|
||||
client::connection_ptr con = c->get_con_from_hdl(hdl);
|
||||
m_server = con->get_response_header("Server");
|
||||
m_error_reason = con->get_ec().message();
|
||||
}
|
||||
|
||||
void on_close(client *c, websocketpp::connection_hdl hdl) {
|
||||
m_status = "Closed";
|
||||
|
||||
client::connection_ptr con = c->get_con_from_hdl(hdl);
|
||||
std::stringstream s;
|
||||
s << "close code: " << con->get_remote_close_code() << " ("
|
||||
<< websocketpp::close::status::get_string(con->get_remote_close_code())
|
||||
<< "), close reason: " << con->get_remote_close_reason();
|
||||
m_error_reason = s.str();
|
||||
}
|
||||
|
||||
void on_message(websocketpp::connection_hdl hdl, client::message_ptr msg) {
|
||||
if (msg->get_opcode() == websocketpp::frame::opcode::text) {
|
||||
std::string payload = msg->get_payload();
|
||||
if (payload == "2") {
|
||||
websocketpp::lib::error_code ec;
|
||||
m_endpoint->send(m_hdl, "3", websocketpp::frame::opcode::text, ec);
|
||||
if (ec) {
|
||||
std::cout << "> Error sending pong 3: " << ec.message() << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
} else {
|
||||
m_messages.push_back(payload);
|
||||
}
|
||||
} else {
|
||||
m_messages.push_back(websocketpp::utility::to_hex(msg->get_payload()));
|
||||
}
|
||||
}
|
||||
|
||||
websocketpp::connection_hdl get_hdl() const {
|
||||
return m_hdl;
|
||||
}
|
||||
|
||||
int get_id() const {
|
||||
return m_id;
|
||||
}
|
||||
|
||||
std::string get_status() const {
|
||||
return m_status;
|
||||
}
|
||||
|
||||
friend std::ostream & operator<< (std::ostream & out, connection_metadata const & data);
|
||||
|
||||
void record_sent_message(std::string message) {
|
||||
m_messages.push_back(">> " + message);
|
||||
}
|
||||
|
||||
private:
|
||||
int m_id;
|
||||
websocketpp::connection_hdl m_hdl;
|
||||
std::string m_status;
|
||||
std::string m_uri;
|
||||
std::string m_server;
|
||||
std::string m_error_reason;
|
||||
std::vector<std::string> m_messages;
|
||||
client *m_endpoint;
|
||||
};
|
||||
|
||||
std::ostream & operator<< (std::ostream & out, connection_metadata const & data) {
|
||||
out
|
||||
|
||||
<< "> URI: " << data.m_uri << "\n"
|
||||
<< "> Status: " << data.m_status << "\n"
|
||||
<< "> Remote Server: " << (data.m_server.empty() ? "None Specified" : data.m_server) << "\n"
|
||||
<< "> Error/close reason: " << (data.m_error_reason.empty() ? "N/A" : data.m_error_reason);
|
||||
|
||||
std::vector<std::string>::const_iterator it;
|
||||
for (it = data.m_messages.begin(); it != data.m_messages.end(); ++it) {
|
||||
out << *it << "\n";
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
static context_ptr on_tls_init() {
|
||||
// establishes a SSL connection
|
||||
context_ptr ctx = std::make_shared<boost::asio::ssl::context>(boost::asio::ssl::context::sslv23);
|
||||
|
||||
try {
|
||||
ctx->set_options(boost::asio::ssl::context::default_workarounds |
|
||||
boost::asio::ssl::context::no_sslv2 |
|
||||
boost::asio::ssl::context::no_sslv3 |
|
||||
boost::asio::ssl::context::single_dh_use);
|
||||
} catch (std::exception &e) {
|
||||
std::cout << "Error in context pointer: " << e.what() << std::endl;
|
||||
}
|
||||
return ctx;
|
||||
}
|
||||
|
||||
class websocket_endpoint {
|
||||
public:
|
||||
websocket_endpoint() {
|
||||
m_endpoint.clear_access_channels(websocketpp::log::alevel::all);
|
||||
m_endpoint.clear_error_channels(websocketpp::log::elevel::all);
|
||||
|
||||
m_endpoint.init_asio();
|
||||
m_endpoint.set_tls_init_handler(bind(&on_tls_init));
|
||||
m_endpoint.start_perpetual();
|
||||
m_thread.reset(new websocketpp::lib::thread(&client::run, &m_endpoint));
|
||||
}
|
||||
|
||||
~websocket_endpoint() {
|
||||
m_endpoint.stop_perpetual();
|
||||
|
||||
for (con_list::const_iterator it = m_connection_list.begin(); it != m_connection_list.end(); ++it) {
|
||||
if (it->second->get_status() != "Open") {
|
||||
// Close only open connections
|
||||
continue;
|
||||
}
|
||||
|
||||
std::cout << "> Closing connection " << it->second->get_id() << std::endl;
|
||||
|
||||
websocketpp::lib::error_code ec;
|
||||
m_endpoint.close(it->second->get_hdl(), websocketpp::close::status::going_away, "", ec);
|
||||
if (ec) {
|
||||
std::cout << "> Error closing connection " << it->second->get_id() << ": "
|
||||
<< ec.message() << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int connect(std::string const &uri) {
|
||||
websocketpp::lib::error_code ec;
|
||||
|
||||
client::connection_ptr con = m_endpoint.get_connection(uri, ec);
|
||||
con->append_header("Cookie", "holosesh=s%3AxmS8xBlQk4kH_rXQOaNjHk_3OuaBDsfA.M0yi%2BZmkiq%2BAmJBRj%2FNg9S%2BaSQpsfHRJcEeYVHLiKXg");
|
||||
|
||||
if(ec) {
|
||||
std::cout << ">Connect initialization error: " << ec.message() << std::endl;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int new_id = m_next_id++;
|
||||
connection_metadata::ptr metadata_ptr(new connection_metadata(&m_endpoint, new_id, con->get_handle(), uri));
|
||||
m_connection_list[new_id] = metadata_ptr;
|
||||
|
||||
con->set_open_handler(websocketpp::lib::bind(
|
||||
&connection_metadata::on_open,
|
||||
metadata_ptr,
|
||||
&m_endpoint,
|
||||
websocketpp::lib::placeholders::_1
|
||||
));
|
||||
con->set_fail_handler(websocketpp::lib::bind(
|
||||
&connection_metadata::on_fail,
|
||||
metadata_ptr,
|
||||
&m_endpoint,
|
||||
websocketpp::lib::placeholders::_1
|
||||
));
|
||||
con->set_message_handler(websocketpp::lib::bind(
|
||||
&connection_metadata::on_message,
|
||||
metadata_ptr,
|
||||
websocketpp::lib::placeholders::_1,
|
||||
websocketpp::lib::placeholders::_2
|
||||
));
|
||||
|
||||
m_endpoint.connect(con);
|
||||
|
||||
return new_id;
|
||||
}
|
||||
|
||||
void close(int id, websocketpp::close::status::value code, std::string reason) {
|
||||
websocketpp::lib::error_code ec;
|
||||
|
||||
con_list::iterator metadata_it = m_connection_list.find(id);
|
||||
if (metadata_it == m_connection_list.end()) {
|
||||
std::cout << "> No connection found with id " << id << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
m_endpoint.close(metadata_it->second->get_hdl(), code, "", ec);
|
||||
if (ec) {
|
||||
std::cout << "> Error initiating close: " << ec.message() << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
void send(int id, std::string message) {
|
||||
websocketpp::lib::error_code ec;
|
||||
|
||||
con_list::iterator metadata_it = m_connection_list.find(id);
|
||||
if (metadata_it == m_connection_list.end()) {
|
||||
std::cout << "> No connection found with id " << id << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
m_endpoint.send(metadata_it->second->get_hdl(), message, websocketpp::frame::opcode::text, ec);
|
||||
if (ec) {
|
||||
std::cout << "> Error sending message: " << ec.message() << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
metadata_it->second->record_sent_message(message);
|
||||
}
|
||||
|
||||
connection_metadata::ptr get_metadata(int id) const {
|
||||
con_list::const_iterator metadata_it = m_connection_list.find(id);
|
||||
if(metadata_it == m_connection_list.end()) {
|
||||
return connection_metadata::ptr();
|
||||
} else {
|
||||
return metadata_it->second;
|
||||
}
|
||||
}
|
||||
private:
|
||||
typedef std::map<int, connection_metadata::ptr> con_list;
|
||||
|
||||
client m_endpoint;
|
||||
websocketpp::lib::shared_ptr<websocketpp::lib::thread> m_thread;
|
||||
|
||||
con_list m_connection_list;
|
||||
int m_next_id;
|
||||
};
|
||||
|
||||
int connect_ws(std::string sid) {
|
||||
|
||||
bool done = false;
|
||||
std::string input;
|
||||
websocket_endpoint endpoint;
|
||||
|
||||
while(!done) {
|
||||
|
||||
std::cout << "Enter command: ";
|
||||
std::getline(std::cin, input);
|
||||
|
||||
if(input == "quit" || input == "q" ) done = true;
|
||||
else if(input == "help") {
|
||||
std::cout
|
||||
<< "\nCommand List:\n"
|
||||
<< "help: Display this help text\n"
|
||||
<< "quit: Exit the program\n"
|
||||
<< std::endl;
|
||||
} else if (input.substr(0, 3) == "nsf") {
|
||||
std::string uri = "wss://nasfaq.biz/socket/?user=314d0bda-d7f0-4636-aed7-5ea02743604b&EIO=4&transport=websocket&sid=" + sid;
|
||||
int id = endpoint.connect(uri);
|
||||
if(id != -1) {
|
||||
std::cout << ">Created nsf connection with id " << id << std::endl;
|
||||
}
|
||||
} else if (input.substr(0, 7) == "connect") {
|
||||
int id = endpoint.connect(input.substr(8));
|
||||
if(id != -1) {
|
||||
std::cout << ">Created connection with id " << id << std::endl;
|
||||
}
|
||||
} else if (input.substr(0,4) == "show") {
|
||||
int id = atoi(input.substr(5).c_str());
|
||||
|
||||
connection_metadata::ptr metadata = endpoint.get_metadata(id);
|
||||
if (metadata) {
|
||||
std::cout << *metadata << std::endl;
|
||||
} else {
|
||||
std::cout << ">Unknown connection id " << id << std::endl;
|
||||
}
|
||||
} else if (input.substr(0, 5) == "close") {
|
||||
std::stringstream ss(input);
|
||||
|
||||
std::string cmd;
|
||||
int id;
|
||||
int close_code = websocketpp::close::status::normal;
|
||||
std::string reason;
|
||||
|
||||
ss >> cmd >> id >> close_code;
|
||||
std::getline(ss, reason);
|
||||
|
||||
endpoint.close(id, close_code, reason);
|
||||
} else if (input.substr(0,4) == "send") {
|
||||
std::stringstream ss(input);
|
||||
|
||||
std::string cmd;
|
||||
int id;
|
||||
std::string message = "";
|
||||
|
||||
ss >> cmd >> id;
|
||||
std::getline(ss,message);
|
||||
|
||||
endpoint.send(id, message);
|
||||
} else {
|
||||
std::cout << "Unrecognized command" << std::endl;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
7
nasfaq/connections/ws/my_ssl.h
Normal file
7
nasfaq/connections/ws/my_ssl.h
Normal file
@ -0,0 +1,7 @@
|
||||
#ifndef _MY_SSL_H_
|
||||
#define _MY_SSL_H_
|
||||
|
||||
int connect_ws(std::string);
|
||||
|
||||
#endif
|
||||
|
1
nasfaq/connections/ws/old_websocket
Submodule
1
nasfaq/connections/ws/old_websocket
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 1b11fd301531e6df35a6107c1e8665b1e77a2d8e
|
1
nasfaq/connections/ws/run.sh
Executable file
1
nasfaq/connections/ws/run.sh
Executable file
@ -0,0 +1 @@
|
||||
clang++ my_ssl.cpp -lcrypto -lssl -lboost_system -lboost_random -lboost_thread -lpthread && ./a.out
|
227
nasfaq/connections/ws/test.cpp
Normal file
227
nasfaq/connections/ws/test.cpp
Normal file
@ -0,0 +1,227 @@
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
#include <websocketpp/config/asio_no_tls_client.hpp>
|
||||
#include <websocketpp/client.hpp>
|
||||
|
||||
#include <websocketpp/common/thread.hpp>
|
||||
#include <websocketpp/common/memory.hpp>
|
||||
|
||||
typedef websocketpp::client<websocketpp::config::asio_client> client;
|
||||
|
||||
class connection_metadata {
|
||||
public:
|
||||
typedef websocketpp::lib::shared_ptr<connection_metadata> ptr;
|
||||
|
||||
connection_metadata(int id, websocketpp::connection_hdl hdl, std::string uri)
|
||||
: m_id(id)
|
||||
, m_hdl(hdl)
|
||||
, m_status("Connecting")
|
||||
, m_uri(uri)
|
||||
, m_server("N/A")
|
||||
{}
|
||||
|
||||
void on_open(client *c, websocketpp::connection_hdl hdl) {
|
||||
m_status = "Open";
|
||||
|
||||
client::connection_ptr con = c->get_con_from_hdl(hdl);
|
||||
m_server = con->get_response_header("Server");
|
||||
}
|
||||
|
||||
void on_fail(client *c, websocketpp::connection_hdl hdl) {
|
||||
m_status = "Failed";
|
||||
|
||||
client::connection_ptr con = c->get_con_from_hdl(hdl);
|
||||
m_server = con->get_response_header("Server");
|
||||
m_error_reason = con->get_ec().message();
|
||||
}
|
||||
|
||||
void on_close(client *c, websocketpp::connection_hdl hdl) {
|
||||
m_status = "Closed";
|
||||
|
||||
client::connection_ptr con = c->get_con_from_hdl(hdl);
|
||||
std::stringstream s;
|
||||
s << "close code: " << con->get_remote_close_code() << " ("
|
||||
<< websocketpp::close::status::get_string(con->get_remote_close_code())
|
||||
<< "), close reason: " << con->get_remote_close_reason();
|
||||
m_error_reason = s.str();
|
||||
}
|
||||
|
||||
websocketpp::connection_hdl get_hdl() const {
|
||||
return m_hdl;
|
||||
}
|
||||
|
||||
int get_id() const {
|
||||
return m_id;
|
||||
}
|
||||
|
||||
std::string get_status() const {
|
||||
return m_status;
|
||||
}
|
||||
|
||||
friend std::ostream & operator<< (std::ostream & out, connection_metadata const & data);
|
||||
|
||||
private:
|
||||
int m_id;
|
||||
websocketpp::connection_hdl m_hdl;
|
||||
std::string m_status;
|
||||
std::string m_uri;
|
||||
std::string m_server;
|
||||
std::string m_error_reason;
|
||||
};
|
||||
|
||||
std::ostream & operator<< (std::ostream & out, connection_metadata const & data) {
|
||||
out << "> URI: " << data.m_uri << "\n"
|
||||
<< "> Status: " << data.m_status << "\n"
|
||||
<< "> Remote Server: " << (data.m_server.empty() ? "None Specified" : data.m_server) << "\n"
|
||||
<< "> Error/close reason: " << (data.m_error_reason.empty() ? "N/A" : data.m_error_reason);
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
class websocket_endpoint {
|
||||
public:
|
||||
websocket_endpoint() {
|
||||
m_endpoint.clear_access_channels(websocketpp::log::alevel::all);
|
||||
m_endpoint.clear_error_channels(websocketpp::log::elevel::all);
|
||||
|
||||
m_endpoint.init_asio();
|
||||
m_endpoint.start_perpetual();
|
||||
m_thread.reset(new websocketpp::lib::thread(&client::run, &m_endpoint));
|
||||
}
|
||||
|
||||
~websocket_endpoint() {
|
||||
m_endpoint.stop_perpetual();
|
||||
|
||||
for (con_list::const_iterator it = m_connection_list.begin(); it != m_connection_list.end(); ++it) {
|
||||
if (it->second->get_status() != "Open") {
|
||||
// Close only open connections
|
||||
continue;
|
||||
}
|
||||
|
||||
std::cout << "> Closing connection " << it->second->get_id() << std::endl;
|
||||
|
||||
websocketpp::lib::error_code ec;
|
||||
m_endpoint.close(it->second->get_hdl(), websocketpp::close::status::going_away, "", ec);
|
||||
if (ec) {
|
||||
std::cout << "> Error closing connection " << it->second->get_id() << ": "
|
||||
<< ec.message() << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int connect(std::string const &uri) {
|
||||
websocketpp::lib::error_code ec;
|
||||
|
||||
client::connection_ptr con = m_endpoint.get_connection(uri, ec);
|
||||
|
||||
if(ec) {
|
||||
std::cout << ">Connect initialization error: " << ec.message() << std::endl;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int new_id = m_next_id++;
|
||||
connection_metadata::ptr metadata_ptr(new connection_metadata(new_id, con->get_handle(), uri));
|
||||
m_connection_list[new_id] = metadata_ptr;
|
||||
|
||||
con->set_open_handler(websocketpp::lib::bind(
|
||||
&connection_metadata::on_open,
|
||||
metadata_ptr,
|
||||
&m_endpoint,
|
||||
websocketpp::lib::placeholders::_1
|
||||
));
|
||||
con->set_fail_handler(websocketpp::lib::bind(
|
||||
&connection_metadata::on_fail,
|
||||
metadata_ptr,
|
||||
&m_endpoint,
|
||||
websocketpp::lib::placeholders::_1
|
||||
));
|
||||
|
||||
m_endpoint.connect(con);
|
||||
|
||||
return new_id;
|
||||
}
|
||||
|
||||
void close(int id, websocketpp::close::status::value code, std::string reason) {
|
||||
websocketpp::lib::error_code ec;
|
||||
|
||||
con_list::iterator metadata_it = m_connection_list.find(id);
|
||||
if (metadata_it == m_connection_list.end()) {
|
||||
std::cout << "> No connection found with id " << id << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
m_endpoint.close(metadata_it->second->get_hdl(), code, "", ec);
|
||||
if (ec) {
|
||||
std::cout << "> Error initiating close: " << ec.message() << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
connection_metadata::ptr get_metadata(int id) const {
|
||||
con_list::const_iterator metadata_it = m_connection_list.find(id);
|
||||
if(metadata_it == m_connection_list.end()) {
|
||||
return connection_metadata::ptr();
|
||||
} else {
|
||||
return metadata_it->second;
|
||||
}
|
||||
}
|
||||
private:
|
||||
typedef std::map<int, connection_metadata::ptr> con_list;
|
||||
|
||||
client m_endpoint;
|
||||
websocketpp::lib::shared_ptr<websocketpp::lib::thread> m_thread;
|
||||
|
||||
con_list m_connection_list;
|
||||
int m_next_id;
|
||||
};
|
||||
|
||||
int main() {
|
||||
|
||||
bool done = false;
|
||||
std::string input;
|
||||
websocket_endpoint endpoint;
|
||||
|
||||
while(!done) {
|
||||
|
||||
std::cout << "Enter command: ";
|
||||
std::getline(std::cin, input);
|
||||
|
||||
if(input == "quit" || input == "q" ) done = true;
|
||||
else if(input == "help") {
|
||||
std::cout
|
||||
<< "\nCommand List:\n"
|
||||
<< "help: Display this help text\n"
|
||||
<< "quit: Exit the program\n"
|
||||
<< std::endl;
|
||||
} else if (input.substr(0, 7) == "connect") {
|
||||
int id = endpoint.connect(input.substr(8));
|
||||
if(id != -1) {
|
||||
std::cout << ">Created connection with id " << id << std::endl;
|
||||
}
|
||||
} else if (input.substr(0,4) == "show") {
|
||||
int id = atoi(input.substr(5).c_str());
|
||||
|
||||
connection_metadata::ptr metadata = endpoint.get_metadata(id);
|
||||
if (metadata) {
|
||||
std::cout << *metadata << std::endl;
|
||||
} else {
|
||||
std::cout << ">Unknown connection id " << id << std::endl;
|
||||
}
|
||||
} else if (input.substr(0, 5) == "close") {
|
||||
std::stringstream ss(input);
|
||||
|
||||
std::string cmd;
|
||||
int id;
|
||||
int close_code = websocketpp::close::status::normal;
|
||||
std::string reason;
|
||||
|
||||
ss >> cmd >> id >> close_code;
|
||||
std::getline(ss, reason);
|
||||
|
||||
endpoint.close(id, close_code, reason);
|
||||
} else {
|
||||
std::cout << "Unrecognized command" << std::endl;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
1
nasfaq/connections/ws/test_run.sh
Executable file
1
nasfaq/connections/ws/test_run.sh
Executable file
@ -0,0 +1 @@
|
||||
clang++ test_ssl.cpp -lssl -lcrypto -lboost_system -lboost_random -lboost_thread -lpthread && ./a.out
|
86
nasfaq/connections/ws/test_ssl.cpp
Normal file
86
nasfaq/connections/ws/test_ssl.cpp
Normal file
@ -0,0 +1,86 @@
|
||||
#include <websocketpp/config/asio_client.hpp>
|
||||
#include <websocketpp/client.hpp>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
typedef websocketpp::client<websocketpp::config::asio_tls_client> client;
|
||||
typedef std::shared_ptr<boost::asio::ssl::context> context_ptr;
|
||||
using websocketpp::lib::placeholders::_1;
|
||||
using websocketpp::lib::placeholders::_2;
|
||||
using websocketpp::lib::bind;
|
||||
|
||||
// pull out the type of messages sent by our config
|
||||
typedef websocketpp::config::asio_client::message_type::ptr message_ptr;
|
||||
|
||||
// This message handler will be invoked once for each incoming message. It
|
||||
// prints the message and then sends a copy of the message back to the server.
|
||||
void on_message(client* c, websocketpp::connection_hdl hdl, message_ptr msg) {
|
||||
std::cout << "on_message called with hdl: " << hdl.lock().get()
|
||||
<< " and message: " << msg->get_payload()
|
||||
<< std::endl;
|
||||
|
||||
|
||||
websocketpp::lib::error_code ec;
|
||||
|
||||
c->send(hdl, msg->get_payload(), msg->get_opcode(), ec);
|
||||
if (ec) {
|
||||
std::cout << "Echo failed because: " << ec.message() << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
static context_ptr on_tls_init() {
|
||||
// establishes a SSL connection
|
||||
context_ptr ctx = std::make_shared<boost::asio::ssl::context>(boost::asio::ssl::context::sslv23);
|
||||
|
||||
try {
|
||||
ctx->set_options(boost::asio::ssl::context::default_workarounds |
|
||||
boost::asio::ssl::context::no_sslv2 |
|
||||
boost::asio::ssl::context::no_sslv3 |
|
||||
boost::asio::ssl::context::single_dh_use);
|
||||
} catch (std::exception &e) {
|
||||
std::cout << "Error in context pointer: " << e.what() << std::endl;
|
||||
}
|
||||
return ctx;
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
// Create a client endpoint
|
||||
client c;
|
||||
|
||||
std::string uri = "wss://nasfaq.biz/socket/?user=314d0bda-d7f0-4636-aed7-5ea02743604b&EIO=4&transport=websocket";
|
||||
|
||||
if (argc == 2) {
|
||||
uri = argv[1];
|
||||
}
|
||||
|
||||
try {
|
||||
// Set logging to be pretty verbose (everything except message payloads)
|
||||
c.set_access_channels(websocketpp::log::alevel::all);
|
||||
c.clear_access_channels(websocketpp::log::alevel::frame_payload);
|
||||
|
||||
// Initialize ASIO
|
||||
c.init_asio();
|
||||
c.set_tls_init_handler(bind(&on_tls_init));
|
||||
|
||||
// Register our message handler
|
||||
c.set_message_handler(bind(&on_message,&c,::_1,::_2));
|
||||
|
||||
websocketpp::lib::error_code ec;
|
||||
client::connection_ptr con = c.get_connection(uri, ec);
|
||||
if (ec) {
|
||||
std::cout << "could not create connection because: " << ec.message() << std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Note that connect here only requests a connection. No network messages are
|
||||
// exchanged until the event loop starts running in the next line.
|
||||
c.connect(con);
|
||||
|
||||
// Start the ASIO io_service run loop
|
||||
// this will cause a single connection to be made to the server. c.run()
|
||||
// will exit when this connection is closed.
|
||||
c.run();
|
||||
} catch (websocketpp::exception const & e) {
|
||||
std::cout << e.what() << std::endl;
|
||||
}
|
||||
}
|
1
nasfaq/socket/ws/simple-libwebsockets-example
Submodule
1
nasfaq/socket/ws/simple-libwebsockets-example
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 1088642db8abbcf9f034bab61f2496864235c042
|
4
nasfaq/ui/test/compile.sh
Executable file
4
nasfaq/ui/test/compile.sh
Executable file
@ -0,0 +1,4 @@
|
||||
gcc -lncurses \
|
||||
nc.c \
|
||||
utils.c \
|
||||
-o nc && ./nc
|
BIN
nasfaq/ui/test/nc
Executable file
BIN
nasfaq/ui/test/nc
Executable file
Binary file not shown.
82
nasfaq/ui/test/nc.c
Normal file
82
nasfaq/ui/test/nc.c
Normal file
@ -0,0 +1,82 @@
|
||||
#include "nc.h"
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
WINDOW *my_win;
|
||||
int startx, starty, width, height;
|
||||
int ch;
|
||||
int margin_x, margin_y;
|
||||
int MAX_ROW, MAX_COL;
|
||||
int MAX_WIN_ROW, MAX_WIN_COL;
|
||||
|
||||
initscr(); /* Start curses mode */
|
||||
raw(); /* Line buffering disabled, Pass on*/
|
||||
noecho();
|
||||
keypad(stdscr, TRUE); /* I need that nifty F2 */
|
||||
|
||||
/* Window parameters */
|
||||
height = 10;
|
||||
width = 20;
|
||||
starty = (LINES - height) / 2; /* Calculating for a center placement */
|
||||
startx = (COLS - width) / 2; /* of the window */
|
||||
|
||||
/* Grid parameters */
|
||||
getmaxyx(stdscr, MAX_ROW, MAX_COL); /* get the number of rows and columns */
|
||||
margin_x = 1;
|
||||
margin_y = 1;
|
||||
MAX_WIN_ROW = MAX_ROW / (height + margin_y);
|
||||
MAX_WIN_COL = MAX_COL / (width + margin_x);
|
||||
WINDOW *win_array[MAX_WIN_COL][MAX_WIN_ROW];
|
||||
|
||||
printw("Press F2 to exit");
|
||||
|
||||
mvprintw(2, 0, "Nbr of win col: %d, nbr of win lines: %d", MAX_WIN_COL, MAX_WIN_ROW);
|
||||
refresh();
|
||||
|
||||
do {
|
||||
for( int i = 0; i < MAX_WIN_COL; i ++ ){
|
||||
for( int j = 0; j < MAX_WIN_ROW; j ++ ){
|
||||
|
||||
win_array[i][j] = create_newwin(height, width, j * (height + margin_y), i * (width + margin_x));
|
||||
refresh();
|
||||
}
|
||||
}
|
||||
|
||||
}while( (ch = getch()) != KEY_F(2));
|
||||
|
||||
//for( int i = 0; i <= MAX_WIN_COL; i ++ ){
|
||||
// for( int j = 0; j <= MAX_WIN_ROW; j ++ ){
|
||||
|
||||
// destroy_win(win_array[i][j]);
|
||||
// }
|
||||
//}
|
||||
|
||||
//while((ch = getch()) != KEY_F(2))
|
||||
//{
|
||||
// switch(ch)
|
||||
// {
|
||||
// case KEY_LEFT:
|
||||
// destroy_win(my_win);
|
||||
// my_win = create_newwin(height, width, starty,--startx);
|
||||
// break;
|
||||
|
||||
// case KEY_RIGHT:
|
||||
// destroy_win(my_win);
|
||||
// my_win = create_newwin(height, width, starty,++startx);
|
||||
// break;
|
||||
|
||||
// case KEY_UP:
|
||||
// destroy_win(my_win);
|
||||
// my_win = create_newwin(height, width, --starty,startx);
|
||||
// break;
|
||||
|
||||
// case KEY_DOWN:
|
||||
// destroy_win(my_win);
|
||||
// my_win = create_newwin(height, width, ++starty,startx);
|
||||
// break;
|
||||
// }
|
||||
//}
|
||||
endwin(); /* End curses mode */
|
||||
return 0;
|
||||
}
|
||||
|
7
nasfaq/ui/test/nc.h
Normal file
7
nasfaq/ui/test/nc.h
Normal file
@ -0,0 +1,7 @@
|
||||
#include <ncurses.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "utils.h"
|
||||
|
39
nasfaq/ui/test/utils.c
Normal file
39
nasfaq/ui/test/utils.c
Normal file
@ -0,0 +1,39 @@
|
||||
#include <ncurses.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
WINDOW *create_newwin(int height, int width, int starty, int startx)
|
||||
{
|
||||
WINDOW *local_win;
|
||||
local_win = newwin(height, width, starty, startx);
|
||||
box(local_win, 0 , 0); /* 0, 0 gives default characters
|
||||
for the vertical and horizontal
|
||||
lines */
|
||||
wrefresh(local_win); /* Show that box */
|
||||
return local_win;
|
||||
}
|
||||
|
||||
void destroy_win(WINDOW *local_win)
|
||||
{
|
||||
/* box(local_win, ' ', ' '); : This won't produce the desired
|
||||
* result of erasing the window. It will leave it's four corners
|
||||
* and so an ugly remnant of window. */
|
||||
|
||||
wborder(local_win, ' ', ' ', ' ',' ',' ',' ',' ',' ');
|
||||
|
||||
/* The parameters taken are
|
||||
* 1. win: the window on which to operate
|
||||
* 2. ls: character to be used for the left side of the window
|
||||
* 3. rs: character to be used for the right side of the window
|
||||
* 4. ts: character to be used for the top side of the window
|
||||
* 5. bs: character to be used for the bottom side of the window
|
||||
* 6. tl: character to be used for the top left corner of the window
|
||||
* 7. tr: character to be used for the top right corner of the window
|
||||
* 8. bl: character to be used for the bottom left corner of the window
|
||||
* 9. br: character to be used for the bottom right corner of the window */
|
||||
|
||||
wrefresh(local_win);
|
||||
delwin(local_win);
|
||||
}
|
||||
|
9
nasfaq/ui/test/utils.h
Normal file
9
nasfaq/ui/test/utils.h
Normal file
@ -0,0 +1,9 @@
|
||||
#include <ncurses.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
WINDOW *create_newwin(int height, int width, int starty, int startx);
|
||||
void destroy_win(WINDOW *local_win);
|
||||
|
Loading…
Reference in New Issue
Block a user