Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Related Pages  

macosxvmdstart.C

Go to the documentation of this file.
00001 /***************************************************************************
00002  *cr
00003  *cr            (C) Copyright 1995-2011 The Board of Trustees of the
00004  *cr                        University of Illinois
00005  *cr                         All Rights Reserved
00006  *cr
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  * RCS INFORMATION:
00011  *
00012  *      $RCSfile: macosxvmdstart.C,v $
00013  *      $Author: johns $        $Locker:  $             $State: Exp $
00014  *      $Revision: 1.24 $      $Date: 2011/03/10 21:06:03 $
00015  *
00016  ***************************************************************************
00017  * DESCRIPTION:
00018  *  MacOS X startup code
00019  ***************************************************************************/
00020 
00021 // only compile this file if we're building on MacOS X 
00022 // and when the target build is meant for an application bundle install
00023 // rather than a traditional X11/Unix style VMD install
00024 #if !defined(VMDNOMACBUNDLE) && (defined(ARCH_MACOSX) || defined(ARCH_MACOSXX86) || defined(ARCH_MACOSXX86_64))
00025 #include <Carbon/Carbon.h>    /* Carbon APIs for process management */
00026 #include <stdlib.h>
00027 #include <stdio.h>            
00028 #include "utilities.h"        /* string/filename manipulation routines */
00029 
00030 OSErr GetApplicationBundleFSSpec(FSSpecPtr theFSSpecPtr) {
00031    OSErr err;
00032    ProcessSerialNumber psn;
00033    err = GetCurrentProcess(&psn);
00034    if (err != noErr) return err;
00035 
00036    FSRef location;
00037    err = GetProcessBundleLocation(&psn, &location);
00038    if (err != noErr) return err;
00039 
00040    return FSGetCatalogInfo(&location, kFSCatInfoNone, 
00041      NULL, NULL, theFSSpecPtr, NULL);
00042 }
00043 
00044 OSErr GetApplicationPackageFSSpecFromBundle(FSSpecPtr theFSSpecPtr) {
00045   OSErr err = fnfErr;
00046   CFBundleRef myAppsBundle = CFBundleGetMainBundle();
00047   if (myAppsBundle == NULL) return err;
00048   CFURLRef myBundleURL = CFBundleCopyBundleURL(myAppsBundle);
00049   if (myBundleURL == NULL) return err;
00050 
00051   FSRef myBundleRef;
00052   Boolean ok = CFURLGetFSRef(myBundleURL, &myBundleRef);
00053   CFRelease(myBundleURL);
00054   if (!ok) return err;
00055 
00056   return FSGetCatalogInfo(&myBundleRef, kFSCatInfoNone,
00057     NULL, NULL, theFSSpecPtr, NULL);
00058 }
00059 
00060 
00061 static char * vmd_get_vmddir(void) {
00062   OSErr rc = 0;
00063   FSSpec spec;
00064   FSRef ref;
00065   UInt8 *path = NULL;
00066   char *bundledir = NULL;
00067   char *vmddir = NULL;
00068   char *tmp = NULL;
00069 
00070   bundledir = (char *) malloc(2048 * sizeof(UInt8));
00071   memset(bundledir, 0, 2048 * sizeof(UInt8));
00072 
00073 #if defined(ARCH_MACOSXX86_64)
00074   //
00075   // CoreFoundation/Cocoa-based application bundle path query code
00076   //
00077   CFBundleRef mainbundle = CFBundleGetMainBundle();
00078   if (mainbundle != NULL) {
00079 #if 1
00080     CFURLRef appurl = CFBundleCopyBundleURL(mainbundle);
00081 #else
00082     CFURLRef appurl = CFBundleCopyExecutableURL(mainbundle);
00083 #endif
00084     CFStringRef cfpath = CFURLCopyFileSystemPath(appurl, kCFURLPOSIXPathStyle);
00085     if (CFStringGetFileSystemRepresentation(cfpath, bundledir, 2048 * sizeof(UInt8) - 1) == true) {
00086 //      printf("MacOS X Bundle path: %s\n", bundledir);
00087 
00088       // Truncate bundle path to parent bundle directory, 
00089       // if needed, when the executable is launched by double clicking
00090       // the application bundle in the GUI.  When the application 
00091       // is launched directly via scripts etc, the main bundle path
00092       // returned from the previous calls already points to the parent
00093       // directory of the VMD executable.
00094       if (strstr(bundledir, "/Contents/Resources/VMD.app")) {
00095         if ((tmp = strrchr(bundledir, '/')) != NULL) {
00096           tmp[0] = '\0';
00097         }
00098         if ((tmp = strrchr(bundledir, '/')) != NULL) {
00099           tmp[0] = '\0';
00100         }
00101         if ((tmp = strrchr(bundledir, '/')) != NULL) {
00102           tmp[0] = '\0';
00103         }
00104 
00105         // add path to main VMD directory from the outermost bundle container
00106         strcat(bundledir, "/Contents/vmd");
00107       }
00108 
00109 
00110       vmddir = (char *) malloc(strlen(bundledir) + 1 + strlen("/vmd"));
00111       strcpy(vmddir, bundledir);
00112     }
00113 
00114     free(bundledir);
00115     CFRelease(appurl);
00116     CFRelease(cfpath);
00117   }
00118 
00119   if (!vmddir) {
00120     printf("WARNING: Failed to get path for main VMD application bundle...\n");
00121     vmddir = getenv("VMDDIR");
00122   }
00123 
00124 #else
00125 
00126   //
00127   // Carbon-based application bundle path query code
00128   //
00129 #if 0
00130   if (!(rc = GetApplicationPackageFSSpecFromBundle(&spec))) {
00131 #else
00132   if (!(rc = GetApplicationBundleFSSpec(&spec))) {
00133 #endif
00134     rc = FSpMakeFSRef(&spec, &ref);
00135     if (rc) printf("makefsref OSErr: %d\n", rc);
00136       
00137     rc = FSRefMakePath(&ref,(UInt8 *) bundledir, 2048);
00138     if (rc) printf("makepath OSErr: %d\n", rc);
00139   } else {
00140     printf("getappbundlepath OSErr: %d\n", rc);
00141   }
00142 
00143   if (rc) {
00144     free(bundledir);
00145     return NULL;
00146   } 
00147 
00148   // truncate bundle path to parent bundle directory
00149   if ((tmp = strrchr(bundledir, '/')) != NULL) {
00150     tmp[0] = '\0';
00151   }
00152   if ((tmp = strrchr(bundledir, '/')) != NULL) {
00153     tmp[0] = '\0';
00154   }
00155 
00156   // add "/vmd" to parent bundle directory
00157   vmddir = (char *) malloc(strlen(bundledir) + 1 + strlen("/vmd"));
00158   strcpy(vmddir, bundledir);
00159   strcat(vmddir, "/vmd");
00160 
00161   free(bundledir);
00162 #endif
00163 
00164   return (char *) vmddir;
00165 }
00166 
00167 
00168 #if 1
00169 int macosxvmdstart(int argc, char **argv) {
00170 #else
00171 int main(int argc, char **argv) {
00172 #endif
00173   char tmp[8192];
00174   char * vmddir;
00175   int i;
00176 
00177   vmddir = vmd_get_vmddir();
00178   if (vmddir == NULL) {
00179     return -1; // fail and exit
00180   }
00181 
00182 #if 0
00183   if (!getenv("MACOSXVMDSTARTUP")) {
00184     int startterminal=1; // be default, we start one...
00185 
00186     setenv("MACOSXVMDSTARTUP", "1", 1);
00187     // check for -dispdev text, in which case we don't start a terminal...
00188     for (i=0; i < argc; i++) {
00189       if (!strupcmp(argv[i], "-dispdev")) {
00190         if (argc > i+1) {
00191           if (!strupcmp(argv[i+1], "text")) {
00192             startterminal=0;
00193           }
00194         } 
00195       }
00196     }
00197 
00198     if (startterminal) {
00199       char cmdbuf[16384];
00200       sprintf(cmdbuf, "\"%s/vmd_MACOSX\"", vmddir);
00201       if (argc > 1) {
00202         for (i=1; i < argc; i++) {
00203           strcat(cmdbuf, " ");
00204           strcat(cmdbuf, argv[i]);
00205         }
00206       }
00207       strcat(cmdbuf, " &");
00208 
00209 printf("Executing VMD startup command: %s\n", cmdbuf);
00210       exit(system(cmdbuf));
00211     }
00212   }
00213 #endif
00214 
00215   if (!getenv("VMDDIR")) {
00216     setenv("VMDDIR", vmddir, 1);
00217   }
00218 
00219   if (!getenv("TCL_LIBRARY")) {
00220     strcpy(tmp, vmddir);
00221     strcat(tmp, "/scripts/tcl");
00222     setenv("TCL_LIBRARY", tmp, 1);
00223   }
00224 
00225   if (!getenv("TK_LIBRARY")) {
00226     strcpy(tmp, vmddir);
00227     strcat(tmp, "/scripts/tk");
00228     setenv("TK_LIBRARY", tmp, 1);
00229   }
00230 
00231   if (!getenv("PYTHONPATH")) {
00232     strcpy(tmp, vmddir);
00233     strcat(tmp, "/scripts/python");
00234     setenv("PYTHONPATH", tmp, 1);
00235   } else {
00236     strcpy(tmp, getenv("PYTHONPATH"));
00237     strcat(tmp, ":");
00238     strcat(tmp, vmddir);
00239     strcat(tmp, "/scripts/python");
00240     setenv("PYTHONPATH", tmp, 1);
00241   }
00242 
00243   if (!getenv("STRIDE_BIN")) {
00244     strcpy(tmp, vmddir);
00245 #if defined(ARCH_MACOSXX86_64)
00246     strcat(tmp, "/stride_MACOSXX86_64");
00247 #elif defined(ARCH_MACOSXX86)
00248     strcat(tmp, "/stride_MACOSXX86");
00249 #else
00250     strcat(tmp, "/stride_MACOSX");
00251 #endif
00252     setenv("STRIDE_BIN", tmp, 1);
00253   }
00254 
00255   if (!getenv("SURF_BIN")) {
00256     strcpy(tmp, vmddir);
00257 #if defined(ARCH_MACOSXX86_64)
00258     strcat(tmp, "/surf_MACOSXX86_64");
00259 #elif defined(ARCH_MACOSXX86)
00260     strcat(tmp, "/surf_MACOSXX86");
00261 #else
00262     strcat(tmp, "/surf_MACOSX");
00263 #endif
00264     setenv("SURF_BIN", tmp, 1);
00265   }
00266 
00267   if (!getenv("TACHYON_BIN")) {
00268     strcpy(tmp, vmddir);
00269 #if defined(ARCH_MACOSXX86_64)
00270     strcat(tmp, "/tachyon_MACOSXX86_64");
00271 #elif defined(ARCH_MACOSXX86)
00272     strcat(tmp, "/tachyon_MACOSXX86");
00273 #else
00274     strcat(tmp, "/tachyon_MACOSX");
00275 #endif
00276     setenv("TACHYON_BIN", tmp, 1);
00277   }
00278 
00279   return 0;
00280 }
00281 
00282 
00283 #endif
00284 

Generated on Wed May 23 01:49:59 2012 for VMD (current) by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002