INDI::BaseDevice * INDI::BaseClientQt::findDev (XMLEle * root, int create, char * errmsg) { XMLAtt * ap; INDI::BaseDevice * dp; char * dn; /* get device name */ ap = findXMLAtt (root, "device"); if (!ap) { snprintf(errmsg, MAXRBUF, "No device attribute found in element %s", tagXMLEle(root)); return (NULL); } dn = valuXMLAtt(ap); if (*dn == '\0') { snprintf(errmsg, MAXRBUF, "Device name is empty! %s", tagXMLEle(root)); return (NULL); } dp = findDev(dn, errmsg); if (dp) return dp; /* not found, create if ok */ if (create) return (addDevice (root, errmsg)); snprintf(errmsg, MAXRBUF, "INDI: <%s> no such device %s", tagXMLEle(root), dn); return NULL; }
int main (int argc, char** argv) { struct usb_device *dev; if (argc < 2) { perr ("Should be called with one argument: 'read' or 'delete'\n", 2); } while (1) { if ((dev = findDev(0x0e6a, 0x0101)) == NULL) { perr ("Waiting for device...\n", 0); } else { break; } usleep (300000); } usb_dev_handle *hdl = open_device (dev); if (!strcmp(argv[1], "read")) { readData (hdl); } else if (!strcmp(argv[1], "delete")) { deleteData (hdl); } else { perr ("Invalid command line argument.\n", 3); } close_device (hdl); return 0; }
/* delete the property in the given device, including widgets and data structs. * when last property is deleted, delete the device too. * if no property name attribute at all, delete the whole device regardless. * return 0 if ok, else -1 with reason in errmsg[]. */ int INDI::BaseClientQt::delPropertyCmd (XMLEle * root, char * errmsg) { XMLAtt * ap; INDI::BaseDevice * dp; /* dig out device and optional property name */ dp = findDev (root, 0, errmsg); if (!dp) return INDI_DEVICE_NOT_FOUND; dp->checkMessage(root); ap = findXMLAtt (root, "name"); /* Delete property if it exists, otherwise, delete the whole device */ if (ap) { INDI::Property * rProp = dp->getProperty(valuXMLAtt(ap)); removeProperty(rProp); int errCode = dp->removeProperty(valuXMLAtt(ap), errmsg); return errCode; } // delete the whole device else return deleteDevice(dp->getDeviceName(), errmsg); }
SelectDevice::SelectDevice(QWidget *parent) : QDialog(parent), ui(new Ui::SelectDevice) { ui->setupUi(this); handle = NULL; findDev(); }
/* a general message command received from the device. * return 0 if ok, else -1 with reason in errmsg[]. */ int INDI::BaseClientQt::messageCmd (XMLEle * root, char * errmsg) { INDI::BaseDevice * dp =findDev (root, 0, errmsg); if (dp) dp->checkMessage(root); return (0); }
int INDI::BaseClientQt::dispatchCommand(XMLEle * root, char * errmsg) { if (!strcmp (tagXMLEle(root), "message")) return messageCmd(root, errmsg); else if (!strcmp (tagXMLEle(root), "delProperty")) return delPropertyCmd(root, errmsg); // Just ignore any getProperties we might get else if (!strcmp (tagXMLEle(root), "getProperties")) return INDI_PROPERTY_DUPLICATED; /* Get the device, if not available, create it */ INDI::BaseDevice * dp = findDev (root, 1, errmsg); if (dp == NULL) { strcpy(errmsg,"No device available and none was created"); return INDI_DEVICE_NOT_FOUND; } // FIXME REMOVE THIS // Ignore echoed newXXX and getProperties if (strstr(tagXMLEle(root), "new") ||strstr(tagXMLEle(root), "getProperties")) return 0; if ((!strcmp (tagXMLEle(root), "defTextVector")) || (!strcmp (tagXMLEle(root), "defNumberVector")) || (!strcmp (tagXMLEle(root), "defSwitchVector")) || (!strcmp (tagXMLEle(root), "defLightVector")) || (!strcmp (tagXMLEle(root), "defBLOBVector"))) return dp->buildProp(root, errmsg); else if (!strcmp (tagXMLEle(root), "setTextVector") || !strcmp (tagXMLEle(root), "setNumberVector") || !strcmp (tagXMLEle(root), "setSwitchVector") || !strcmp (tagXMLEle(root), "setLightVector") || !strcmp (tagXMLEle(root), "setBLOBVector")) return dp->setValue(root, errmsg); return INDI_DISPATCH_ERROR; }
void overwriteProc(XtPointer fsel, int conf) { SelFileNamesRec *fnames = (SelFileNamesRec *) fsel; char to[MAXPATHLEN], from[MAXPATHLEN]; String errstr; struct stat tolstats; size_t len; int devto, devfrom, deverr = -1, res; switch (conf) { case CANCEL: fnames->first = fnames->n_sel; break; case ALL: fnames->conf_ovwr = False; case YES: switch (fnames->op) { case COPY: errstr = "Error copying"; break; case MOVE: errstr = "Error moving"; break; default: errstr = "Error creating symlink to"; } strcpy(from, fnames->directory); if (from[(len = strlen(from)) - 1] != '/') strcat(from, "/"); strcat(from, fnames->names[fnames->first]); strcpy(to, fnames->target); devfrom = findDev(from); if (mountDev(devto = findDev(to), False)) deverr = devto; else if (mountDev(devfrom, False)) deverr = devfrom; if (deverr != -1) { error(fnames->shell, "Cannot mount device on", mntable.devices[deverr].def_mpoint); fnames->first = fnames->n_sel; umountDev(devto, False); break; } if (fnames->dirtarget) strcat(to, fnames->names[fnames->first]); if (!(lstat(to, &tolstats))) { if (fnames->op != COPY && S_ISDIR(tolstats.st_mode)) rdelete(to); else if (fnames->op == LINK || (fnames->op == MOVE && S_ISLNK(tolstats.st_mode))) { unlink(to); fnames->update = True; } } switch (fnames->op) { case COPY: rcopy(from, to, False); res = 0; break; case MOVE: res = movefile(from, to); break; default: res = makeLink(from, to); } if (res) { if (opError(fnames->shell, errstr, from) != YES) { fnames->first = fnames->n_sel; break; } } else fnames->update = True; umountDev(devto, False); umountDev(devfrom, False); case NO: fnames->first++; } moveFilesProc(fsel, YES); }
void moveFilesProc(XtPointer fsel, int conf) { SelFileNamesRec *fnames = (SelFileNamesRec *) fsel; struct stat tostats, tolstats, frstats; char from[MAXPATHLEN], to[MAXPATHLEN]; String name, cwd; String op_name, from_err, to_err; size_t toend, fromend; int devto, devfrom, deverr = -1, i, perm, res; Boolean is_dir, is_link; if (conf != YES || !fnames->op) { freeSelFiles(fnames); return; } if (chdir(fnames->directory)) { sysError(fnames->shell, "System error:"); freeSelFiles(fnames); return; } chdir(user.home); switch (fnames->op) { case COPY: op_name = "Copy:"; from_err = "Error copying"; to_err = "Error copying to"; break; case MOVE: op_name = "Move:"; from_err = "Error moving"; to_err = "Error moving to"; break; default: /* i.e. LINK */ op_name = "Link:"; from_err = "Error creating symlink to"; to_err = "Error creating symlink in"; } if (fnames->target[0] != '/' && fnames->target[0] != '~' && fnames->target != 0) { strcpy(to, fnames->directory); if (to[strlen(to)-1] != '/') strcat(to, "/"); } else to[0] = 0; strcat(to, fnames->target); fnexpand(to); if (!(cwd = absolutePath(to))) { error(fnames->shell, no_target, to); freeSelFiles(fnames); return; } strcpy(to, cwd); XTFREE(cwd); fromend = strlen(strcpy(from, fnames->directory)); if (from[fromend-1] != '/') { from[fromend++] = '/'; from[fromend] = 0; } devfrom = findDev(from); if (mountDev(devto = findDev(to), False)) deverr = devto; else if (mountDev(devfrom, False)) deverr = devfrom; if (deverr != -1) { error(fnames->shell, "Cannot mount device on", mntable.devices[deverr].def_mpoint); umountDev(devto, False); freeSelFiles(fnames); return; } if (!(stat(to, &tostats)) && S_ISDIR(tostats.st_mode)) { if (chdir(to) || !(perm = permission(&tostats, P_WRITE))) { chdir(user.home); if (!perm) error(fnames->shell, "You have no write permission for ", to); else sysError(fnames->shell, "System error:"); umountDev(devto, False); umountDev(devfrom, False); freeSelFiles(fnames); return; } chdir(user.home); fnames->dirtarget = True; toend = strlen(to); if (to[toend-1] != '/') { to[toend++] = '/'; to[toend] = 0; } } else if (fnames->n_sel == 1) fnames->dirtarget = False; else { error(fnames->shell, op_name, "Target for multiple files must be a folder"); umountDev(devto, False); umountDev(devfrom, False); freeSelFiles(fnames); return; } if (!fnames->first) zzz(); XTFREE(fnames->target); fnames->target = XtNewString(to); for (i = fnames->first; i < fnames->n_sel; i++) { name = fnames->names[i]; if (fnames->op != LINK && (!strcmp(name, ".") || !strcmp(name, ".."))) { error(fnames->shell, "Cannot move or copy . or ..", NULL); continue; } strcpy(from+fromend, name); if (fnames->dirtarget) { if (fnames->op != LINK && prefix(from, to)) { String err_str, format = "Cannot move or copy %s to"; err_str = (String) XtMalloc((strlen(format) + strlen(from)) * sizeof(char)); sprintf(err_str, format, from); error(fnames->shell, err_str, to); XTFREE(err_str); umountDev(devto, False); umountDev(devfrom, False); freeSelFiles(fnames); wakeUp(); return; } strcpy(to+toend, name); } if (!(lstat(to, &tolstats))) { fnames->first = i; is_dir = False; if (!(stat(to, &tostats))) { if (S_ISDIR(tostats.st_mode)) is_dir = True; if (!stat(from, &frstats) && tostats.st_ino == frstats.st_ino) { error(fnames->shell, op_name, "Source and destination are identical"); umountDev(devto, False); umountDev(devfrom, False); freeSelFiles(fnames); wakeUp(); return; } } if (S_ISLNK(tolstats.st_mode)) is_link = True; else is_link = False; if (fnames->conf_ovwr || (is_dir && (!is_link || fnames->op == COPY) && resources.confirm_delete_folder)) overwriteDialog(fnames, to, (fnames->op == COPY && is_dir && (lstat(from, &frstats) || !S_ISDIR(frstats.st_mode)))? "File copy:" : op_name, is_dir && (!is_link || fnames->op == COPY)); else overwriteProc(fsel, YES); umountDev(devto, False); umountDev(devfrom, False); return; } switch (fnames->op) { case COPY: rcopy(from, to, False); res = 0; break; case MOVE: res = movefile(from, to); break; default: res = makeLink(from, to); } if (res) { if (opError(fnames->shell, from_err, name) != YES) break; } else fnames->update = True; } umountDev(devto, False); umountDev(devfrom, False); if (fnames->update) { if (fnames->op == COPY) intUpdate(CHECK_DIR); /* Check for new subdirectories */ if (fnames->op == MOVE) markForUpdate(fnames->directory, CHECK_FILES); markForUpdate(to, RESHOW); if (fnames->op != COPY) intUpdate(CHECK_DIR); } freeSelFiles(fnames); wakeUp(); }