// ------------------------------------------------------------ int Qaullib_UserCheckUser(union olsr_ip_addr *ip, char *name) { struct qaul_user_LL_item *user; int user_found = 0; // check if user exists in LL if(Qaullib_User_LL_IpSearch (ip, &user)) { // if user exists: update lastseen_at if(user->type < QAUL_USERTYPE_KNOWN) { // set user name strncpy(user->name, name, MAX_USER_LEN); memcpy(&user->name[MAX_USER_LEN], "\0", 1); // hide empty users if(strlen(user->name) > 0) { user->type = QAUL_USERTYPE_KNOWN; user->changed = QAUL_USERCHANGED_MODIFIED; } else { user->type = QAUL_USERTYPE_HIDDEN; } } else if(user->changed >= QAUL_USERCHANGED_DELETED) { if(user->changed == QAUL_USERCHANGED_DELETED) user->changed = QAUL_USERCHANGED_UNCHANGED; else user->changed = QAUL_USERCHANGED_MODIFIED; } user->time = time(NULL); user_found = 1; } else { // if user does not exist: create user user = Qaullib_User_LL_Add (ip); // set user name strncpy(user->name, name, MAX_USER_LEN); memcpy(&user->name[MAX_USER_LEN], "\0", 1); // hide empty users if(strlen(user->name) > 0) { user->type = QAUL_USERTYPE_KNOWN; user->changed = QAUL_USERCHANGED_MODIFIED; } else { user->type = QAUL_USERTYPE_HIDDEN; } } return user_found; }
// ------------------------------------------------------------ void Qaullib_UserTouchIp(union olsr_ip_addr *ip, float linkcost) { struct qaul_user_LL_item *user; if(QAUL_DEBUG) printf("Qaullib_UserTouchIp \n"); // check if user exists in LL if(Qaullib_User_LL_IpSearch (ip, &user)) { if(QAUL_DEBUG) printf("user exists \n"); // if user exists: update lastseen_at if(user->changed >= QAUL_USERCHANGED_DELETED) { if(user->type == QAUL_USERTYPE_KNOWN) user->changed = QAUL_USERCHANGED_MODIFIED; else user->changed = QAUL_USERCHANGED_UNCHANGED; } // set link cost if(linkcost > 20.0) { // delete this user if(user->changed < QAUL_USERCHANGED_DELETED) user->changed = QAUL_USERCHANGED_DELETED; } else { if( user->changed >= QAUL_USERCHANGED_DELETED && linkcost <= 10.0) { user->changed = QAUL_USERCHANGED_MODIFIED; } else if(Qaullib_UserLinkcost2Img(user->lq) != Qaullib_UserLinkcost2Img(linkcost)) { user->changed = QAUL_USERCHANGED_MODIFIED; } } user->lq = linkcost; // set last seen time stamp user->time = time(NULL); } else { if(QAUL_DEBUG) printf("user does not exist, create it \n"); // if user does not exist: create user user = Qaullib_User_LL_Add (ip); user->lq = linkcost; } }
// ------------------------------------------------------------ void Qaullib_UserFavoritesDB2LL(void) { sqlite3_stmt *ppStmt; union olsr_ip_addr myip; struct qaul_user_LL_item *myitem; int myipint; // Select rows from database if( sqlite3_prepare_v2(db, sql_user_get_all, -1, &ppStmt, NULL) != SQLITE_OK ) { printf("SQLite error: %s\n",sqlite3_errmsg(db)); return; } // For each row returned while (sqlite3_step(ppStmt) == SQLITE_ROW) { // For each column int jj; // search for ip for(jj=0; jj < sqlite3_column_count(ppStmt); jj++) { if(strcmp(sqlite3_column_name(ppStmt,jj), "ipv4") == 0) { myipint = sqlite3_column_int(ppStmt, jj); memcpy(&myip.v4, &myipint, sizeof(struct sockaddr_in)); break; } } myitem = Qaullib_User_LL_Add(&myip); myitem->type = QAUL_USERTYPE_KNOWN; myitem->favorite = 1; myitem->changed = QAUL_USERCHANGED_CACHED; // fill in rest for(jj=0; jj < sqlite3_column_count(ppStmt); jj++) { if(strcmp(sqlite3_column_name(ppStmt,jj), "name") == 0) { sprintf(myitem->name,"%s",sqlite3_column_text(ppStmt, jj)); break; } } } sqlite3_finalize(ppStmt); }
void Qaullib_UserAdd(union olsr_ip_addr *ip, char *name, char *iconhash, char *suffix) { struct qaul_user_LL_item *myuseritem; printf("Qaullib_UserAdd\n"); // search for user if(Qaullib_User_LL_IpSearch (ip, &myuseritem)) { printf("Qaullib_UserAddInfo user found in LL\n"); // check if it is already known if(myuseritem->type < QAUL_USERTYPE_KNOWN) { printf("Qaullib_UserAddInfo name not known yet\n"); // set type myuseritem->type = QAUL_USERTYPE_KNOWN; if(myuseritem->changed == QAUL_USERCHANGED_UNCHANGED) myuseritem->changed = QAUL_USERCHANGED_MODIFIED; } else return; } else { printf("Qaullib_UserAddInfo user not found in LL: create it\n"); // create the user if it doesn't exist myuseritem = Qaullib_User_LL_Add (ip); // set user to cache myuseritem->changed = QAUL_USERCHANGED_CACHED; } // fill in name strncpy(myuseritem->name, name, MAX_USER_LEN); memcpy(&myuseritem->name[MAX_USER_LEN], "\0", 1); // todo: add icon info memcpy(&myuseritem->icon[0], "\0", 1); printf("Qaullib_User survived\n"); if(strlen(myuseritem->name) > 0) myuseritem->type = QAUL_USERTYPE_KNOWN; else myuseritem->type = QAUL_USERTYPE_HIDDEN; if(QAUL_DEBUG) printf("Qaullib_UserAdd added: %s\n", name); }
// ------------------------------------------------------------ void Qaullib_User_LL_IpTouch (union olsr_ip_addr *ip, float linkcost) { struct qaul_user_LL_node mynode; struct qaul_user_LL_item *new_item; Qaullib_User_LL_InitNodeWithIP(&mynode, ip); int ip_exists; ip_exists = 0; while(Qaullib_User_LL_NextItem(&mynode)) { if(memcmp(&mynode.item->ip, ip, qaul_ip_size) == 0) { // check if it is a real user if(mynode.item->type != QAUL_USERTYPE_WEB_KNOWN) { ip_exists = 1; mynode.item->time = time(NULL); // if user exists: update lastseen_at if(mynode.item->changed >= QAUL_USERCHANGED_DELETED) { if(mynode.item->type == QAUL_USERTYPE_KNOWN) mynode.item->changed = QAUL_USERCHANGED_MODIFIED; else mynode.item->changed = QAUL_USERCHANGED_UNCHANGED; } // set link cost if(linkcost > 20.0) { // delete this user if(mynode.item->changed < QAUL_USERCHANGED_DELETED) mynode.item->changed = QAUL_USERCHANGED_DELETED; } else { if( mynode.item->changed >= QAUL_USERCHANGED_DELETED && linkcost <= 10.0) { mynode.item->changed = QAUL_USERCHANGED_MODIFIED; } else if(Qaullib_UserLinkcost2Img(mynode.item->lq) != Qaullib_UserLinkcost2Img(linkcost)) { mynode.item->changed = QAUL_USERCHANGED_MODIFIED; } } } // update link cost mynode.item->lq = linkcost; } } // create new entry if none exists if(ip_exists == 0) { new_item = Qaullib_User_LL_Add (ip, 0); new_item->lq = linkcost; } return; }