From a2a44254e4d07f895fc06e6cf8562ca0703eb3b6 Mon Sep 17 00:00:00 2001 From: "Francisco T. Martinez" Date: Wed, 13 Dec 2006 14:47:26 +0000 Subject: [PATCH] Initial import of the Mono Add-in for Visual Studio 2005 svn path=/trunk/wintools/; revision=69450 --- vsAddIn2005/AUTHORS | 1 + vsAddIn2005/BinandLib/CreateZipFromSln.exe | Bin 0 -> 9216 bytes vsAddIn2005/BinandLib/monoLaunchC.exe | Bin 0 -> 37888 bytes vsAddIn2005/BinandLib/monoLaunchW.exe | Bin 0 -> 37888 bytes vsAddIn2005/BinandLib/prj2makesharpWin32.exe | Bin 0 -> 34304 bytes vsAddIn2005/COPYING | 343 +++++++ vsAddIn2005/ChangeLog | 6 + vsAddIn2005/CreateZipFile/AssemblyInfo.cs | 25 + .../CreateZipFile/CreateZipFile.csproj | 116 +++ vsAddIn2005/CreateZipFile/CreateZipFile.sln | 20 + vsAddIn2005/CreateZipFile/Drive.cs | 254 +++++ vsAddIn2005/CreateZipFile/MainOpts.cs | 34 + vsAddIn2005/CreateZipFile/Makefile.mcs.nmake | 37 + vsAddIn2005/CreateZipFile/ZipCompressor.cs | 92 ++ vsAddIn2005/INSTALL | 3 + vsAddIn2005/Prj2MakeWin32/CsprojInfo.cs | 170 ++++ vsAddIn2005/Prj2MakeWin32/CsprojInfo2005.cs | 188 ++++ vsAddIn2005/Prj2MakeWin32/Makefile.mcs.nmake | 45 + vsAddIn2005/Prj2MakeWin32/MdPrjHelper.cs | 362 +++++++ vsAddIn2005/Prj2MakeWin32/MsPrjHelper.cs | 910 ++++++++++++++++++ vsAddIn2005/Prj2MakeWin32/PrjHelper.cs | 92 ++ vsAddIn2005/Prj2MakeWin32/PrjxInfo.cs | 197 ++++ vsAddIn2005/Prj2MakeWin32/csprog2005.xsd | 162 ++++ vsAddIn2005/Prj2MakeWin32/csproj_ver2003.cs | 282 ++++++ vsAddIn2005/Prj2MakeWin32/csproj_ver2005.cs | 300 ++++++ vsAddIn2005/Prj2MakeWin32/cui/AssemblyInfo.cs | 38 + vsAddIn2005/Prj2MakeWin32/cui/Main.cs | 31 + vsAddIn2005/Prj2MakeWin32/cui/MainMod.cs | 128 +++ vsAddIn2005/Prj2MakeWin32/cui/MainOpts.cs | 28 + vsAddIn2005/Prj2MakeWin32/pkgconfiginvoker.cs | 97 ++ .../Prj2MakeWin32/prj2makesharp.csproj | 139 +++ vsAddIn2005/Prj2MakeWin32/prj2makesharp.sln | 20 + vsAddIn2005/Prj2MakeWin32/sharp_d_cmbx.cs | 117 +++ vsAddIn2005/Prj2MakeWin32/sharp_d_prjx.cs | 326 +++++++ vsAddIn2005/README | 51 + vsAddIn2005/README.txt | 61 ++ vsAddIn2005/ReleaseNotes.txt | 61 ++ vsAddIn2005/monoaddin.sln | 32 + vsAddIn2005/monoaddin.suo | Bin 0 -> 37888 bytes vsAddIn2005/monoaddin/AssemblyInfo.cs | Bin 0 -> 3330 bytes vsAddIn2005/monoaddin/ClassDiagram1.cd | 47 + vsAddIn2005/monoaddin/CommandBar.resx | 424 ++++++++ vsAddIn2005/monoaddin/Connect.cs | Bin 0 -> 87194 bytes vsAddIn2005/monoaddin/CreateZipHelper.cs | 109 +++ vsAddIn2005/monoaddin/MonoLaunchHelper.cs | 110 +++ vsAddIn2005/monoaddin/OptionsDlg.cs | 499 ++++++++++ vsAddIn2005/monoaddin/OptionsDlg.resx | 436 +++++++++ vsAddIn2005/monoaddin/Prj2MakeHelper.cs | 174 ++++ vsAddIn2005/monoaddin/RegistryHelper.cs | 204 ++++ vsAddIn2005/monoaddin/codekey/vsprj2make.snk | Bin 0 -> 597 bytes vsAddIn2005/monoaddin/monoaddin.AddIn | Bin 0 -> 42364 bytes vsAddIn2005/monoaddin/monoaddin.csproj | 116 +++ .../reflib/ICSharpCode.SharpZipLib.dll | Bin 0 -> 132608 bytes vsAddIn2005/reflib/Mono.GetOptions.dll | Bin 0 -> 46080 bytes 54 files changed, 6887 insertions(+) create mode 100644 vsAddIn2005/AUTHORS create mode 100644 vsAddIn2005/BinandLib/CreateZipFromSln.exe create mode 100644 vsAddIn2005/BinandLib/monoLaunchC.exe create mode 100644 vsAddIn2005/BinandLib/monoLaunchW.exe create mode 100644 vsAddIn2005/BinandLib/prj2makesharpWin32.exe create mode 100644 vsAddIn2005/COPYING create mode 100644 vsAddIn2005/ChangeLog create mode 100644 vsAddIn2005/CreateZipFile/AssemblyInfo.cs create mode 100644 vsAddIn2005/CreateZipFile/CreateZipFile.csproj create mode 100644 vsAddIn2005/CreateZipFile/CreateZipFile.sln create mode 100644 vsAddIn2005/CreateZipFile/Drive.cs create mode 100644 vsAddIn2005/CreateZipFile/MainOpts.cs create mode 100644 vsAddIn2005/CreateZipFile/Makefile.mcs.nmake create mode 100644 vsAddIn2005/CreateZipFile/ZipCompressor.cs create mode 100644 vsAddIn2005/INSTALL create mode 100644 vsAddIn2005/Prj2MakeWin32/CsprojInfo.cs create mode 100644 vsAddIn2005/Prj2MakeWin32/CsprojInfo2005.cs create mode 100644 vsAddIn2005/Prj2MakeWin32/Makefile.mcs.nmake create mode 100644 vsAddIn2005/Prj2MakeWin32/MdPrjHelper.cs create mode 100644 vsAddIn2005/Prj2MakeWin32/MsPrjHelper.cs create mode 100644 vsAddIn2005/Prj2MakeWin32/PrjHelper.cs create mode 100644 vsAddIn2005/Prj2MakeWin32/PrjxInfo.cs create mode 100644 vsAddIn2005/Prj2MakeWin32/csprog2005.xsd create mode 100644 vsAddIn2005/Prj2MakeWin32/csproj_ver2003.cs create mode 100644 vsAddIn2005/Prj2MakeWin32/csproj_ver2005.cs create mode 100644 vsAddIn2005/Prj2MakeWin32/cui/AssemblyInfo.cs create mode 100644 vsAddIn2005/Prj2MakeWin32/cui/Main.cs create mode 100644 vsAddIn2005/Prj2MakeWin32/cui/MainMod.cs create mode 100644 vsAddIn2005/Prj2MakeWin32/cui/MainOpts.cs create mode 100644 vsAddIn2005/Prj2MakeWin32/pkgconfiginvoker.cs create mode 100644 vsAddIn2005/Prj2MakeWin32/prj2makesharp.csproj create mode 100644 vsAddIn2005/Prj2MakeWin32/prj2makesharp.sln create mode 100644 vsAddIn2005/Prj2MakeWin32/sharp_d_cmbx.cs create mode 100644 vsAddIn2005/Prj2MakeWin32/sharp_d_prjx.cs create mode 100644 vsAddIn2005/README create mode 100644 vsAddIn2005/README.txt create mode 100644 vsAddIn2005/ReleaseNotes.txt create mode 100644 vsAddIn2005/monoaddin.sln create mode 100644 vsAddIn2005/monoaddin.suo create mode 100644 vsAddIn2005/monoaddin/AssemblyInfo.cs create mode 100644 vsAddIn2005/monoaddin/ClassDiagram1.cd create mode 100644 vsAddIn2005/monoaddin/CommandBar.resx create mode 100644 vsAddIn2005/monoaddin/Connect.cs create mode 100644 vsAddIn2005/monoaddin/CreateZipHelper.cs create mode 100644 vsAddIn2005/monoaddin/MonoLaunchHelper.cs create mode 100644 vsAddIn2005/monoaddin/OptionsDlg.cs create mode 100644 vsAddIn2005/monoaddin/OptionsDlg.resx create mode 100644 vsAddIn2005/monoaddin/Prj2MakeHelper.cs create mode 100644 vsAddIn2005/monoaddin/RegistryHelper.cs create mode 100644 vsAddIn2005/monoaddin/codekey/vsprj2make.snk create mode 100644 vsAddIn2005/monoaddin/monoaddin.AddIn create mode 100644 vsAddIn2005/monoaddin/monoaddin.csproj create mode 100644 vsAddIn2005/reflib/ICSharpCode.SharpZipLib.dll create mode 100644 vsAddIn2005/reflib/Mono.GetOptions.dll diff --git a/vsAddIn2005/AUTHORS b/vsAddIn2005/AUTHORS new file mode 100644 index 0000000..20b249f --- /dev/null +++ b/vsAddIn2005/AUTHORS @@ -0,0 +1 @@ +Francisco "Paco" Martinez diff --git a/vsAddIn2005/BinandLib/CreateZipFromSln.exe b/vsAddIn2005/BinandLib/CreateZipFromSln.exe new file mode 100644 index 0000000000000000000000000000000000000000..9f7fbfb9f126266d40350ce07fc84857a6ba382f GIT binary patch literal 9216 zcmeHMeQX@pai872+q+wlXYQR$O13C1B}+Nd@`;k=M51Jg6e-D!MUmE#l4Gltm&YY} z(%rrD?w%x?kt`=bkklVZ5TvmU1Wr{HtyBGxHg4?{EescK(V{h)Ha40de^eIeF#j}wGn6AF-&xzZ7Arq&0P-YE61=Cp${~! zJUR-T`M&y~y6)D*?d?vy`5^m>*^1CCUiJpP|N*6TT# zwg$3;G1}cQ9KbQ_63DR#!!XwKB)ro$cW>D9)l0x)KG?NONPNu4YSk{qfem1Oc5r~6 z01y9mkVZfqK?<-lsVhvg^ruQa`)$Z2mseqif&!~&FBe5pL4~ztAi0cD#OU4!8Avig z3?!GK>%BZCh#Qf@Rmo+mCBh3I5v*OjZxT6dAS;ne0QwKY?Hp8FIq0xJ#Y9WNqUC#F zDNMF@vje_j$xaLh5;-_*UgXp$1ZO=7pS5hfI~&`z1(J5$jtSF_shhwKnSGh5&$1=c zj`iH1joC3f{#0rIUtGI(Ez*SDXkFwax9K!lC;Mz;mN4I|v#H61rth&Pna`S1$z{YB z<4DYuZJG+6n^@mGZG_(tv-Pz-JpmTMT9pVgxODiIMzsJ{Xm#q6BFoIJ#z@>V)y+V+ zBvm&q*;opG^e`5;<7y3%-QSeR)mq?d)GdGt6=7vf@R_!@jh1N8ZfT<>?Sx;0eT8VP z-Iz~4YA;GSf=}dnL6)pLI*61e|WF_InZkp737vM=&hy2v|A-6qCX?7+6z z(WN#M0wu~JtR?jfGo*k zU>9=$Pay4DGS?4uRl>goGyL@c3VvGbYj$uGeFs-;VLP}TL@Sotic4^Z%!oW!c?^us z6skk|!51(AOZ{v|GPeyJYzI>f0(tRCl(>dcMrn83iKj|xJE&XqWDY4agB>iJw3E3z zfhg3NWhWam)m=O?)kkqL)yEjx3AIZ^Otl+VH3X2blL}h{*M|PREYa*2@%;-}frP?3 zS_!oeZ~*a{gdRsoyRF}H0qKnC{zhcr0wM-F%P5#YKgp=oLeXTfg!`dJUwdJgFWnbL z_|kLX04|bVD?=N$Nse=)pbbGkfzQ$d+JVBy4`_1ti|*5Bx97L#ciy=JdB72;8sMv_ z<4qTdcA`Sw!R$?i&@WXN0+!f{Hhc*iVbe^3uAu#`!CG!QP*$@%FB?7AY&twMKE}e0 z18q<{ar0%3%M6b~7=nNkYbuWt-1MQA5GNhOnZe1jEW;E$~%= zeE|fsXWdFyHDle@wRne@);ULitJr6K4swO+t3Z9m{zWNjRp$EXB2 zNlSpgNRQFu8cRN>6+!=1Z9C{!v_)k0C9O)Iqt`VbR=c!w^eglhxc&4K?E>unRAV2K zI^(v!g`O8}&(rPtr+^RX+v&IH7+^o0(mx9;9%}n}s_I_`<(&R3W<91q2mERMGT?Li z*Xdi(pwXXV|9^{K5f5LX4aUo$aTWMm+NhA(C>OGisMjrqSguX2B(||vq$Mq>))4rsKdLQ6reMEa)|0~#f zT>mG%OIxpP(}v~mnC5Ed@NUXIZ^#T#6|1mkbo4rdVwXUqQ^I46Xet(U%Fm(`^TAz! z4~9+JYV<`u+G#VWspyz)T#3Fxzpgh1@=8@M&C=xTX|EVkVJQf`3gwHT@@d5P-K8U? zph?b;s&W}pB~=Y*bkX%`LRD4%uoq6&B4YD8<*T9>1S39fEzvE87QFD(5wE%sF4Bob zH=I^u>L|aYj;VXRa*d{3Fe2;u@kxTtv62s4%3nI_Ry-ygDwRFPPn5z%RSyrI54~yt zUuaZSi*ATZWwulm(H3u7&D3h1&&-|^c0UmeD zb#~PC!+4kjoof;6<+7~Cif`l9dDXrmB`*+_vM`b(sTvVuQ-`2Ic!gTI6gCY- zbB-y6a;nb;^58)$HVPh=$Hj6>T^&+>1uJ^YtCiiNN8_Ufq`5ZAUv~t1pj118q8;^% zckcKgZhmypE1n7Jm4F~VSr2RVu(32Bpf3+OSyU+Y+z{FF!Xw^UuS}CQugVKS2bMq< z46+BSp}$09ken`|L^<@M>Kp~Qt`K=pC_Un#qEx_BL7fNTJ$7iNSzP%j*Z|JU=A3f<0MB|-#O?S2#CoOxPT3oCgT)EAx^%<~ zVKf-8hKh&HU5zS<(8l)09Im7>RiBOKHu8ql9P(AAP_EKmn5&n)eb;gF-g%EE=8M>j z^>PSJ`Qt&&KfR;kp7ChRFP-&x)tcd;8Sxh&SVt9|LhZOH9O+Eah>Nf>EH1h$wG_!7 zKn*d|n`>5^6fmo4u~X~CI({Ry zVsj)2yvl5OX}T1ay^#a*b)@hL1AOFQ~^B%eGZg4a8Q82*k~v+9w-%HWyqb8`7TDsG2;0y=njm9 zz~?|y80BI3AWaKhfnNugIaN@aUgU|qDTJkv0uRB2bP}(e8v&Pb&C>uLiBHl6q4ZXLnL8HL7inY_o)JlPATz`gx??f*?a`O1vomW2>cQmax zolNZd$LF&7zdjCLGUkxIHbz=H9Vb1VPJ@; zlQPU+LpRg>u?z}fyEBnUr!!rdjwIYkcO|TJW^?AQ%-v~tk7HFLo|(zaz+pB8?^B65 z97fLID#w#fClayD3`9*w=UD7SD)S2&S41+Kd*hjkk)))N(2Se$<)GE-8@Fj1)o5Qt z4IJ0OO~B#i;>?4O@kGHnUJB}N*(rqexsr17M-NUrc#4+WqB9Rs6kA+Y*4C(F;t)S% zNB4E2PK}beV!yLva1dYNZq=x}oxjy-@iH29PPs+pOyDUMPv(!HQE9aLj(KNqsfx!p zvEz9W*!j4xF2E7F{UC$8xIA+Q^y zwwo7ii=?wn>AA++2p%1p8rpAb92SS)72V%jj`G*Q{)o4JTw+*BoAUX`On&VW@p(x8 z+l3#$xo-UvlUEWM@66H~{$%%m=-_Ww_^yci!Fz*>(ldAiI?LUI^ZsF?^VlxUR^YI6$4+F;8yi6hDa z!KeRT*VD9rB~P3i_KQDwx6kE=4St}A{Bc&+ogWn<-y;45eEhJF9RXtcz{d{Q-zoWR z#`yjfCgd}ZuXA?+ZpX=$L3o_G8L>=CCKhBpd1ab9IMdPUx5sv)9OsdT^Emm~Dz(sB n=cuyhz^y=^kH;r<$90w-h#~9Kh_kRur|3Bq_a|ZqsGMrmT literal 0 HcmV?d00001 diff --git a/vsAddIn2005/BinandLib/monoLaunchC.exe b/vsAddIn2005/BinandLib/monoLaunchC.exe new file mode 100644 index 0000000000000000000000000000000000000000..b72bbf116ba199f423b3f0d695aa7078aac82b54 GIT binary patch literal 37888 zcmeIb4SZD9wKu#cbCMjwzzq3-pg{+XibW|pV2J}dAsGltU_!`*2mvCQIEnc(IfoBR zF!3a9hSRB(YAf&c-YZglysh`GZLOs()r8O_Xs+eMtF%%ZTiPC&C_&OBXv%s2YoD29 z!iSITbD#IVzxV0MZ=b#Q+H0@9_S$Q&{dp$25A0%Q#+U%7>x}J(PmhbgKl{~>+Q95H4oL5RM|I`R9DwX_6L3TI=R|jUTx1_nQyPEDfP{n zG$|oHOgh!}O6$5ue)C?$6*aWHCm~+c@SpGH!C$%UtM9Fc|2z0=;J>h{@)GOKB#DL#R%0%VB+ zO}rMq4X&2rE+ZUc$cZ2%Fa8|CI~+kW9%Q0?qkcF_AUv-$GFD1~X91r{fxq*4jIo^P zthJ2UP0@hy;W?6Ts|3&+d3X_jRM*i;AdJV(*v2_^r6p1cW9icX08N$(=Y@-UToA|{ z1C4E+h=g5mM5`Ju>TxmFHm9z>ZWCaK2vbAHn}B38?K|%>Iar zb-B1Qbaa_0rY;j&4omTQdWul%VjVqWkD8q>DjJg#a^%VT?`2jNnz(;Di(w&wQi7|~ z#Z^kXkXOMxh$mMte>%t^=11pf)Kf%|8#-}qo9m#+IMF;6S%N~kN6i%c?3;vJ!B%;? zveQ#{L7nv!7S1tr8W=TŃD{E_xQTqFPxKZBm#2%`e_YgcRLt&& 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 literal 0 HcmV?d00001 diff --git a/vsAddIn2005/BinandLib/monoLaunchW.exe b/vsAddIn2005/BinandLib/monoLaunchW.exe new file mode 100644 index 0000000000000000000000000000000000000000..5c9d4878a892ea84c840fdb8b66b96a736a75ee6 GIT binary patch literal 37888 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 z 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 literal 0 HcmV?d00001 diff --git a/vsAddIn2005/BinandLib/prj2makesharpWin32.exe b/vsAddIn2005/BinandLib/prj2makesharpWin32.exe new file mode 100644 index 0000000000000000000000000000000000000000..9b9c5ff107ec9db57bcf877388ff26933778bcb9 GIT binary patch literal 34304 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 literal 0 HcmV?d00001 diff --git a/vsAddIn2005/COPYING b/vsAddIn2005/COPYING new file mode 100644 index 0000000..d4ad240 --- /dev/null +++ b/vsAddIn2005/COPYING @@ -0,0 +1,343 @@ +You may use, distribute and copy vsprj2make under the terms of + GNU General Public License version 2, which is displayed below. + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + diff --git a/vsAddIn2005/ChangeLog b/vsAddIn2005/ChangeLog new file mode 100644 index 0000000..2318524 --- /dev/null +++ b/vsAddIn2005/ChangeLog @@ -0,0 +1,6 @@ +2006-04-19 Francisco "Paco" Martinez + + * Initial import into mono's svn repository + + + diff --git a/vsAddIn2005/CreateZipFile/AssemblyInfo.cs b/vsAddIn2005/CreateZipFile/AssemblyInfo.cs new file mode 100644 index 0000000..067c253 --- /dev/null +++ b/vsAddIn2005/CreateZipFile/AssemblyInfo.cs @@ -0,0 +1,25 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using Mono.GetOptions; +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// + +[assembly: AssemblyTitle("CreateZipFromSln")] +[assembly: AssemblyDescription("Creates a Zip File from a MS Visual Studio .NET solution file.")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("MFConsulting")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("(c) 2004")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: Mono.About("MFConsulting, (c) 2004")] +[assembly: Mono.Author("Paco Martinez")] +[assembly: Mono.UsageComplement("-f ")] +[assembly: AssemblyVersion("0.95.1.0")] +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] + diff --git a/vsAddIn2005/CreateZipFile/CreateZipFile.csproj b/vsAddIn2005/CreateZipFile/CreateZipFile.csproj new file mode 100644 index 0000000..f7fcb11 --- /dev/null +++ b/vsAddIn2005/CreateZipFile/CreateZipFile.csproj @@ -0,0 +1,116 @@ + + + Local + 8.0.50727 + 2.0 + {7546314B-68AE-4067-B3F2-3D703AACED64} + Debug + AnyCPU + + + + + CreateZipFromSln + + + JScript + Grid + IE50 + false + Exe + Mfconsulting.Vsprj2make + OnBuildSuccess + + + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + + + false + false + false + false + 4 + full + prompt + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + false + + + true + false + false + false + 4 + none + prompt + + + + ICSharpCode.SharpZipLib + ..\reflib\ICSharpCode.SharpZipLib.dll + + + Mono.GetOptions + ..\reflib\Mono.GetOptions.dll + + + System + + + System.Data + + + System.XML + + + + + Code + + + Code + + + Code + + + Code + + + + + + + + + + \ No newline at end of file diff --git a/vsAddIn2005/CreateZipFile/CreateZipFile.sln b/vsAddIn2005/CreateZipFile/CreateZipFile.sln new file mode 100644 index 0000000..04c997c --- /dev/null +++ b/vsAddIn2005/CreateZipFile/CreateZipFile.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CreateZipFile", "CreateZipFile.csproj", "{7546314B-68AE-4067-B3F2-3D703AACED64}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7546314B-68AE-4067-B3F2-3D703AACED64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7546314B-68AE-4067-B3F2-3D703AACED64}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7546314B-68AE-4067-B3F2-3D703AACED64}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7546314B-68AE-4067-B3F2-3D703AACED64}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/vsAddIn2005/CreateZipFile/Drive.cs b/vsAddIn2005/CreateZipFile/Drive.cs new file mode 100644 index 0000000..529fd70 --- /dev/null +++ b/vsAddIn2005/CreateZipFile/Drive.cs @@ -0,0 +1,254 @@ +using System; +using System.Collections; +using System.IO; +using System.Text.RegularExpressions; + +namespace Mfconsulting.Vsprj2make +{ + /// + /// Summary description for Drive. + /// + public class Drive + { + static System.Collections.ArrayList g_straDirList = new ArrayList(); + static System.Collections.ArrayList g_straFileList = new ArrayList(); + static char []g_chaSeparator = {';'}; + static string g_strBlacListedDirectories = "CVS;obj;.svn"; + static string g_strBlacListedFiles = ".suo;.cvsignore;.vssscc;.vspscc"; + + public Drive() + { + // + // TODO: Add constructor logic here + // + } + + public static void Main(string[] args) + { + string strOutFile; + string strSolutionFile; + MainOpts optObj = new MainOpts(); + ZipCompressor zcObj = new ZipCompressor(); + int i; + + // Handle command line arguments + optObj.ProcessArgs(args); + + // Hangle no parameters being passed + if(args.Length < 1 || optObj.SolutionFile.Length < 1) + { + optObj.DoHelp(); + return; + } + + // Check for BlackListed Extensions being passed + if(optObj.Extensions.Length > 0) + { + g_strBlacListedFiles = optObj.Extensions; + } + + // Check for BlackListed directories being passed + if(optObj.BlacListedDirectories.Length > 0) + { + g_strBlacListedDirectories = optObj.BlacListedDirectories; + } + + strSolutionFile = optObj.SolutionFile; + + if(optObj.OutputFilePath.Length > 0) + { + strOutFile = optObj.OutputFilePath; + } + else + { + strOutFile = + Path.Combine( + Path.GetDirectoryName(strSolutionFile), + (Path.GetFileNameWithoutExtension(strSolutionFile) + ".zip") + ); + } + + if(System.IO.Path.GetExtension(strSolutionFile).ToUpper().CompareTo(".SLN") != 0) + { + Console.WriteLine("The file you submited does not seem like a Visual Studio .NET Solution file."); + return; + } + + // Parse solution + Drive.ParseSolution(strSolutionFile); + + // build a string array of the base solution directory + // and the projects directory + string []straBaseDirs = new string[g_straDirList.Count]; + for(i = 0; i < straBaseDirs.Length; i++) + { + straBaseDirs[i] = (string)g_straDirList[i]; + AddFilesToFileList(straBaseDirs[i]); + } + + // Clear the global Directory ArrayList + g_straDirList.Clear(); + + // Build the File ArrayList + string []straFilenames = new string[g_straFileList.Count]; + for(i = 0; i < straFilenames.Length; i++) + { + straFilenames[i] = (string)g_straFileList[i]; + } + + // Clear the global File ArrayList + g_straFileList.Clear(); + + // Invoke the Programs main functionality and purpose + zcObj.CompressionLevel = optObj.Level; + zcObj.CreateZipFile(straFilenames, strOutFile); + } + + #region Support functions + + /// + /// Parse through all the projects in a given solution + /// + /// The fully qualified path to the solution file. + static void ParseSolution(string strFname) + { + string strSolutionDir; + FileStream fis = new FileStream( + strFname, + FileMode.Open, + FileAccess.Read, + FileShare.Read + ); + + StreamReader reader = new StreamReader(fis); + Regex regex = new Regex(@"Project\(""\{(.*)\}""\) = ""(.*)"", ""(.*)"", ""(\{.*\})"""); + + // Get the solution directory and added + strSolutionDir = System.IO.Path.GetDirectoryName(strFname); + + // Change the current directory to the solution directory + System.IO.Directory.SetCurrentDirectory(strSolutionDir); + + Drive.g_straDirList.Add(strSolutionDir); + + while (true) + { + string s = reader.ReadLine(); + Match match; + + match = regex.Match(s); + if (match.Success) + { + string projectName = match.Groups[2].Value; + string csprojPath = match.Groups[3].Value; + string projectGuid = match.Groups[4].Value; + + if (csprojPath.StartsWith("http://")) + { + Console.WriteLine("WARNING: got http:// project, guessing actual path."); + csprojPath = Path.Combine(projectName, Path.GetFileName(csprojPath)); + } + if (csprojPath.EndsWith (".csproj")) + { + string strProjDir = System.IO.Path.GetDirectoryName( + System.IO.Path.GetFullPath(csprojPath)); + + if(strProjDir.CompareTo(strSolutionDir) != 0) + { + Drive.g_straDirList.Add(strProjDir); + // Recurse to look for subdirs + ListSubDirs(strProjDir); + } + else + { + ListSubDirs(strProjDir); + } + } + } + + if (s.StartsWith("Global")) + { + break; + } + } + } + + /// + /// Iterates through all of the directories (if any) that + /// are contained within a given directory + /// + /// An imput string that + /// represents the directory to search in + public static void ListSubDirs(string strInDirPath) + { + System.IO.DirectoryInfo di = new DirectoryInfo(strInDirPath); + + foreach(System.IO.DirectoryInfo diObj in di.GetDirectories()) + { + // Determine if is fit + if(IsDirBlackListed(diObj.Name) == false) + { + g_straDirList.Add(diObj.FullName); + ListSubDirs(diObj.FullName); + } + } + } + + /// + /// Determines if a directory name is listed on the ignore. + /// + /// String value that represents the name to check. + /// Returns true if black listed or false otherwise + public static bool IsDirBlackListed(string strInDirName) + { + string []straBlackListItems = g_strBlacListedDirectories.Split(g_chaSeparator); + + foreach(string strDirName in straBlackListItems) + { + if(strInDirName.ToUpper().CompareTo(strDirName.ToUpper()) == 0) + return true; + } + + return false; + } + + /// + /// Determines if a given file name is in the Black List + /// + /// The file name to check against the list + /// Returns true if black listed or false otherwise + public static bool IsFileBlackListed(string strInFileName) + { + string []straBlackListItems = g_strBlacListedFiles.Split(g_chaSeparator); + + foreach(string strExtention in straBlackListItems) + { + if(Path.GetExtension(strInFileName).ToUpper().CompareTo(strExtention.ToUpper()) == 0) + return true; + } + + return false; + } + + /// + /// Extract the list of files from a given directory and + /// inserts them into the global File ArrayList + /// + /// The full directory path to look for files + public static void AddFilesToFileList(string strInDirPath) + { + string []straFiles = Directory.GetFiles(strInDirPath); + + foreach(string strFileName in straFiles) + { + // Check to see if blacklisted + if(IsFileBlackListed(strFileName) == false) + { + Drive.g_straFileList.Add(strFileName); + } + } + } + + #endregion + } +} diff --git a/vsAddIn2005/CreateZipFile/MainOpts.cs b/vsAddIn2005/CreateZipFile/MainOpts.cs new file mode 100644 index 0000000..1046d1c --- /dev/null +++ b/vsAddIn2005/CreateZipFile/MainOpts.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections; +using Mono.GetOptions; + +namespace Mfconsulting.Vsprj2make +{ + class MainOpts : Options + { + [Option(1, "Compression level", 'l')] + public int Level = 4; + + [Option(1, "Ignored extensions", "IgnoredExtensions")] + public string Extensions = ".suo,.cvsignore,.vssscc,.vspscc"; + + [Option(1, "Ignored directories", "IgnoredDirectories")] + public string BlacListedDirectories = "CVS,obj,.svn"; + + [Option(1, "Output file path", 'o')] + public string OutputFilePath = ""; + + [Option(1, "Input solution or project file", 'f')] + public string SolutionFile = ""; + + public MainOpts() + { + ParsingMode = OptionsParsingMode.Both; + BreakSingleDashManyLettersIntoManyOptions = false; + EndOptionProcessingWithDoubleDash = true; + + if (System.IO.Path.DirectorySeparatorChar.CompareTo('/') == 0) + ParsingMode = OptionsParsingMode.Linux; + } + } +} diff --git a/vsAddIn2005/CreateZipFile/Makefile.mcs.nmake b/vsAddIn2005/CreateZipFile/Makefile.mcs.nmake new file mode 100644 index 0000000..df58562 --- /dev/null +++ b/vsAddIn2005/CreateZipFile/Makefile.mcs.nmake @@ -0,0 +1,37 @@ +!if !defined (TARGET) +TARGET=.\bin\Debug +!else +TARGET=.\bin\$(TARGET) +!endif + +MCS=mcs +!if !defined(RELEASE) +MCSFLAGS=-debug --stacktrace +!endif + +CREATEZIPFILE_EXE=$(TARGET)\CreateZipFromSln.exe +CREATEZIPFILE_PDB=$(TARGET)\CreateZipFromSln.exe.mdb +CREATEZIPFILE_SRC=AssemblyInfo.cs \ + Drive.cs \ + ZipCompressor.cs \ + MainOpts.cs + +CREATEZIPFILE_RES= + +$(CREATEZIPFILE_EXE): $(CREATEZIPFILE_SRC) + -md $(TARGET) + $(MCS) $(MCSFLAGS) -r:System.dll -r:System.Data.dll -r:System.Xml.dll -r:ICSharpCode.SharpZipLib.dll -r:Mono.GetOptions.dll -target:exe -out:$(CREATEZIPFILE_EXE) $(CREATEZIPFILE_RES) $(CREATEZIPFILE_SRC) + + +# common targets + +all: $(CREATEZIPFILE_EXE) + +clean: + -del "$(CREATEZIPFILE_EXE)" 2> nul + -del "$(CREATEZIPFILE_PDB)" 2> nul + + +# project names as targets + +CreateZipFile: $(CREATEZIPFILE_EXE) diff --git a/vsAddIn2005/CreateZipFile/ZipCompressor.cs b/vsAddIn2005/CreateZipFile/ZipCompressor.cs new file mode 100644 index 0000000..3bfb8b7 --- /dev/null +++ b/vsAddIn2005/CreateZipFile/ZipCompressor.cs @@ -0,0 +1,92 @@ +using System; +using System.IO; +using ICSharpCode.SharpZipLib.Checksums; +using ICSharpCode.SharpZipLib.Zip; +using ICSharpCode.SharpZipLib.GZip; + +namespace Mfconsulting.Vsprj2make +{ + public class ZipCompressor + { + /// + /// Level of compression + /// + public int m_nCompressionLevel = 6; + + /// + /// Level of compression + /// + public int CompressionLevel + { + get { return m_nCompressionLevel; } + set + { + if(value > 9) + { + m_nCompressionLevel = 9; + return; + } + + if(value < 1) + { + m_nCompressionLevel = 1; + return; + } + + m_nCompressionLevel = value; + } + } + + public string GetFileNameWithoutDrive(string strInFullPath) + { + System.IO.DirectoryInfo diObj = null; + string strRetVal; + string strFileName = System.IO.Path.GetFileName(strInFullPath); + string strDirectory = System.IO.Path.GetDirectoryName(strInFullPath); + + diObj = new DirectoryInfo(strDirectory); + + strRetVal = String.Format("{0}{1}{2}", + diObj.FullName.Substring(diObj.Root.Name.Length), + System.IO.Path.DirectorySeparatorChar, + strFileName + ); + + return strRetVal.Replace("\\", "/"); + } + + public void CreateZipFile(string[] straFilenames, string strOutputFilename) + { + Crc32 crc = new Crc32(); + ZipOutputStream zos = new ZipOutputStream(File.Create(strOutputFilename)); + + zos.SetLevel(m_nCompressionLevel); + + foreach (string strFileName in straFilenames) + { + FileStream fs = File.OpenRead(strFileName); + + byte[] buffer = new byte[fs.Length]; + fs.Read(buffer, 0, buffer.Length); + ZipEntry entry = new ZipEntry(GetFileNameWithoutDrive(strFileName)); + + entry.DateTime = DateTime.Now; + + entry.Size = fs.Length; + fs.Close(); + + crc.Reset(); + crc.Update(buffer); + + entry.Crc = crc.Value; + + zos.PutNextEntry(entry); + + zos.Write(buffer, 0, buffer.Length); + } + + zos.Finish(); + zos.Close(); + } + } +} diff --git a/vsAddIn2005/INSTALL b/vsAddIn2005/INSTALL new file mode 100644 index 0000000..9dd8fd2 --- /dev/null +++ b/vsAddIn2005/INSTALL @@ -0,0 +1,3 @@ +INSTALL.txt for monoaddin +------------------------------------------- + diff --git a/vsAddIn2005/Prj2MakeWin32/CsprojInfo.cs b/vsAddIn2005/Prj2MakeWin32/CsprojInfo.cs new file mode 100644 index 0000000..ad20e9c --- /dev/null +++ b/vsAddIn2005/Prj2MakeWin32/CsprojInfo.cs @@ -0,0 +1,170 @@ +using System; +using System.Collections; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml; +using System.Xml.Serialization; + + +namespace Mfconsulting.General.Prj2Make +{ + class CsprojInfo + { + public readonly string name; + public readonly string guid; + public readonly string csprojpath; + public string makename; + public string makename_ext; + public string assembly_name; + public string res; + public string src; + private bool m_bAllowUnsafeCode; + private Mfconsulting.General.Prj2Make.Schema.Csproj.VisualStudioProject m_projObject; + + public string ext_refs = ""; + public string switches = ""; + + public bool AllowUnsafeCode + { + get { return m_bAllowUnsafeCode; } + } + + public Mfconsulting.General.Prj2Make.Schema.Csproj.VisualStudioProject Proyecto + { + get { return m_projObject; } + } + + // Project desirialization + protected Mfconsulting.General.Prj2Make.Schema.Csproj.VisualStudioProject LoadPrjFromFile (string strIn) + { + FileStream fs = new FileStream (strIn, FileMode.Open); + + XmlSerializer xmlSer = new XmlSerializer (typeof(Mfconsulting.General.Prj2Make.Schema.Csproj.VisualStudioProject)); + Mfconsulting.General.Prj2Make.Schema.Csproj.VisualStudioProject prjObj = (Mfconsulting.General.Prj2Make.Schema.Csproj.VisualStudioProject) xmlSer.Deserialize (fs); + + fs.Close(); + + return (prjObj); + } + + public CsprojInfo(bool isUnixMode, bool isMcsMode, string name, string guid, string csprojpath) + { + this.name = name; + this.guid = guid; + this.csprojpath = csprojpath; + + makename = name.Replace('.','_').ToUpper(); + makename_ext = makename + "_EXT"; + m_bAllowUnsafeCode = false; + + // convert backslashes to slashes + csprojpath = csprojpath.Replace("\\", "/"); + + // loads the file in order to deserialize and + // build the object graph + try + { + m_projObject = LoadPrjFromFile (csprojpath); + } + + catch (Exception exc) + { + Console.WriteLine ( + String.Format ("Could not load the file {0}\nException: {1}", + csprojpath, + exc.Message) + ); + return; + } + + // Establish if the allow unsafe code flag is true + foreach (Mfconsulting.General.Prj2Make.Schema.Csproj.Config cf in m_projObject.CSHARP.Build.Settings.Config) + { + if(cf.AllowUnsafeBlocks == true) + m_bAllowUnsafeCode = true; + } + + switch (m_projObject.CSHARP.Build.Settings.OutputType) + { + case "Library": + makename_ext = makename + "_DLL"; + assembly_name = m_projObject.CSHARP.Build.Settings.AssemblyName + ".dll"; + switches += " -target:library"; + break; + + case "Exe": + makename_ext = makename + "_EXE"; + assembly_name = m_projObject.CSHARP.Build.Settings.AssemblyName + ".exe"; + switches += " -target:exe"; + break; + + case "WinExe": + makename_ext = makename + "_EXE"; + assembly_name = m_projObject.CSHARP.Build.Settings.AssemblyName + ".exe"; + switches += " -target:winexe"; + break; + + default: + throw new NotSupportedException("Unsupported OutputType: " + m_projObject.CSHARP.Build.Settings.OutputType); + + } + + src = ""; + string basePath = Path.GetDirectoryName(csprojpath); + string s; + + foreach (Mfconsulting.General.Prj2Make.Schema.Csproj.File fl in m_projObject.CSHARP.Files.Include) + { + if(fl.BuildAction == Mfconsulting.General.Prj2Make.Schema.Csproj.FileBuildAction.Compile) + { + if (src != "") + { + src += " \\\n\t"; + } + + s = System.IO.Path.Combine(basePath, fl.RelPath); + s = s.Replace("\\", "/"); + if (SlnMaker.slash != "/") + s = s.Replace("/", SlnMaker.slash); + + // Test for spaces + if (isUnixMode == false) { + // We are in win32 using a cmd.exe or other + // DOS shell + if(s.IndexOf(' ') > -1) { + src += String.Format("\"{0}\"", s); + } else { + src += s; + } + } else { + // We are in *NIX or some other + // GNU like shell + src += s.Replace(" ", "\\ "); + } + } + } + + res = ""; + string rootNS = m_projObject.CSHARP.Build.Settings.RootNamespace; + string relPath; + foreach (Mfconsulting.General.Prj2Make.Schema.Csproj.File fl in m_projObject.CSHARP.Files.Include) + { + if(fl.BuildAction == Mfconsulting.General.Prj2Make.Schema.Csproj.FileBuildAction.EmbeddedResource) + { + if (res != "") { + res += " \\\n\t"; + } + + relPath = fl.RelPath.Replace("\\", "/"); + s = System.IO.Path.Combine(basePath, relPath); + s = String.Format("-resource:{0},{1}", s, rootNS + "." + relPath.Replace("/", ".")); + s = s.Replace("\\", "/"); + if (SlnMaker.slash != "/") + s = s.Replace("/", SlnMaker.slash); + res += s; + } + } + } + } +} \ No newline at end of file diff --git a/vsAddIn2005/Prj2MakeWin32/CsprojInfo2005.cs b/vsAddIn2005/Prj2MakeWin32/CsprojInfo2005.cs new file mode 100644 index 0000000..c6accd8 --- /dev/null +++ b/vsAddIn2005/Prj2MakeWin32/CsprojInfo2005.cs @@ -0,0 +1,188 @@ +using System; +using System.Diagnostics; +using System.Collections; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml; +using System.Xml.Serialization; + + +namespace Mfconsulting.General.Prj2Make +{ + class CsprojInfo2005 + { + public readonly string name; + public readonly string guid; + public readonly string csprojpath; + public string makename; + public string makename_ext; + public string assembly_name; + public string res; + public string src; + private bool m_bAllowUnsafeCode; + private Mfconsulting.General.Prj2Make.Schema.Csproj2005.Project m_projObject; + + public string ext_refs = ""; + public string switches = ""; + + public bool AllowUnsafeCode + { + get { return m_bAllowUnsafeCode; } + } + + public Mfconsulting.General.Prj2Make.Schema.Csproj2005.Project Proyecto + { + get { return m_projObject; } + } + + // Project desirialization + protected Mfconsulting.General.Prj2Make.Schema.Csproj2005.Project LoadPrjFromFile (string strIn) + { + FileStream fs = new FileStream (strIn, FileMode.Open); + Mfconsulting.General.Prj2Make.Schema.Csproj2005.Project prjObj = null; + + try + { + XmlSerializer xmlSer = new XmlSerializer(typeof(Mfconsulting.General.Prj2Make.Schema.Csproj.VisualStudioProject)); + prjObj = (Mfconsulting.General.Prj2Make.Schema.Csproj2005.Project)xmlSer.Deserialize(fs); + } + catch (Exception exc) + { + Trace.WriteLine(String.Format("Error while deserializing file: {0}\n{1}", strIn, exc.Message)); + } + + fs.Close(); + + return (prjObj); + } + + public CsprojInfo2005(bool isUnixMode, bool isMcsMode, string name, string guid, string csprojpath) + { + this.name = name; + this.guid = guid; + this.csprojpath = csprojpath; + + makename = name.Replace('.','_').ToUpper(); + makename_ext = makename + "_EXT"; + m_bAllowUnsafeCode = false; + + // convert backslashes to slashes + csprojpath = csprojpath.Replace("\\", "/"); + + // loads the file in order to deserialize and + // build the object graph + try + { + m_projObject = LoadPrjFromFile (csprojpath); + } + + catch (Exception exc) + { + Console.WriteLine ( + String.Format ("Could not load the file {0}\nException: {1}", + csprojpath, + exc.Message) + ); + return; + } + + // Establish if the allow unsafe code flag is true + foreach (Mfconsulting.General.Prj2Make.Schema.Csproj2005.PropertyGroup propGrp in m_projObject.PropertyGroup) + { + if (propGrp.AllowUnsafeBlocks == true) + m_bAllowUnsafeCode = true; + } + + foreach (Mfconsulting.General.Prj2Make.Schema.Csproj2005.PropertyGroup propGrp in m_projObject.PropertyGroup) + { + switch (propGrp.OutputType) + { + case "Library": + makename_ext = makename + "_DLL"; + assembly_name = m_projObject.PropertyGroup[0].AssemblyName + ".dll"; + switches += " -target:library"; + break; + + case "Exe": + makename_ext = makename + "_EXE"; + assembly_name = m_projObject.PropertyGroup[0].AssemblyName + ".exe"; + switches += " -target:exe"; + break; + + case "WinExe": + makename_ext = makename + "_EXE"; + assembly_name = m_projObject.PropertyGroup[0].AssemblyName + ".exe"; + switches += " -target:winexe"; + break; + + default: + throw new NotSupportedException("Unsupported OutputType: " + propGrp.OutputType); + } + } + + src = ""; + string basePath = Path.GetDirectoryName(csprojpath); + string s; + + foreach (object[][] itemGrpArray in m_projObject.ItemGroup) + { + foreach (object[] itemGrp in itemGrpArray) + { + } + } + + //foreach (Mfconsulting.General.Prj2Make.Schema.Csproj.File fl in m_projObject.CSHARP.Files.Include) + //{ + // if(fl.BuildAction == Mfconsulting.General.Prj2Make.Schema.Csproj.FileBuildAction.Compile) + // { + // if (src != "") + // { + // src += " \\\n\t"; + // } + + // s = System.IO.Path.Combine(basePath, fl.RelPath); + // s = s.Replace("\\", "/"); + // if (SlnMaker.slash != "/") + // s = s.Replace("/", SlnMaker.slash); + + // // Test for spaces + // if (isUnixMode == false) { + // // We are in win32 using a cmd.exe or other + // // DOS shell + // if(s.IndexOf(' ') > -1) { + // src += String.Format("\"{0}\"", s); + // } else { + // src += s; + // } + // } else { + // // We are in *NIX or some other + // // GNU like shell + // src += s.Replace(" ", "\\ "); + // } + // } + //} + + //res = ""; + //string rootNS = m_projObject.CSHARP.Build.Settings.RootNamespace; + //string relPath; + //foreach (Mfconsulting.General.Prj2Make.Schema.Csproj.File fl in m_projObject.CSHARP.Files.Include) + //{ + // if(fl.BuildAction == Mfconsulting.General.Prj2Make.Schema.Csproj.FileBuildAction.EmbeddedResource) + // { + // if (res != "") { + // res += " \\\n\t"; + // } + + // relPath = fl.RelPath.Replace("\\", "/"); + // s = System.IO.Path.Combine(basePath, relPath); + // s = String.Format("-resource:{0},{1}", s, rootNS + "." + relPath.Replace("/", ".")); + // s = s.Replace("\\", "/"); + // if (SlnMaker.slash != "/") + // s = s.Replace("/", SlnMaker.slash); + // res += s; + // } + //} + } + } +} \ No newline at end of file diff --git a/vsAddIn2005/Prj2MakeWin32/Makefile.mcs.nmake b/vsAddIn2005/Prj2MakeWin32/Makefile.mcs.nmake new file mode 100644 index 0000000..ea67b05 --- /dev/null +++ b/vsAddIn2005/Prj2MakeWin32/Makefile.mcs.nmake @@ -0,0 +1,45 @@ +!if !defined (TARGET) +TARGET=.\bin\Debug +!else +TARGET=.\bin\$(TARGET) +!endif + +MCS=mcs +!if !defined(RELEASE) +MCSFLAGS=-debug --stacktrace +!endif + +PRJ2MAKESHARP_EXE=$(TARGET)\prj2makesharpWin32.exe +PRJ2MAKESHARP_PDB=$(TARGET)\prj2makesharpWin32.exe.mdb +PRJ2MAKESHARP_SRC=csproj_ver2003.cs \ + CsprojInfo.cs \ + MdPrjHelper.cs \ + MsPrjHelper.cs \ + pkgconfiginvoker.cs \ + PrjHelper.cs \ + PrjxInfo.cs \ + sharp_d_cmbx.cs \ + sharp_d_prjx.cs \ + cui\AssemblyInfo.cs \ + cui\Main.cs \ + cui\MainMod.cs \ + cui\MainOpts.cs +PRJ2MAKESHARP_RES= + +$(PRJ2MAKESHARP_EXE): $(PRJ2MAKESHARP_SRC) + -md $(TARGET) + $(MCS) $(MCSFLAGS) -r:System.Xml.dll -r:Mono.GetOptions.dll -r:System.dll -target:exe -out:$(PRJ2MAKESHARP_EXE) $(PRJ2MAKESHARP_RES) $(PRJ2MAKESHARP_SRC) + + +# common targets + +all: $(PRJ2MAKESHARP_EXE) + +clean: + -del "$(PRJ2MAKESHARP_EXE)" 2> nul + -del "$(PRJ2MAKESHARP_PDB)" 2> nul + + +# project names as targets + +prj2makesharp: $(PRJ2MAKESHARP_EXE) diff --git a/vsAddIn2005/Prj2MakeWin32/MdPrjHelper.cs b/vsAddIn2005/Prj2MakeWin32/MdPrjHelper.cs new file mode 100644 index 0000000..6eaf062 --- /dev/null +++ b/vsAddIn2005/Prj2MakeWin32/MdPrjHelper.cs @@ -0,0 +1,362 @@ +using System; +using System.Collections; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml; +using System.Xml.Serialization; +using System.Diagnostics; + +namespace Mfconsulting.General.Prj2Make +{ + public class CmbxMaker + { + public static string slash; + static Hashtable projNameInfo = new Hashtable(); + static Hashtable projGuidInfo = new Hashtable(); + private Mfconsulting.General.Prj2Make.Schema.Cmbx.Combine m_cmbObject; + private bool m_bIsUnix; + private bool m_bIsMcs; + private bool m_bIsUsingLib; + + // Flag use to determine if the LIB variable will be used in + // the Makefile that prj2make generates + public bool IsUsingLib + { + get{ return m_bIsUsingLib; } + set{ m_bIsUsingLib = value; } + } + + // Determines if the makefile is intended for nmake or gmake for urposes of path separator character + public bool IsUnix + { + get{ return m_bIsUnix; } + set{ m_bIsUnix = value; } + } + + // Determines if using MCS or CSC + public bool IsMcs + { + get{ return m_bIsMcs; } + set{ m_bIsMcs = value; } + } + + public Mfconsulting.General.Prj2Make.Schema.Cmbx.Combine Solucion { + get { return m_cmbObject; } + } + + public CmbxMaker() + { + m_bIsUnix = false; + m_bIsMcs = false; + m_bIsUsingLib = false; + } + + // Combine desirialization + protected Mfconsulting.General.Prj2Make.Schema.Cmbx.Combine LoadCmbFromFile (string strIn) + { + FileStream fs = new FileStream (strIn, FileMode.Open); + + XmlSerializer xmlSer = new XmlSerializer (typeof(Mfconsulting.General.Prj2Make.Schema.Cmbx.Combine)); + Mfconsulting.General.Prj2Make.Schema.Cmbx.Combine cmbObj = (Mfconsulting.General.Prj2Make.Schema.Cmbx.Combine) xmlSer.Deserialize (fs); + + fs.Close(); + + return (cmbObj); + } + + protected void ParseMdCsProj(string fname) + { + string projectName; + + PrjxInfo pi = new PrjxInfo(m_bIsUnix, m_bIsMcs, fname); + projectName = pi.name; + projNameInfo[projectName] = pi; + } + + protected void ParseCombine(string fname) + { + string CombineFilePath = fname; + + // convert backslashes to slashes + CombineFilePath = CombineFilePath.Replace("\\", "/"); + + // loads the file in order to deserialize and + // build the object graph + try { + m_cmbObject = LoadCmbFromFile (CombineFilePath); + } catch (Exception exc) { + + Console.WriteLine ( + String.Format ("Could not load the file {0}\nException: {1}", + CombineFilePath, + exc.Message) + ); + return; + } + + foreach(Mfconsulting.General.Prj2Make.Schema.Cmbx.Entry ent in m_cmbObject.Entries) + { + string projectName = System.IO.Path.GetFileNameWithoutExtension(ent.filename); + string csprojPath = ent.filename; + + if (csprojPath.EndsWith(".prjx")) + { + PrjxInfo pi = new PrjxInfo(m_bIsUnix, m_bIsMcs, csprojPath); + + projNameInfo[projectName] = pi; + } + } + } + + public string MdCmbxHelper(bool isUnixMode, bool isMcsMode, bool isSln, string slnFile) + { + bool noCommonTargets = false; + bool noProjectTargets = false; + bool noFlags = false; + int nPos = -1; + StringBuilder MakefileBuilder = new StringBuilder(); + + m_bIsUnix = isUnixMode; + m_bIsMcs = isMcsMode; + + if(m_bIsUnix == true && m_bIsMcs == true) + { + m_bIsUsingLib = true; + } + + if (m_bIsUnix) + { + slash = "/"; + } + else + { + slash = "\\"; + } + + try + { + string d = Path.GetDirectoryName(slnFile); + + if (d != "") + Directory.SetCurrentDirectory(d); + + if (isSln == true) { + // We invoke the ParseSolution + // by passing the file obtained + ParseCombine (slnFile); + } else { + + // We invoke the ParseMsCsProj + // by passing the file obtained + ParseMdCsProj (slnFile); + } + + if (!noFlags) + { + if (m_bIsUnix) // gmake + { + MakefileBuilder.Append("ifndef TARGET\n"); + MakefileBuilder.Append("\tTARGET=./bin/Debug\n"); + MakefileBuilder.Append("else\n"); + MakefileBuilder.Append("\tTARGET=./bin/$(TARGET)\n"); + MakefileBuilder.Append("endif\n\n"); + + if (m_bIsMcs == false) + { + MakefileBuilder.Append("MCS=csc\n"); + MakefileBuilder.Append("MCSFLAGS=-nologo\n\n"); + MakefileBuilder.Append("ifdef (RELEASE)\n"); + MakefileBuilder.Append("\tMCSFLAGS=$(MCSFLAGS) -optimize+ -d:TRACE\n"); + MakefileBuilder.Append("else\n"); + MakefileBuilder.Append("\tMCSFLAGS=$(MCSFLAGS) -debug+ -d:TRACE,DEBUG\n"); + MakefileBuilder.Append("endif\n"); + } + else + { + MakefileBuilder.Append("MCS=mcs\n"); + MakefileBuilder.Append("ifndef (RELEASE)\n"); + MakefileBuilder.Append("\tMCSFLAGS=-debug --stacktrace\n"); + MakefileBuilder.Append("endif\n"); + // Define and add the information used in the -lib: arguments passed to the + // compiler to assist in finding non-fullyqualified assembly references. + if(m_bIsUsingLib == true) + { + MakefileBuilder.AppendFormat("LIBS=-lib:{0}/mono/1.0 -lib:{1}/mono/gtk-sharp\n\n", + "`pkg-config --variable=libdir mono`", + "`pkg-config --variable=libdir gtk-sharp`" + ); + } + } + } + else // nmake + { + MakefileBuilder.Append("!if !defined (TARGET)\n"); + MakefileBuilder.Append("TARGET=.\\bin\\Debug\n"); + MakefileBuilder.Append("!else\n"); + MakefileBuilder.Append("TARGET=.\\bin\\$(TARGET)\n"); + MakefileBuilder.Append("!endif\n\n"); + + if (m_bIsMcs == false) + { + MakefileBuilder.Append("MCS=csc\n"); + MakefileBuilder.Append("MCSFLAGS=-nologo\n\n"); + MakefileBuilder.Append("!if !defined(RELEASE)\n"); + MakefileBuilder.Append("MCSFLAGS=$(MCSFLAGS) -optimize+ -d:TRACE\n"); + MakefileBuilder.Append("!else\n"); + MakefileBuilder.Append("MCSFLAGS=$(MCSFLAGS) -debug+ -d:TRACE,DEBUG\n"); + MakefileBuilder.Append("!endif\n"); + } + else + { + MakefileBuilder.Append("MCS=mcs\n"); + MakefileBuilder.Append("!if !defined(RELEASE)\n"); + MakefileBuilder.Append("MCSFLAGS=-debug --stacktrace\n"); + MakefileBuilder.Append("!endif\n"); + } + } + + MakefileBuilder.Append("\n"); + } + else + { + MakefileBuilder.Append("!if !defined(MCS)\n"); + MakefileBuilder.Append("!error You must provide MCS when making\n"); + MakefileBuilder.Append("!endif\n\n"); + } + + foreach (PrjxInfo prjI in projNameInfo.Values) + { + MakefileBuilder.AppendFormat("{0}=$(TARGET){1}{2}\n", prjI.makename_ext, slash, prjI.assembly_name); + MakefileBuilder.AppendFormat("{0}_PDB=$(TARGET){1}{2}\n", prjI.makename, slash, prjI.assembly_name.Replace(".dll",".pdb")); + MakefileBuilder.AppendFormat("{0}_SRC={1}\n", prjI.makename, prjI.src); + MakefileBuilder.AppendFormat("{0}_RES={1}\n\n", prjI.makename, prjI.res); + } + + + foreach (PrjxInfo pi in projNameInfo.Values) + { + string refs = ""; + string deps = ""; + + foreach (Mfconsulting.General.Prj2Make.Schema.Prjx.Reference rf in pi.Proyecto.References) + { + if (refs != "") + refs += " "; + + string assemblyName = rf.refto; + + // HACK - under Unix filenames are case sensitive + // Under Windows there's no agreement on Xml vs XML ;-) + if (0 == String.Compare(assemblyName, "System.Xml", true)) + { + assemblyName = "System.Xml"; + } + + // Check to see if there is a coma in the + // reference. This could indicate a GAC + // style reference + nPos = assemblyName.IndexOf(','); + if(nPos == -1) + { + if (System.IO.Path.GetExtension(assemblyName).ToUpper().CompareTo(".DLL") == 0) + { + refs += "-r:" + assemblyName; + } + else + { + refs += "-r:" + assemblyName + ".dll"; + } + } + else + { + refs += "-r:" + assemblyName.Substring(0, nPos) + ".dll"; + } + } + + MakefileBuilder.AppendFormat("$({0}): $({1}_SRC) {2}\n", pi.makename_ext, pi.makename, deps); + + if (isUnixMode) + { + MakefileBuilder.Append("\t-mkdir -p $(TARGET)\n"); + } + else + { + MakefileBuilder.Append("\t-md $(TARGET)\n"); + } + + MakefileBuilder.Append("\t$(MCS) $(MCSFLAGS)"); + + // Test to see if any configuratino has the Allow unsafe blocks on + if(pi.AllowUnsafeCode == true ) { + MakefileBuilder.Append(" -unsafe"); + } + + // Test for LIBS usage + if(m_bIsUsingLib == true) { + MakefileBuilder.Append(" $(LIBS)"); + } + + MakefileBuilder.AppendFormat(" {2}{3} -out:$({0}) $({1}_RES) $({1}_SRC)\n", + pi.makename_ext, pi.makename, refs, pi.switches); + + MakefileBuilder.Append("\n"); + } + + if (!noCommonTargets) + { + MakefileBuilder.Append("\n"); + MakefileBuilder.Append("# common targets\n\n"); + MakefileBuilder.Append("all:\t"); + + bool first = true; + + foreach (PrjxInfo pi in projNameInfo.Values) + { + if (!first) + { + MakefileBuilder.Append(" \\\n\t"); + } + MakefileBuilder.AppendFormat("$({0})", pi.makename_ext); + first = false; + } + MakefileBuilder.Append("\n\n"); + + MakefileBuilder.Append("clean:\n"); + + foreach (PrjxInfo pi in projNameInfo.Values) + { + if (isUnixMode) + { + MakefileBuilder.AppendFormat("\t-rm -f \"$({0})\" 2> /dev/null\n", pi.makename_ext); + MakefileBuilder.AppendFormat("\t-rm -f \"$({0}_PDB)\" 2> /dev/null\n", pi.makename); + } + else + { + MakefileBuilder.AppendFormat("\t-del \"$({0})\" 2> nul\n", pi.makename_ext); + MakefileBuilder.AppendFormat("\t-del \"$({0}_PDB)\" 2> nul\n", pi.makename); + } + } + MakefileBuilder.Append("\n"); + } + + if (!noProjectTargets) + { + MakefileBuilder.Append("\n"); + MakefileBuilder.Append("# project names as targets\n\n"); + foreach (PrjxInfo pi in projNameInfo.Values) + { + MakefileBuilder.AppendFormat("{0}: $({1})\n", pi.name, pi.makename_ext); + } + } + } + catch (Exception e) + { + Console.WriteLine("EXCEPTION: {0}\n", e); + return ""; + } + + return MakefileBuilder.ToString(); + } + } +} diff --git a/vsAddIn2005/Prj2MakeWin32/MsPrjHelper.cs b/vsAddIn2005/Prj2MakeWin32/MsPrjHelper.cs new file mode 100644 index 0000000..122f8da --- /dev/null +++ b/vsAddIn2005/Prj2MakeWin32/MsPrjHelper.cs @@ -0,0 +1,910 @@ +using System; +using System.Diagnostics; +using System.Collections; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml; +using System.Xml.Serialization; +using Mfconsulting.General.Prj2Make.Schema.Prjx; +using Mfconsulting.General.Prj2Make.Schema.Csproj; + +namespace Mfconsulting.General.Prj2Make +{ + public class SlnMaker + { + public static string slash; + static Hashtable projNameInfo = new Hashtable(); + static Hashtable projGuidInfo = new Hashtable(); + private string prjxFileName = null; + private string cmbxFileName = null; + private string m_strSlnVer; + private string m_strCsprojVer; + private bool m_bIsUnix; + private bool m_bIsMcs; + private bool m_bIsUsingLib; + + // Flag use to determine if the LIB variable will be used in + // the Makefile that prj2make generates + public bool IsUsingLib + { + get{ return m_bIsUsingLib; } + set{ m_bIsUsingLib = value; } + } + + + // Determines if the makefile is intended for nmake or gmake for urposes of path separator character + public bool IsUnix + { + get{ return m_bIsUnix; } + set{ m_bIsUnix = value; } + } + + // Determines if using MCS or CSC + public bool IsMcs + { + get{ return m_bIsMcs; } + set{ m_bIsMcs = value; } + } + + public string SlnVersion + { + get { return m_strSlnVer; } + set { m_strSlnVer = value; } + } + + public string CsprojVersion + { + get { return m_strCsprojVer; } + set { m_strCsprojVer = value; } + } + + // Shuld contain the file name + // of the most resent prjx generation + public string PrjxFileName { + get { return prjxFileName; } + } + + // Shuld contain the file name + // of the most resent cmbx generation + public string CmbxFileName { + get { return cmbxFileName; } + } + + // Default constructor + public SlnMaker() + { + m_bIsUnix = false; + m_bIsMcs = false; + m_bIsUsingLib = false; + } + + // Utility function to determine the sln file version + protected string GetSlnFileVersion(string strInSlnFile) + { + string strVersion = null; + string strInput = ""; + Match match; + FileStream fis = new FileStream(strInSlnFile, FileMode.Open, FileAccess.Read, FileShare.Read); + StreamReader reader = new StreamReader(fis); + Regex regex = new Regex(@"Microsoft Visual Studio Solution File, Format Version (\d.\d\d)"); + + while (strInput.StartsWith("Microsoft Visual Studio Solution") == false && strInput != null) + { + strInput = reader.ReadLine(); + } + + match = regex.Match(strInput); + if (match.Success) + { + strVersion = match.Groups[1].Value; + } + + // Close the stream + reader.Close(); + + // Close the File Stream + fis.Close(); + + return strVersion; + } + + // Utility function to determine the csproj file version + protected string GetCsprojFileVersion(string strInCsprojFile) + { + string strRetVal = null; + XmlDocument xmlDoc = new XmlDocument(); + XmlNode prodVerNode = null; + XmlNode firstPropGroupNode = null; + + xmlDoc.Load(strInCsprojFile); + + // Try assuming VS 2003 + prodVerNode = xmlDoc.SelectSingleNode("/VisualStudioProject/CSHARP/@ProductVersion"); + if (prodVerNode == null) + { + // Try assuming VS 2005 + firstPropGroupNode = xmlDoc.FirstChild.FirstChild; + foreach (XmlNode theNode in firstPropGroupNode.ChildNodes) + { + if (theNode.Name.CompareTo("ProductVersion") == 0) + { + prodVerNode = theNode; + } + } + + strRetVal = prodVerNode.InnerText; + } + else + { + strRetVal = prodVerNode.Value; + } + + return strRetVal; + } + + protected void ParseMsCsProj(string fname) + { + string projectName = System.IO.Path.GetFileNameWithoutExtension (fname); + string csprojPath = System.IO.Path.GetFileName (fname); + string projectGuid = ""; + + if (m_strCsprojVer.StartsWith("7.1")) + { + CsprojInfo pi = new CsprojInfo(m_bIsUnix, m_bIsMcs, projectName, projectGuid, csprojPath); + + projNameInfo[projectName] = pi; + projGuidInfo[projectGuid] = pi; + } + else if(m_strCsprojVer.StartsWith("8")) + { + CsprojInfo2005 pi = new CsprojInfo2005(m_bIsUnix, m_bIsMcs, projectName, projectGuid, csprojPath); + + projNameInfo[projectName] = pi; + projGuidInfo[projectGuid] = pi; + } + } + + protected void ParseSolution(string fname) + { + FileStream fis = new FileStream(fname,FileMode.Open, FileAccess.Read, FileShare.Read); + StreamReader reader = new StreamReader(fis); + Regex regex = new Regex(@"Project\(""\{(.*)\}""\) = ""(.*)"", ""(.*)"", ""(\{.*\})"""); + + while (true) + { + string s = reader.ReadLine(); + Match match; + + match = regex.Match(s); + if (match.Success) + { + string projectName = match.Groups[2].Value; + string csprojPath = match.Groups[3].Value; + string projectGuid = match.Groups[4].Value; + + if (csprojPath.EndsWith (".csproj") && !csprojPath.StartsWith("http://")) + { + CsprojInfo pi = new CsprojInfo (m_bIsUnix, m_bIsMcs, projectName, projectGuid, csprojPath); + + projNameInfo[projectName] = pi; + projGuidInfo[projectGuid] = pi; + } + } + + if (s.StartsWith("Global")) + { + break; + } + } + } + + public string MsSlnHelper(bool isUnixMode, bool isMcsMode, bool isSln, string slnFile) + { + bool noCommonTargets = false; + bool noProjectTargets = false; + bool noFlags = false; + StringBuilder MakefileBuilder = new StringBuilder(); + + m_bIsUnix = isUnixMode; + m_bIsMcs = isMcsMode; + + if(m_bIsUnix == true && m_bIsMcs == true) + { + m_bIsUsingLib = true; + } + + if (m_bIsUnix) + { + slash = "/"; + } + else + { + slash = "\\"; + } + + try + { + string d = Path.GetDirectoryName(slnFile); + if (d != "") + Directory.SetCurrentDirectory(d); + + if (isSln == true) + { + // Get the sln file version + m_strSlnVer = GetSlnFileVersion(slnFile); + + // We invoke the ParseSolution + // by passing the file obtained + ParseSolution (slnFile); + } + else + { + // Get the Csproj version + m_strCsprojVer = GetCsprojFileVersion(slnFile); + + // We invoke the ParseMsCsProj + // by passing the file obtained + ParseMsCsProj (slnFile); + } + + System.Reflection.Assembly curAssam = System.Reflection.Assembly.GetExecutingAssembly(); + MakefileBuilder.AppendFormat("# Makefile created with Prj2MakeSharpWin32 ver. {0}\n# on {1}\n\n", + curAssam.GetName().Version.ToString(), + System.DateTime.Now.ToUniversalTime().ToString() + ); + + if (!noFlags) + { + if (m_bIsUnix) // gmake + { + MakefileBuilder.Append("ifndef TARGET\n"); + MakefileBuilder.Append("\tTARGET=./bin/Debug\n"); + MakefileBuilder.Append("else\n"); + MakefileBuilder.Append("\tTARGET=./bin/$(TARGET)\n"); + MakefileBuilder.Append("endif\n\n"); + + if (this.m_bIsMcs == false) + { + MakefileBuilder.Append("MCS=csc\n"); + MakefileBuilder.Append("MCSFLAGS=-nologo\n\n"); + MakefileBuilder.Append("ifdef (RELEASE)\n"); + MakefileBuilder.Append("\tMCSFLAGS=$(MCSFLAGS) -optimize+ -d:TRACE\n"); + MakefileBuilder.Append("else\n"); + MakefileBuilder.Append("\tMCSFLAGS=$(MCSFLAGS) -debug+ -d:TRACE,DEBUG\n"); + MakefileBuilder.Append("endif\n"); + } + else + { + MakefileBuilder.Append("MCS=mcs\n"); + MakefileBuilder.Append("ifndef (RELEASE)\n"); + MakefileBuilder.Append("\tMCSFLAGS=-debug --stacktrace\n"); + MakefileBuilder.Append("endif\n"); + // Define and add the information used in the -lib: arguments passed to the + // compiler to assist in finding non-fullyqualified assembly references. + if(m_bIsMcs == true) + { + MakefileBuilder.AppendFormat("LIBS=-lib:{0}/mono/1.0 -lib:{1}/mono/gtk-sharp\n\n", + "`pkg-config --variable=libdir mono`", + "`pkg-config --variable=libdir gtk-sharp`" + ); + } + } + } + else // nmake + { + MakefileBuilder.Append("!if !defined (TARGET)\n"); + MakefileBuilder.Append("TARGET=.\\bin\\Debug\n"); + MakefileBuilder.Append("!else\n"); + MakefileBuilder.Append("TARGET=.\\bin\\$(TARGET)\n"); + MakefileBuilder.Append("!endif\n\n"); + + if (m_bIsMcs == false) + { + MakefileBuilder.Append("MCS=csc\n"); + MakefileBuilder.Append("MCSFLAGS=-nologo\n\n"); + MakefileBuilder.Append("!if !defined(RELEASE)\n"); + MakefileBuilder.Append("MCSFLAGS=$(MCSFLAGS) -optimize+ -d:TRACE\n"); + MakefileBuilder.Append("!else\n"); + MakefileBuilder.Append("MCSFLAGS=$(MCSFLAGS) -debug+ -d:TRACE,DEBUG\n"); + MakefileBuilder.Append("!endif\n"); + } + else + { + MakefileBuilder.Append("MCS=mcs\n"); + MakefileBuilder.Append("!if !defined(RELEASE)\n"); + MakefileBuilder.Append("MCSFLAGS=-debug --stacktrace\n"); + MakefileBuilder.Append("!endif\n"); + } + } + + MakefileBuilder.Append("\n"); + } + else + { + MakefileBuilder.Append("!if !defined(MCS)\n"); + MakefileBuilder.Append("!error You must provide MCS when making\n"); + MakefileBuilder.Append("!endif\n\n"); + } + + foreach (CsprojInfo pi in projNameInfo.Values) + { + MakefileBuilder.AppendFormat("{0}=$(TARGET){1}{2}\n", pi.makename_ext, slash, pi.assembly_name); + MakefileBuilder.AppendFormat("{0}_PDB=$(TARGET){1}{2}\n", pi.makename, slash, pi.assembly_name.Replace(".dll",".pdb")); + MakefileBuilder.AppendFormat("{0}_SRC={1}\n", pi.makename, pi.src); + MakefileBuilder.AppendFormat("{0}_RES={1}\n\n", pi.makename, pi.res); + } + + foreach (CsprojInfo pi in projNameInfo.Values) + { + string refs = ""; + string deps = ""; + + foreach (Mfconsulting.General.Prj2Make.Schema.Csproj.Reference rf in pi.Proyecto.CSHARP.Build.References) + { + if(rf.Package == null || rf.Package.CompareTo("") == 0) + { + // Add space in between references as + // it becomes necessary + if (refs != "") + refs += " "; + + string assemblyName = rf.AssemblyName; + + // HACK - under Unix filenames are case sensitive + // Under Windows there's no agreement on Xml vs XML ;-) + if (0 == String.Compare(assemblyName, "System.Xml", true)) + { + assemblyName = "System.Xml"; + } + refs += "-r:" + assemblyName + ".dll"; + } + else + { + try + { + CsprojInfo pi2 = (CsprojInfo)projGuidInfo[rf.Project]; + + if (refs != "") + refs += " "; + + if (deps != "") + deps += " "; + + refs += "-r:$(" + pi2.makename_ext + ")"; + deps += "$(" + pi2.makename_ext + ")"; + } + catch(System.NullReferenceException) + { + refs += String.Format("-r:{0}.dll", rf.Name); + deps += String.Format("# Missing dependency project {1} ID:{0}?", rf.Project, + rf.Name); + Console.WriteLine(String.Format( + "Warning: The project {0}, ID: {1} may be required and appears missing.", + rf.Name, rf.Project) + ); + } + } + } + + MakefileBuilder.AppendFormat("$({0}): $({1}_SRC) {2}\n", pi.makename_ext, pi.makename, deps); + + if (isUnixMode) + { + MakefileBuilder.Append("\t-mkdir -p $(TARGET)\n"); + } + else + { + MakefileBuilder.Append("\t-md $(TARGET)\n"); + } + + MakefileBuilder.Append("\t$(MCS) $(MCSFLAGS)"); + + // Test to see if any configuratino has the Allow unsafe blocks on + if(pi.AllowUnsafeCode == true ) { + MakefileBuilder.Append(" -unsafe"); + } + + // Test for LIBS usage + if(m_bIsUsingLib == true) { + MakefileBuilder.Append(" $(LIBS)"); + } + + MakefileBuilder.AppendFormat(" {2}{3} -out:$({0}) $({1}_RES) $({1}_SRC)\n", + pi.makename_ext, pi.makename, refs, pi.switches); + + MakefileBuilder.Append("\n"); + } + + if (!noCommonTargets) + { + MakefileBuilder.Append("\n"); + MakefileBuilder.Append("# common targets\n\n"); + MakefileBuilder.Append("all:\t"); + + bool first = true; + + foreach (CsprojInfo pi in projNameInfo.Values) + { + if (!first) + { + MakefileBuilder.Append(" \\\n\t"); + } + MakefileBuilder.AppendFormat("$({0})", pi.makename_ext); + first = false; + } + MakefileBuilder.Append("\n\n"); + + MakefileBuilder.Append("clean:\n"); + + foreach (CsprojInfo pi in projNameInfo.Values) + { + if (isUnixMode) + { + MakefileBuilder.AppendFormat("\t-rm -f \"$({0})\" 2> /dev/null\n", pi.makename_ext); + MakefileBuilder.AppendFormat("\t-rm -f \"$({0}_PDB)\" 2> /dev/null\n", pi.makename); + } + else + { + MakefileBuilder.AppendFormat("\t-del \"$({0})\" 2> nul\n", pi.makename_ext); + MakefileBuilder.AppendFormat("\t-del \"$({0}_PDB)\" 2> nul\n", pi.makename); + } + } + MakefileBuilder.Append("\n"); + } + + if (!noProjectTargets) + { + MakefileBuilder.Append("\n"); + MakefileBuilder.Append("# project names as targets\n\n"); + foreach (CsprojInfo pi in projNameInfo.Values) + { + MakefileBuilder.AppendFormat("{0}: $({1})\n", pi.name, pi.makename_ext); + } + } + + return MakefileBuilder.ToString(); + } + catch (Exception e) + { + Console.WriteLine("EXCEPTION: {0}\n", e); + return ""; + } + } + + public void CreatePrjxFromCsproj(string csprojFileName) + { + int nCnt = 0; + FileStream fsIn = null; + XmlSerializer xmlDeSer = null; + FileStream fsOut = null; + XmlSerializer xmlSer = null; + Mfconsulting.General.Prj2Make.Schema.Csproj.VisualStudioProject csprojObj = null; + Mfconsulting.General.Prj2Make.Schema.Prjx.Project prjxObj = new Mfconsulting.General.Prj2Make.Schema.Prjx.Project(); + string PrjxFileName = String.Format ("{0}.prjx", + Path.Combine(Path.GetDirectoryName(csprojFileName), + Path.GetFileNameWithoutExtension(csprojFileName)) + ); + + // convert backslashes to slashes + csprojFileName = csprojFileName.Replace("\\", "/"); + Console.WriteLine(String.Format("Will create project filename:{0}", PrjxFileName)); + + // Load the csproj + fsIn = new FileStream (csprojFileName, FileMode.Open); + xmlDeSer = new XmlSerializer (typeof(VisualStudioProject)); + csprojObj = (VisualStudioProject) xmlDeSer.Deserialize (fsIn); + fsIn.Close(); + + // Begin prjxObj population + prjxObj.name = Path.GetFileNameWithoutExtension(csprojFileName); + prjxObj.description = ""; + prjxObj.newfilesearch = "None"; + prjxObj.enableviewstate = "True"; + prjxObj.version = (decimal)1.1; + prjxObj.projecttype = "C#"; + + prjxObj.Contents = GetContents (csprojObj.CSHARP.Files.Include); + prjxObj.References = GetReferences(csprojObj.CSHARP.Build.References); + prjxObj.DeploymentInformation = new Mfconsulting.General.Prj2Make.Schema.Prjx.DeploymentInformation(); + prjxObj.DeploymentInformation.target = ""; + prjxObj.DeploymentInformation.script = ""; + prjxObj.DeploymentInformation.strategy = "File"; + + nCnt = csprojObj.CSHARP.Build.Settings.Config.Length; + prjxObj.Configurations = new Configurations(); + prjxObj.Configurations.Configuration = new Configuration[nCnt]; + for(int i = 0; i < nCnt; i++) + { + prjxObj.Configurations.Configuration[i] = CreateConfigurationBlock( + csprojObj.CSHARP.Build.Settings.Config[i], + csprojObj.CSHARP.Build.Settings.AssemblyName, + csprojObj.CSHARP.Build.Settings.OutputType + ); + } + prjxObj.Configurations.active = prjxObj.Configurations.Configuration[0].name; + + prjxObj.Configuration = prjxObj.Configurations.Configuration[0]; + + // Serialize + fsOut = new FileStream (PrjxFileName, FileMode.Create); + xmlSer = new XmlSerializer (typeof(Project)); + xmlSer.Serialize(fsOut, prjxObj); + fsOut.Close(); + + return; + } + + public void MsSlnToCmbxHelper(string slnFileName) + { + int i = 0; + FileStream fsOut = null; + XmlSerializer xmlSer = null; + StringBuilder MakefileBuilder = new StringBuilder(); + Mfconsulting.General.Prj2Make.Schema.Cmbx.Combine cmbxObj = new Mfconsulting.General.Prj2Make.Schema.Cmbx.Combine(); + string cmbxFileName = String.Format ("{0}.cmbx", + Path.Combine(Path.GetDirectoryName(slnFileName), + Path.GetFileNameWithoutExtension(slnFileName)) + ); + + Console.WriteLine(String.Format("Will create combine filename:{0}", cmbxFileName)); + + try + { + string d = Path.GetDirectoryName(slnFileName); + if (d != "") + Directory.SetCurrentDirectory(d); + + // We invoke the ParseSolution + // by passing the file obtained + ParseSolution (slnFileName); + + // Create all of the prjx files form the csproj files + foreach (CsprojInfo pi in projNameInfo.Values) + { + CreatePrjxFromCsproj(pi.csprojpath); + } + + + // Begin prjxObj population + cmbxObj.name = Path.GetFileNameWithoutExtension(slnFileName); + cmbxObj.description = ""; + cmbxObj.fileversion = (decimal)1.0; + + // Create and attach the StartMode element + Mfconsulting.General.Prj2Make.Schema.Cmbx.StartMode startModeElem = new Mfconsulting.General.Prj2Make.Schema.Cmbx.StartMode(); + + // Create the array of Execute objects + Mfconsulting.General.Prj2Make.Schema.Cmbx.Execute[] executeElem = new Mfconsulting.General.Prj2Make.Schema.Cmbx.Execute[projNameInfo.Count]; + + // Populate the Element objects instances + i = 0; + foreach (CsprojInfo pi in projNameInfo.Values) + { + Mfconsulting.General.Prj2Make.Schema.Cmbx.Execute execElem = new Mfconsulting.General.Prj2Make.Schema.Cmbx.Execute(); + execElem.entry = pi.name; + execElem.type = "None"; + + executeElem[i++] = execElem; + } + + startModeElem.startupentry = executeElem[0].entry; + startModeElem.single = "True"; + startModeElem.Execute = executeElem; + + // Attach the StartMode Object to the + // Combine object + cmbxObj.StartMode = startModeElem; + + // Gnerate the entries array + Mfconsulting.General.Prj2Make.Schema.Cmbx.Entry[] entriesObj = new Mfconsulting.General.Prj2Make.Schema.Cmbx.Entry[projNameInfo.Count]; + // Populate the Entry objects instances + i = 0; + foreach (CsprojInfo pi in projNameInfo.Values) + { + Mfconsulting.General.Prj2Make.Schema.Cmbx.Entry entryObj = new Mfconsulting.General.Prj2Make.Schema.Cmbx.Entry(); + string PrjxFileName = String.Format (".{0}{1}.prjx", + Path.DirectorySeparatorChar, + Path.Combine(Path.GetDirectoryName(pi.csprojpath), + Path.GetFileNameWithoutExtension(pi.csprojpath)) + ); + + entryObj.filename = PrjxFileName; + + entriesObj[i++] = entryObj; + } + + // Attach the Entries Object to the + // Combine object + cmbxObj.Entries = entriesObj; + + Mfconsulting.General.Prj2Make.Schema.Cmbx.Configurations configurationsObj = new Mfconsulting.General.Prj2Make.Schema.Cmbx.Configurations(); + + // Hack hardcoded configuration value must get the one + // from analyzing the different configuration entries + configurationsObj.active = "Debug"; + + // Hack hardcoded number of configuration object + // assuming 2 for Debug and Release + configurationsObj.Configuration = new Mfconsulting.General.Prj2Make.Schema.Cmbx.Configuration[2]; + Mfconsulting.General.Prj2Make.Schema.Cmbx.Configuration confObj1 = new Mfconsulting.General.Prj2Make.Schema.Cmbx.Configuration(); + configurationsObj.Configuration[0] = confObj1; + Mfconsulting.General.Prj2Make.Schema.Cmbx.Configuration confObj2 = new Mfconsulting.General.Prj2Make.Schema.Cmbx.Configuration(); + configurationsObj.Configuration[1] = confObj2; + + configurationsObj.Configuration[0].name = "Release"; + configurationsObj.Configuration[0].Entry = CreateArrayOfConfEntries(); + configurationsObj.Configuration[1].name = "Debug"; + configurationsObj.Configuration[1].Entry = CreateArrayOfConfEntries(); + + // Attach the Configurations object to the + // Combine Object + cmbxObj.Configurations = configurationsObj; + + // Serialize + fsOut = new FileStream (cmbxFileName, FileMode.Create); + xmlSer = new XmlSerializer (typeof(Mfconsulting.General.Prj2Make.Schema.Cmbx.Combine)); + xmlSer.Serialize(fsOut, cmbxObj); + fsOut.Close(); + + return; + } + catch (Exception e) + { + Console.WriteLine("EXCEPTION: {0}\n", e); + return; + } + } + + protected Mfconsulting.General.Prj2Make.Schema.Prjx.Reference[] GetReferences(Mfconsulting.General.Prj2Make.Schema.Csproj.Reference[] References) + { + Mfconsulting.General.Prj2Make.Schema.Prjx.Reference[] theReferences = null; + int i = 0; + + // Get the GAC path + string strBasePathMono1_0 = Path.Combine( + Mfconsulting.General.PkgConfigInvoker.GetPkgVariableValue("mono", "libdir").TrimEnd(), + "mono/1.0"); + + string strBasePathGtkSharp = Path.Combine( + Mfconsulting.General.PkgConfigInvoker.GetPkgVariableValue("mono", "libdir").TrimEnd(), + "mono/gtk-sharp"); + + // Little Diagnostics -- remove later + Console.WriteLine ("Base path: {0}", strBasePathMono1_0); + Console.WriteLine ("Base path: {0}", strBasePathGtkSharp); + + if(References != null && References.Length > 0) + { + theReferences = new Mfconsulting.General.Prj2Make.Schema.Prjx.Reference[References.Length]; + } + else + { + return null; + } + + // Iterate through the reference collection of the csproj file + foreach(Mfconsulting.General.Prj2Make.Schema.Csproj.Reference rf in References) + { + Mfconsulting.General.Prj2Make.Schema.Prjx.Reference rfOut = new Mfconsulting.General.Prj2Make.Schema.Prjx.Reference(); + string strRefFileName; + + if(rf.Package == null || rf.Package.CompareTo("") == 0) + { + bool bIsWhereExpected = false; + + // HACK - under Unix filenames are case sensitive + // Under Windows there's no agreement on Xml vs XML ;-) + if(Path.GetFileName(rf.HintPath).CompareTo("System.XML.dll") == 0) + { + strRefFileName = Path.Combine (strBasePathMono1_0, Path.GetFileName("System.Xml.dll")); + + // Test to see if file exist in GAC location + if(System.IO.File.Exists(strRefFileName) == true) { + try { + rfOut.refto = System.Reflection.Assembly.LoadFrom(strRefFileName).FullName; + rfOut.type = Mfconsulting.General.Prj2Make.Schema.Prjx.ReferenceType.Gac; + rfOut.localcopy = Mfconsulting.General.Prj2Make.Schema.Prjx.ReferenceLocalcopy.True; + bIsWhereExpected = true; + } catch (Exception exc) { + Console.WriteLine ("Error doing Assembly.LoadFrom with File: {0}\nErr Msg: {1}", + strRefFileName, + exc.Message ); + } + } + } else { + strRefFileName = Path.Combine (strBasePathMono1_0, Path.GetFileName(rf.HintPath)); + + // Little Diagnostics -- remove later + Console.WriteLine ("Reference that will be tested for existance: {0}", strRefFileName); // Test to see if file exist in GAC location + + // Test to see if file exist in GAC location + if(System.IO.File.Exists(strRefFileName) == true) { + try { + rfOut.refto = System.Reflection.Assembly.LoadFrom(strRefFileName).FullName; + rfOut.type = Mfconsulting.General.Prj2Make.Schema.Prjx.ReferenceType.Gac; + rfOut.localcopy = Mfconsulting.General.Prj2Make.Schema.Prjx.ReferenceLocalcopy.True; + bIsWhereExpected = true; + } catch (Exception exc) { + Console.WriteLine ("Error doing Assembly.LoadFrom with File: {0}\nErr Msg: {1}", + strRefFileName, + exc.Message ); + } + } + + strRefFileName = Path.Combine (strBasePathGtkSharp, Path.GetFileName(rf.HintPath)); + + // Little Diagnostics -- remove later + Console.WriteLine ("Reference that will be tested for existance: {0}", strRefFileName); // Test to see if file exist in GAC location + + // Test to see if file exist in GAC location + if(System.IO.File.Exists(strRefFileName) == true) { + try { + rfOut.refto = System.Reflection.Assembly.LoadFrom(strRefFileName).FullName; + rfOut.type = Mfconsulting.General.Prj2Make.Schema.Prjx.ReferenceType.Gac; + rfOut.localcopy = Mfconsulting.General.Prj2Make.Schema.Prjx.ReferenceLocalcopy.True; + bIsWhereExpected = true; + } catch (Exception exc) { + Console.WriteLine ("Error doing Assembly.LoadFrom with File: {0}\nErr Msg: {1}", + strRefFileName, + exc.Message ); + } + } + + if(bIsWhereExpected == false) + { + rfOut.refto = Path.GetFileName(rf.HintPath); + rfOut.type = Mfconsulting.General.Prj2Make.Schema.Prjx.ReferenceType.Gac; + rfOut.localcopy = Mfconsulting.General.Prj2Make.Schema.Prjx.ReferenceLocalcopy.True; + } + } + + // increment the iterator value + theReferences[i++] = rfOut; + } + else + { + rfOut.type = Mfconsulting.General.Prj2Make.Schema.Prjx.ReferenceType.Project; + + rfOut.refto = Path.GetFileName(rf.Name); + rfOut.localcopy = Mfconsulting.General.Prj2Make.Schema.Prjx.ReferenceLocalcopy.True; + // increment the iterator value + theReferences[i++] = rfOut; + } + } + + return theReferences; + } + + protected Mfconsulting.General.Prj2Make.Schema.Prjx.File[] GetContents(Mfconsulting.General.Prj2Make.Schema.Csproj.File[] Include) + { + Mfconsulting.General.Prj2Make.Schema.Prjx.File[] theFiles = null; + int i = 0; + + if(Include != null && Include.Length > 0) + { + theFiles = new Mfconsulting.General.Prj2Make.Schema.Prjx.File[Include.Length]; + } + else + { + return null; + } + + // Iterate through the file collection of the csproj file + foreach(Mfconsulting.General.Prj2Make.Schema.Csproj.File fl in Include) + { + Mfconsulting.General.Prj2Make.Schema.Prjx.File flOut = new Mfconsulting.General.Prj2Make.Schema.Prjx.File(); + flOut.name = String.Format(".{0}{1}", Path.DirectorySeparatorChar, fl.RelPath); + + switch(fl.SubType) + { + case "Code": + flOut.subtype = Mfconsulting.General.Prj2Make.Schema.Prjx.FileSubtype.Code; + break; + } + + switch(fl.BuildAction) + { + case Mfconsulting.General.Prj2Make.Schema.Csproj.FileBuildAction.Compile: + flOut.buildaction = Mfconsulting.General.Prj2Make.Schema.Prjx.FileBuildaction.Compile; + break; + case Mfconsulting.General.Prj2Make.Schema.Csproj.FileBuildAction.Content: + flOut.buildaction = Mfconsulting.General.Prj2Make.Schema.Prjx.FileBuildaction.Exclude; + break; + case Mfconsulting.General.Prj2Make.Schema.Csproj.FileBuildAction.EmbeddedResource: + flOut.buildaction = Mfconsulting.General.Prj2Make.Schema.Prjx.FileBuildaction.EmbedAsResource; + break; + case Mfconsulting.General.Prj2Make.Schema.Csproj.FileBuildAction.None: + flOut.buildaction = Mfconsulting.General.Prj2Make.Schema.Prjx.FileBuildaction.Exclude; + break; + } + flOut.dependson = fl.DependentUpon; + flOut.data = ""; + + // increment the iterator value + theFiles[i++ ] = flOut; + } + + return theFiles; + } + + protected Configuration CreateConfigurationBlock(Config ConfigBlock, string AssemblyName, string OuputType) + { + Configuration ConfObj = new Configuration(); + CodeGeneration CodeGenObj = new CodeGeneration(); + Execution ExecutionObj = new Execution(); + Output OutputObj = new Output(); + + ConfObj.runwithwarnings = "False"; + ConfObj.name = ConfigBlock.Name; + + // CodeGenObj member population + CodeGenObj.runtime = "MsNet"; + CodeGenObj.compiler = "Csc"; + CodeGenObj.warninglevel = ConfigBlock.WarningLevel; + CodeGenObj.nowarn = ""; + CodeGenObj.includedebuginformation = (ConfigBlock.DebugSymbols == true) ? + CodeGenerationIncludedebuginformation.True : + CodeGenerationIncludedebuginformation.False; + + CodeGenObj.optimize = (ConfigBlock.Optimize == true) ? "True" : "False"; + + if (ConfigBlock.AllowUnsafeBlocks == true) + { + CodeGenObj.unsafecodeallowed = CodeGenerationUnsafecodeallowed.True; + } + else + { + CodeGenObj.unsafecodeallowed = CodeGenerationUnsafecodeallowed.False; + } + if (ConfigBlock.CheckForOverflowUnderflow == true) + { + CodeGenObj.generateoverflowchecks = "True"; + } + else + { + CodeGenObj.generateoverflowchecks = "False"; + } + + CodeGenObj.mainclass = ""; + CodeGenObj.target = OuputType; + CodeGenObj.generatexmldocumentation = "False"; + CodeGenObj.win32Icon = ""; + + // ExecutionObj member population + ExecutionObj.commandlineparameters = ""; + ExecutionObj.consolepause = "True"; + + // OutputObj member population + OutputObj.directory = ConfigBlock.OutputPath; + OutputObj.assembly = AssemblyName; + OutputObj.executeScript = ""; + OutputObj.executeBeforeBuild = ""; + OutputObj.executeAfterBuild = ""; + + ConfObj.CodeGeneration = CodeGenObj; + ConfObj.Execution = ExecutionObj; + ConfObj.Output = OutputObj; + + return ConfObj; + } + + protected Mfconsulting.General.Prj2Make.Schema.Cmbx.Entry[] CreateArrayOfConfEntries() + { + Mfconsulting.General.Prj2Make.Schema.Cmbx.Entry[] confEntry = new Mfconsulting.General.Prj2Make.Schema.Cmbx.Entry[projNameInfo.Count]; + // Populate the Entry objects instances + int i = 0; + foreach (CsprojInfo pi in projNameInfo.Values) + { + Mfconsulting.General.Prj2Make.Schema.Cmbx.Entry entryObj = new Mfconsulting.General.Prj2Make.Schema.Cmbx.Entry(); + entryObj.name = pi.name; + entryObj.configurationname = "Debug"; + entryObj.build = "False"; + + confEntry[i++] = entryObj; + } + + return confEntry; + } + } +} diff --git a/vsAddIn2005/Prj2MakeWin32/PrjHelper.cs b/vsAddIn2005/Prj2MakeWin32/PrjHelper.cs new file mode 100644 index 0000000..68ec395 --- /dev/null +++ b/vsAddIn2005/Prj2MakeWin32/PrjHelper.cs @@ -0,0 +1,92 @@ +// Copyright (c) 2004 Francisco T. Martinez +// All rights reserved. +// +using System; +using System.Xml; +using System.Xml.Serialization; +using System.Collections; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; +using Mfconsulting.General.Prj2Make.Schema.Prjx; +using Mfconsulting.General.Prj2Make.Schema.Csproj; + +namespace Mfconsulting.General.Prj2Make +{ + public class Maker + { + public enum TypeOfFile { + unknown, + sln, + csproj, + cmbx, + prjx + } + + // Helper function to determine the type of + // file being parsed based on its extension + protected TypeOfFile DetermineFileType(string inFileName) + { + string ExtentionString = System.IO.Path.GetExtension (inFileName); + + switch(ExtentionString) + { + case ".sln": + return TypeOfFile.sln; + case ".csproj": + return TypeOfFile.csproj; + case ".cmbx": + return TypeOfFile.cmbx; + case ".prjx": + return TypeOfFile.prjx; + } + + return TypeOfFile.unknown; + } + + public bool CreateCombineFromSln(string slnFileName) + { + SlnMaker slnMkObj = new SlnMaker(); + + // Load the sln and parse it + slnMkObj.MsSlnToCmbxHelper(slnFileName); + + return false; + } + + public bool CreatePrjxFromCsproj(string csprojFileName) + { + SlnMaker slnMkObj = new SlnMaker(); + + // Load the csproj and parse it + slnMkObj.CreatePrjxFromCsproj(csprojFileName); + + return false; + } + + // Main entry point for Makefile generation + public string MakerMain(bool isUnixMode, bool isMcsMode, string slnFile) + { + SlnMaker mk1Obj = null; + CmbxMaker mk2Obj = null; + // Test to see what kind if file we got + // sln, csproj, cmbx, prjx + switch(DetermineFileType(slnFile)) + { + case TypeOfFile.sln: + mk1Obj = new SlnMaker(); + return mk1Obj.MsSlnHelper (isUnixMode, isMcsMode, true, slnFile); + case TypeOfFile.csproj: + mk1Obj = new SlnMaker(); + return mk1Obj.MsSlnHelper (isUnixMode, isMcsMode, false, slnFile); + case TypeOfFile.cmbx: + mk2Obj = new CmbxMaker(); + return mk2Obj.MdCmbxHelper (isUnixMode, isMcsMode, true, slnFile); + case TypeOfFile.prjx: + mk2Obj = new CmbxMaker(); + return mk2Obj.MdCmbxHelper (isUnixMode, isMcsMode, false, slnFile); + } + return "Error: unknown file type."; + } + } +} diff --git a/vsAddIn2005/Prj2MakeWin32/PrjxInfo.cs b/vsAddIn2005/Prj2MakeWin32/PrjxInfo.cs new file mode 100644 index 0000000..07ab461 --- /dev/null +++ b/vsAddIn2005/Prj2MakeWin32/PrjxInfo.cs @@ -0,0 +1,197 @@ +// Copyright (c) 2004 Francisco T. Martinez +// All rights reserved. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Library General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +using System; +using System.Collections; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml; +using System.Xml.Serialization; + + +namespace Mfconsulting.General.Prj2Make +{ + class PrjxInfo + { + public readonly string name; + public readonly string csprojpath; + public string makename; + public string makename_ext; + public string assembly_name; + public string res; + public string src; + private bool m_bAllowUnsafeCode; + private Mfconsulting.General.Prj2Make.Schema.Prjx.Project m_projObject; + + public string ext_refs = ""; + public string switches = ""; + + public bool AllowUnsafeCode + { + get { return m_bAllowUnsafeCode; } + } + + public Mfconsulting.General.Prj2Make.Schema.Prjx.Project Proyecto { + get { return m_projObject; } + } + + // Project desirialization + protected Mfconsulting.General.Prj2Make.Schema.Prjx.Project LoadPrjFromFile (string strIn) + { + FileStream fs = new FileStream (strIn, FileMode.Open); + + XmlSerializer xmlSer = new XmlSerializer (typeof(Mfconsulting.General.Prj2Make.Schema.Prjx.Project)); + Mfconsulting.General.Prj2Make.Schema.Prjx.Project prjObj = (Mfconsulting.General.Prj2Make.Schema.Prjx.Project) xmlSer.Deserialize (fs); + + fs.Close(); + + return (prjObj); + } + + public PrjxInfo(bool isUnixMode, bool isMcsMode, string csprojpath) + { + Mfconsulting.General.Prj2Make.Schema.Prjx.Configuration activeConf = null; + this.csprojpath = csprojpath; + + m_bAllowUnsafeCode = false; + + // convert backslashes to slashes + csprojpath = csprojpath.Replace("\\", "/"); + + // loads the file in order to deserialize and + // build the object graph + try { + m_projObject = LoadPrjFromFile (csprojpath); + } catch (Exception exc) { + + Console.WriteLine ( + String.Format ("Could not load the file {0}\nException: {1}", + csprojpath, + exc.Message) + ); + return; + } + + this.name = m_projObject.name; + + makename = name.Replace('.','_').ToUpper(); + makename_ext = makename + "_EXT"; + + // Get the configuration to be used and + // copy it to a local configuration object + foreach(Mfconsulting.General.Prj2Make.Schema.Prjx.Configuration cnfObj in m_projObject.Configurations.Configuration) + { + if(cnfObj.name.CompareTo(m_projObject.Configurations.active) == 0) + { + // Assign the active configuration + activeConf = cnfObj; + break; + } + } + + // Establish if the allow unsafe code flag is true + if(activeConf.CodeGeneration.unsafecodeallowed == Mfconsulting.General.Prj2Make.Schema.Prjx.CodeGenerationUnsafecodeallowed.True) + { + m_bAllowUnsafeCode = true; + } + + switch (activeConf.CodeGeneration.target) + { + case "Library": + makename_ext = makename + "_DLL"; + assembly_name = activeConf.Output.assembly + ".dll"; + switches += " -target:library"; + break; + + case "Exe": + makename_ext = makename + "_EXE"; + assembly_name = activeConf.Output.assembly + ".exe"; + switches += " -target:exe"; + break; + + case "WinExe": + makename_ext = makename + "_EXE"; + assembly_name = activeConf.Output.assembly + ".exe"; + switches += " -target:winexe"; + break; + + default: + throw new NotSupportedException("Unsupported OutputType: " + activeConf.CodeGeneration.target); + + } + + src = ""; + string basePath = Path.GetDirectoryName(csprojpath); + string s; + + // Process Source code files for compiling + foreach (Mfconsulting.General.Prj2Make.Schema.Prjx.File f in m_projObject.Contents) + { + if(f.buildaction == Mfconsulting.General.Prj2Make.Schema.Prjx.FileBuildaction.Compile) + { + if (src != "") { + src += " \\\n\t"; + } + + s = System.IO.Path.Combine(basePath, f.name); + s = s.Replace("\\", "/"); + if (CmbxMaker.slash != "/") + s = s.Replace("/", CmbxMaker.slash); + + // Test for spaces + if (isUnixMode == false) + { + // We are in win32 using a cmd.exe or other + // DOS shell + if(s.IndexOf(' ') > -1) { + src += String.Format("\"{0}\"", s); + } else { + src += s; + } + } else { + // We are in *NIX or some other + // GNU like shell + src += s.Replace(" ", "\\ "); + } + } + } + + // Process resources for embedding + res = ""; + string rootNS = this.name; + string relPath; + foreach (Mfconsulting.General.Prj2Make.Schema.Prjx.File f in m_projObject.Contents) + { + if(f.buildaction == Mfconsulting.General.Prj2Make.Schema.Prjx.FileBuildaction.EmbedAsResource) + { + if (src != "") { + src += " \\\n\t"; + } + + relPath = f.name.Replace("\\", "/"); + s = System.IO.Path.Combine(basePath, relPath); + s = String.Format(" -resource:{0},{1}", s, System.IO.Path.GetFileName(relPath)); + s = s.Replace("\\", "/"); + if (CmbxMaker.slash != "/") + s = s.Replace("/", CmbxMaker.slash); + res += s; + } + } + } + } +} diff --git a/vsAddIn2005/Prj2MakeWin32/csprog2005.xsd b/vsAddIn2005/Prj2MakeWin32/csprog2005.xsd new file mode 100644 index 0000000..ff58aa5 --- /dev/null +++ b/vsAddIn2005/Prj2MakeWin32/csprog2005.xsd @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vsAddIn2005/Prj2MakeWin32/csproj_ver2003.cs b/vsAddIn2005/Prj2MakeWin32/csproj_ver2003.cs new file mode 100644 index 0000000..2614290 --- /dev/null +++ b/vsAddIn2005/Prj2MakeWin32/csproj_ver2003.cs @@ -0,0 +1,282 @@ +namespace Mfconsulting.General.Prj2Make.Schema.Csproj { + using System.Xml.Serialization; + + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class Build { + + /// + public Settings Settings; + + /// + [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable=false)] + public Reference[] References; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class Settings { + + /// + [System.Xml.Serialization.XmlElementAttribute("Config")] + public Config[] Config; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string ApplicationIcon; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string AssemblyKeyContainerName; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string AssemblyName; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string AssemblyOriginatorKeyFile; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string DefaultClientScript; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string DefaultHTMLPageLayout; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string DefaultTargetSchema; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public bool DelaySign; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string OutputType; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string PreBuildEvent; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string PostBuildEvent; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string RootNamespace; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string RunPostBuildEvent; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string StartupObject; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class Config { + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string Name; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public bool AllowUnsafeBlocks; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public int BaseAddress; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public bool CheckForOverflowUnderflow; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string ConfigurationOverrideFile; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string DefineConstants; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string DocumentationFile; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public bool DebugSymbols; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public short FileAlignment; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public bool IncrementalBuild; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public bool NoStdLib; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string NoWarn; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public bool Optimize; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string OutputPath; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public bool RegisterForComInterop; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public bool RemoveIntegerChecks; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public bool TreatWarningsAsErrors; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public System.SByte WarningLevel; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class Reference { + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string Name; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string AssemblyName; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string HintPath; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string Project; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string Package; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class CSHARP { + + /// + public Build Build; + + /// + public Files Files; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string ProjectType; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string ProductVersion; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public System.Decimal SchemaVersion; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string ProjectGuid; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class Files { + + /// + [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable=false)] + public File[] Include; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class File { + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string RelPath; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public FileBuildAction BuildAction; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string SubType; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string DependentUpon; + } + + /// + public enum FileBuildAction { + + /// + Compile, + + /// + Content, + + /// + EmbeddedResource, + + /// + None, + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class Include { + + /// + [System.Xml.Serialization.XmlElementAttribute("File")] + public File[] File; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class References { + + /// + [System.Xml.Serialization.XmlElementAttribute("Reference")] + public Reference[] Reference; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class VisualStudioProject { + + /// + public CSHARP CSHARP; + } +} diff --git a/vsAddIn2005/Prj2MakeWin32/csproj_ver2005.cs b/vsAddIn2005/Prj2MakeWin32/csproj_ver2005.cs new file mode 100644 index 0000000..6300c86 --- /dev/null +++ b/vsAddIn2005/Prj2MakeWin32/csproj_ver2005.cs @@ -0,0 +1,300 @@ +namespace Mfconsulting.General.Prj2Make.Schema.Csproj2005 +{ + using System.Xml.Serialization; + + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class Compile { + + /// + public SubType SubType; + + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool SubTypeSpecified; + + /// + public string AutoGen; + + /// + public string DependentUpon; + + /// + public string DesignTimeSharedInput; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string Include; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public enum SubType { + + /// + Designer, + + /// + Form, + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class Configuration { + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string Condition; + + /// + [System.Xml.Serialization.XmlTextAttribute()] + public string Value; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public enum DebugType { + + /// + full, + + /// + pdbonly, + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class EmbeddedResource { + + /// + public Generator Generator; + + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool GeneratorSpecified; + + /// + public LastGenOutput LastGenOutput; + + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool LastGenOutputSpecified; + + /// + public SubType SubType; + + /// + public string DependentUpon; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string Include; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public enum Generator { + + /// + ResXFileCodeGenerator, + + /// + SettingsSingleFileGenerator, + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public enum LastGenOutput { + + /// + [System.Xml.Serialization.XmlEnumAttribute("Resources.Designer.cs")] + ResourcesDesignercs, + + /// + [System.Xml.Serialization.XmlEnumAttribute("Settings.Designer.cs")] + SettingsDesignercs, + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class Import { + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string Project; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class ItemGroup { + + /// + [System.Xml.Serialization.XmlElementAttribute("None", typeof(None))] + [System.Xml.Serialization.XmlElementAttribute("Compile", typeof(Compile))] + [System.Xml.Serialization.XmlElementAttribute("EmbeddedResource", typeof(EmbeddedResource))] + [System.Xml.Serialization.XmlElementAttribute("Reference", typeof(Reference))] + public object[] Items; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class None { + + /// + public Generator Generator; + + /// + public LastGenOutput LastGenOutput; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string Include; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class Reference { + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string Include; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public enum OutputPath { + + /// + [System.Xml.Serialization.XmlEnumAttribute("bin\\Debug\\")] + binDebug, + + /// + [System.Xml.Serialization.XmlEnumAttribute("bin\\Release\\")] + binRelease, + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class Platform { + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string Condition; + + /// + [System.Xml.Serialization.XmlTextAttribute()] + public string Value; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class Project { + + /// + [System.Xml.Serialization.XmlElementAttribute("PropertyGroup")] + public PropertyGroup[] PropertyGroup; + + /// + [System.Xml.Serialization.XmlArrayItemAttribute(typeof(None), IsNullable=false)] + [System.Xml.Serialization.XmlArrayItemAttribute(typeof(Compile), IsNullable=false)] + [System.Xml.Serialization.XmlArrayItemAttribute(typeof(EmbeddedResource), IsNullable=false)] + [System.Xml.Serialization.XmlArrayItemAttribute(typeof(Reference), IsNullable=false)] + public object[][] ItemGroup; + + /// + public Import Import; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string DefaultTargets; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class PropertyGroup { + + /// + public Configuration Configuration; + + /// + public Platform Platform; + + /// + public string ProductVersion; + + /// + public System.Decimal SchemaVersion; + + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool SchemaVersionSpecified; + + /// + public string ProjectGuid; + + /// + public string OutputType; + + /// + public string AppDesignerFolder; + + /// + public string RootNamespace; + + /// + public string AssemblyName; + + /// + public bool DebugSymbols; + + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool DebugSymbolsSpecified; + + /// + public DebugType DebugType; + + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool DebugTypeSpecified; + + /// + public bool Optimize; + + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool OptimizeSpecified; + + /// + public bool AllowUnsafeBlocks; + + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool AllowUnsafeBlocksSpecified; + + /// + public OutputPath OutputPath; + + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool OutputPathSpecified; + + /// + public string DefineConstants; + + /// + public string ErrorReport; + + /// + public System.SByte WarningLevel; + + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool WarningLevelSpecified; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string Condition; + } +} \ No newline at end of file diff --git a/vsAddIn2005/Prj2MakeWin32/cui/AssemblyInfo.cs b/vsAddIn2005/Prj2MakeWin32/cui/AssemblyInfo.cs new file mode 100644 index 0000000..ab1bb7a --- /dev/null +++ b/vsAddIn2005/Prj2MakeWin32/cui/AssemblyInfo.cs @@ -0,0 +1,38 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using Mono.GetOptions; + +// Information about this assembly is defined by the following +// attributes. +// +// change them to the information which is associated with the assembly +// you compile. + +[assembly: AssemblyTitle("prj2makesharpWin32")] +[assembly: AssemblyDescription("Generates make and nmake files from Visual Studio and MonoDevelop project files")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("MFConsulting")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("2004")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: Mono.About("MFConsulting, (c) 2004")] +[assembly: Mono.Author("Jaroslaw Kowalski")] +[assembly: Mono.Author("Paco Martinez")] +[assembly: Mono.UsageComplement("InputFile")] + + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all values by your own or you can build default build and revision +// numbers with the '*' character (the default): + +[assembly: AssemblyVersion("0.95.1.0")] + +// The following attributes specify the key for the sign of your assembly. See the +// .NET Framework documentation for more information about signing. +// This is not required, if you don't want signing let these attributes like they're. +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] diff --git a/vsAddIn2005/Prj2MakeWin32/cui/Main.cs b/vsAddIn2005/Prj2MakeWin32/cui/Main.cs new file mode 100644 index 0000000..e297e67 --- /dev/null +++ b/vsAddIn2005/Prj2MakeWin32/cui/Main.cs @@ -0,0 +1,31 @@ +// project created on 3/13/04 at 5:22 a +using System; + +namespace Mfconsulting.General.Prj2Make.Cui +{ + class MainClass + { + public static void Main(string[] args) + { + // Handle command line arguments + MainOpts optObj = new MainOpts(); + optObj.ProcessArgs(args); + + if ( optObj.csproj2prjx == true && optObj.RemainingArguments.Length > 0) + { + new MainMod (optObj.RemainingArguments[0]); + return; + } + + // Asuming residual arguments possibly a file path + if (optObj.RemainingArguments.Length > 0) + { + new MainMod (optObj.isNmake, optObj.isCsc, optObj.RemainingArguments[0]); + } + else // No arguments + { + optObj.DoHelp(); + } + } + } +} diff --git a/vsAddIn2005/Prj2MakeWin32/cui/MainMod.cs b/vsAddIn2005/Prj2MakeWin32/cui/MainMod.cs new file mode 100644 index 0000000..215be75 --- /dev/null +++ b/vsAddIn2005/Prj2MakeWin32/cui/MainMod.cs @@ -0,0 +1,128 @@ +using System; +using System.IO; +using Mfconsulting.General.Prj2Make; + +namespace Mfconsulting.General.Prj2Make.Cui +{ + public class MainMod + { + public string m_AppName = "prj2make-sharp"; + public string m_WorkspaceFileName; + public string m_FileNamePath; + public string m_OutputMakefile; + + private bool m_IsUnix = false; + private bool m_IsMcs = true; + + // Determines the make file type/style + public bool IsUnix + { + get { return m_IsUnix; } + set { m_IsUnix = value; } + } + + // Determines what compiler to use MCS or CSC + public bool IsMcs + { + get { return m_IsMcs; } + set { m_IsMcs = value; } + } + + protected void MyInitializeComponents() + { + } + + public MainMod (string inputFileName) + { + Mfconsulting.General.Prj2Make.Maker mkObj = null; + + MyInitializeComponents(); + + if (inputFileName == null || inputFileName.Length < 1) + + { + Console.WriteLine ("No input file has been specified."); + return; + } + + if (Path.GetExtension(inputFileName).ToUpper().CompareTo(".SLN") == 0) + { + mkObj = new Mfconsulting.General.Prj2Make.Maker(); + mkObj.CreateCombineFromSln(inputFileName); + return; + } + + if (Path.GetExtension(inputFileName).ToUpper().CompareTo(".CSPROJ") == 0) + { + mkObj = new Mfconsulting.General.Prj2Make.Maker(); + mkObj.CreatePrjxFromCsproj(inputFileName); + return; + } + } + + // For command line handling + public MainMod (bool isNmake, bool isCsc, string WorkspaceFile) + { + MyInitializeComponents(); + this.IsMcs = (isCsc == true) ? false : true; + this.IsUnix = (isNmake == true) ? false : true; + IniFromCommandLine(WorkspaceFile); + } + + protected void IniFromCommandLine(string WorkspaceFilename) + { + m_WorkspaceFileName = WorkspaceFilename; + m_FileNamePath = System.IO.Path.GetDirectoryName(m_WorkspaceFileName); + System.Text.StringBuilder strbFileName = new System.Text.StringBuilder(); + + strbFileName.AppendFormat("Makefile.{0}.{1}", + (this.IsMcs == true) ? "mcs" : "csc", + (this.IsUnix == true) ? "gmake" : "nmake" + ); + + m_OutputMakefile = System.IO.Path.Combine(m_FileNamePath, strbFileName.ToString()); + + // Actually follow through and genrate the contents of the Makefile + // to be placed on the textview + CreateMakefile(); + } + + + protected void CreateMakefile() + { + Mfconsulting.General.Prj2Make.Maker mkObj = null; + string slnFile = null; + + if (this.m_WorkspaceFileName.Length < 1) { + Console.WriteLine ("No input file has been specified."); + return; + } + else + slnFile = m_WorkspaceFileName; + + mkObj = new Mfconsulting.General.Prj2Make.Maker(); + SaveMakefileToDisk(mkObj.MakerMain(IsUnix, IsMcs, slnFile)); + } + + protected void SaveMakefileToDisk (string MakeFileContents) + { + FileStream fs = null; + StreamWriter w = null; + + if (MakeFileContents.StartsWith ("Error") || MakeFileContents.StartsWith ("Notice")) { + Console.WriteLine(MakeFileContents); + return; + } + + if (m_OutputMakefile != null && m_OutputMakefile.Length > 1) { + fs = new FileStream(m_OutputMakefile, FileMode.Create, FileAccess.Write); + w = new StreamWriter(fs); + } + + if (w != null) { + w.WriteLine (MakeFileContents); + w.Close(); + } + } + } +} \ No newline at end of file diff --git a/vsAddIn2005/Prj2MakeWin32/cui/MainOpts.cs b/vsAddIn2005/Prj2MakeWin32/cui/MainOpts.cs new file mode 100644 index 0000000..ba18bb9 --- /dev/null +++ b/vsAddIn2005/Prj2MakeWin32/cui/MainOpts.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections; +using Mono.GetOptions; + +namespace Mfconsulting.General.Prj2Make.Cui +{ + class MainOpts : Options + { + [Option("Output for nmake.exe", 'n')] + public bool isNmake = false; + + [Option("Use csc instead of mcs", 'c')] + public bool isCsc = false; + + [Option(1, "Converts a csproj/sln to prjx/cmbx", "csproj2prjx")] + public bool csproj2prjx = false; + + public MainOpts() + { + ParsingMode = OptionsParsingMode.Both; + BreakSingleDashManyLettersIntoManyOptions = false; + EndOptionProcessingWithDoubleDash = true; + + if (System.IO.Path.DirectorySeparatorChar.CompareTo('/') == 0) + ParsingMode = OptionsParsingMode.Linux; + } + } +} diff --git a/vsAddIn2005/Prj2MakeWin32/pkgconfiginvoker.cs b/vsAddIn2005/Prj2MakeWin32/pkgconfiginvoker.cs new file mode 100644 index 0000000..b363c3a --- /dev/null +++ b/vsAddIn2005/Prj2MakeWin32/pkgconfiginvoker.cs @@ -0,0 +1,97 @@ +// created on 6/8/2004 at 5:44 AM +using System; +using System.Diagnostics; + +namespace Mfconsulting.General +{ + public sealed class PkgConfigInvoker + { + + public static string GetPkgConfigVersion() + { + string pkgout = null; + + pkgout = RunPkgConfig("--version"); + + if(pkgout != null) + { + return pkgout; + } + + return null; + } + + public static string GetPkgVariableValue(string strPkg, string strVarName) + { + string pkgout = null; + + pkgout = RunPkgConfig(String.Format("--variable={0} {1}", + strVarName, strPkg)); + + if(pkgout != null) + { + return pkgout; + } + + return null; + } + + public static string GetPkgConfigModuleVersion(string strPkg) + { + string pkgout = null; + + pkgout = RunPkgConfig(String.Format("--modversion {0}", strPkg)); + + if(pkgout != null) + { + return pkgout; + } + + return null; + } + + public static string RunPkgConfig(string strArgLine) + { + string pkgout; + + ProcessStartInfo pi = new ProcessStartInfo (); + pi.FileName = "pkg-config"; + pi.RedirectStandardOutput = true; + pi.UseShellExecute = false; + pi.Arguments = strArgLine; + Process p = null; + try + { + p = Process.Start (pi); + } + catch (Exception e) + { + Console.WriteLine("Couldn't run pkg-config: " + e.Message); + return null; + } + + if (p.StandardOutput == null) + { + Console.WriteLine("Specified package did not return any information"); + } + + pkgout = p.StandardOutput.ReadToEnd (); + p.WaitForExit (); + if (p.ExitCode != 0) + { + Console.WriteLine("Error running pkg-config. Check the above output."); + return null; + } + + if (pkgout != null) + { + p.Close (); + return pkgout; + } + + p.Close (); + + return null; + } + } +} \ No newline at end of file diff --git a/vsAddIn2005/Prj2MakeWin32/prj2makesharp.csproj b/vsAddIn2005/Prj2MakeWin32/prj2makesharp.csproj new file mode 100644 index 0000000..04d5867 --- /dev/null +++ b/vsAddIn2005/Prj2MakeWin32/prj2makesharp.csproj @@ -0,0 +1,139 @@ + + + Local + 8.0.50727 + 2.0 + {C6089460-D3B0-4934-87BB-D96B897B72D7} + Debug + AnyCPU + + + + + prj2makesharpWin32 + + + JScript + Grid + IE50 + false + Exe + + + OnBuildSuccess + + + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + + + false + false + false + false + 4 + full + prompt + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + + + false + false + false + false + 4 + full + prompt + + + + Mono.GetOptions + ..\reflib\Mono.GetOptions.dll + + + System + + + System.XML + + + + + Code + + + + Code + + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + + + + + + + + \ No newline at end of file diff --git a/vsAddIn2005/Prj2MakeWin32/prj2makesharp.sln b/vsAddIn2005/Prj2MakeWin32/prj2makesharp.sln new file mode 100644 index 0000000..25a6862 --- /dev/null +++ b/vsAddIn2005/Prj2MakeWin32/prj2makesharp.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "prj2makesharp", "prj2makesharp.csproj", "{C6089460-D3B0-4934-87BB-D96B897B72D7}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C6089460-D3B0-4934-87BB-D96B897B72D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C6089460-D3B0-4934-87BB-D96B897B72D7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C6089460-D3B0-4934-87BB-D96B897B72D7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C6089460-D3B0-4934-87BB-D96B897B72D7}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/vsAddIn2005/Prj2MakeWin32/sharp_d_cmbx.cs b/vsAddIn2005/Prj2MakeWin32/sharp_d_cmbx.cs new file mode 100644 index 0000000..614f2e5 --- /dev/null +++ b/vsAddIn2005/Prj2MakeWin32/sharp_d_cmbx.cs @@ -0,0 +1,117 @@ +namespace Mfconsulting.General.Prj2Make.Schema.Cmbx { + using System.Xml.Serialization; + + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class Combine { + + /// + public StartMode StartMode; + + /// + [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable=false)] + public Entry[] Entries; + + /// + public Configurations Configurations; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public System.Decimal fileversion; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string name; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string description; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class StartMode { + + /// + [System.Xml.Serialization.XmlElementAttribute("Execute")] + public Execute[] Execute; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string startupentry; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string single; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class Execute { + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string entry; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string type; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class Configuration { + + /// + [System.Xml.Serialization.XmlElementAttribute("Entry")] + public Entry[] Entry; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string name; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class Entry { + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string filename; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string name; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string configurationname; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string build; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class Configurations { + + /// + [System.Xml.Serialization.XmlElementAttribute("Configuration")] + public Configuration[] Configuration; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string active; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class Entries { + + /// + [System.Xml.Serialization.XmlElementAttribute("Entry")] + public Entry[] Entry; + } +} diff --git a/vsAddIn2005/Prj2MakeWin32/sharp_d_prjx.cs b/vsAddIn2005/Prj2MakeWin32/sharp_d_prjx.cs new file mode 100644 index 0000000..f4d6113 --- /dev/null +++ b/vsAddIn2005/Prj2MakeWin32/sharp_d_prjx.cs @@ -0,0 +1,326 @@ +namespace Mfconsulting.General.Prj2Make.Schema.Prjx { + using System.Xml.Serialization; + + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class CodeGeneration { + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string runtime; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string compiler; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public System.SByte warninglevel; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string nowarn; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public CodeGenerationIncludedebuginformation includedebuginformation; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string optimize; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public CodeGenerationUnsafecodeallowed unsafecodeallowed; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string generateoverflowchecks; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string mainclass; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string target; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string definesymbols; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string generatexmldocumentation; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string win32Icon; + } + + /// + public enum CodeGenerationIncludedebuginformation { + + /// + False, + + /// + True, + } + + /// + public enum CodeGenerationUnsafecodeallowed { + + /// + False, + + /// + True, + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class Configuration { + + /// + public CodeGeneration CodeGeneration; + + /// + public Execution Execution; + + /// + public Output Output; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string runwithwarnings; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string name; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class Execution { + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string commandlineparameters; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string consolepause; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class Output { + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string directory; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string assembly; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string executeScript; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string executeBeforeBuild; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string executeAfterBuild; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class Configurations { + + /// + [System.Xml.Serialization.XmlElementAttribute("Configuration")] + public Configuration[] Configuration; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string active; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class Contents { + + /// + [System.Xml.Serialization.XmlElementAttribute("File")] + public File[] File; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class File { + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string name; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public FileSubtype subtype; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public FileBuildaction buildaction; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string dependson; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string data; + } + + /// + public enum FileSubtype { + + /// + Code, + + /// + Directory, + } + + /// + public enum FileBuildaction { + + /// + Nothing, + + /// + Compile, + + /// + EmbedAsResource, + + /// + Exclude, + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class DeploymentInformation { + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string target; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string script; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string strategy; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class Project { + + /// + [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable=false)] + public File[] Contents; + + /// + [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable=false)] + public Reference[] References; + + /// + public DeploymentInformation DeploymentInformation; + + /// + public Configuration Configuration; + + /// + public Configurations Configurations; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string name; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string description; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string newfilesearch; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string enableviewstate; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public System.Decimal version; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string projecttype; + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class Reference { + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public ReferenceType type; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string refto; + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public ReferenceLocalcopy localcopy; + } + + /// + public enum ReferenceType { + + /// + Assembly, + + /// + Gac, + + /// + Project, + } + + /// + public enum ReferenceLocalcopy { + + /// + False, + + /// + True, + } + + /// + [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] + public class References { + + /// + [System.Xml.Serialization.XmlElementAttribute("Reference")] + public Reference[] Reference; + } +} diff --git a/vsAddIn2005/README b/vsAddIn2005/README new file mode 100644 index 0000000..7e4c9f3 --- /dev/null +++ b/vsAddIn2005/README @@ -0,0 +1,51 @@ +README for monoaddin ver 0.95.1.0 +By Francisco T. Martinez Sunday, September 26, 2004 +------------------------------------------------------------------------------- + +General Description + +The Visual Studio Prj2Make# add-in is meant to complement the Mono Combined +Win32 Installer. This add in should simplify the use of Visual Studio .NET 2003 +as a development platform for Mono applications and may ease the deployment of +the developer's solution to other non-Windows platforms supported by Mono. + +As stated above, the monoaddin Add-in is closely linked and dependent of the +Mono Combined Win32 Installer. + +Requirements: + +- Visual Studio .NET 2003 + +- Mono Combined Win32 Installer (mono-1.0.2-gtksharp-1.0.2-win32-0.7.exe) + +Credits and Related Information + +The Prj2Make# add-in as well as it's installer have been developed by +Francisco "Paco" Martinez under the recommendations and advice of the +Mono community. Special gratitude to Maria Figueroa, Roger Martinez, +Mildred Martinez, Daniel Morgan, Miguel de Icaza, Todd Berman, Lluis +Sanchez, Atsushi Enomoto and Joseph Hill. Special thanks to my children, +Monica and Paquito for letting me use their quality time for the betterment +of mankind. + +For Support and Questions you can visit the locations or email the mail +list below: + + http://forge.novell.com/modules/xfmod/project/?prj2make-sharp + http://forge.novell.com/modules/xfmod/maillist/?group_id=1395 + +Mono Combined Installer Web Site URL: + http://forge.novell.com/modules/xfmod/project/?monowin32 + +Mono Combined Installer Mailing List Subscription and Archive: + http://forge.novell.com/modules/xfmod/maillist/?group_id=1395 + +Mono Project Web Site URL: + http://www.mono-project.com + +Mono Project Mailing List Subscription and Archive: + http://www.mono-project.com/about/mailing-lists.html#maillists + + +Microsoft .NET, Visual Studio .NET 2003 and Windows are registered trademarks +of Microsoft Corporation. diff --git a/vsAddIn2005/README.txt b/vsAddIn2005/README.txt new file mode 100644 index 0000000..3394cb4 --- /dev/null +++ b/vsAddIn2005/README.txt @@ -0,0 +1,61 @@ +README for monoaddin ver 0.99.0.2 +By Francisco T. Martinez 5:56 PM 1/2/2006 +------------------------------------------------------------------------------- + +General Description + +The Visual Studio Prj2Make# add-in is meant to complement the Mono Combined +Win32 Installer. This add in should simplify the use of Visual Studio .NET 2003 +as a development platform for Mono applications and may ease the deployment of +the developer's solution to other non-Windows platforms supported by Mono. + +As stated above, the monoaddin Add-in is closely linked and dependent of the +Mono Combined Win32 Installer. + +New in this Release: + +The "Test In Mono" menu option is now implemented. This will give users the +ability to run the currently selected Startup project in a Visual Studio Solution +using the Mono Runtime that is selected in accordance with MonoLaunch. + + +Requirements: + +- Visual Studio 2005 + +- Mono Combined Win32 Installer (mono-1.1.10-gtksharp-2.4.0-win32-x.x.exe or higher) + +- Mono Runtime Selector Win32 Installer (MonoLaunch-1.0.0.2-1.exe or higher) + + +Credits and Related Information + +The Prj2Make# add-in as well as it's installer have been developed by +Francisco "Paco" Martinez under the recommendations and advice of the +Mono community. Special gratitude to Maria Figueroa, Roger Martinez, +Mildred Martinez, Daniel Morgan, Miguel de Icaza, Todd Berman, Lluis +Sanchez, Atsushi Enomoto and Joseph Hill. Special thanks to my children, +Monica and Paquito for letting me use their quality time for the betterment +of mankind. + +For Support and Questions you can visit the locations or email the mail +list below: + + http://forge.novell.com/modules/xfmod/project/?prj2make-sharp + http://forge.novell.com/modules/xfmod/maillist/?group_id=1395 + +Mono Combined Installer Web Site URL: + http://forge.novell.com/modules/xfmod/project/?monowin32 + +Mono Combined Installer Mailing List Subscription and Archive: + http://forge.novell.com/modules/xfmod/maillist/?group_id=1395 + +Mono Project Web Site URL: + http://www.mono-project.com + +Mono Project Mailing List Subscription and Archive: + http://www.mono-project.com/about/mailing-lists.html#maillists + + +Microsoft .NET, Visual Studio 2005 and Windows are registered trademarks +of Microsoft Corporation. diff --git a/vsAddIn2005/ReleaseNotes.txt b/vsAddIn2005/ReleaseNotes.txt new file mode 100644 index 0000000..cfb0035 --- /dev/null +++ b/vsAddIn2005/ReleaseNotes.txt @@ -0,0 +1,61 @@ +README for vspr2make ver 0.99.0.2 +By Francisco T. Martinez 5:56 PM 1/2/2006 +------------------------------------------------------------------------------- + +General Description + +The Visual Studio Prj2Make# add-in is meant to complement the Mono Combined +Win32 Installer. This add in should simplify the use of Visual Studio .NET 2003 +as a development platform for Mono applications and may ease the deployment of +the developer's solution to other non-Windows platforms supported by Mono. + +As stated above, the vspr2make Add-in is closely linked and dependent of the +Mono Combined Win32 Installer. + +New in this Release: + +The "Test In Mono" menu option is now implemented. This will give users the +ability to run the currently selected Startup project in a Visual Studio Solution +using the Mono Runtime that is selected in accordance with MonoLaunch. + + +Requirements: + +- Visual Studio .NET 2003 + +- Mono Combined Win32 Installer (mono-1.1.10-gtksharp-2.4.0-win32-x.x.exe or higher) + +- Mono Runtime Selector Win32 Installer (MonoLaunch-1.0.0.2-1.exe or higher) + + +Credits and Related Information + +The Prj2Make# add-in as well as it's installer have been developed by +Francisco "Paco" Martinez under the recommendations and advice of the +Mono community. Special gratitude to Maria Figueroa, Roger Martinez, +Mildred Martinez, Daniel Morgan, Miguel de Icaza, Todd Berman, Lluis +Sanchez, Atsushi Enomoto and Joseph Hill. Special thanks to my children, +Monica and Paquito for letting me use their quality time for the betterment +of mankind. + +For Support and Questions you can visit the locations or email the mail +list below: + + http://forge.novell.com/modules/xfmod/project/?prj2make-sharp + http://forge.novell.com/modules/xfmod/maillist/?group_id=1395 + +Mono Combined Installer Web Site URL: + http://forge.novell.com/modules/xfmod/project/?monowin32 + +Mono Combined Installer Mailing List Subscription and Archive: + http://forge.novell.com/modules/xfmod/maillist/?group_id=1395 + +Mono Project Web Site URL: + http://www.mono-project.com + +Mono Project Mailing List Subscription and Archive: + http://www.mono-project.com/about/mailing-lists.html#maillists + + +Microsoft .NET, Visual Studio .NET 2003 and Windows are registered trademarks +of Microsoft Corporation. diff --git a/vsAddIn2005/monoaddin.sln b/vsAddIn2005/monoaddin.sln new file mode 100644 index 0000000..a525795 --- /dev/null +++ b/vsAddIn2005/monoaddin.sln @@ -0,0 +1,32 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "monoaddin", "monoaddin\monoaddin.csproj", "{4441F814-D559-4C3F-9250-650709C79BB0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CreateZipFile", "CreateZipFile\CreateZipFile.csproj", "{7546314B-68AE-4067-B3F2-3D703AACED64}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "prj2makesharp", "Prj2MakeWin32\prj2makesharp.csproj", "{C6089460-D3B0-4934-87BB-D96B897B72D7}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4441F814-D559-4C3F-9250-650709C79BB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4441F814-D559-4C3F-9250-650709C79BB0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4441F814-D559-4C3F-9250-650709C79BB0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4441F814-D559-4C3F-9250-650709C79BB0}.Release|Any CPU.Build.0 = Release|Any CPU + {7546314B-68AE-4067-B3F2-3D703AACED64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7546314B-68AE-4067-B3F2-3D703AACED64}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7546314B-68AE-4067-B3F2-3D703AACED64}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7546314B-68AE-4067-B3F2-3D703AACED64}.Release|Any CPU.Build.0 = Release|Any CPU + {C6089460-D3B0-4934-87BB-D96B897B72D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C6089460-D3B0-4934-87BB-D96B897B72D7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C6089460-D3B0-4934-87BB-D96B897B72D7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C6089460-D3B0-4934-87BB-D96B897B72D7}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/vsAddIn2005/monoaddin.suo b/vsAddIn2005/monoaddin.suo new file mode 100644 index 0000000000000000000000000000000000000000..d5b1869ff16155360ea0f6c421232d84ba7de6c1 GIT binary patch literal 37888 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 + + + + + + Connect.cs + gABAIEAAAAAAAABAAAQAAAAAKAAAABAAAAAAAABAAAA= + + + + + + + CreateZipHelper.cs + AAAIAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAEAAAAAAA= + + + + + + MonoLaunchHelper.cs + AAAAAAAAAAAAAAAAAAEAAAAAAAAAQEAAgAAAAAAAEAA= + + + + + + OptionsDlg.cs + QAAAAAABECQAIRAAIACAEACeAEw8AAAAAHAIAAABFAA= + + + + + + Prj2MakeHelper.cs + AAAAAkAAAAAAAAAAgAAAAAAAAAAAAAABAAAAAAAAAAA= + + + + + + RegistryHelper.cs + ICCAAAEAEAAEAAAAAQAAAgQACCAAAAIAAAAAAgEAAAM= + + + \ No newline at end of file diff --git a/vsAddIn2005/monoaddin/CommandBar.resx b/vsAddIn2005/monoaddin/CommandBar.resx new file mode 100644 index 0000000..ad98b19 --- /dev/null +++ b/vsAddIn2005/monoaddin/CommandBar.resx @@ -0,0 +1,424 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Action + Addins + Build + Class Diagram + Community + Data + Database + Database Diagram + Debug + Diagram + Edit + File + Format + Frames + Help + Image + Layout + Macros + Project + Query + Query Designer + Refactor + Resources + Schema + Styles + Team + Table + Table Designer + Test + Tools + View + Window + XML + + 操作 + アドイン + ビルド + クラス ダイアグラム + コミュニティ + データ + データベース + データベース ダイアグラム + デバッグ + ダイアグラム + 編集 + ファイル + 書式 + フレーム + ヘルプ + イメージ + レイアウト + マクロ + プロジェクト + クエリ + クエリ デザイナ + リファクタ + リソース + スキーマ + スタイル + チーム + テーブル + テーブル デザイナ + テスト + ツール + 表示 + ウィンドウ + XML + + Aktion + Add-Ins + Erstellen + Klassendiagramm + Community + Daten + Datenbank + Datenbankdiagramm + Debuggen + Diagramm + Bearbeiten + Datei + Format + Rahmen + Hilfe + Bild + Layout + Makros + Projekt + Query + Abfrage-Designer + Umgestalten + Ressourcen + Schema + Formate + Team + Tabelle + Tabellen-Designer + Testen + Extras + Ansicht + Fenster + XML + + Acción + Complementos + Generar + Diagrama de clase + Comunidad + Datos + Base de datos + Diagrama de base de datos + Depurar + Diagrama + Editar + Archivo + Formato + Marcos + Ayuda + Imagen + Diseño + Macros + Proyecto + Consulta + Diseñador de consultas + Refactorizar + Recursos + Esquema + Estilos + Equipo + Tabla + Diseñador de tablas + Prueba + Herramientas + Ver + Ventana + XML + + Action + Compléments + Générer + Diagramme de classes + Communauté + Données + Base de données + Schéma de base de données + Déboguer + Schéma + Modifier + Fichier + Format + Frames + ? + Image + Disposition + Macros + Projet + Requête + Concepteur de requêtes + Refactoriser + Ressources + Schéma + Styles + équipe + Tableau + Concepteur de tables + Test + Outils + Affichage + Fenêtre + XML + + Azione + Componenti aggiuntivi + Genera + Diagramma classi + Comunità + Dati + Database + Diagramma database + Debug + Diagramma + Modifica + File + Formato + Frame + ? + Immagine + Layout + Macro + Progetto + Query + Progettazione query + Effettua refactoring + Risorse + Schema + Stili + Team + Tabella + Progettazione tabelle + Prova + Strumenti + Visualizza + Finestra + XML + + 작업 + 추가 기능 + 빌드 + 클래스 다이어그램 + 커뮤니티 + 데이터 + 데이터베이스 + 데이터베이스 다이어그램 + 디버그 + 다이어그램 + 편집 + 파일 + 서식 + 프레임 + 도움말 + 이미지 + 레이아웃 + 매크로 + 프로젝트 + 쿼리 + 쿼리 디자이너 + 리팩터링 + 리소스 + 스키마 + 스타일 + + 테이블 + 테이블 디자이너 + 테스트 + 도구 + + + XML + + 操作 + 外接程序 + 生成 + 类关系图 + 社区 + 数据 + 数据库 + 数据库关系图 + 调试 + 关系图 + 编辑 + 文件 + 格式 + 框架 + 帮助 + 图像 + 布局 + + 项目 + 查询 + 查询设计器 + 重构 + 资源 + 架构 + 样式 + 工作组 + + 表设计器 + 测试 + 工具 + 视图 + 窗口 + XML + + 動作 + 增益集 + 建置 + 類別圖表 + 社群 + 資料 + 資料庫 + 資料庫圖表 + 偵錯 + 圖表 + 編輯 + 檔案 + 格式 + 框架 + 說明 + 影像 + 配置 + 巨集 + 專案 + 查詢 + 查詢設計工具 + 重整 + 資源 + 結構描述 + 樣式 + 小組 + 資料表 + 資料表設計工具 + 測試 + 工具 + 檢視 + 視窗 + XML + + \ No newline at end of file diff --git a/vsAddIn2005/monoaddin/Connect.cs b/vsAddIn2005/monoaddin/Connect.cs new file mode 100644 index 0000000000000000000000000000000000000000..1c4892ccfbda80fe31311e242c028f5c178ccd95 GIT binary patch literal 87194 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 M&DQaN|9?*YA1XYXS^xk5 literal 0 HcmV?d00001 diff --git a/vsAddIn2005/monoaddin/CreateZipHelper.cs b/vsAddIn2005/monoaddin/CreateZipHelper.cs new file mode 100644 index 0000000..dd7962b --- /dev/null +++ b/vsAddIn2005/monoaddin/CreateZipHelper.cs @@ -0,0 +1,109 @@ +using System; +using System.Diagnostics; + +namespace Mfconsulting.Vsprj2make +{ + /// + /// Summary description for CreateZipHelper. + /// + public class CreateZipHelper + { + private string m_strCreateZipPath; + + public CreateZipHelper() + { + if(IsCreateZipAvailable() == false) + { + throw new Exception("CreateZip may not be installed"); + } + } + + public string CreateZipFile(string strInputFilePath, string strIgnoredDirs, string strIgnoredEx, int nLevel) + { + string strCreateZipStdOut; + System.Text.StringBuilder strbArgLine = new System.Text.StringBuilder(); + char []carSpecialCharacters = {' ','\t', ',', '*', '%', '!'}; + + // Build the command line parameters + if(strInputFilePath.IndexOfAny(carSpecialCharacters)== -1) + { + strbArgLine.AppendFormat("-f {0}", + strInputFilePath); + } + else + { + strbArgLine.AppendFormat("-f \"{0}\"", + strInputFilePath); + } + + if(strIgnoredDirs.Length > 1) + { + strbArgLine.AppendFormat(" --IgnoredDirectories \"{0}\"", strIgnoredDirs); + } + + if(strIgnoredEx.Length > 1) + { + strbArgLine.AppendFormat(" --IgnoredExtensions \"{0}\"", strIgnoredEx); + } + + strbArgLine.AppendFormat(" -l {0}", nLevel.ToString()); + + ProcessStartInfo pi = new ProcessStartInfo(); + pi.FileName = m_strCreateZipPath; + pi.RedirectStandardOutput = true; + pi.UseShellExecute = false; + pi.CreateNoWindow = true; + pi.Arguments = strbArgLine.ToString(); + Process p = null; + try + { + p = Process.Start (pi); + } + catch (Exception e) + { + Console.WriteLine("Couldn't run CreateZipFromSln: " + e.Message); + return "Couldn't run CreateZipFromSln: " + e.Message; + } + + strCreateZipStdOut = p.StandardOutput.ReadToEnd (); + p.WaitForExit (); + if (p.ExitCode != 0) + { + Console.WriteLine("Error running CreateZipFromSln. Check the above output."); + return null; + } + + if (strCreateZipStdOut != null) + { + p.Close (); + return strCreateZipStdOut; + } + + p.Close (); + + return null; + } + + protected bool IsCreateZipAvailable() + { + string baseDirectory; + string strTmp; + + try + { + System.Reflection.Assembly myAddIn = System.Reflection.Assembly.GetCallingAssembly(); + baseDirectory = System.IO.Path.GetDirectoryName(myAddIn.Location); + strTmp = System.IO.Path.Combine(baseDirectory, "CreateZipFromSln.exe"); + m_strCreateZipPath = (System.IO.File.Exists(strTmp) == true) ? strTmp : null; + if(m_strCreateZipPath != null) + return true; + } + catch(Exception) + { + m_strCreateZipPath = null; + return false; + } + return false; + } + } +} diff --git a/vsAddIn2005/monoaddin/MonoLaunchHelper.cs b/vsAddIn2005/monoaddin/MonoLaunchHelper.cs new file mode 100644 index 0000000..f4fb36c --- /dev/null +++ b/vsAddIn2005/monoaddin/MonoLaunchHelper.cs @@ -0,0 +1,110 @@ +using System; +using System.IO; + +namespace Mfconsulting.Vsprj2make +{ + /// + /// MonoLaunchHelper is a support class meant to facilitate + /// interaction between the Add-in's main class Connect, and + /// the monoLaunch executable. + /// + public class MonoLaunchHelper + { + private string m_MonoLaunchCPath; + + public string MonoLaunchCPath + { + get { return m_MonoLaunchCPath; } + } + + private string m_MonoLaunchWPath; + + public string MonoLaunchWPath + { + get { return m_MonoLaunchWPath; } + } + + public MonoLaunchHelper() + { + if (IsMonoLaunchAvailable() == false) + { + throw new Exception("monoLaunchC may not be installed"); + } + } + + protected bool IsMonoLaunchAvailable() + { + string baseDirectory; + string strTmp; + + try + { + System.Reflection.Assembly myAddIn = System.Reflection.Assembly.GetCallingAssembly(); + baseDirectory = System.IO.Path.GetDirectoryName(myAddIn.Location); + strTmp = System.IO.Path.Combine(baseDirectory, "monoLaunchC.exe"); + m_MonoLaunchCPath = (System.IO.File.Exists(strTmp) == true) ? strTmp : null; + strTmp = System.IO.Path.Combine(baseDirectory, "monoLaunchW.exe"); + m_MonoLaunchWPath = (System.IO.File.Exists(strTmp) == true) ? strTmp : null; + if (m_MonoLaunchCPath != null && m_MonoLaunchWPath != null) + return true; + } + catch (Exception) + { + m_MonoLaunchCPath = null; + return false; + } + return false; + } + + /// + /// Returns the path to the Xsp.exe or Xsp2.exe based on the XspExeSelection + /// + public string GetXspExePath(int xspExeSelection) + { + RegistryHelper regHlpr = new RegistryHelper(); + string strMonoBasePath; + string retVal = ""; + + if (xspExeSelection > 2 || xspExeSelection < 1) + throw new Exception("Invalid Xsp.exe selection. Value must be either 1 or 2"); + + strMonoBasePath = regHlpr.GetMonoBasePath(); + + if (xspExeSelection == 1) + { + // Handle when it is Xsp.exe + retVal = Path.Combine( + strMonoBasePath, + @"lib\mono\1.0\xsp.exe" + ); + if (File.Exists(retVal) == true) + return retVal; + retVal = Path.Combine( + strMonoBasePath, + @"lib\xsp\1.0\xsp.exe" + ); + if (File.Exists(retVal) == true) + return retVal; + } + + if (xspExeSelection == 2) + { + // Handle when it is Xsp2.exe + retVal = Path.Combine( + strMonoBasePath, + @"lib\mono\2.0\xsp2.exe" + ); + if (File.Exists(retVal) == true) + return retVal; + retVal = Path.Combine( + strMonoBasePath, + @"lib\xsp\2.0\xsp2.exe" + ); + if (File.Exists(retVal) == true) + return retVal; + } + + return retVal; + } + } +} diff --git a/vsAddIn2005/monoaddin/OptionsDlg.cs b/vsAddIn2005/monoaddin/OptionsDlg.cs new file mode 100644 index 0000000..61a8617 --- /dev/null +++ b/vsAddIn2005/monoaddin/OptionsDlg.cs @@ -0,0 +1,499 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; + +namespace Mfconsulting.Vsprj2make +{ + /// + /// Summary description for OptionsDlg. + /// + public class OptionsDlg : System.Windows.Forms.Form + { + private Mfconsulting.Vsprj2make.RegistryHelper m_regH = null; + private string m_strMonoBasePath; + + private System.Windows.Forms.Panel m_PanelTabs; + private System.Windows.Forms.Panel m_panelButtons; + private System.Windows.Forms.TabControl m_tabControl; + private System.Windows.Forms.TabPage m_tabPage1; + private System.Windows.Forms.TabPage m_tabPage2; + private System.Windows.Forms.Button m_btnOK; + private System.Windows.Forms.Button m_btnCancel; + private System.Windows.Forms.TabPage m_tabPage3; + private System.Windows.Forms.TabPage m_tabPage4; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox m_edtMonoBasePath; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox m_edtDirectories; + private System.Windows.Forms.TextBox m_edtExtensions; + private System.Windows.Forms.NumericUpDown m_nupdwnCompressionLevel; + private System.Windows.Forms.TextBox m_edtLibPath; + private System.Windows.Forms.NumericUpDown m_nupdwnPort; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.RadioButton radioButton1; + private System.Windows.Forms.RadioButton radioButton2; + + public string MonoBasePath + { + get { return m_strMonoBasePath; } + set { m_strMonoBasePath = value; } + } + + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public OptionsDlg() + { + // + // Required for Windows Form Designer support + // + InitializeComponent(); + + // Read from the Mono Path from the registry + try + { + m_regH = new RegistryHelper(); + } + catch(Exception exc) + { + MessageBox.Show(this, exc.Message,"Prj2make", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + UpdateData(false); + + } + + protected void UpdateData(bool bIsSaving) + { + if(bIsSaving) + { + // Saving values to registry + m_regH.CompressionLevel = (int)m_nupdwnCompressionLevel.Value; + m_regH.IgnoredDirectories = m_edtDirectories.Text; + m_regH.IgnoredExtensions = m_edtExtensions.Text; + + m_regH.MonoLibPath = m_edtLibPath.Text; + + m_regH.Port = (int)m_nupdwnPort.Value; + m_regH.XspExeSelection = (radioButton1.Checked == true ? 1 : 2); + } + else + { + // Loading values from registry + try + { + // Read from the Mono Path from the registry + m_edtMonoBasePath.Text = m_regH.GetMonoBasePath(); + + m_edtDirectories.Text = m_regH.IgnoredDirectories; + m_edtExtensions.Text = m_regH.IgnoredExtensions; + m_nupdwnCompressionLevel.Value = (decimal)m_regH.CompressionLevel; + + m_edtLibPath.Text = m_regH.MonoLibPath; + + m_nupdwnPort.Value = (decimal)m_regH.Port; + if(m_regH.XspExeSelection == 1) + radioButton1.Checked = true; + else + radioButton2.Checked = true; + } + catch(Exception exc) + { + MessageBox.Show(this, exc.Message,"Prj2make", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if(components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.m_PanelTabs = new System.Windows.Forms.Panel(); + this.m_tabControl = new System.Windows.Forms.TabControl(); + this.m_tabPage3 = new System.Windows.Forms.TabPage(); + this.m_edtMonoBasePath = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.m_tabPage1 = new System.Windows.Forms.TabPage(); + this.button2 = new System.Windows.Forms.Button(); + this.m_edtDirectories = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.button1 = new System.Windows.Forms.Button(); + this.m_edtExtensions = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.m_nupdwnCompressionLevel = new System.Windows.Forms.NumericUpDown(); + this.label2 = new System.Windows.Forms.Label(); + this.m_tabPage4 = new System.Windows.Forms.TabPage(); + this.m_edtLibPath = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.m_tabPage2 = new System.Windows.Forms.TabPage(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.radioButton2 = new System.Windows.Forms.RadioButton(); + this.radioButton1 = new System.Windows.Forms.RadioButton(); + this.m_nupdwnPort = new System.Windows.Forms.NumericUpDown(); + this.label5 = new System.Windows.Forms.Label(); + this.m_panelButtons = new System.Windows.Forms.Panel(); + this.m_btnCancel = new System.Windows.Forms.Button(); + this.m_btnOK = new System.Windows.Forms.Button(); + this.m_PanelTabs.SuspendLayout(); + this.m_tabControl.SuspendLayout(); + this.m_tabPage3.SuspendLayout(); + this.m_tabPage1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.m_nupdwnCompressionLevel)).BeginInit(); + this.m_tabPage4.SuspendLayout(); + this.m_tabPage2.SuspendLayout(); + this.groupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.m_nupdwnPort)).BeginInit(); + this.m_panelButtons.SuspendLayout(); + this.SuspendLayout(); + // + // m_PanelTabs + // + this.m_PanelTabs.Controls.Add(this.m_tabControl); + this.m_PanelTabs.Dock = System.Windows.Forms.DockStyle.Fill; + this.m_PanelTabs.Location = new System.Drawing.Point(0, 0); + this.m_PanelTabs.Name = "m_PanelTabs"; + this.m_PanelTabs.Size = new System.Drawing.Size(456, 246); + this.m_PanelTabs.TabIndex = 0; + // + // m_tabControl + // + this.m_tabControl.Controls.Add(this.m_tabPage3); + this.m_tabControl.Controls.Add(this.m_tabPage1); + this.m_tabControl.Controls.Add(this.m_tabPage4); + this.m_tabControl.Controls.Add(this.m_tabPage2); + this.m_tabControl.Dock = System.Windows.Forms.DockStyle.Fill; + this.m_tabControl.Location = new System.Drawing.Point(0, 0); + this.m_tabControl.Name = "m_tabControl"; + this.m_tabControl.SelectedIndex = 0; + this.m_tabControl.Size = new System.Drawing.Size(456, 246); + this.m_tabControl.TabIndex = 0; + // + // m_tabPage3 + // + this.m_tabPage3.Controls.Add(this.m_edtMonoBasePath); + this.m_tabPage3.Controls.Add(this.label1); + this.m_tabPage3.Location = new System.Drawing.Point(4, 22); + this.m_tabPage3.Name = "m_tabPage3"; + this.m_tabPage3.Size = new System.Drawing.Size(448, 220); + this.m_tabPage3.TabIndex = 2; + this.m_tabPage3.Text = "Mono"; + // + // m_edtMonoBasePath + // + this.m_edtMonoBasePath.Location = new System.Drawing.Point(16, 48); + this.m_edtMonoBasePath.Name = "m_edtMonoBasePath"; + this.m_edtMonoBasePath.ReadOnly = true; + this.m_edtMonoBasePath.Size = new System.Drawing.Size(264, 20); + this.m_edtMonoBasePath.TabIndex = 1; + this.m_edtMonoBasePath.Text = ""; + // + // label1 + // + this.label1.Location = new System.Drawing.Point(16, 24); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(100, 16); + this.label1.TabIndex = 0; + this.label1.Text = "Mono Base Path"; + // + // m_tabPage1 + // + this.m_tabPage1.Controls.Add(this.button2); + this.m_tabPage1.Controls.Add(this.m_edtDirectories); + this.m_tabPage1.Controls.Add(this.label4); + this.m_tabPage1.Controls.Add(this.button1); + this.m_tabPage1.Controls.Add(this.m_edtExtensions); + this.m_tabPage1.Controls.Add(this.label3); + this.m_tabPage1.Controls.Add(this.m_nupdwnCompressionLevel); + this.m_tabPage1.Controls.Add(this.label2); + this.m_tabPage1.Location = new System.Drawing.Point(4, 22); + this.m_tabPage1.Name = "m_tabPage1"; + this.m_tabPage1.Size = new System.Drawing.Size(448, 220); + this.m_tabPage1.TabIndex = 0; + this.m_tabPage1.Text = "Packaging"; + // + // button2 + // + this.button2.Location = new System.Drawing.Point(408, 128); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(24, 23); + this.button2.TabIndex = 8; + this.button2.Text = "..."; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // m_edtDirectories + // + this.m_edtDirectories.Location = new System.Drawing.Point(16, 128); + this.m_edtDirectories.Name = "m_edtDirectories"; + this.m_edtDirectories.Size = new System.Drawing.Size(384, 20); + this.m_edtDirectories.TabIndex = 7; + this.m_edtDirectories.Text = ""; + // + // label4 + // + this.label4.Location = new System.Drawing.Point(16, 104); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(104, 23); + this.label4.TabIndex = 6; + this.label4.Text = "Ignored directories"; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(408, 72); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(24, 23); + this.button1.TabIndex = 5; + this.button1.Text = "..."; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // m_edtExtensions + // + this.m_edtExtensions.Location = new System.Drawing.Point(16, 72); + this.m_edtExtensions.Name = "m_edtExtensions"; + this.m_edtExtensions.Size = new System.Drawing.Size(384, 20); + this.m_edtExtensions.TabIndex = 4; + this.m_edtExtensions.Text = ""; + // + // label3 + // + this.label3.Location = new System.Drawing.Point(16, 48); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(104, 23); + this.label3.TabIndex = 3; + this.label3.Text = "Ignored extensions"; + // + // m_nupdwnCompressionLevel + // + this.m_nupdwnCompressionLevel.Location = new System.Drawing.Point(128, 16); + this.m_nupdwnCompressionLevel.Maximum = new System.Decimal(new int[] { + 9, + 0, + 0, + 0}); + this.m_nupdwnCompressionLevel.Name = "m_nupdwnCompressionLevel"; + this.m_nupdwnCompressionLevel.Size = new System.Drawing.Size(40, 20); + this.m_nupdwnCompressionLevel.TabIndex = 2; + this.m_nupdwnCompressionLevel.Value = new System.Decimal(new int[] { + 4, + 0, + 0, + 0}); + // + // label2 + // + this.label2.Location = new System.Drawing.Point(16, 16); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(104, 23); + this.label2.TabIndex = 0; + this.label2.Text = "Compression Level"; + // + // m_tabPage4 + // + this.m_tabPage4.Controls.Add(this.m_edtLibPath); + this.m_tabPage4.Controls.Add(this.label6); + this.m_tabPage4.Location = new System.Drawing.Point(4, 22); + this.m_tabPage4.Name = "m_tabPage4"; + this.m_tabPage4.Size = new System.Drawing.Size(448, 220); + this.m_tabPage4.TabIndex = 3; + this.m_tabPage4.Text = "Prj2Make#"; + // + // m_edtLibPath + // + this.m_edtLibPath.Location = new System.Drawing.Point(16, 48); + this.m_edtLibPath.Name = "m_edtLibPath"; + this.m_edtLibPath.Size = new System.Drawing.Size(384, 20); + this.m_edtLibPath.TabIndex = 1; + this.m_edtLibPath.Text = ""; + // + // label6 + // + this.label6.Location = new System.Drawing.Point(16, 24); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(152, 16); + this.label6.TabIndex = 0; + this.label6.Text = "Lib path (for gmake makefile)"; + // + // m_tabPage2 + // + this.m_tabPage2.Controls.Add(this.groupBox1); + this.m_tabPage2.Controls.Add(this.m_nupdwnPort); + this.m_tabPage2.Controls.Add(this.label5); + this.m_tabPage2.Location = new System.Drawing.Point(4, 22); + this.m_tabPage2.Name = "m_tabPage2"; + this.m_tabPage2.Size = new System.Drawing.Size(448, 220); + this.m_tabPage2.TabIndex = 1; + this.m_tabPage2.Text = "XSP"; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.radioButton2); + this.groupBox1.Controls.Add(this.radioButton1); + this.groupBox1.Location = new System.Drawing.Point(16, 56); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(176, 96); + this.groupBox1.TabIndex = 2; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "XSP selection"; + // + // radioButton2 + // + this.radioButton2.Location = new System.Drawing.Point(24, 56); + this.radioButton2.Name = "radioButton2"; + this.radioButton2.TabIndex = 1; + this.radioButton2.Text = "XSP&2"; + // + // radioButton1 + // + this.radioButton1.Location = new System.Drawing.Point(24, 24); + this.radioButton1.Name = "radioButton1"; + this.radioButton1.TabIndex = 0; + this.radioButton1.Text = "&XSP"; + // + // m_nupdwnPort + // + this.m_nupdwnPort.Location = new System.Drawing.Point(56, 16); + this.m_nupdwnPort.Maximum = new System.Decimal(new int[] { + 65534, + 0, + 0, + 0}); + this.m_nupdwnPort.Minimum = new System.Decimal(new int[] { + 8102, + 0, + 0, + 0}); + this.m_nupdwnPort.Name = "m_nupdwnPort"; + this.m_nupdwnPort.Size = new System.Drawing.Size(48, 20); + this.m_nupdwnPort.TabIndex = 1; + this.m_nupdwnPort.Value = new System.Decimal(new int[] { + 8189, + 0, + 0, + 0}); + // + // label5 + // + this.label5.Location = new System.Drawing.Point(16, 16); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(32, 23); + this.label5.TabIndex = 0; + this.label5.Text = "Port"; + // + // m_panelButtons + // + this.m_panelButtons.Controls.Add(this.m_btnCancel); + this.m_panelButtons.Controls.Add(this.m_btnOK); + this.m_panelButtons.Dock = System.Windows.Forms.DockStyle.Bottom; + this.m_panelButtons.Location = new System.Drawing.Point(0, 190); + this.m_panelButtons.Name = "m_panelButtons"; + this.m_panelButtons.Size = new System.Drawing.Size(456, 56); + this.m_panelButtons.TabIndex = 1; + // + // m_btnCancel + // + this.m_btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.m_btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.m_btnCancel.Location = new System.Drawing.Point(368, 16); + this.m_btnCancel.Name = "m_btnCancel"; + this.m_btnCancel.TabIndex = 1; + this.m_btnCancel.Text = "Cancel"; + // + // m_btnOK + // + this.m_btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.m_btnOK.Location = new System.Drawing.Point(280, 16); + this.m_btnOK.Name = "m_btnOK"; + this.m_btnOK.TabIndex = 0; + this.m_btnOK.Text = "OK"; + this.m_btnOK.Click += new System.EventHandler(this.m_btnOK_Click); + // + // OptionsDlg + // + this.AcceptButton = this.m_btnOK; + this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); + this.CancelButton = this.m_btnCancel; + this.ClientSize = new System.Drawing.Size(456, 246); + this.Controls.Add(this.m_panelButtons); + this.Controls.Add(this.m_PanelTabs); + this.Name = "OptionsDlg"; + this.Text = "Prj2Make# Options"; + this.Load += new System.EventHandler(this.OptionsDlg_Load); + this.m_PanelTabs.ResumeLayout(false); + this.m_tabControl.ResumeLayout(false); + this.m_tabPage3.ResumeLayout(false); + this.m_tabPage1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.m_nupdwnCompressionLevel)).EndInit(); + this.m_tabPage4.ResumeLayout(false); + this.m_tabPage2.ResumeLayout(false); + this.groupBox1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.m_nupdwnPort)).EndInit(); + this.m_panelButtons.ResumeLayout(false); + this.ResumeLayout(false); + + } + #endregion + + private void m_btnOK_Click(object sender, System.EventArgs e) + { + UpdateData(true); + this.Close(); + } + + private void OptionsDlg_Load(object sender, System.EventArgs e) + { + this.UpdateData(false); + } + + private void button1_Click(object sender, System.EventArgs e) + { + MessageBox.Show( + this, + "Not implemented yet.", + "Prj2Make-Sharp", + MessageBoxButtons.OK, + MessageBoxIcon.Information + ); + } + + private void button2_Click(object sender, System.EventArgs e) + { + MessageBox.Show( + this, + "Not implemented yet.", + "Prj2Make-Sharp", + MessageBoxButtons.OK, + MessageBoxIcon.Information + ); + } + + } +} diff --git a/vsAddIn2005/monoaddin/OptionsDlg.resx b/vsAddIn2005/monoaddin/OptionsDlg.resx new file mode 100644 index 0000000..21d6d77 --- /dev/null +++ b/vsAddIn2005/monoaddin/OptionsDlg.resx @@ -0,0 +1,436 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + + True + + + Private + + + 8, 8 + + + True + + + Private + + + True + + + False + + + True + + + Private + + + Private + + + 8, 8 + + + False + + + True + + + True + + + Private + + + Private + + + 8, 8 + + + Private + + + False + + + Private + + + False + + + Private + + + Private + + + False + + + True + + + True + + + Private + + + Private + + + 8, 8 + + + False + + + Private + + + Private + + + Private + + + False + + + Private + + + False + + + Private + + + Private + + + False + + + Private + + + Private + + + Private + + + False + + + Private + + + False + + + Private + + + Private + + + False + + + Private + + + Private + + + False + + + Private + + + Private + + + False + + + True + + + True + + + Private + + + Private + + + 8, 8 + + + Private + + + False + + + Private + + + False + + + Private + + + Private + + + True + + + True + + + Private + + + Private + + + False + + + 8, 8 + + + Private + + + 8, 8 + + + True + + + False + + + True + + + Private + + + False + + + Private + + + Private + + + False + + + Private + + + Private + + + False + + + Private + + + Private + + + False + + + Private + + + Private + + + False + + + True + + + Private + + + 8, 8 + + + True + + + Private + + + False + + + Private + + + Private + + + False + + + Private + + + Private + + + False + + + OptionsDlg + + + (Default) + + + False + + + False + + + 8, 8 + + + True + + + 80 + + + True + + + Private + + \ No newline at end of file diff --git a/vsAddIn2005/monoaddin/Prj2MakeHelper.cs b/vsAddIn2005/monoaddin/Prj2MakeHelper.cs new file mode 100644 index 0000000..6d73bfb --- /dev/null +++ b/vsAddIn2005/monoaddin/Prj2MakeHelper.cs @@ -0,0 +1,174 @@ +using System; +using System.Diagnostics; + +namespace Mfconsulting.Vsprj2make +{ + /// + /// Summary description for Prj2MakeHelper. + /// + public class Prj2MakeHelper + { + private string m_strPrj2makePath; + + public Prj2MakeHelper() + { + if(IsPrj2MakeAvailable() == false) + { + throw new Exception("Prj2make may not be installed"); + } + } + + public string CreateMdFiles(string strInputFilePath) + { + string strPrj2MakeStdOut; + System.Text.StringBuilder strbArgLine = new System.Text.StringBuilder(); + char []carSpecialCharacters = {' ','\t', ',', '*', '%', '!'}; + MonoLaunchHelper launchHlpr = new MonoLaunchHelper(); + + // Build the command line parameters + strbArgLine.AppendFormat("\"{0}\" ", m_strPrj2makePath); + + strbArgLine.Append("--csproj2prjx "); + + if(strInputFilePath.IndexOfAny(carSpecialCharacters)== -1) + { + strbArgLine.Append(strInputFilePath); + } + else + { + strbArgLine.AppendFormat("\"{0}\"", + strInputFilePath); + } + + ProcessStartInfo pi = new ProcessStartInfo(); + pi.FileName = launchHlpr.MonoLaunchWPath; + // pi.FileName = m_strPrj2makePath; + pi.RedirectStandardOutput = true; + pi.UseShellExecute = false; + pi.CreateNoWindow = true; + pi.Arguments = strbArgLine.ToString(); + Process p = null; + try + { + p = Process.Start (pi); + } + catch (Exception e) + { + Console.WriteLine("Couldn't run prj2makesharpWin32: " + e.Message); + return null; + } + + strPrj2MakeStdOut = p.StandardOutput.ReadToEnd (); + p.WaitForExit (); + if (p.ExitCode != 0) + { + Console.WriteLine("Error running prj2makesharpWin32. Check the above output."); + return null; + } + + if (strPrj2MakeStdOut != null) + { + p.Close (); + return strPrj2MakeStdOut; + } + + p.Close (); + + return null; + } + + public string CreateMakeFile(bool IsCsc, bool IsNmake, string strInputFilePath) + { + string strPrj2MakeStdOut; + System.Text.StringBuilder strbArgLine = new System.Text.StringBuilder(); + char []carSpecialCharacters = {' ','\t', ',', '*', '%', '!'}; + MonoLaunchHelper launchHlpr = new MonoLaunchHelper(); + + // Build the command line parameters + strbArgLine.AppendFormat("\"{0}\" ", m_strPrj2makePath); + + if(IsCsc == true) + { + strbArgLine.Append("-c "); + } + + if(IsNmake == true) + { + strbArgLine.Append("-n "); + } + + if(strInputFilePath.IndexOfAny(carSpecialCharacters)== -1) + { + strbArgLine.Append(strInputFilePath); + } + else + { + strbArgLine.AppendFormat("\"{0}\"", + strInputFilePath); + } + + ProcessStartInfo pi = new ProcessStartInfo(); + pi.FileName = launchHlpr.MonoLaunchWPath; + pi.RedirectStandardOutput = true; + pi.UseShellExecute = false; + pi.CreateNoWindow = true; + pi.Arguments = strbArgLine.ToString(); + Process p = null; + try + { + p = Process.Start (pi); + } + catch (Exception e) + { + Console.WriteLine("Couldn't run prj2makesharpWin32: " + e.Message); + return null; + } + + strPrj2MakeStdOut = p.StandardOutput.ReadToEnd (); + p.WaitForExit (); + if (p.ExitCode != 0) + { + Console.WriteLine("Error running prj2makesharpWin32. Check the above output."); + return null; + } + + if (strPrj2MakeStdOut != null) + { + p.Close (); + return strPrj2MakeStdOut; + } + + p.Close (); + + return null; + } + + protected bool IsPrj2MakeAvailable() + { + string baseDirectory; + string strMonoBasePath; + string strTmp; + RegistryHelper regH = null; + + try + { + regH = new RegistryHelper(); + + // This acts as a test to see if mono is installed + strMonoBasePath = regH.GetMonoBasePath(); + System.Reflection.Assembly myAddIn = System.Reflection.Assembly.GetCallingAssembly(); + baseDirectory = System.IO.Path.GetDirectoryName(myAddIn.Location); + strTmp = System.IO.Path.Combine(baseDirectory, "prj2makesharpWin32.exe"); + m_strPrj2makePath = (System.IO.File.Exists(strTmp) == true) ? strTmp : null; + if(m_strPrj2makePath != null) + return true; + } + catch(Exception) + { + m_strPrj2makePath = null; + return false; + } + return false; + } + } +} diff --git a/vsAddIn2005/monoaddin/RegistryHelper.cs b/vsAddIn2005/monoaddin/RegistryHelper.cs new file mode 100644 index 0000000..a8fa069 --- /dev/null +++ b/vsAddIn2005/monoaddin/RegistryHelper.cs @@ -0,0 +1,204 @@ +using System; + +namespace Mfconsulting.Vsprj2make +{ + /// + /// Summary description for RegistryHelper. + /// + public class RegistryHelper + { + private Microsoft.Win32.RegistryKey m_MonoSoftwareKey = null; + private Microsoft.Win32.RegistryKey m_GtkSharpSoftwareKey = null; + private Microsoft.Win32.RegistryKey m_Prj2MakeSoftwareKey = null; + + public Microsoft.Win32.RegistryKey MonoSoftwareKey + { + get { return m_MonoSoftwareKey; } + } + + public Microsoft.Win32.RegistryKey GtkSharpSoftwareKey + { + get { return m_GtkSharpSoftwareKey; } + } + + public Microsoft.Win32.RegistryKey Prj2MakeSoftwareKey + { + get { return m_Prj2MakeSoftwareKey; } + } + + /// + /// Default constructor + /// + public RegistryHelper() + { + m_Prj2MakeSoftwareKey = Microsoft.Win32.Registry.CurrentUser.CreateSubKey( + @"SOFTWARE\Mono\MonoAddin05\settings" + ); + + if(m_Prj2MakeSoftwareKey == null) + { + throw new Exception("Prj2Make Add-in may not be installed correctly."); + } + } + + #region Packaging options + + public int CompressionLevel + { + get + { + int nRetVal = + (int)Prj2MakeSoftwareKey.GetValue("CompressionLevel", 6); + return nRetVal; + } + set { Prj2MakeSoftwareKey.SetValue("CompressionLevel", value); } + } + + public string IgnoredExtensions + { + get + { + return (string)Prj2MakeSoftwareKey.GetValue( + "IgnoredExtension", + ".suo;.cvsignore;.vssscc;.vspscc" + ); + } + set { Prj2MakeSoftwareKey.SetValue("IgnoredExtension", value); } + } + + public string IgnoredDirectories + { + get + { + return (string)Prj2MakeSoftwareKey.GetValue( + "IgnoredDirectories", + "CVS;obj;.svn" + ); + } + set { Prj2MakeSoftwareKey.SetValue("IgnoredDirectories", value); } + } + + #endregion + + #region XSP settings + + public int Port + { + get { return (int)m_Prj2MakeSoftwareKey.GetValue("XSPPort", 8189); } + set { m_Prj2MakeSoftwareKey.SetValue("XSPPort", value); } + } + + public int XspExeSelection + { + get { return (int)m_Prj2MakeSoftwareKey.GetValue("XspExeSelection", 2); } + set { m_Prj2MakeSoftwareKey.SetValue("XspExeSelection", value); } + } + + #endregion + + #region Prj2make-Sharp Makefile and MD file creation + public string MonoLibPath + { + get + { + return (string)Prj2MakeSoftwareKey.GetValue("MonoLibPath", + "/usr/lib/mono/2.0,/usr/lib/mono/gtk-sharp-2.0"); + } + set { Prj2MakeSoftwareKey.SetValue("MonoLibPath", value); } + } + + #endregion + + #region Mono Key + /// + /// Tries to pupolate the Mono Registry key + /// + private void LoadMonoKey() + { + Microsoft.Win32.RegistryKey MonoRoot = null; + MonoRoot = Microsoft.Win32.Registry.LocalMachine.OpenSubKey( + @"SOFTWARE\Novell\Mono" + ); + if(MonoRoot == null) + { + throw new Exception("Mono may not be installed correctly"); + } + string strMonoVersion = (string)MonoRoot.GetValue("DefaultCLR"); + m_MonoSoftwareKey = MonoRoot.OpenSubKey(strMonoVersion); + + if(this.m_MonoSoftwareKey == null) + { + throw new Exception("Mono may not be installed correctly"); + } + } + + public string GetDefaultClr() + { + Microsoft.Win32.RegistryKey MonoRoot = null; + MonoRoot = Microsoft.Win32.Registry.LocalMachine.OpenSubKey( + @"SOFTWARE\Novell\Mono" + ); + if(MonoRoot == null) + { + throw new Exception("Mono may not be installed correctly"); + } + + return (string)MonoRoot.GetValue("DefaultCLR"); + } + + public void SetDefaultClr(string monoVersionValue) + { + Microsoft.Win32.RegistryKey MonoRoot = null; + MonoRoot = Microsoft.Win32.Registry.LocalMachine.OpenSubKey( + @"SOFTWARE\Novell\Mono", true + ); + if(MonoRoot == null) + { + throw new Exception("Mono may not be installed correctly"); + } + + MonoRoot.SetValue("DefaultCLR", monoVersionValue); + } + + public string[] GetMonoVersions() + { + Microsoft.Win32.RegistryKey MonoRoot = null; + MonoRoot = Microsoft.Win32.Registry.LocalMachine.OpenSubKey( + @"SOFTWARE\Novell\Mono" + ); + if(MonoRoot == null) + { + throw new Exception("A Mono installation could not be detected in your system. Mono may not be installed."); + } + + return MonoRoot.GetSubKeyNames(); + } + + /// + /// Optains the base path where the Mono installation resides + /// + /// Returns a string containing the path to + /// where the Mono installation resides + /// + public string GetMonoBasePath() + { + string strRetVal; + if(m_MonoSoftwareKey == null) + { + try + { + LoadMonoKey(); + } + catch(Exception exc) + { + throw exc; + } + } + + strRetVal = m_MonoSoftwareKey.GetValue("SdkInstallRoot", "").ToString(); + + return strRetVal; + } + #endregion + } +} diff --git a/vsAddIn2005/monoaddin/codekey/vsprj2make.snk b/vsAddIn2005/monoaddin/codekey/vsprj2make.snk new file mode 100644 index 0000000000000000000000000000000000000000..7bc7302f05877b9f2c14b3f1e034d7172e017d0b GIT binary patch literal 597 zcmV-b0;>H70ssI2Bme+XQ$aES1ONa50096uCldHaK4qEw|J>TaFb4%c!N_m;9&5zG zT!E1*r%RXukX@Hq_dKwZL>-(BH_~p+8E2iSEH3 zm#WtQ`w$J5=CLN#Gh;z+nufgfDKjza%_!6h2pq{J6cpAGb+On7#F`%d|Xp-h?1CuON0o6raO8xXeQum+W$dWX|Y z{-c@Z3`!Rv6@d;T7N-`Q4+7UZx0t}QR{}}eLxikN z$=yrztp!tVPAsddZ-sluSU($cz@pdz*5^OIrCfH??e~0rlqdmipHVFpwNC%f%ZOg9 zDM0rLJ~1K6iJMi-4c@_9h$re1EYi@`YF(^7Mbr0)!EMH zkU?RUP=_qbC0tdjBma+Rx9EOj$%a%HFp3}gB-DvDbZQBSR=OPQ+$ZTRKa jy`k(8#XfR=Qo~MO{OMHr7stVaGd`0WBkB literal 0 HcmV?d00001 diff --git a/vsAddIn2005/monoaddin/monoaddin.AddIn b/vsAddIn2005/monoaddin/monoaddin.AddIn new file mode 100644 index 0000000000000000000000000000000000000000..d7b5f626b7f94fd9b1d339855746aacdb33dcbbf GIT binary patch literal 42364 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 literal 0 HcmV?d00001 diff --git a/vsAddIn2005/monoaddin/monoaddin.csproj b/vsAddIn2005/monoaddin/monoaddin.csproj new file mode 100644 index 0000000..f2543f5 --- /dev/null +++ b/vsAddIn2005/monoaddin/monoaddin.csproj @@ -0,0 +1,116 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {4441F814-D559-4C3F-9250-650709C79BB0} + Library + + + false + monoaddin + Mfconsulting.Vsprj2make + + + true + false + bin\ + false + DEBUG;TRACE + 4 + false + + + false + true + bin\ + false + TRACE + 4 + false + + + + + + + + + + + + Code + + + Code + + + + + Form + + + + + + + Designer + + + OptionsDlg.cs + Designer + + + + + {80CC9F66-E7D8-4DDD-85B6-D9E6CD0E93E2} + 8 + 0 + 0 + primary + False + + + {1A31287A-4D7D-413E-8E32-3B374931BD89} + 8 + 0 + 0 + primary + False + + + {1CBA492E-7263-47BB-87FE-639000619B15} + 8 + 0 + 0 + primary + False + + + {00020430-0000-0000-C000-000000000046} + 2 + 0 + 0 + primary + False + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vsAddIn2005/reflib/ICSharpCode.SharpZipLib.dll b/vsAddIn2005/reflib/ICSharpCode.SharpZipLib.dll new file mode 100644 index 0000000000000000000000000000000000000000..1766c982b88620269b92ed2d2fc8e789682193df GIT binary patch literal 132608 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

i{CYqOUy=PJ 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 E2PMI8eE