browser.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:10k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1993-1997, Silicon Graphics, Inc.
  3.  * ALL RIGHTS RESERVED 
  4.  * Permission to use, copy, modify, and distribute this software for 
  5.  * any purpose and without fee is hereby granted, provided that the above
  6.  * copyright notice appear in all copies and that both the copyright notice
  7.  * and this permission notice appear in supporting documentation, and that 
  8.  * the name of Silicon Graphics, Inc. not be used in advertising
  9.  * or publicity pertaining to distribution of the software without specific,
  10.  * written prior permission. 
  11.  *
  12.  * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
  13.  * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
  14.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
  15.  * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
  16.  * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
  17.  * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
  18.  * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
  19.  * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
  20.  * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
  21.  * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
  22.  * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
  23.  * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
  24.  * 
  25.  * US Government Users Restricted Rights 
  26.  * Use, duplication, or disclosure by the Government is subject to
  27.  * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
  28.  * (c)(1)(ii) of the Rights in Technical Data and Computer Software
  29.  * clause at DFARS 252.227-7013 and/or in similar or successor
  30.  * clauses in the FAR or the DOD or NASA FAR Supplement.
  31.  * Unpublished-- rights reserved under the copyright laws of the
  32.  * United States.  Contractor/manufacturer is Silicon Graphics,
  33.  * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
  34.  *
  35.  * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
  36.  */
  37. #include <stdio.h>
  38. #include <GL/glut.h>
  39. #include <mui/mui.h>
  40. #include <dirent.h>
  41. #include <string.h>
  42. #include <sys/stat.h>
  43. #include <unistd.h>
  44. #include <stdlib.h>
  45. #include <mui/browser.h>
  46. #define MAXFILES 400
  47. char *filelist[MAXFILES];
  48. char err[80];
  49. char *dot = ".";
  50. char *dotdot = "..";
  51. char directory[300], originaldir[300];
  52. struct stat d, dd;
  53. struct dirent *dir;
  54. DIR *file;
  55. int off;
  56. extern int mui_singlebuffered;
  57. int selectedfile = -1;
  58. int cd(char *s);
  59. void pwd(void);
  60. void ls(void);
  61. extern void settlstrings(muiObject *obj, char **s);
  62. void settltop(muiObject *obj, int top);
  63. muiObject *tl, *vs, *l4;
  64. void writeoutputfile(char *dir, char *file)
  65. {
  66.     FILE *f;
  67.     f = fopen(BROWSEFILE, "w");
  68.     fprintf(f, "D:%sn", dir);
  69.     if (file)
  70. fprintf(f, "F:%sn", file);
  71.     fclose(f);
  72. }
  73. void controltltop(muiObject *obj, enum muiReturnValue value)
  74. {
  75.     float sliderval;
  76.     if ((value != MUI_SLIDER_RETURN) && (value != MUI_SLIDER_THUMB)) return;
  77.     sliderval = muiGetVSVal(obj);
  78.     muiSetTLTop(tl, sliderval);
  79. }
  80. void handlefileselection(muiObject *obj, enum muiReturnValue value)
  81. {
  82.     char *fname;
  83.     int len;
  84.     if (value == MUI_TEXTLIST_RETURN_CONFIRM) {
  85. selectedfile = muiGetTLSelectedItem(obj);
  86. fname = filelist[selectedfile];
  87. len = strlen(fname);
  88. if (fname[len-1] == '/') {
  89.     fname[len-1] = 0;
  90.     cd(fname);
  91.     return;
  92. } else {
  93.     writeoutputfile(directory, fname);
  94.     exit(0);
  95. }
  96.     }
  97.     if (value != MUI_TEXTLIST_RETURN) return;
  98.     selectedfile = muiGetTLSelectedItem(obj);
  99.     muiSetVSValue(vs, 1.0);
  100. }
  101. void handleaccept(muiObject *obj, enum muiReturnValue value)
  102. {
  103.     char *fname;
  104.     int len;
  105.     if (value != MUI_BUTTON_PRESS) return;
  106.     if (selectedfile == -1) return;
  107.     fname = filelist[selectedfile];
  108.     len = strlen(fname);
  109.     if (fname[len-1] == '/') {
  110. fname[len-1] = 0;
  111. cd(fname);
  112. return;
  113.     } else {
  114. writeoutputfile(directory, fname);
  115. exit(0);
  116.     }
  117.     obj = 0; /* for lint's sake */
  118. }
  119. void handleoriginal(muiObject *obj, enum muiReturnValue value)
  120. {
  121.     if (value != MUI_BUTTON_PRESS) return;
  122.     cd(originaldir);
  123.     obj = 0; /* for lint's sake */
  124. }
  125. void handleupdir(muiObject *obj, enum muiReturnValue value)
  126. {
  127.     if (value != MUI_BUTTON_PRESS) return;
  128.     cd("..");
  129.     obj = 0; /* for lint's sake */
  130. }
  131. void handlecancel(muiObject *obj, enum muiReturnValue value)
  132. {
  133.     if (value != MUI_BUTTON_PRESS) return;
  134.     writeoutputfile(directory, 0);
  135.     exit(0);
  136.     obj = 0; /* for lint's sake */
  137. }
  138. void handletextbox(muiObject *obj, enum muiReturnValue value)
  139. {
  140.     char *s, *slash;
  141.     if (value != MUI_TEXTBOX_RETURN) return;
  142.     s = muiGetTBString(obj);
  143.     if (0 == chdir(s)) {
  144. pwd();
  145. ls();
  146. settlstrings(tl, filelist);
  147. selectedfile = 0;
  148. muiChangeLabel(l4, directory);
  149. muiClearTBString(obj);
  150. return;
  151.     }
  152.     /* hack up the path, if any */
  153.     slash = strrchr(s, '/');
  154.     if (slash == 0) {
  155. slash = s-1; /* to make filename == slash+1 */
  156.     } else {
  157. if (*s == '/') { /* absolute path */
  158.     strncpy(directory, s, slash-s);
  159.     directory[slash-s] = 0;
  160. } else {
  161.     strcat(directory, "/");
  162.     strncat(directory, s, slash-s);
  163. }
  164.     }
  165.      /* now filename == slash+1 */
  166.     writeoutputfile(directory, slash+1);
  167.     exit(0);
  168. }
  169. #define THUMBHEIGHT 20
  170. #define ARROWSPACE 40
  171. void maketestui(void)
  172. {
  173.     muiObject *l1, *l2, *l3, *b1, *b2, *b3, *b4, *t;
  174.     int xmin, ymin, xmax, ymax;
  175.     muiNewUIList(1);
  176.     l1 = muiNewBoldLabel(10, 475, "Directory:");
  177.     muiAddToUIList(1, l1);
  178.     l4 = muiNewLabel(80, 475, "./");
  179.     muiAddToUIList(1, l4);
  180.     l2 = muiNewBoldLabel(10, 430, "Set directory:");
  181.     muiAddToUIList(1, l2);
  182.     b1 = muiNewButton(10, 100, 390, 415);
  183.     muiLoadButton(b1, "Up");
  184.     muiAddToUIList(1, b1);
  185.     muiSetCallback(b1, handleupdir);
  186.     b2 = muiNewButton(10, 100, 355, 380);
  187.     muiLoadButton(b2, "Original");
  188.     muiAddToUIList(1, b2);
  189.     muiSetCallback(b2, handleoriginal);
  190.     tl = muiNewTextList(120, 80, 370, 22);
  191.     muiAddToUIList(1, tl);
  192.     muiGetObjectSize(tl, &xmin, &ymin, &xmax, &ymax);
  193.     vs = muiNewVSlider(xmax, ymin+2, ymax, 0, THUMBHEIGHT);
  194.     muiSetVSValue(vs, 1.0);
  195.     muiSetVSArrowDelta(vs, 10);
  196.     muiAddToUIList(1, vs);
  197.     t = muiNewTextbox(120, 390, 40);
  198.     muiSetActive(t, 1);
  199.     muiAddToUIList(1, t);
  200.     muiSetCallback(t, handletextbox);
  201.     l3 = muiNewBoldLabel(40, 50, "Open File:");
  202.     muiAddToUIList(1, l3);
  203.     b3 = muiNewButton(130, 230, 9, 34);
  204.     muiLoadButton(b3, "Accept");
  205.     muiSetCallback(b3, handleaccept);
  206.     muiAddToUIList(1, b3);
  207.     b4 = muiNewButton(250, 350, 9, 34);
  208.     muiLoadButton(b4, "Cancel");
  209.     muiSetCallback(b4, handlecancel);
  210.     muiAddToUIList(1, b4);
  211.     muiSetCallback(vs, controltltop);
  212.     muiSetCallback(tl, handlefileselection);
  213.     
  214.     cd(directory);
  215.     strcpy(originaldir, directory);
  216. }
  217. void main(int argc, char **argv)
  218. {
  219.     FILE *f;
  220.     f = fopen(BROWSEFILE, "r");
  221.     parsebrowsefile(f);
  222.     fclose(f);
  223.     strcpy(directory, currentdirectoryname);
  224.     maketestui();
  225.     glutInit(&argc, argv);
  226.     if (argc > 1) mui_singlebuffered = 1;
  227.     glutInitWindowPosition(xcenter-200, ycenter-250);
  228.     glutInitWindowSize(400, 500);
  229.     if (mui_singlebuffered)
  230. glutInitDisplayMode( GLUT_RGB | GLUT_SINGLE );
  231.     else
  232. glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
  233.     glutCreateWindow("browser");
  234.     muiInit();
  235.     glutMainLoop();
  236. }
  237. void errormsg(char *s)
  238. {
  239.     fprintf(stderr, "%sn", s);
  240. }
  241. void prname(void)
  242. {
  243. directory[0] = '/';
  244. if (off == 0)
  245. off = 1;
  246. directory[off] = 0;
  247. }
  248. int dirlevels(char *s)
  249. {
  250.     int levels;
  251.     for (levels = 0; *s; s++)
  252. if (*s == '/')
  253.     levels++;
  254.     return(levels);
  255. }
  256. int cat(void)
  257. {
  258. register i, j;
  259. char *name = directory + 1; /* I love C */
  260. i = -1;
  261. while (dir->d_name[++i] != 0) 
  262. if ((off+i+2) > MAXNAMLEN - 1) {
  263. prname();
  264. return 1;
  265. }
  266. for(j=off+1; j>=0; --j)
  267. name[j+i+1] = name[j];
  268. off=i+off+1;
  269. name[i] = '/';
  270. for(--i; i>=0; --i)
  271. name[i] = dir->d_name[i];
  272. return 0;
  273. }
  274. /* get the current working directory (the following 3 routines are from pwd.c) */
  275. void pwd(void)
  276. {
  277. for(off = 0;;) {
  278. if(stat(dot, &d) < 0) {
  279. fprintf(stderr, "pwd: cannot stat .!n");
  280. exit(2);
  281. }
  282. if ((file = opendir(dotdot)) == NULL) {
  283. fprintf(stderr,"pwd: cannot open ..n");
  284. exit(2);
  285. }
  286. if(fstat(file->dd_fd, &dd) < 0) {
  287. fprintf(stderr, "pwd: cannot stat ..!n");
  288. exit(2);
  289. }
  290. if(chdir(dotdot) < 0) {
  291. fprintf(stderr, "pwd: cannot chdir to ..n");
  292. exit(2);
  293. }
  294. if(d.st_dev == dd.st_dev) {
  295. if(d.st_ino == dd.st_ino) {
  296. prname();
  297. chdir(directory);
  298. return;
  299. }
  300. do
  301. if ((dir = readdir(file)) == NULL) {
  302. fprintf(stderr, "pwd: read error in ..n");
  303. exit(2);
  304. }
  305. while (dir->d_ino != d.st_ino);
  306. }
  307. else do {
  308. if((dir = readdir(file)) == NULL) {
  309. fprintf(stderr, "pwd: read error in ..n");
  310. exit(2);
  311. }
  312. stat(dir->d_name, &dd);
  313. } while(dd.st_ino != d.st_ino || dd.st_dev != d.st_dev);
  314. (void)closedir(file);
  315. if (cat()) {
  316. chdir(directory);
  317. return;
  318. }
  319. }
  320. }
  321. void freels(void)
  322. {
  323.     char **p;
  324.     p = filelist;
  325.     while (*p != 0) {
  326. free(*p);
  327. *p = 0;
  328. p++;
  329.     }
  330. }
  331. int mystrcmp(char **s1, char **s2)
  332. {
  333.     return strcmp(*s1,*s2);
  334. }
  335. void ls(void)
  336. {
  337.     DIR *dirp;
  338.     int i = 0;
  339.     int len;
  340.     struct dirent *dir;
  341.     struct stat statbuf;
  342.     
  343.     if ((dirp = opendir(directory)) == NULL) {
  344. errormsg("bad directoryn");
  345. return;
  346.     }
  347.     freels();
  348.     chdir(directory);
  349.     while ((dir = readdir(dirp)) != NULL) {
  350. if (dir->d_name[0] == '.')
  351.     continue;
  352. /*f = open(dir->d_name, O_RDONLY);
  353. if (!f) 
  354.     continue;
  355. if (!okfiletype(getfiletype(f)))
  356.     continue;
  357. close(f);*/
  358. stat(dir->d_name,&statbuf);
  359. len = strlen(dir->d_name) + 1 + (statbuf.st_mode & S_IFDIR? 1 : 0);
  360. filelist[i] = (char *)malloc(len);
  361. strcpy(filelist[i], dir->d_name);
  362. if (statbuf.st_mode & S_IFDIR) {
  363.     filelist[i][len-2] = '/'; filelist[i][len-1] = 0;
  364. }
  365. i++;
  366.     }
  367.     filelist[i] = 0;
  368.     qsort(&filelist[0], i, sizeof (char *), (int (*)(const void *, const void *))mystrcmp);
  369.     closedir(dirp);
  370. }
  371. int cd(char *s)
  372. {
  373.     if(chdir(s) < 0) {
  374. fprintf(stderr,"cannot open %sn",s);
  375. return -1;
  376.     }
  377.     pwd();
  378.     ls();
  379.     settlstrings(tl, filelist);
  380.     muiChangeLabel(l4, directory);
  381.     selectedfile = 0;
  382.     return 0;
  383. }