bool houseDataStructure::addDevice(const QString &roomName, const QString &deviceName, devices::DeviceDirection direction, devices::DeviceType type, devices::DeviceSubType subType, double value, int chipID, int esp8266Pin) { // already have a device with this name in this room if (deviceExists(roomName, deviceName)) { Q_EMIT message(tr("houseDataStructure: The device '%1' already exists in room '%2'").arg(deviceName, roomName), utils::SoftwareError); return false; } // chip id valid? if (chipID <= 1000) { Q_EMIT message(tr("houseDataStructure: The chip ID '%1' is invalid").arg(chipID), utils::SoftwareError); return false; } if (gpioInUse(chipID, esp8266Pin)) { Q_EMIT message(tr("houseDataStructure: The pin '%1' is already in use in the chip n'%2'").arg(esp8266Pin, chipID), utils::SoftwareError); return false; } // test types compatibility if (!devices::typeCompatible(direction, type)) { Q_EMIT message(tr("houseDataStructure: The type '%1' is not valid in regard to the pin direction '%2'").arg(type, direction), utils::SoftwareError); return false; } if (!devices::subTypeCompatible(type, subType)) { Q_EMIT message(tr("houseDataStructure: The sub type '%1' is not valid in regard to the type '%2'").arg(subType, type), utils::SoftwareError); return false; } // retrieve room if (!roomExists(roomName)) { Q_EMIT message(tr("houseDataStructure: The room to remove '%1' does not exists").arg(roomName), utils::SoftwareError); return false; } int idx = roomIndex(roomName); if (idx == -1) { Q_EMIT message(tr("houseDataStructure: The room '%1' could not be retreived from the list of rooms").arg(roomName), utils::SoftwareError); return false; } Room *currentRoom = m_rooms.at(idx); //add device to the room Device *dev = new Device(deviceName, direction, type, subType, value, chipID, esp8266Pin); if (!dev->isValid()) { Q_EMIT message(tr("houseDataStructure: The device '%1' is not valid").arg(deviceName), utils::SoftwareError); return false; } currentRoom->devices.append(dev); return true; }
bool houseDataStructure::addRoom(const QString &roomName) { if (roomName.isEmpty()) { Q_EMIT message(tr("houseDataStructure: The room must have a name."), utils::SoftwareError); return false; } if (roomExists(roomName)) { Q_EMIT message(tr("houseDataStructure: The room to add '%1' already exists").arg(roomName), utils::SoftwareError); return false; } Room *newRoom = new Room(roomName); m_rooms.append(newRoom); Q_EMIT message(tr("houseDataStructure: The room '%1' was added to the house structure").arg(roomName), utils::Success); }
bool houseDataStructure::removeRoom(const QString &roomName) { if (!roomExists(roomName)) { Q_EMIT message(tr("houseDataStructure: The room to remove '%1' does not exists").arg(roomName), utils::SoftwareError); return false; } const int idx = roomIndex(roomName); if (idx == -1) { Q_EMIT message(tr("houseDataStructure: The room '%1' could not be retreived from the list of rooms").arg(roomName), utils::SoftwareError); return false; } delete m_rooms.takeAt(idx); Q_EMIT message(tr("houseDataStructure: The room '%1' was removed from the house structure").arg(roomName), utils::Success); }
/* -------------------------------------------------------------------- */ void hallfunc(void) { label roomname; int roomslot; getString("room name", roomname, NAMESIZE, FALSE, ECHO, ""); roomslot = roomExists(roomname); if (roomslot == ERROR) roomslot = partialExist(roomname); if ((roomslot) == ERROR || !strlen(roomname) ) { mPrintf("\n No %s room", roomname); return; } xhallfunc(roomslot, 0, FALSE); putHall(); }
int houseDataStructure::deviceIndex(const QString &roomName, const QString &name) { if (!roomExists(roomName)) { Q_EMIT message(tr("houseDataStructure: The room to remove '%1' does not exists").arg(roomName), utils::SoftwareError); return false; } int idx = roomIndex(roomName); if (idx == -1) { Q_EMIT message(tr("houseDataStructure: The room '%1' could not be retreived from the list of rooms").arg(roomName), utils::SoftwareError); return false; } const Room *currentRoom = m_rooms.at(idx); for (int i = 0; i < currentRoom->devices.count(); ++i) { const Device *currentDevice = currentRoom->devices.at(i); if (currentDevice->name == name) { return i; } } return -1; }
void renameRoom(void) { char pathname[64]; char summary[500]; label roomname; label oldname; label groupname; char line[80]; char waspublic; int groupslot; char description[13]; int roomslot; BOOL prtMess = TRUE; BOOL quit = FALSE; int c; char oldEcho; strcpy(oldname,roomBuf.rbname); if (!roomBuf.rbflags.MSDOSDIR) { roomBuf.rbdirname[0] = '\0'; } doCR(); do { if (prtMess) { doCR(); outFlag = OUTOK; mPrintf("<3N0> Name.............. %s", roomBuf.rbname); doCR(); mPrintf("<3I0> Infoline.......... %s", roomBuf.descript); doCR(); mPrintf("<3D0> Directory......... %s", roomBuf.rbflags.MSDOSDIR ? roomBuf.rbdirname : "None"); doCR(); mPrintf("<3L0> Application....... %s", roomBuf.rbflags.APLIC ? roomBuf.rbaplic : "None"); doCR(); mPrintf("<3F0> Description File.. %s", roomBuf.rbroomtell[0] ? roomBuf.rbroomtell : "None"); doCR(); mPrintf("<3G0> Access Group...... %s", roomBuf.rbflags.GROUPONLY ? grpBuf.group[roomBuf.rbgrpno].groupname : "None"); doCR(); mPrintf("<3V0> PriVileges Group.. %s", roomBuf.rbflags.PRIVGRP ? grpBuf.group[roomBuf.rbPgrpno].groupname : "None"); doCR(); if (roomBuf.rbflags.PRIVGRP) { mPrintf(" Download only..... %s", roomBuf.rbflags.DOWNONLY ? "Yes" : "No" ); doCR(); mPrintf(" Upload only....... %s", roomBuf.rbflags.UPONLY ? "Yes" : "No" ); doCR(); mPrintf(" Read Only......... %s", roomBuf.rbflags.READONLY ? "Yes" : "No" ); doCR(); mPrintf(" Group moderates... %s", roomBuf.rbflags.GRP_MOD ? "Yes" : "No" ); doCR(); } mPrintf("<3H0> Hidden............ %s", roomBuf.rbflags.PUBLIC ? "No" : "Yes" ); doCR(); mPrintf("<3Y0> Anonymous......... %s", roomBuf.rbflags.ANON ? "Yes" : "No" ); doCR(); mPrintf("<3O0> BIO............... %s", roomBuf.rbflags.BIO ? "Yes" : "No" ); doCR(); mPrintf("<3M0> Moderated......... %s", roomBuf.rbflags.MODERATED ? "Yes" : "No" );doCR(); #ifdef NETWORK mPrintf("<3E0> Networked/Shared.. %s", roomBuf.rbflags.SHARED ? "Yes" : "No" ); doCR(); if (roomBuf.rbflags.SHARED) { mPrintf ("<3W0> Shared With....... ") ; messWithShareList (SHORT_SEE_NO_MODIFY, oldname) ; doCR() ; } #endif /* NETWORK */ mPrintf("<3P0> Permanent......... %s", roomBuf.rbflags.PERMROOM ? "Yes" : "No" ); doCR(); mPrintf("<3U0> Subject........... %s", roomBuf.rbflags.SUBJECT ? "Yes" : "No" ); doCR(); doCR(); mPrintf("<3S0> to save, <3A0> to abort."); doCR(); prtMess = (BOOL)(!expert); } outFlag = IMPERVIOUS; doCR(); mPrintf("2Change:0 "); oldEcho = echo; echo = NEITHER; c = iChar(); echo = oldEcho; if (!CARRIER) return; switch(toupper(c)) { case 'L': mPrintf("Application"); doCR(); if (sysop && onConsole) { if ( getYesNo("Application", (uchar)(roomBuf.rbflags.APLIC) ) ) { getString("Application filename", description, 13, FALSE, ECHO, (roomBuf.rbaplic[0]) ? roomBuf.rbaplic : ""); strcpy(roomBuf.rbaplic, description); roomBuf.rbflags.APLIC = TRUE; } else { roomBuf.rbaplic[0] = '\0'; roomBuf.rbflags.APLIC = FALSE; } } else { mPrintf("Must be Sysop at console to enter application."); doCR(); } break; case 'N': mPrintf("Name"); doCR(); getString("New room name", roomname, NAMESIZE, FALSE, ECHO, roomBuf.rbname); normalizeString(roomname); roomslot = roomExists(roomname); if (roomslot >= 0 && roomslot != thisRoom) { mPrintf("A \"%s\" room already exists.\n", roomname); } else { strcpy(roomBuf.rbname, roomname); /* also in room itself */ } break; case 'I': mPrintf("Info-line \n "); getNormStr("New room Info-line", roomBuf.descript, 79, ECHO); break; case 'D': mPrintf("Directory"); doCR(); if (sysop) { if (getYesNo("Directory room", (uchar)roomBuf.rbflags.MSDOSDIR)) { roomBuf.rbflags.MSDOSDIR = TRUE; if (!roomBuf.rbdirname[0]) mPrintf(" No drive and path"); else mPrintf(" Now space %s",roomBuf.rbdirname); doCR(); getString("Path", pathname, 63, FALSE, ECHO, (roomBuf.rbdirname[0]) ? roomBuf.rbdirname : cfg.dirpath); pathname[0] = (char)toupper(pathname[0]); doCR(); mPrintf("Checking pathname \"%s\"", pathname); doCR(); if (directory_l(pathname) && !onConsole) { logBuf.VERIFIED = TRUE; sprintf(msgBuf->mbtext, "Security violation on dirctory %s by %s\n " "User unverified.", pathname, logBuf.lbname); aideMessage(); doCR(); mPrintf("Security violation, your account is being " "held for sysop's review"); doCR(); Hangup(); getRoom(thisRoom); return; } if (changedir(pathname) != -1) { mPrintf(" Now space %s", pathname); doCR(); strcpy(roomBuf.rbdirname, pathname); } else { mPrintf("%s does not exist! ", pathname); if (getYesNo("Create", 0)) { if (mkdir(pathname) == -1) { mPrintf("mkdir() ERROR!"); strcpy(roomBuf.rbdirname, cfg.temppath); } else { strcpy(roomBuf.rbdirname, pathname); mPrintf(" Now space %s",roomBuf.rbdirname); doCR(); } } else { strcpy(roomBuf.rbdirname, cfg.temppath); } } if (roomBuf.rbflags.PRIVGRP && roomBuf.rbflags.MSDOSDIR) { roomBuf.rbflags.DOWNONLY = getYesNo("Download only", (uchar)roomBuf.rbflags.DOWNONLY); if (!roomBuf.rbflags.DOWNONLY) { roomBuf.rbflags.UPONLY = getYesNo("Upload only", (uchar)roomBuf.rbflags.UPONLY); } } } else { roomBuf.rbflags.MSDOSDIR = FALSE; roomBuf.rbflags.DOWNONLY = FALSE; } changedir(cfg.homepath); } else { doCR(); mPrintf("Must be Sysop to make directories."); doCR(); } break; case 'F': mPrintf("Description File"); doCR(); if (cfg.roomtell && sysop) { if ( getYesNo("Display room description File", (uchar)(roomBuf.rbroomtell[0] != '\0') ) ) { getString("Description Filename", description, 13, FALSE, ECHO, (roomBuf.rbroomtell[0]) ? roomBuf.rbroomtell : ""); strcpy(roomBuf.rbroomtell, description); } else roomBuf.rbroomtell[0] = '\0'; } else { doCR(); mPrintf("Must be Sysop and have Room descriptions configured."); doCR(); } break; case 'G': mPrintf("Access Group"); doCR(); if ((thisRoom > 2) || (thisRoom > 0 && sysop)) { if (getYesNo("Change Group", 0)) { getString("Group for room <CR> for no group", groupname, NAMESIZE, FALSE, ECHO, ""); roomBuf.rbflags.GROUPONLY = TRUE; groupslot = partialgroup(groupname); if (!strlen(groupname) || (groupslot == ERROR) ) { roomBuf.rbflags.GROUPONLY = 0; if (groupslot == ERROR && strlen(groupname)) mPrintf("No such group."); } if (roomBuf.rbflags.GROUPONLY) { roomBuf.rbgrpno = (unsigned char)groupslot; /* roomBuf.rbgrpgen = grpBuf.group[groupslot].groupgen;*/ } } } else { if(thisRoom > 0) { doCR(); mPrintf("Must be Sysop to change group for Mail> or Aide)"); doCR(); } else { doCR(); mPrintf("Lobby> can never be group only"); doCR(); } } break; case 'V': mPrintf("Privileges Group"); doCR(); if (getYesNo("Change Group", 0)) { getString("Group for room <CR> for no group", groupname, NAMESIZE, FALSE, ECHO, ""); roomBuf.rbflags.PRIVGRP = TRUE; groupslot = partialgroup(groupname); if (!strlen(groupname) || (groupslot == ERROR) ) { roomBuf.rbflags.PRIVGRP = FALSE; roomBuf.rbflags.READONLY = FALSE; roomBuf.rbflags.DOWNONLY = FALSE; roomBuf.rbflags.UPONLY = FALSE; roomBuf.rbflags.GRP_MOD = FALSE; if (groupslot == ERROR && strlen(groupname)) mPrintf("No such group."); } if (roomBuf.rbflags.PRIVGRP ) { roomBuf.rbPgrpno = (unsigned char)groupslot; /* roomBuf.rbPgrpgen = grpBuf.group[groupslot].groupgen; */ } } if (roomBuf.rbflags.PRIVGRP) { roomBuf.rbflags.READONLY = getYesNo("Read only", (uchar)roomBuf.rbflags.READONLY); roomBuf.rbflags.GRP_MOD = getYesNo("Group Moderates", (uchar)roomBuf.rbflags.GRP_MOD); if (roomBuf.rbflags.MSDOSDIR) { roomBuf.rbflags.DOWNONLY = getYesNo("Download only", (uchar)roomBuf.rbflags.DOWNONLY); if (!roomBuf.rbflags.DOWNONLY) { roomBuf.rbflags.UPONLY = getYesNo("Upload only", (uchar)roomBuf.rbflags.UPONLY); } } } break; case 'H': mPrintf("Hidden Room"); doCR(); if ((thisRoom > 2) || (thisRoom>0 && sysop)) { waspublic = (uchar)roomBuf.rbflags.PUBLIC; roomBuf.rbflags.PUBLIC = !getYesNo("Hidden room", (uchar)(!roomBuf.rbflags.PUBLIC)); if (waspublic && (!roomBuf.rbflags.PUBLIC)) { roomBuf.rbgen = (uchar)((roomBuf.rbgen +1) % MAXGEN); logBuf.lbroom[thisRoom].lbgen = roomBuf.rbgen; } } else { doCR(); mPrintf("Must be Sysop to make Lobby>, Mail> or Aide) hidden."); doCR(); } break; case 'Y': mPrintf("Anonymous Room"); doCR(); if ((thisRoom > 2) || (thisRoom>0 && sysop)) { roomBuf.rbflags.ANON = getYesNo("Anonymous room", (uchar)(roomBuf.rbflags.ANON)); } else { doCR(); mPrintf("Must be Sysop to make Lobby>, Mail> or Aide) Anonymous."); doCR(); } break; case 'O': mPrintf("BIO Room"); doCR(); if ((thisRoom > 2) || (thisRoom>0 && sysop)) { roomBuf.rbflags.BIO = getYesNo("BIO room", (uchar)(roomBuf.rbflags.BIO)); } else { doCR(); mPrintf("Must be Sysop to make Lobby>, Mail> or Aide) BIO."); doCR(); } break; case 'M': mPrintf("Moderated"); doCR(); if (sysop) { if (getYesNo("Moderated", (uchar)(roomBuf.rbflags.MODERATED) )) roomBuf.rbflags.MODERATED = TRUE; else roomBuf.rbflags.MODERATED = FALSE; } else { doCR(); mPrintf("Must be Sysop to make Moderated rooms."); doCR(); } break; #ifdef NETWORK case 'E': mPrintf("Networked/Shared"); doCR(); if (sysop) { /* Perhaps rooms made shareable should also automatically */ /* become permenant, as well. */ BOOL fShared = (BOOL) roomBuf.rbflags.SHARED ; roomBuf.rbflags.SHARED = getYesNo("Networked/Shared room", (uchar)fShared) ; if ((roomBuf.rbflags.SHARED) && (!fShared)) roomBuf.rbflags.PERMROOM = TRUE ; } else { doCR(); mPrintf("Must be Sysop to make Shared rooms."); doCR(); } break; case 'W': mPrintf ("Shared With"); doCR(); if (roomBuf.rbflags.SHARED) messWithShareList (SEE_WITH_MODIFY, oldname) ; else { doCR() ; mPrintf ("Unshared rooms don't have share lists.") ; doCR() ; } break ; #endif /* NETWORK */ case 'P': mPrintf("Permanent"); doCR(); if (thisRoom > DUMP) { if (!roomBuf.rbflags.MSDOSDIR) { roomBuf.rbflags.PERMROOM = getYesNo("Permanent", (uchar)roomBuf.rbflags.PERMROOM); } else { roomBuf.rbflags.PERMROOM = 1; doCR(); mPrintf("Directory rooms are always Permanent."); doCR(); } } else { doCR(); mPrintf("Lobby> Mail> Aide) or Dump> always Permanent."); doCR(); } break; case 'U': mPrintf("Subject"); doCR(); roomBuf.rbflags.SUBJECT = getYesNo("Ask for subject in room", (uchar)roomBuf.rbflags.SUBJECT); break; case 'S': mPrintf("Save"); doCR(); if (getYesNo("Save changes", FALSE)) { noteRoom(); putRoom(thisRoom); /* trap file line */ sprintf(line, "Room \'%s\' changed to \'%s\' by %s", oldname, roomBuf.rbname, logBuf.lbname); trap(line, T_AIDE); /* Aide room */ formatSummary(summary); sprintf(msgBuf->mbtext, "%s \n%s", line, summary); aideMessage(); return; } break; case 'A': mPrintf("Abort"); doCR(); if (getYesNo("Abort", TRUE)) { getRoom(thisRoom); return; } break; case '\r': case '\n': case '?': mPrintf("Menu"); doCR(); prtMess = TRUE; break; default: mPrintf("%c ? for help", c); doCR(); break; } } while (!quit); }
/* -------------------------------------------------------------------- */ static void makeSendFile(void) { char line[100], line2[100]; label troo; label fn; FILE *file; int i = 0, rm; if ((file = fopen(roomreqin, "rb")) == NULL) { perror("Error opening roomreq.in"); } doccr(); cPrintf(" Fetching:"); doccr(); GetStr(file, troo, LABELSIZE); while(strlen(troo) && !feof(file)) { if ((rm = roomExists(troo)) != ERROR) { if (nodecanseeroom(node.ndname, rm)) { sprintf(fn, "room.%d", i); cPrintf(" %-20s ", troo); if( !((i+1) % 3) ) doccr(); NewRoom(rm, fn); } else { doccr(); cPrintf(" No access to %s room.", troo); doccr(); amPrintf(" '%s' room not available to remote.\n", troo); netError = TRUE; } } else { doccr(); cPrintf(" No %s room on system.", troo); doccr(); amPrintf(" '%s' room not found for remote.\n", troo); netError = TRUE; } i++; GetStr(file, troo, LABELSIZE); } doccr(); fclose(file); unlink(roomreqin); cPrintf(" Copying mail file."); doccr(); sprintf(line, "%s\\%s", cfg.transpath, node.ndmailtmp); sprintf(line2, "%s\\mesg.tmp", cfg.temppath); if ((file = fopen(line2, "wb")) != NULL) { fclose(file); } copyfile(line, line2); cPrintf(" Compressing message files."); doccr(); /* * Zip them up */ sformat(line, node.zip, "df", roomdataout, "mesg.tmp room.*"); apsystem(line); /* * Remove them. */ ambigUnlink("room.*", FALSE); unlink("mesg.tmp"); }