11import * as path from "path" ;
22import * as vscode from "vscode" ;
3+ import * as url from "url" ;
34import { AtelierAPI } from "../../api" ;
45import { Directory } from "./Directory" ;
56import { File } from "./File" ;
@@ -26,17 +27,36 @@ export class FileSystemProvider implements vscode.FileSystemProvider {
2627 public async readDirectory ( uri : vscode . Uri ) : Promise < [ string , vscode . FileType ] [ ] > {
2728 const api = new AtelierAPI ( uri ) ;
2829 const parent = await this . _lookupAsDirectory ( uri ) ;
29- const sql = `CALL %Library.RoutineMgr_StudioOpenDialog(?,,,,,,0)` ;
30- const folder = uri . path === "/" ? "/" : uri . path . replace ( / \/ / g, "." ) + "/" ;
31- const spec = folder . slice ( 1 ) + "*.cls,*.inc,*.int,*.mac" ;
30+ const sql = `CALL %Library.RoutineMgr_StudioOpenDialog(?,?,?,?,?,?,?)` ;
31+ const { query } = url . parse ( decodeURIComponent ( uri . toString ( ) ) , true ) ;
32+ const type = String ( query && query . type ) . toLowerCase ( ) || "all" ;
33+ const csp = query . csp === "" || query . csp === "1" ;
34+ let filter = query . filter || "" ;
35+ if ( csp ) {
36+ filter = filter || "*" ;
37+ } else if ( type === "rtn" ) {
38+ filter = "*.inc,*.int,*.mac" ;
39+ } else if ( type === "cls" ) {
40+ filter = "*.cls" ;
41+ } else {
42+ filter = query . filter || "*.cls,*.inc,*.int,*.mac" ;
43+ }
44+ const folder = csp ? ( uri . path . endsWith ( "/" ) ? uri . path : uri . path + "/" ) : uri . path . replace ( / \/ / g, "." ) ;
45+ const spec = csp ? folder + filter : folder . slice ( 1 ) + filter ;
46+ const dir = "1" ;
47+ const orderBy = "1" ;
48+ const system = api . ns === "%SYS" ? "1" : "0" ;
49+ const flat = String ( query . flat ) || "0" ;
50+ const notStudio = "0" ;
51+ const generated = String ( query . generated ) || "0" ;
3252 return api
33- . actionQuery ( sql , [ spec ] )
53+ . actionQuery ( sql , [ spec , dir , orderBy , system , flat , notStudio , generated ] )
3454 . then ( data => data . result . content || [ ] )
3555 . then ( data =>
3656 data . map ( item => {
3757 const name = item . Name ;
3858 const fullName = folder === "" ? name : folder + "/" + name ;
39- if ( item . IsDirectory . length ) {
59+ if ( item . Type === "10" || item . Type === "9" ) {
4060 parent . entries . set ( name , new Directory ( name , fullName ) ) ;
4161 return [ name , vscode . FileType . Directory ] ;
4262 } else {
@@ -76,7 +96,9 @@ export class FileSystemProvider implements vscode.FileSystemProvider {
7696 overwrite : boolean ;
7797 }
7898 ) : void | Thenable < void > {
79- const fileName = uri . path . slice ( 1 ) . replace ( / \/ / g, "." ) ;
99+ const { query } = url . parse ( decodeURIComponent ( uri . toString ( ) ) , true ) ;
100+ const csp = query . csp === "" || query . csp === "1" ;
101+ const fileName = csp ? uri . path : uri . path . slice ( 1 ) . replace ( / \/ / g, "." ) ;
80102 if ( fileName . startsWith ( "." ) ) {
81103 return ;
82104 }
@@ -143,10 +165,9 @@ export class FileSystemProvider implements vscode.FileSystemProvider {
143165 }
144166
145167 private async _lookupAsFile ( uri : vscode . Uri ) : Promise < File > {
146- // if (!uri.path.match(/\.\w+$/)) {
147- // return Promise.resolve(new Directory(uri.path))
148- // }
149- const fileName = uri . path . slice ( 1 ) . replace ( / \/ / g, "." ) ;
168+ const { query } = url . parse ( decodeURIComponent ( uri . toString ( ) ) , true ) ;
169+ const csp = query . csp === "" || query . csp === "1" ;
170+ const fileName = csp ? uri . path : uri . path . slice ( 1 ) . replace ( / \/ / g, "." ) ;
150171 if ( fileName . startsWith ( "." ) ) {
151172 throw vscode . FileSystemError . FileNotFound ( ) ;
152173 }
@@ -155,7 +176,16 @@ export class FileSystemProvider implements vscode.FileSystemProvider {
155176 return api
156177 . getDoc ( fileName )
157178 . then ( data => data . result )
158- . then ( ( { ts, content } ) => new File ( name , fileName , ts , content . join ( "\n" ) . length , content . join ( "\n" ) ) )
179+ . then (
180+ ( { ts, content } ) =>
181+ new File (
182+ name ,
183+ fileName ,
184+ ts ,
185+ Array . isArray ( content ) ? content . join ( "\n" ) . length : content . length ,
186+ Array . isArray ( content ) ? content . join ( "\n" ) : content
187+ )
188+ )
159189 . then ( entry =>
160190 this . _lookupParentDirectory ( uri ) . then ( parent => {
161191 parent . entries . set ( name , entry ) ;
0 commit comments