sketchucation logo sketchucation
    • Login
    ℹ️ Licensed Extensions | FredoBatch, ElevationProfile, FredoSketch, LayOps, MatSim and Pic2Shape will require license from Sept 1st More Info

    Safe place to store user-defined parameters

    Scheduled Pinned Locked Moved Developers' Forum
    114 Posts 9 Posters 11.1k Views 9 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • thomthomT Offline
      thomthom
      last edited by

      Just to test things I created a user account "tæst" under Windows7. And ran some tests in the Ruby Console:

      
      ENV['HOMEPATH']
      \Users\t‘st
      
      ENV["LOCALAPPDATA"]
      C;\Users\t‘st\AppData\Local
      
      ENV["APPDATA"]
      C;\Users\t‘st\AppData\Roaming
      
      file = File.join( ENV['LOCALAPPDATA'], 'FooBar.txt' )
      C;\Users\t‘st\AppData\Local/FooBar.txt
      
      File.open( tempfile, 'wb' ) { |file| file.puts 'Hello world' }
      Error; #<Errno;;ENOENT; (eval);0;in `initialize'; No such file or directory - C;\Users\t‘st\AppData\Local/FooBar.txt>
      (eval)
      (eval);0;in `open'
      (eval);0
      
      
      ENV['TEMP']
      C;\Users\TST~1\AppData\Local\Temp
      
      tempfile = File.join( ENV['TEMP'], 'FooBar.txt' )
      C;\Users\TST~1\AppData\Local\Temp/FooBar.txt
      
      File.open( tempfile, 'wb' ) { |file| file.puts 'Hello world' }
      nil
      
      

      Interesting observations:

      Most ENV has some strange character replacements. Is this a Ruby thing?

      ENV['TEMP'] returned a path in the format of the old DOS 8.3 format. And this could be written to.

      
      ENV.each { |k,v| puts "#{k}\t#{v}" }
      ALLUSERSPROFILE	C;\ProgramData
      APPDATA	C;\Users\t‘st\AppData\Roaming
      CommonProgramFiles	C;\Program Files (x86)\Common Files
      CommonProgramFiles(x86)	C;\Program Files (x86)\Common Files
      CommonProgramW6432	C;\Program Files\Common Files
      COMPUTERNAME	ARC-CU-10-09
      ComSpec	C;\Windows\system32\cmd.exe
      FP_NO_HOST_CHECK	NO
      HOMEDRIVE	C;
      HOMEPATH	\Users\t‘st
      LOCALAPPDATA	C;\Users\t‘st\AppData\Local
      LOGONSERVER	\\ARC-CU-10-09
      NUMBER_OF_PROCESSORS	8
      OS	Windows_NT
      PATHEXT	.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
      PROCESSOR_ARCHITECTURE	x86
      PROCESSOR_ARCHITEW6432	AMD64
      PROCESSOR_IDENTIFIER	Intel64 Family 6 Model 26 Stepping 5, GenuineIntel
      PROCESSOR_LEVEL	6
      PROCESSOR_REVISION	1a05
      ProgramData	C;\ProgramData
      ProgramFiles	C;\Program Files (x86)
      ProgramFiles(x86)	C;\Program Files (x86)
      ProgramW6432	C;\Program Files
      PSModulePath	C;\Windows\system32\WindowsPowerShell\v1.0\Modules\
      PUBLIC	C;\Users\Public
      SESSIONNAME	Console
      SystemDrive	C;
      SystemRoot	C;\Windows
      TEMP	C;\Users\TST~1\AppData\Local\Temp
      TMP	C;\Users\TST~1\AppData\Local\Temp
      ULTRAMON_LANGDIR	C;\Program Files\UltraMon\Resources\en
      USERDOMAIN	arc-cu-10-09
      USERNAME	t‘st
      USERPROFILE	C;\Users\t‘st
      windir	C;\Windows
      
      

      The TEMP path seem to be the only one using this format.
      So, question is, is it possible to monkey-patch this so one can extract the user directory in DOS8.3 format and use that to replace the mangled paths of the other variables?

      And what does it return under other Windows versions? (Win8, Vista, XP)

      What about chineese/japanese types or characters - does the same thing apply?

      Thomas Thomassen — SketchUp Monkey & Coding addict
      List of my plugins and link to the CookieWare fund

      1 Reply Last reply Reply Quote 0
      • thomthomT Offline
        thomthom
        last edited by

        @unknownuser said:

        Also, you should use ENV["LOCALAPPDATA"] || ENV["APPDATA"] so you can support XP at no extra effort 😄

        What folders does this yield on XP? Under Win7 it's both in the user directory.

        Thomas Thomassen — SketchUp Monkey & Coding addict
        List of my plugins and link to the CookieWare fund

        1 Reply Last reply Reply Quote 0
        • fredo6F Offline
          fredo6
          last edited by

          I will use the parent of ENV["TMPDIR"] only on Mac. Apparently, this directory has a long cryptic name, which I assume will only contain valid characters.

          On Windows, this is more of a problem is ENV["LOCALAPPDATA"] cannot be manipulated from Ruby dues to non Ascii characters. It's not only for creating subfolders there, but also to manage filepaths of files to be created and updated.

          The best I can do is to check if the username contains non-ascii characters and then simplify the name to Ascii, and create a folder with that simplified name in C:\users. This really becomes convoluted!!

          There must be a trick however, because when Sketchup installs, it sets the default file locations pointing to the "MyDocuments" folder, whose name also contains the username (something like C:\Userfiles\<username>\Documents\). But maybe these locations are not used from Ruby.

          Fredo

          1 Reply Last reply Reply Quote 0
          • thomthomT Offline
            thomthom
            last edited by

            @fredo6 said:

            The best I can do is to check if the username contains non-ascii characters and then simplify the name to Ascii, and create a folder with that simplified name in C:\users. This really becomes convoluted!!

            Creating random folder directly in the location where user folders are? I don't think people would too happy about this. I'd like to explore if we can get the 8.3 filename for the appdata folder.

            @fredo6 said:

            There must be a trick however, because when Sketchup installs, it sets the default file locations pointing to the "MyDocuments" folder, whose name also contains the username (something like C:\Userfiles\<username>\Documents\). But maybe these locations are not used from Ruby.

            Correct - SketchUp itself has no problems with Unicode paths. It's the Ruby 1.8 core.

            Thomas Thomassen — SketchUp Monkey & Coding addict
            List of my plugins and link to the CookieWare fund

            1 Reply Last reply Reply Quote 0
            • fredo6F Offline
              fredo6
              last edited by

              @thomthom said:

              @unknownuser said:

              Also, you should use ENV["LOCALAPPDATA"] || ENV["APPDATA"] so you can support XP at no extra effort 😄

              What folders does this yield on XP? Under Win7 it's both in the user directory.

              Actually as I use both, LOCALAPPDATA first and then APPDATA.

              For info, on WindowsXP, ENV["APPDATA"] is defined and uses the old Windows user directory in the form of C:\Documents and Settings\<username>\Application Data.

              Fredo

              1 Reply Last reply Reply Quote 0
              • thomthomT Offline
                thomthom
                last edited by

                @fredo6 said:

                For info, on WindowsXP, ENV["APPDATA"] is defined and uses the old Windows user directory in the form of C:\Documents and Settings\<username>\Application Data.

                Got a full list of ENV variables under XP?

                Btw- if I recall correctly "Documents and Settings" is localized to the user's language, isn't it? (without the shim that Vista,Win7, win8 uses)

                Thomas Thomassen — SketchUp Monkey & Coding addict
                List of my plugins and link to the CookieWare fund

                1 Reply Last reply Reply Quote 0
                • fredo6F Offline
                  fredo6
                  last edited by

                  We could also substitute <username> in the paths by

                  • Default on Win7, Vista, Win8
                  • All users on XP

                  At least this will avoid the problem of unicode in the username.

                  Fredo

                  1 Reply Last reply Reply Quote 0
                  • thomthomT Offline
                    thomthom
                    last edited by

                    @fredo6 said:

                    We could also substitute <username> in the paths by

                    • Default on Win7, Vista, Win8
                    • All users on XP

                    At least this will avoid the problem of unicode in the username.

                    And the setting would not be per-use - but per computer. ...which might not be a big issue since the plugin folder is shared by all users.

                    But again I raise my concern that XP paths might be translated. "All users" I think is "Alle brukere" in Norwegian XP. (I can dig out my old XP machine and test.)

                    Thomas Thomassen — SketchUp Monkey & Coding addict
                    List of my plugins and link to the CookieWare fund

                    1 Reply Last reply Reply Quote 0
                    • D Offline
                      driven
                      last edited by

                      Just found a BIG PROBLEM with the 'TIG' and new 'FREDO' path trick on my mac.

                      My User 'private' settings for 'BOTH' are now available to any account on my computer or connected to my network.

                      By stepping up stream, external to ENV["TMPDIR"] you are bypassing the LOCK to other user accounts and network traffic.

                      So my SFC Password Cookie and my Fredo settings are usable from any account, I do not expect a Plugin to share this type of information with the world.

                      Please move these back into User Space asap.

                      This could be a huge problem on a work or university network...

                      john

                      learn from the mistakes of others, you may not live long enough to make them all yourself...

                      1 Reply Last reply Reply Quote 0
                      • S Offline
                        slbaumgartner
                        last edited by

                        @driven said:

                        Just found a BIG PROBLEM with the 'TIG' and new 'FREDO' path trick on my mac.

                        My User 'private' settings for 'BOTH' are now available to any account on my computer or connected to my network.

                        By stepping up stream, external to ENV["TMPDIR"] you are bypassing the LOCK to other user accounts and network traffic.

                        So my SFC Password Cookie and my Fredo settings are usable from any account, I do not expect a Plugin to share this type of information with the world.

                        Please move these back into User Space asap.

                        This could be a huge problem on a work or university network...

                        john

                        Confirm: the parent of ENV[TMPDIR] has permissions drwxr-xr-x on my Mac - that means it is readable by anyone, though only the owner (me) can write new files there. ENV[TMPDIR] itself is drwx------, which means it is inaccessible to anyone but me. This is not a big deal if you are the only user on your computer, but a serious issue if anyone else has access.

                        Steve

                        1 Reply Last reply Reply Quote 0
                        • fredo6F Offline
                          fredo6
                          last edited by

                          I think I will default to the old method of DEFPARAM_Dir in the SU Plugins directory 😛 😢

                          1 Reply Last reply Reply Quote 0
                          • thomthomT Offline
                            thomthom
                            last edited by

                            Using Win32 API calls I've been able to get short (DOS 8.3 style) path name to appdata. I need to run some tests to make sure it works under XP etc.

                            Thomas Thomassen — SketchUp Monkey & Coding addict
                            List of my plugins and link to the CookieWare fund

                            1 Reply Last reply Reply Quote 0
                            • fredo6F Offline
                              fredo6
                              last edited by

                              Trying to recap

                              1) On Windows
                              For the non-ascii username, we have a much more general problem, because Temp directory and very likely any files (skp, materials), are going to be stamped with the username in the file paths. So nothing will work. For instance, I prepare the HTML files of webdialog boxes in the Temp directory. This is also where I put some traces.
                              --> I will ignore this until Sketchup moves to Ruby 1.9.2 which solves the problem (or thomthom to find a solution!). Too bad for users having a non-ascii name!

                              For parameters, the usage of LOCALAPPDATA and APPDATA is OK. It is based on users and should correspond to writable areas
                              --> I will use this method

                              2) on Mac
                              For the non-ascii username, apparently there is no issue with non-ascii usernames (to be confirmed), but anyway, the Temp dir is independent, writable and only visible to users. In addition, the ~/ notation allows avoiding having the user name in the path
                              --> NO issue there

                              For parameters, there are visibility issues with the parent folder of ENV["TMPDIR"]. So the method cannot be used.
                              --> I will use driven's method based on a root directory ~/Library/Application Support/ with a hidden folder "LIBFREDO6_DATA_Dir" under which I will create the files and subfolders.

                              It's interesting to see that we have had a long debate on a basic question which we should expect to be covered by Sketchup itself. I think we should formulate it clearly for the Trimble SU team to address it in SU 2014.

                              Fredo

                              1 Reply Last reply Reply Quote 0
                              • thomthomT Offline
                                thomthom
                                last edited by

                                As for OSX, what about this:

                                plugin_path = Sketchup.find_support_file('Plugins') path = File.join( plugin_path, '..', '..' ) File.expand_path( path )

                                Making some assumption here, but tested under SU8 and SU2013 on OSX 10.8.3:

                                /Library/Application Support/Google SketchUp 8 /Users/thomas/Library/Application Support/SketchUp 2013

                                Thomas Thomassen — SketchUp Monkey & Coding addict
                                List of my plugins and link to the CookieWare fund

                                1 Reply Last reply Reply Quote 0
                                • thomthomT Offline
                                  thomthom
                                  last edited by

                                  @fredo6 said:

                                  1) On Windows
                                  For the non-ascii username, we have a much more general problem, because Temp directory and very likely any files (skp, materials), are going to be stamped with the username in the file paths. So nothing will work. For instance, I prepare the HTML files of webdialog boxes in the Temp directory. This is also where I put some traces.
                                  --> I will ignore this until Sketchup moves to Ruby 1.9.2 which solves the problem (or thomthom to find a solution!). Too bad for users having a non-ascii name!

                                  On my Win7 systems I tried, the TEMP/TMP ENV variables returned a short (DOS 8.3 style) path name. These short paths was writable with Ruby 1.8 as the system resolved their real paths. (I assume because the short paths where given to the ANSI version of the system file functions which in turn handled it.)

                                  @fredo6 said:

                                  For parameters, the usage of LOCALAPPDATA and APPDATA is OK. It is based on users and should correspond to writable areas
                                  --> I will use this method

                                  There also include username in the path and may be non-writable. In fact - you are more likely to get issues here because the ENV variable doesn't return a short path - but a path string with replaced characters.

                                  @fredo6 said:

                                  2) on Mac
                                  For the non-ascii username, apparently there is no issue with non-ascii usernames (to be confirmed), but anyway, the Temp dir is independent, writable and only visible to users. In addition, the ~/ notation allows avoiding having the user name in the path
                                  --> NO issue there

                                  Unicode filenames works under OSX with Ruby 1.8 because the file system functions calls handles UTF-8 strings.

                                  @fredo6 said:

                                  For parameters, there are visibility issues with the parent folder of ENV["TMPDIR"]. So the method cannot be used.
                                  --> I will use driven's method based on a root directory ~/Library/Application Support/ with a hidden folder "LIBFREDO6_DATA_Dir" under which I will create the files and subfolders.

                                  What about under '~\Library\Application Support\SketchUp 2013' ? That way the data is isolated from version to version.

                                  Thomas Thomassen — SketchUp Monkey & Coding addict
                                  List of my plugins and link to the CookieWare fund

                                  1 Reply Last reply Reply Quote 0
                                  • fredo6F Offline
                                    fredo6
                                    last edited by

                                    On my Windows 7,
                                    ENV["TMP"] --> C:\Users\Fred\AppData\Local\Temp
                                    ENV["LOCALAPPDATA"] --> C:\Users\Fred\AppData\Local
                                    So I don't see the short Dos 8.3 notation on my PC

                                    Anyway, since the releasing of my scripts I have been using ENV["TMP"] and I never came across a user having problem with non-ascii username. So maybe very few users do set up their PC with a non-ascii username

                                    On Mac,

                                    It seems SU 13 plugins is installed under ~/Library/Application Support/SketchUP 2013/Sketchup/Plugins.

                                    So I still have a problem to understand

                                    • why we could create a directory from Ruby under ~/Library/Application Support
                                    • and why it fails when you create it in ~/Library/Application Support/SketchUP 2013/Sketchup/Plugins (i.e. the failure reported on DEFPARAM_Dir creation)

                                    Fredo

                                    1 Reply Last reply Reply Quote 0
                                    • D Offline
                                      driven
                                      last edited by

                                      @thomthom said:

                                      As for OSX, what about this:

                                      plugin_path = Sketchup.find_support_file('Plugins') path = File.join( plugin_path, '..', '..' ) File.expand_path( path )

                                      The problem is when Sketchup.find_support_file('Plugins') returns the non-user Library

                                      the only way to be sure you have a User writable Plugins Folder is

                                      userPlugins = (File.dirname(File.expand_path(Sketchup.find_support_file("OldColors")))) <<  ("/Plugins")
                                      Dir.mkdir(userPlugins ) unless File.exist?(userPlugins )
                                      

                                      This empty Folder OldColors is in every version since v5 at least, it's not dynamically created like Shortcuts.plist nor movable like AutoSave

                                      SU on mac has always been able to have 2 'Plugins' paths, it was mix and match that messed things up...

                                      john

                                      learn from the mistakes of others, you may not live long enough to make them all yourself...

                                      1 Reply Last reply Reply Quote 0
                                      • thomthomT Offline
                                        thomthom
                                        last edited by

                                        @fredo6 said:

                                        On my Windows 7,
                                        ENV["TMP"] --> C:\Users\Fred\AppData\Local\Temp
                                        ENV["LOCALAPPDATA"] --> C:\Users\Fred\AppData\Local
                                        So I don't see the short Dos 8.3 notation on my PC

                                        Because your username "Fred" is compatible with the 8.3 annotation. If however the username is "tæst" the the returned value would be:

                                        ENV["TMP"] --> C:\Users\TST~1\AppData\Local\Temp ENV["LOCALAPPDATA"] --> C:\Users\T'st\AppData\Local

                                        As demonstrated by this example: http://sketchucation.com/forums/viewtopic.php?f=180&t=52730&start=60#p482159

                                        So ENV["LOCALAPPDATA"] is not safe and will fail.

                                        @fredo6 said:

                                        Anyway, since the releasing of my scripts I have been using ENV["TMP"] and I never came across a user having problem with non-ascii username. So maybe very few users do set up their PC with a non-ascii username

                                        That's because ENV["TMP"] returns the path in the short 8.3 format.

                                        I've managed to make Win32 API system calls to get the appdata folder in this format. But I don't see any other way to get this path. For me it's not a big deal because I already ship D. Berger's Win32::API class wrapped under the TT:: namespace in TT_Lib2. But it's not an ideal solution for everyone as it requires bundling a third party library.

                                        Thomas Thomassen — SketchUp Monkey & Coding addict
                                        List of my plugins and link to the CookieWare fund

                                        1 Reply Last reply Reply Quote 0
                                        • fredo6F Offline
                                          fredo6
                                          last edited by

                                          Thomthom,

                                          Thanks really for all your efforts.

                                          On Win7, LOCALAPPDATA seems to be simply the parent of the Temp folder.

                                          So maybe the solution is to use for local data File.dirname ENV["TMP"], which hopefully will preserve the 8.3 notation.

                                          It may even work on Windows XP

                                          [EDIT]from Internet googling, it seems that the temp directory on Xp is %SystemDrive%\Documents and Settings{username}\Local Settings\Temp.
                                          On Windows Vista, 7, 8, the directory is %SystemDrive%\Users{username}\AppData\Local\Temp

                                          So the method File.dirname ENV["TEMP"] would work on both Widnows systems, provided this call File.dirname preserves the Dos8.3 notation.

                                          Fredo

                                          1 Reply Last reply Reply Quote 0
                                          • thomthomT Offline
                                            thomthom
                                            last edited by

                                            Under XP:

                                            ` ENV['LOCALAPPDATA']
                                            nil

                                            ENV['APPDATA']
                                            C:\Documents and Settings\XPMUser\Application Data`

                                            However - APPDATA != Local AppData - so it's not the correct fallback to make.

                                            ENV variable:

                                            ENV.to_hash { "PROCESSOR_ARCHITECTURE"=>"x86", "HOMEDRIVE"=>"C:", "APPDATA"=>"C:\\Documents and Settings\\XPMUser\\Application Data", "USERPROFILE"=>"C:\\Documents and Settings\\XPMUser", "TMP"=>"C:\\DOCUME~1\\XPMUser\\LOCALS~1\\Temp", "SESSIONNAME"=>"Console", "ProgramFiles"=>"C:\\Program Files", "PROCESSOR_REVISION"=>"1707", "PROCESSOR_LEVEL"=>"6", "CommonProgramFiles"=>"C:\\Program Files\\Common Files", "USERNAME"=>"XPMUser", "PROCESSOR_IDENTIFIER"=>"x86 Family 6 Model 23 Stepping 7, GenuineIntel", "OS"=>"Windows_NT", "FP_NO_HOST_CHECK"=>"NO", "CLIENTNAME"=>"Console", "windir"=>"C:\\WINDOWS", "SystemRoot"=>"C:\\WINDOWS", "PATHEXT"=>".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH", "ALLUSERSPROFILE"=>"C:\\Documents and Settings\\All Users", "USERDOMAIN"=>"VIRTUALXP-IE8", "NUMBER_OF_PROCESSORS"=>"1", "HOMEPATH"=>"\\Documents and Settings\\XPMUser", "TEMP"=>"C:\\DOCUME~1\\XPMUser\\LOCALS~1\\Temp", "SystemDrive"=>"C:", "Path"=>"C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\Program Files\\TortoiseHg\\", "LOGONSERVER"=>"\\\\VIRTUALXP-IE8", "ComSpec"=>"C:\\WINDOWS\\system32\\cmd.exe", "COMPUTERNAME"=>"VIRTUALXP-IE8" }

                                            When I make Win32 calls to get the path from the system I get:

                                            TT::Win32.get_folder_path_ansi( TT::Win32::CSIDL_LOCAL_APPDATA ) C:\Documents and Settings\XPMUser\Local Settings\Application Data

                                            That is the full path. But not that this is an English XP version and the user is "XPMUser" which all contains ASCII characters. When the OS language changes or username changes to contain non-ASCII characters it will fail.

                                            The 8.3 version of the path - that seem to work better for Ruby 1.8 is:
                                            TT::Win32.get_short_folder_path_ansi( TT::Win32::CSIDL_LOCAL_APPDATA ) C:\DOCUME~1\XPMUser\LOCALS~1\APPLIC~1

                                            But one cannot hard code these either.

                                            And the different folder structure also means one cannot go from TEMP path to the local appdata path.

                                            Thomas Thomassen — SketchUp Monkey & Coding addict
                                            List of my plugins and link to the CookieWare fund

                                            1 Reply Last reply Reply Quote 0
                                            • 1
                                            • 2
                                            • 3
                                            • 4
                                            • 5
                                            • 6
                                            • 2 / 6
                                            • First post
                                              Last post
                                            Buy SketchPlus
                                            Buy SUbD
                                            Buy WrapR
                                            Buy eBook
                                            Buy Modelur
                                            Buy Vertex Tools
                                            Buy SketchCuisine
                                            Buy FormFonts

                                            Advertisement