From c8a8fb4d62b4b1231b06023b2f88a6700cbbcada Mon Sep 17 00:00:00 2001 From: Keivan Date: Wed, 20 Oct 2010 18:49:23 -0700 Subject: [PATCH] Fixed notification issues Added basic support for file scan Major redactor of ReportTitle/File parsing Updated Ninject/Ninject.MVC Removed dependency from Microsoft.Web.Administration reactored Episode repository structure --- IISExpress/AppServer/applicationhost.config | 68 +- NzbDrone.Core.Test/DbConfigControllerTest.cs | 2 +- NzbDrone.Core.Test/EpisodeProviderTest.cs | 4 +- NzbDrone.Core.Test/Libs/Moq.pdb | Bin 0 -> 343552 bytes ...sts (X201's conflicted copy 2010-10-19).cs | 105 + NzbDrone.Core.Test/MediaFileProviderTests.cs | 87 + NzbDrone.Core.Test/MockLib.cs | 22 +- NzbDrone.Core.Test/NzbDrone.Core.Test.csproj | 18 +- NzbDrone.Core.Test/QualityProfileTest.cs | 4 +- NzbDrone.Core.Test/RepoTest.cs | 13 +- NzbDrone.Core.Test/SeriesProviderTest.cs | 12 +- NzbDrone.Core/CentralDispatch.cs | 5 +- .../Entities/Episode/BasicEpisode.cs | 14 - .../Entities/Episode/RemoteEpisode.cs | 12 - .../Notification/NotificationStatus.cs | 9 - .../Entities/Notification/NotificationType.cs | 9 - NzbDrone.Core/Libraries/Castle.Core.dll | Bin 0 -> 287744 bytes NzbDrone.Core/Libraries/Castle.Core.pdb | Bin 0 -> 1058304 bytes NzbDrone.Core/Libraries/Castle.Core.xml | 4937 +++++++++++++++++ NzbDrone.Core/Model/EpisodeModel.cs | 16 + NzbDrone.Core/Model/EpisodeParseResult.cs | 12 + .../Notification/BasicNotification.cs | 4 +- .../Notification/BasicNotificationType.cs | 9 + .../Notification/ProgressNotification.cs | 10 +- .../ProgressNotificationStatus.cs | 9 + NzbDrone.Core/NzbDrone.Core.csproj | 35 +- NzbDrone.Core/Parser.cs | 135 + NzbDrone.Core/Properties/AssemblyInfo.cs | 4 +- NzbDrone.Core/Providers/ConfigProvider.cs | 2 +- NzbDrone.Core/Providers/DiskProvider.cs | 5 + NzbDrone.Core/Providers/EpisodeProvider.cs | 90 +- .../Fakes/FakeNotificationProvider.cs | 6 +- NzbDrone.Core/Providers/IDiskProvider.cs | 2 + NzbDrone.Core/Providers/IEpisodeProvider.cs | 13 +- NzbDrone.Core/Providers/IMediaFileProvider.cs | 13 + .../Providers/INotificationProvider.cs | 2 +- NzbDrone.Core/Providers/ISeasonProvider.cs | 2 +- NzbDrone.Core/Providers/ISeriesProvider.cs | 3 +- NzbDrone.Core/Providers/MediaFileProvider.cs | 49 + .../Providers/NotificationProvider.cs | 4 +- NzbDrone.Core/Providers/SeasonProvider.cs | 2 +- NzbDrone.Core/Providers/SeriesProvider.cs | 38 +- NzbDrone.Core/Providers/SyncProvider.cs | 5 +- .../{Entities => Repository}/Config.cs | 2 +- .../EpisodeInfo.cs => Repository/Episode.cs} | 16 +- .../EpisodeFile.cs} | 14 +- .../Quality/AllowedQuality.cs | 2 +- .../Quality/QualityProfile.cs | 2 +- .../Quality/QualityTypes.cs | 4 +- .../{Entities => Repository}/Season.cs | 4 +- .../{Entities => Repository}/Series.cs | 6 +- NzbDrone.Web/Scripts/Notification.js | 2 +- NzbDrone.Web/Views/Series/Details.aspx | 2 +- NzbDrone.Web/Views/Series/index.aspx | 2 +- NzbDrone/IISController.cs | 34 +- NzbDrone/NzbDrone.csproj | 6 +- NzbDrone/app.config | 2 +- 57 files changed, 5569 insertions(+), 320 deletions(-) create mode 100644 NzbDrone.Core.Test/Libs/Moq.pdb create mode 100644 NzbDrone.Core.Test/MediaFileProviderTests (X201's conflicted copy 2010-10-19).cs create mode 100644 NzbDrone.Core.Test/MediaFileProviderTests.cs delete mode 100644 NzbDrone.Core/Entities/Episode/BasicEpisode.cs delete mode 100644 NzbDrone.Core/Entities/Episode/RemoteEpisode.cs delete mode 100644 NzbDrone.Core/Entities/Notification/NotificationStatus.cs delete mode 100644 NzbDrone.Core/Entities/Notification/NotificationType.cs create mode 100644 NzbDrone.Core/Libraries/Castle.Core.dll create mode 100644 NzbDrone.Core/Libraries/Castle.Core.pdb create mode 100644 NzbDrone.Core/Libraries/Castle.Core.xml create mode 100644 NzbDrone.Core/Model/EpisodeModel.cs create mode 100644 NzbDrone.Core/Model/EpisodeParseResult.cs rename NzbDrone.Core/{Entities => Model}/Notification/BasicNotification.cs (86%) create mode 100644 NzbDrone.Core/Model/Notification/BasicNotificationType.cs rename NzbDrone.Core/{Entities => Model}/Notification/ProgressNotification.cs (82%) create mode 100644 NzbDrone.Core/Model/Notification/ProgressNotificationStatus.cs create mode 100644 NzbDrone.Core/Parser.cs create mode 100644 NzbDrone.Core/Providers/IMediaFileProvider.cs create mode 100644 NzbDrone.Core/Providers/MediaFileProvider.cs rename NzbDrone.Core/{Entities => Repository}/Config.cs (86%) rename NzbDrone.Core/{Entities/Episode/EpisodeInfo.cs => Repository/Episode.cs} (60%) rename NzbDrone.Core/{Entities/MediaFile.cs => Repository/EpisodeFile.cs} (50%) rename NzbDrone.Core/{Entities => Repository}/Quality/AllowedQuality.cs (79%) rename NzbDrone.Core/{Entities => Repository}/Quality/QualityProfile.cs (95%) rename NzbDrone.Core/{Entities => Repository}/Quality/QualityTypes.cs (92%) rename NzbDrone.Core/{Entities => Repository}/Season.cs (82%) rename NzbDrone.Core/{Entities => Repository}/Series.cs (84%) diff --git a/IISExpress/AppServer/applicationhost.config b/IISExpress/AppServer/applicationhost.config index 351a77d65..6c56a7b72 100644 --- a/IISExpress/AppServer/applicationhost.config +++ b/IISExpress/AppServer/applicationhost.config @@ -1,4 +1,4 @@ - + - - cz%@p zoi{I9W$sTperuh&q)7VJf_OInOCQz?L?b>`wrx5clLxLJdf}8 z$B_BP<`;FVtmh}#)L(3(xg;cVz=$FJMrLeDJ^D+%WYW0S*xSD9{S*oI^rX6^FlsZj z-(X%kG0?myH#}_{{Wa62#@34URqp*wur;zEcV2Ocey2})VhVZF*pR`aGGi-Ln`eM%Bw0Sx|tNJn0mZQEKgWood8JT^w!B~|IPh+HxUVGEqQlx+0TJ;?S32Efpq0!u; z#N>@&&e1o^TmT}BaGO*7Z*bf6tsPTk?wnwAMs!Z1!G4(|xi83kd1Z6<`bTtsr#IUV zoLP0vBEeqFSg;_|yI-FnqegA%Gp^r6RC#^cU>t@^?+V7Zl5lgD-&r2gS25s3pX-+n~VYo`hMY1#w*sN!`;`ZcZ@ zUI5{C4)EXOx{9N99De*gcFcF%UX8pu6z z{diEFu=Eyg`+~?&)}r*LS1okDt1GHJ^O2D5_&!Jt;o%8Z|3_$lY~i+Y{Pm$Pu&HfL z{S%B-rx%ImPpBS-d7|i{{HG z`|oO5Z|aTO`ByJ5^gsT)?Y(ox;$XempLtMigT0CufehqDFk;eGq^^6pp-3NO1mb0p@y9rhk;}B<> zhondK>t`Pp2)BJ;Ty5k~87`uAT zr}O>H(bb>VCYb2S7oN2ecJjSFvmQx*IhaqV^y4MFgt)o--L#HgW7V6zrgZDE)z3F4 z=N6RZ^i|%sgLzuT^An!0NBH0N_RpQGuJ?HP>aCvI#XOb4+cNu%*s^z<)vIIQrSdcB z(0RD3x^FepZdevAjOOW!G-+cSts7I*9{$tvb?d+)7JHe#%rXN};U^RbA9=lNxk`li)BRo_BCP;tZK zsNSQ@6VRJW^Uqb{uxfUd_hA0FamZDD87O#5Ztqx;Zf5*%QKwK>Y_=Pb{<-w7>gSSv zQOmNoXIUeM^v>$jXAAE&dpJ_x%mqqKUGM$3zFR4_#gEZd?2f1`&M)LOF0m%S;wK*| z8nvbC5qm}SeVux{)wZ#!&yFSLd2DR(?e*vD;RA=50fBJB+w@8Pz4Z28^?PP)rcEc> zv$@Mh=J{xO@7N+}xXnqCb>^NzJr?US-M;E`s3MJ(>f2X3Yu|D#G{N%hmZ%5lzYD@xCJTUFCKkjwwPh%dO{6Q0-2tMnC{u3lA>yv|ju zqK)h`a0}NAT2!@P^*w~{ysn!5C@1t8edw;Y?4HIhemk;b@y4q6$-3>^R@66h057^7 zG{Tf+c%FY;Wu0Vk>rcY-+!lVYRKkmnM)d8sMej2_C(^=%uG^Jvw;Qk9Oc`@}$>JJ4 zhQ9a08mD6S@26iV=%q3|jUPm08(z0hHQ&DS=6q((F}*m?TB=&CyoqiIPww|KFHa-} z;r4HiTxI&Ib);RVd0pu_;dvZqU-9wD%s$+B=B0FVwmzy-hu^C1yEI#z)`7e^c*sC* zSGGg#X3`q*>#!XQ=I36$#c8!wc)+NvQGN^D_tdC&`)1!kdOER1&v0~$6q<6#!PRBC{Me_fO<(o4s@A4{e1vci?_IL1 zHsN(?US#9;u?VcCPHFoamQ_E8WV+0yhS)70!6}11N9fl#i-%UW?0Y5;MK+ie+I7ak zRo_qM^-G~PdsaPD;jYpCy$8lVT+`#eoisMSR@pSuuR3m4 zg~alxV;s}R+D-q~_pMTGyv;92{?bgJLb=#JAxyVbm%n{O*nS~wMhH7Ngyn^>0+>y+ zb=l>meL)B-g1ORH4l}nV>D#*fP3Pw^sFB$t*=g)=?O<1hu=`ktJsDt;HQl{(n{?e=o|LAKNdb4?;e`~ggf6OUf6}A+nkI|d-cT9-ClSBNS z0yD2ItP_hN`gdV73lgyZTTamp@^4pDioPwxUv6f08wWS$j6m zt-tPZ{v;a`$ILLLy?JpN4YPGuve_`3X36HpG25POm_>2+Bs)CB-?1>8FVf%1u*P1j zgZ69fT>!If%pPOejWBadukYWohvV$oJh$vA*q-_iHe28HZ(V*78mo<;WQ}1q&&)8X zy?Opx!1nO|;#|?VmJNs5I7l`TX456vL9pH?EZb&mn5V#8aXB0IjZO@k4D%>Dhh8yM zh1~?RePsMtr-OPN_P!&`D=1i-K3g8zgg#t9%VpCi*@LiM^nq+GVvhH(_O}7n+3b^S zD;m!P2ip&3>%8<=0JC{!>y!>g+be}((%U3k46`c^l9kXP+d2H53_HNVK8D%)CBys? zX3NO-T{;*Y&yF-!o1c>PgxNGpHUehzU$W^TVa^E&b74rBC&6qTlJ+hRv9}s#>yq?$ z7tFRz$sUE#^?I9R`n{F5PDr*MX4{rz--fWiVFxf`>bp2 z?Hs~}!fc*Nf8*jur+Fg2m2gl#*;E%%)*y<6k?vo~?$FL~oPqPFM#A zdmXl~gLR-YbA{OhX45R~je{NT2=fV8cL&=D8}DF48T4HC4uJJ=_&Wi1tb^63lW_SP z0CUAN2gdN>Z8GfzFxzKIwg6`HvxD)k9bJBlVc(d2(qBHE#6SnT2sX>XHo>9}b}$2n zZAVq?g|G!Mo(%Oi>93N3YO2HDI+*Rpq`wbfwjY%22Utf(n9b-U7*@Sa`r8p^`)SGg z!l?Gu`Wp^&wXyNA%N+i`hIMnW7DOb^k!Op@l)D}NdeXVO%4k3c8ydngVKg&ulld|w zgyq7XuM%UzRos6p;o#Y2X!h8~T zsySZ9a|#2FE1n0!7+Snd`a1;H!NE?3xyHCRV73n0xuy>m>_pmb@?5K`G zyOm*{1;eYiNp>6TF$b%l1K7sF4u{$Kiwtuajjq_??`7wn34qIsABK?)H<8l+0jOX@DdR%d79m3kf zT=jDg7*hjpllDf!j&iU^VI-qke_z0Mcd%vvS9|Cd!iK}_{94BIYFLKD-e<6E2OGgj zhaFdBm{VX3SKcOBF>Hf_P23|mcar`Vz-*Xgk-zDxa3YLpgSSa`Ic$JoB*)*hzc=Fi zNwyKjaOG{1HRfc@o(GT|f74;^472S>vRN=Y9!Zu1v+0xUh!C~{wvCB_^miG|=8I(a zhWJ|>!k!9YFTjp-#AUyp!5ARpG7DzQTe4*^TjwQP3A6jGtIg|jcnWrnBQ8a~+;KS! z=8DVZFjrjef!R1%*T&^z*e#B@oXy0$v4dR(bH(LJm@6*t!E79?YvWR%$%M;ZOBi0g zP5R4%+4CI94u}hrX5(+V9Oj0w@({KZHq(S8?Y#xdbuj%3k0B0L25aPCN5O16q8j^~ zPQx--1G7i6(?k577s6J;Y&pm^xb<jR_BUM)5l&$1n>~^>fZ6_2vRz@WF!h()?fHZBHyY-3 zCOB0XgNiH6sj$Y5c;;#yNr(`Q& z9gG#p?t$5ULb8Wpw(p@S`kRjDCfLqqk7TU}1#2^s?F+N>3CT`|+4MJS!M`6v)9?4!039~+hZpQ~{uW1Nt3$yDC(%*To7A7u| zT?e!4Cq&ENbQ+$A?O^su_8IJD!}#fM+TY!KDmBCGk^Z*ZE9eV2%-^)XwlEtP$%esf zyXB|9X@BG6!jx<#J8T;p>ide7-)xv210taHZ{?>%pdj$53Hq0jDc}iC7 zp3Lf4qfxvh_z& z{Z0GZ1$Ls@BmG?uv-v35*DzZ~BmEF#ZKVy9NXy7Rf7AA|;uzWBZ<>|C+M7Kj$KNzN z6ZS;i*e)5D=@Wu^h-9;2-AqW5Er(s{VBIGM^8)E_Z&*)%iH_B7f7n>Q4@?S4q|!X2;uczOPvM4T9M|d0)XYVGGPY$!><( zIfGbjHxvuThlGlXS@ zu+cEv-es7%Fk7$b_WVu9Wqw?kk{uGl3Smu6NYdYtA^whr9q91)Hmsq8eFC%n#3XZ! zc61uPf%P%_B-?5KV9i6aez0Z^e_60LhS8P!o3?i_%(hL*R={jtOM92WE-@iVHk6Y; z+viBO9M;(Qqf7KR9hdW9EzBOtu7e%mV0C5&V~+IK4t9#e-!-rz2WyTo8+W=df79`t z1Issi=uZ4ivnOG;z00_~0<+~nbMrUt@2fa_k`1AfooJ4xdib06w-)BI_Z-ZX*Kfmi zF(Jt`{0X~V2hJwbaC3H$cFCF@9E?X)4}a4^^@Dxr2(!iPpns8Jc7o-YkR&@6wvU57 z0^7;K-iQ6{V6Wr^b)G8cZ#wF4=LB<8$$o>`_AXhS++b~+D(7!H%pNd1j!8BJX3I#j zN|^0KBs&sj+pT2Bhpfi!5WxUNwzv9%v)e~?NIu=HzdqQVUIfO9X}@+ z-({HBz)o=Z+aoVnN0I)qPH=Yz+Ye^zpbT>+%%)GWe3%`_BwGlx z=aL5*yV}v|yFbpJWRJpZTaoM;*zYDR$sUU;b*F2Dd#p4UqDEX?+el69P? zlsd$WwI9i7)V z!FDkFBzqFJw}aI!4AyO=zvZyu4u9)l6%IC(iA`t281DQ{$1?{u%gn5|1WdZ*bmTLv3q{?0M3b~JkkX8W^T!RnR<{ikHx z!fg5^YX-A*Ub6NfZ1)g05Z2qoPlh=c*4@F*3SkexdN}-j3A1B|w6_tq%Hi+KLxX-o z`r8B>^Lpi#yEcrul}a}ZGts1dnDV2 z#y-fwhQVx|kp4!&Y`vCj2F#8%42Axt<8nL9)@#WcRVvlj94*-}*ohAI1dJ^8HtBEB z!k|q{HWl`W!(WR9IT;(O@|G2 zu(M#cP0M&*0vl`mFt`@qcO@HsSkUiEwhU(5(R>l+X|N7vpJX?| z?EI`i_byP}cBk>jw8P&tYj#91AC#;= zterVpvPrNuhDm$#V1pd&Qkd;?q`%0KL0&VJ@i!gM2Czv-M1}i(qX{NRq9A*)o#s zMVPIFl6?wm;Ry40ST_gjbX2e&DZ`u!bEWSMn=ByrseXMfy7jHo)O;9n6)!7h$e6tcQ(vgxU3&VEmJDxd_(W;qN9`0|&b+#NX4f zs~rA{jt$lXWL!>x?dtG%E3C7Fy#{OTU|+}iW9sW~5q>o}j&lTmk^A7Qr7 zlC18D!MUMi!(q1nlmMr^Z?qzX=`53H=gM9^CRwo8!m?ftLeSu_G!FF?m z`3!7N2ixlO;9OgVIRa+;5T@GxrpsXxtfAQ>*@3Wn4weJkS_i-;{YB3Rp0kmx5;h~| zO)*9HHyzY-u#RSrWZ%LLGWH}Jb5`uzV%n=@_naN1L9&Nn-Aoxt_W8L%o0hE3dBIq< z(8O0eI(q$J`K@sfQ9>+WDXoFDWP(qA7~ALDPa zakZo4G6!boA(9otTASk~TLv5CU=P5$IoPMLI}Kwx?Qc3R7hMp{&m?;QX6Go9y$Ne$ zLXz?P9>y@>ZIYF(2-=EdN5h&q{GA1}Wh?!?3%lLn@3aep`?{pRM_}6^xHXn-b#h0N8epFz3Oxb+AKWeI4vd z*iZ-i0M_5ZnqM5;V=dD#3g)u67lQN1kuW>A;q=7cbomv)_A`4VyANjT zf@FP($gXu`9wnQxD!3jX*(ES-S8tMCx+=&Qrs)3W)ianKA0%53%P~hwHuUn~96_=v zFuT4W*M?z_TmukDpV|0(@-hwbVJb25|GXJY26*lT;WI}N?#7^e&Vrp=6k z+3O^nF8G^ftFH;Ody+j3bJ=?bwzsjj)VSKw_FCWUE{FE8 zPUiTf#?_AYHymc?L`(HfvuQRRw!8Uzsd2TV+0igp*5#sL_m@V5AjDPKDdym6xo=Nr|%+8l2`xe&7geBSUupWk;Xk6`Rd%N8ljDM2# zfh{n{OSTerj)V2OEjZ6vZjRB8wl_J19SSSg2eC6ZC`9-$+=GI@O1H z=v~41a8m3L?_X`^Wtc5@$=-)eG{;M}$K63+AXx$IFo(a7VZ9x!`8`3OEW^xz?db4# zFl-kGTMBF9U}wO#bFfQbZ5-@Qm>sKRJRgQ_@9_6xh`+aCtsVY0!tDH0+G}}l&}T{3 z3)aRF=4hC!+^4~8dzWFB!J0e5Tn6juV0XZ_aj^SB*drlq9jvn>%x^;c{RFf9u1w#5 zV0$>i>~dc)Zc2Y6V76b9Y$7bn5#~9t2By7Be=F|~t~W~dGt8Fl$tG;==%5-s5RA8y z^@Q~@$4hoF%;u+L$G|!|{9OU-=3vjl`Z(C1A@({v=#I-sSSu6eDaO@~PWyqd0<%xD z$6&S&O7;wFCx^e!VGSH?Bh1z%8RjOKUBi=X!9&4%MC?dUX|53})<>=IZDbG&4? z!R&Y|*^@9EPsv^gvG+Qx*kLd8;h=9l%^ag0orWneTket_2eWCA?1B(>1I(u3bYbrf zn5~0n2(}((^F^{BV0Ju`tmE3C93<-svvp9iVIlsqU=3Alll~^d?AnE7$HHv;lk7^^ z#8{B(Oyg=tm%|ThgZq#q`w3?2nPh*!Y&()H?~$ONm+UN<9mgbF9pdi|*d*esx3gl7 z_iu!McYQRdFOm%jVH03BebV2w5Oxr(wKmKq{gpiy)N9GEgxUU6vZr7l#)7O8=IY0T z{FMIQfR#D?jd?<;x+b1yn`5-2ckTORP!5vKfz>m|OEy1*6~k{6JGi)2@Yu7NGa2Rr zn4P;xc4mmb3qshXFq?K6<{DTdM?BYtg!vR~u*2U!u#OJa;pt!=DdW-uwvEGI{}8qp ztkB`_+7NqdV7(mvK8BSz*pz32`gxu?MmxG46~J1UeUcpsYwBR9hxoe!R&4y8Z(QwY zd)q&&lpPZ#y98$Il4Os2Dyczp-jRs0OQ zx|rjy6#m-19`uotjfL4ZE!pG{HUqYY!`^Wr?3NJrF08i+^D2>shHnIYh-4jMogMzN zV747ee^Wx(Y*@q*W)94j(bXcJ#W1GW-X>X}H-q+mjqsNRvwe?bxv<^M@sgbav+dzp z5$2_^mS&%1cff3(N%khp_PeV^m>7MY7{y2RQ7lhqX2AdXa`-VFeC0`|Y6oZV>(|V7r)o zl3ftz??&P8Mwm^zWb0sun&TxK@=h?fxk-eX1+#f}vtZ-n{7E(wX2%Z6@?f^yZxLZ0 z3bSomvZLbs-75T@3j5LQlkBK>gR;F%_&Wh+`vS>M3}MS*cKnn6PKVh%yIt5j4`$OY z*_9#eHdwX^OZscPK1kmk!d^>QBePGkjv=fE%%)HJ>j$%CE7>rZ?U&YwxJ-p*n|+eq z0<-yYr||b6tdrR%*#|JYCUBSV_tAU7IhSO=!)*E_`zM5L{eCc3Nq_BNeM}tg7I7I5 z8|Pr>!`eI88kp_tWSEb^Y(FpA=dhg}Vb=Q~NW1jc2-e*AyT`cN(QRaBmBJMfdBFL=oK*NzUe6!x;&_poubqglqML7kT@57y2cFWFJBHik)i z=fhe!*!3_w21tK*!EC-r_7rS^Bh0>^1^1~+f1ki?onLGGYe%R3N0=Qu*6N*R)9f!; zJ@fZk<7!8?ia0TH|U*v#wtR*UH!Goo3T)FwBlsk63`K*#y{W z`Ujh2?|d2DVgTU{^ZgdG)vMFmHhMb%gmI%#QgoE@yogw0FragxU7~s0mv;I(k>YZ2BZy4J$Xt zOV;jto_#dwlPqteJIn%@jmu*uZ0+cv%3ueZeUiNh>*!z`VRj6V{u=!dl#yiH!ED+k zYXRHF*n8Z#+R^cB2eW;hWV^x+GRHq*T92YUu)<0Aci02^ogJ!M?&XnWm$ z4&DnO+0(G&&GC{=_$9dCTe3@G+c^AP4eM&yI^$|b$K`q0Yx)P9WS9RIj4P7e3$x>_ zWR;tO`L1Nwz-&Avy9s9JJCe=&J*a0-$D-@~tE0XIwu9Lx+1ap62YVf6<0Ad74`Cm} zMwu|5F|KyJvi&1CPnB$72+M@Eb%c3v2wN1w&Vt$W$+)ZtVVA*9bi`%1|G2~K0UPS@ zR{$ICVAsKHKOy7U>d)YLbjfDH?EK|f6Sj7AIUEABX_xF!SkxRZ*&DEW4z?ba;b1%c z<@UEr2Fy{SThG33+rmwbH>$<&X+@BHeV!L9KwzcVJE;E8#^-0b3)jv z5Ox#H&Rd^1VQWXH;StylW}js5z-;;?`!Ixk0kioj{rv&6=kzZayV}ulx%Kbh99^;( zU@gt@l6?%TZ`g~*)s7DHYnYu+NcM9G`wM2%@RA6#$v?rn+a)_1X3zH}8%T^=nXn`q z53}VUSrlf|F4_RV?kC4^QRD|>O}nW zDj8-Q*kO(^&xVb3us2|~++Q)rXh$dceb|m>pJac)nmbry7P_W8*c_N`4>HVx5LOCn z>Im}~*me$f25hv0y%A#XJ(w*&8P6|a_WV||2oHL>(pMkm3bO@lCr3Q{z+7n`0n2ds zJ1&Gh4l8u{>&-*ZLmaFCHrv70!LD_%l6n#UJ`b5^@4>Ei_&atRciPW^*)}c1Tn)2r z>{S!Cc67bI6K2anvPWRHJ-jCTJq@${pk%MW`kUil7yjzi59~?S40evg-_{te953CVtk**YQF)(wOFl&le~g|Q=9hY){VVC^0LvS582Y$2?Z zgRKY&^DbBuhrcIau6%g~X8RtQzK>zIIl?@*QN+KuLi&3a=8DTZFjxBigt_vpZDV&l zyTe@R8w|7Gvyt(fv0cQ!e^;{N5Vj0v`*P{;3YaSmYhiXwmHu9Zx$^9z5cUJC(osfp zn?(F|Z)xuwST~2i2Vkuo>{Xa64WGeUIsE+zvwe?@ORMeO_Ikiv?Joni++pu&*j^5{ z6)#G1<#ltI?ayR9d%^6yK(f&xVeSue)z3WG_KtX#hp^*dwvUu?IX%SQ#W1_xBmM2n z$B)i)#AOYvw}X8GbLHnxFjxPwRdct$<{_*T%+3ejG;z|79s_#Ax|n^E%?R-qh1oKa z{>or>?2zoJ5O#71J3oY75yEZ`VfTfwCqvjPA?*DS_EiY`73Rv%x-Eh+K<4MJuzsfe z-ZHLsblJ{?**gEWV0o~XW}jq>VRns0vZG*^IsEO^GU$7xzdo@29R7}l?crcI!)zOq zVPt9A@Jp{hbl#?^6+%^I-NI?=!(J z31L@tKZBX7q&^pE_#9@cXBGA(%(e&V@8`HMzYt;m z5*Maqzrk$zN%mI=tJ@)ni}bf0tiFlEmm)5$LRk9{wi~RgBg~1gJsoU0tb>EChBb1q zH6d(m2zw4@=g>0kAHZxI`^wnWj;;$0I|l7mvMw;&RwU~Q8)m}#+PK=$VHU#nHTxvH z8)nN$vWH!4(3 zz-*pLc0q{0OJTOZmi}%FVUNRXxl4Z^g)sf%H@j9M{k4VJwOGjpz+CpG!dz*X8^V@^ zgn2;-yA$S0!;3Ii8omk%v;J=GG_(t0Jz=hV86Uz9fw|IfJj|7b%R<6@5aud}mqOUb zAz?n=3OD|HJB?6-@#mIXwcQ2FI`}+H0&9| zCWM5!0A|M{*)|u4uw^0a>=1TY2)i+a-3znxB^l2bVcR?U-4Eiz+$8$>Z$jAbFgvbD ze|5UKSwq--V@LWchuQnAB)bb{%i(ts&&OcB%s$C}g!OZOX@SY-%X7{V68TqR>g%W z*$r`F{wcz|DK1ROZVvHxYY4j?X2%X0=DjeRcF7)x*}Ue~MSs(2ekRVJWUs^QxcRs5 zE0$*;!|eH=WIw{1n&Ty_yN8>#fVu2-g0**qIULs7!Dhe~JJ^dbn`bhf@4)Oj3b#Z0 zo6fVkJtF?I_>%R2*?SKp8wVR|LXzwR*cej@C3~S~a9vxn&tM}QVRr51W{1FfI{d8& zVNb$rp2@hp472M*euKh>PS$%cdu}h;r!YGolvi z9g)8CVYVD3yDZLMUE%K^yS0sd7oql^$Yq>$qHdME|MJ+$La}t=fmu{ zBH1M&>?&ACQ-0Fl6EIu0l5O2T=+7kE3D(0A<~Ud%!?qD=I2=}DSbf31g4y*?$^L}d zGLo#>fMDE|tW5}OAHq7rT=w>a*{DlxnnuiQ?CCttl8raOE9_XLf!)%^Oc2@{{6lUv-^!FO9i>YUl z{U;>MZ3YH&6zQ)$%$CEpA`P8kHhq%yh1tU;>j$%WCRrxT&d(a!08E}ugW2+v>>!x! zvn0z439|xb^Hcge0cO|v8i}}E2(#l@W5J$>wK3(uEtdYKe|`$v%j}Ww)*fcl zC)q@p?I)UvxEu(xb5qIY!A6^SN_I2M=9y#t3sbWGA#AS@HUehLR)#qy#NVV4wtoma7*=S~ zCG9;uG`P1yvR`03n=+ED#ooaf&{E`CcbM&aS_w8AX4`aY!4|=6Unl+D9%ql+>HJOq zd^*J5Uvc(!5dK;YbK9E?v;Clq%V98EuO&MMX4{x#r^7~=m`nB&>_7+GeV>T`u1@JM z2WI2aR-|tp%(fND7Q<{`C)qJD+t*2UPMp1V!rnzN+r}ijBF>&`0Ttl1A`#B`cKVj`0@oYUJs1qGU`Z~j0Y3L4f zrJ)~eoWtIcussdyB<$S{ixbwaXFV76^awh?CQykvic_-ioI?XMNgWv^3+ zzh1EEj(j;DX6FSmo-0D^T?Mo4b{CPKx5I4OC3_fV`z*eHhJ<-;2)jJQ z-Yp^a?hj#4g|Jsc*at9I+P@9)_j?H2dXziQnuf5QV0Mn#S+td*upy=nN>&*crew#! z>=-WD3YZ-mCA%JG>ryUDs8#B6b%nZ8UBwgp*YNcJYCddwy}Ci&sBTg>^A(0$c|!PhbqDWMyOVd8+^z26 ziphPfIy|5rR1c|#)mrt4dX%?SKdzooPpYSQ=hM@CyY^Z2oO)ippk7oj@rI07)T`<> z^}2dPy{X>fiK2J-(&u{ho_b$>pf;!v)ko@M^@;jaea6!cU#KtDSL$nC8}}{uUVpDP zsvmgY?oaAx^^5wIRqajccdpI;NByb(QhzI|MI;ib6RFE<8@7(ri)<6AA88QTHqtQC zDAG8xU8G55`$*GBvqJ5&fb@ATXRw6g&ktLnvQpGI@mL2D|O)> zy#J9w;VBj{J5S=937m}Pv*`Nf6yBZISE(T*1MS#@_m0^UA^O7p1C$!sQK`>IDfMwL zrA}e+{33&Q^mpQYMjSV$E9YuxXg8%!p!2;2SO3=g^l!aSOaHBPH~p&CPsDXM;&m%0 zv08^Q$vJC(-lIn6u2rW4?CiMv%*=WR&`s*|VGRm68CCk%(>#J=r)1aaP+Mllfh z!uF^*J=<9+t*i!aT`@OAnP>8yTI$+ol*85o38xG1?#ko+u;kObUF~XTOZHj=e_kvFX6sKUYx*!((&vcOFiweGtc4RZv)3PC9J`_D)kS1 zZd9pjI`J(u;;3~s@oPz#n~2Yoq$Pv&AAOKgzfa=W?n=E#{@g--G&+DV_T#%k{JnS( zX@pIpESe9)Ml0fkJ7F4mP5r$M_kH5}Df!)*^nOox4fi5Vr0+M%WHx2BiunA^v4;|F zJ@R@Ud3qr>3#af+Im&%5b>L;!s58%#lGeRxyG;r2J#3Gp-p8xoaLR!+%%{Fwu_y0w#KxD@pWi8)cS+xO zl*8=<$d4v5O{T17O{T7nN|b)d+{4tZX6>jegwtsk@}BreMVl*i<4n>^J~gH;S)EUQ z984K%wWAEQ^7hQ07R@cnET~wLJ*TpuFh65nw74RBQAyc??76-3`uEEpGH_tuKK=U* z%pIIvUY3`gnOj~_810!^QWnk5EGa52Ddza{o+AtLDhf)9bIX=wDk{nf z=2TWh%d@BQt9ah{g7OM~XV1Ly6xyCSIk#fIiAaqtja*WkTU3xYxvXUIlI+pZ;%HfJ zMM+tCc2-eA1qmg21x2NW(Tu6nvPVYe=2jL~?4Mg$8O>T;S{5xYCsS%112413m&}_- zE@sb&&e1=kWi<}gm9VkJ^P^=26}iQE(Xqt~OY(Ac$xd5R8ub&OGSk)MX-3(+$|CC6 zl<3@OS(G@{*m!8Qtx}Ok<>pb`OOjxf7BeMUUQ$_>7tJ13P#Cp;)Hvvbg3K%_jx{`8 zM<+y!=1@g5O9~64IvF)Kl~5HiRbEmUO;!#iB!illTUd}kpjC3y>KTxtnb+#l_e zQm+$&_M43E<0^9X=#<>JCmNte&nT#vAJlRm*Vt<4Xyg???UzYKjSac-FS9VWyxg1J z=p;_dEt?muNK^83y~rL>P@He3hhvKiDhlZK4@-6%PZ$)dOK>dNafhWWyQ}GAGV=4w zm?}=1>vuLu>|UJ3t|#y1GY?M$V{xgFYy{C=oBJ9cJZPfe0w zmPwu8p-wF|0226;DzLL65FPks?F7tbK2pE-12CCl@pNUCNZP1(9F=rl$0cS zyf>%6-dHk1FD4|R8{g7uv2S$A)XF*K6$KTQIxACDL8e5DN-FeZDd;k5Ts)yE^!h8^ zbw(GbxQW?*WMs5FudJXn87GSgZOf|_W?n%7CGRvYH2QqP0zDO|$3L9)*0LNm~BNafk1%StLs{l9Bm?-TORpKz9E2h%fuXL4;ZW) zmgRfnwq8s~%9&NjNt`#$^)s$KDQ83Bg+@nM#=2FN+F#?03^iND+}PrBZyB-1W)td4 z!b~!#Eh(PDdsEhtxfQv|O^jd1t6fmeU;%kvv0Va9(`0LGP>vHzDhlQ%Y3Rk zlh^+z)Q#}$oEj|*&aqNfj(R~NYhg0x#G6f;m)wH9)b}XHP*5|Hb#*0SL3v_jVPTRk zZiIGJUWcqF0eUJIxBgJ$Dv`MMN=L=IwH>=_9QbByLvSH#d`WITiwUu%%0ll1Es3Ws zn~lhL7Ig9_m1dUYN6UjMlg!|^w=mliwlbM8Zt`(d9iaaKeKCWHZd=g za=|2YoC?kvvZq#-diN7}GqQr%HTiO%CnsfghL&MYA7VpsT23>$tt2m3Uj_(BDM%X**%`^LwY@N@iAU##ZB6l3>TIP)+65 z9({$)yO&~Y@!XPRty3i!i%V26zWKLFjab6eEP1oD&@R-Q>e~zG`xkJ*D+$vVuP)LE zg1b_(CscYT6A3$$TY%wtI;tRAsHgl%x<@LZG)>hRRZ>=zt8aOu4lOLmiVy_x z(3_b7!CS%2EQ@mCsm2-nf3TdiC6O)a!Q<1M(px60&t|4?1^LOy=!E(dSCf-HLvz`w zrWa!RmRp#-7LzbOO=Ii>RG0{Sj|E`VcRHfFW zKWXMpKY7=(&(anJrkm6|B%d22V)uQ=?wYHT)ipMe zP-)}3lxmtfqjGr?Zy=-(6$t zu8gjxi2aT{o$H)>mC>tPWtIBw>SSg5W|Qq*T}ZXHsxP@zYC0 zlbhw$KCM+_6Vha(Hhd6a`k{tA=O8WYwtMi%7GD=yKO)XGz_su5SM;_v@U#TA)^ zg7RmuaW`M-n-!Yf@}Fn zTS|(5hE@;d1$nyec#j9io~%u73MQ1~R~AN7kTr4HU(Ly^z3q<&4Qpk-G9_A3Syt@N z@{>4qN$6FW)bs9v)O0AUddY{IYFstKhiv;$QT(!^z3}9B(KU{PtN*ftjW@YBwTp|D zNqNX)OVjOLCmmH;>^;nqq9mKKRric~^)l6CtKT@|#sG#Wy`C6b^NHJEx5$!Dp`~K|02uB^W0!r zZXv5{N$hSD>?h8$%;TR?vxaGxo|0S35=^G)E*l0G z1&fncWxZa(TXfYA?N2D-8R?R;q}+R!SUYm_=0_)RH!E|&B(69m*hskfB-^VGruvoh zoCvQGs_7-}1Z&kb@1To|&9Rc%r^U}r<6gUw`b631Lz44kQ9>RjG+=+_Kk0WmdvzRJ zaW~W?{N=Z%;8xNaXKP}+($8*BiRR|}&u`Z_{Dge0t}c>7JBvuxc(bKlRctwZDjiAg zymVf#v(vU3XRcRx`pkjeDm(6Oi)1YvZMN`&jzm9ek>&?2s+;U5;kLH_BGIuk#N_p! z38oV|9j^H-;$cn7IW{%(TT*iBkewxD+iAmy%HsSazME@HTO<<)zmrQ&%Bq_(r1+&2 zu@V}^a}3E^fDDSq+>;(#GqAgBoKp$)&aYZ=%YpVRO!r*L>ZM&qJsYumf0I4V*{;$i z$Ge+3Kbjv~d`VWXnb0fi;f=S$C24slakMtGVDa{vXbI?`hJ_FJjAnkd;XoYt>Z&Q)XlzKoY1W-Kfz;K72@Lhqro;(0aBFPBljdmEph zm;7gky}Y#32LC;*secOr6+M?0@7+R_+^maR36Hg=n)h8*D_qB7@{iXYb`#GvVCV8q+5Re$3!U65>?fhRFAsQ6wb-}2=&ugcIC);Jp)g&`)4}Yo#-dP|>RVg#zPru@>XqRW(^@6yaDT{&b)#FdflF%d)a?_?IIDM^gQZ`=?O$@vn zxod1LAvtlC!!Ntw3~wwiRW9STqRAVMy+$xOw;&n!z;mh0PLIqxpHe+3^0O#*YLS$M z6E8>na|*kFYoHzu5L>2ZAqtlw|k%u=O#jV~x(pkEE4 zdKK$u`cyAI{L^bbr+?A1Ifbk~#CFW(6DH-o_<&FaH}U299}wb#V(15i@?swl%F`bZ z$_qXqlM^rN3Wyr(V=j9TQT-Qx17mqL|zWkRJv1(+o^} z&1;$}%_l+9lF(dpktM|`^`A(tVkg@fgN4DXJJORCLGANvY5HrPZ?QbPN?!Raxz#YN zaDqGuVl&5loTOHxGgrS9zE)!}Prn?wR%5Urx}>)4^M*2ReXH$Ql*hdXzEq%RN_ z>I;NX{jO2ldTOJ+7DpG&jYA2y1?anZYc&$3_I(@0`qjqvMS8UwrP%CduJ?AO ze?dg_s}uhP(O9TIqF7$L5i##v{P$Fq3KoLt=l=!$?Bb$A@8m$g@S|1>X)&X2?GF83 z4Cb20UecczoKVGHof*u@%qdjb2AcfXcTaWSsy{`<2gJ;)64EkNuafRL`Wqj4{u|9W4%5~W3xeJt&CO5G2)ub)UhIRzJb;?+p~#LwwNUPQsV>_e z|I5?5a_8B$OEKwQD~lQD<_H#Py%(=1e#SE`jn0che(Y22UKLDRbE{%G-+Vthy)p2X z73#F6w^x4pkM?p-+4cd(_$bWrBH z3~WTwo&$-|uoq9wpqTd9EQ)=h$*Z45ycmEdOU&#vg~j3*e0eY-%olIxN=*--Zxbsr zPx1S6(ezZm^k#8fMJmtc1y;dVe_}nYUj*q%ym#rI(|o?QmZmzEkO9(sNwHTNsjunP z$HE^7_!La~MghObxms?zo3xciHMYG>F#9TITa39pr6j}{f^rRVbO za_^BvZZ*o*=R-DP(Z$|3v?z>}bqa9>QBXXe+lIUk;08ltdZq<&v8Zlh=Hql^Lp5bm z%x(U8{%!vHqJf?yrMGnaJkaOwDa(h1?y;y~aY1q1p7dDd!m@dRLb?XV;BwI7C37kZ z3eDR9QZwPH{v^b%cc(qKgXWgL4$zN1nkLQJpMK!1Y+hv%_kZd;2)wV( zrmTu@E;hQKTlQXVT{GUsgGY_ zu#;XtMrmz{aam)g;Jh`y_UGUFY@oJdF=q)yQro2xn<%97Or)AB8aG=BmZECAc!<Mu&ycI(kMv*^dzYdao=vA479%PeVKL$0PR7xKQ@ z+%h_OE^+9!mVZTrD4%~>ocOqNZC9Gu3^nL*YrUjm5vnLzzyr;-U5$AnEmmXx1rf2U z#kHR)C8f39?dxkZwVn^P-Ew{V|DK#+S-E7+Aq<88j#g9VeIn}Llu!DTRkhuC%A(lh&mX9ffqI zo2gZ=`i)n>l&vtAj9D5_~-`Kt*rX1nJG)N zw;UD!bdvW>aH`G4UM;7ei;0#kEXa$N$7XNd_hM3#!zP(QB}$XQm>GR1beaq%RHXu5 znVcrOx}lgZHH{WiV9LA(noCZ3x*JH%n+6gd#W!_R=b&C2OjVk^vwZ!*?xNTSyY+js z=a(e=Q5Y}#q^Zi%d1bt-TX*AWw5m-dvm;APT5(B9Y3ePAoJ(DD%K6$f@2AUO#Pfk( zA*Ie#YIDsdBpnq^+lnh8oqy>v>z7mVn{Yzsq-Q?d+{4Y)jMjQ-Ke=-~uT2%2uV&lF zDZDT_(Xy1hsg76MTdNgiELW$;luclItm%0xpSw+U{^b|s&MPh{uPDeXPfxn^ z{UBIMb-K7x$!8?elcYsaK4X!N${w?ll9SPdrflk7%v{ok5*;jSt$cw%RK1j0^4^)w zS3T$iZNHQ2eBDl&k+_aEWj6eVlXMHz;9xN??n%G6y(zYt5Ci{V-qfrL zdyO~2pnje($bht2EvocZdlHPNIG=fOcs5Ef$#ZOGF(?JCu+)6AELkfZUg3GmRdzWg z={d$ilsO^RYZ>{$Gkz&~n<}$29;qs+WWwpUJi8+WNfVZ0onsp8m9r`|r;ta2Vi8DT z%7mp?sQdc$fm&#I~Z}C=A zo@+Kashj0m3)%Xn)`C20AFm_jbRpH%oG&`0)kvy}s=TP8loz7S&E<1M`geIW+4rP) zLn0kHX9=+@DbhZW8B|=xa@;p|7rNz!%hC!x9i_WZo07bPWO$vG`DA) zh8J8k=AX+SJm#{U>wmuSpMM^{tKiKaj&1+*Hg!(&K0TQ;NU2KvH$GUY$8hWCDD@2P zrhS!KiTh0#rS``i)K94*+(&yWH6Qo&QA(YS`^HeEj>fH=q10Wtw`VA|9QTyTN?n6H zW1LbK;A2rw=Wg6CbCr4J>^ zzu#3UqM)wpq0}7Q#iajn+SFU%+HxL+Nj)F-&J znkv;5cR+zs8*oqAN2%j+Um2^^3fxsh>QUV1x^paUFYM*wu5F~$&bUhn=VRO>2P?G* zw=Ma1A}+zIdT7l=rLMsJjZ7mdDrb~ZXW_n_snn^sdfN(3CjAHD?%78vqN3`NPj}*e zHeRVqao^vMwBi<%Zhoqw`lJ!JF8TW&?k|IsT8O)VLjFqsO{TnzyN2@F4);cc7Zq)% z)ZVz~4pC|e?o9HfC+;xP`3UYU{6Q9}gY(D(+~-;R!R!a57y_iCI2ltC@lwz0a z5mBlE?#8J~-Hh7_|9Dkd1C%-xcWdJFCGJU-^Mkngos^<#s#l4}Fx>7G(vG;3u+tlN z+*qY9z`ddn8@MmdRO(*b4NaBmhWj>|N|e>#ZIv2|yYF_`#9dWKsYbXXD5NKGZ!e~< z;bxM#R3Ww1eo9@7`!<=p7I$a-?}_^c_2voO4Fp0~t8tB$>VSLg4oZQj%7!!6HI>RH^~W-GN0_t^QACGO=I zKOFZ+GUH<0{W>T$8h03pXpj2@;k||1k9_zXw+Dst8tz*ii6idrAxFDM$7M>-$IJz+PcI8;r+A6cu8Ak&YP+(HTguWHkQNS3f#xXD0M#W{@rQ2xG!y|6j4$4_fd+Zse5ykdI9&$;nWG- z??~TB+|lGWO-ntNM;*s~p7adB{d63CIqp~F<3`+T3Y7W~_f*RBCERsn;>oy=c2kNh zQnM)keQ+NnGfHtsAE4BIxbIS!L`i*^LtldX0Y*>99YcJc$1SB@uEu?UbPd8ir>#;H ziQ1pSxePb6m@y1@SYPrS_a59r+=KYzQ{3%`E42*wUhLhEJE5LZWWCBJUhGn*PF3nA z+!4h0B-}Ts_oHy{okd;4-H%S>DBQu63q_!25#QZ$AIJVG-08&kG~EAf|KH7lc6DNH ztn1=f+s=E5#>RHoo779w9%u6R|Mb5+_+K6P_tt?myT<178ydyVDbC%Bv2h#b^SE0v zE-Yp2=s?rHhqk<)L1GQb`-JxZ+E|}(;H%NO{9Z}eZz1j8!&v2fxSTuM~fU>>tDL@%-L^za!9!KAgif;5ftQvu`QK{YiL_WA0D%oQ?zg z^!bIJbLqIR=64%x*Vkpi?`ivzFR{tBmfZx@`OV_h|_*>VB{xEG{`_aeiv%2!*$(ROP(#K zZVcDqbKEMz7^){{{9T{FH{jkw9L~kxQ2gk8*vK)ujMsCRj?;~Vlg<8>@YNhw%Dx9+ ze=`5mXyvz)7he$m9*yHTWLC2FmZLo5U1qu*^3hPV z7`_$zbo_7a5({q{$8JEc!S(*vh|4FfV&Uj?Kh8d#4@clv|Grhng*547_1{{${B?WK z<)!-zohS22Pd4HFN&c;(OgEAC@r0xEY7cFL{9B9PLds_&{yMXNC_0|s`sA=b;pHQp zC&M{*{)zYl<(wYTMXeqnj0e#}=wY-LJ%S!ZkD>%`mW9rP|*kKRM?qYuyq^db5PeT+UqpQ6vu=ScT8U!t$j z*XSGcE&2|9k2azo(2wXR^fUSe{fd4=n-E#5Uge+H(Cg?8^d@=>>GS$`(7QVP_;PG}d@8SRR8LtRi;)D7*9x}!Z%57ZO&LcLKR)ED(b z{m}q45Dh|u(GavJ+6(Evdv7!h?SqD+3^W2|qLC;IjY6Z*7&I1*L;IrfXabsuCZWk_ zKQskRMbpr9v_G1GW}*Yof#@KVjSfb$&}@{0a?u==hw@Pr%|-Ljd{lrAK?_hJDniAm z1eKygQ5h;n6{r#|M2pa3v;-Z74o63zBhgXlXtWd^gN{YVq2tjqbOJgNEk`GzlhG;Y zRCF3T9i4&BL}#J1(K+Z`bRIe%U4T}g3(-aBVzd%nf-Xgup;hQ|bOpK+U4^bj*Pv_B zYIGgC9^HU$L^q+E(Jkm!bQ`)I-GSDiJJDU}Zgda27u|>MM_bc})kE8$`ltcg7BxhA ztZR(6Lrst#i<_cms5xqZTB25{HEM%)Ky6Vwv?JOHwMRQ6-S>AyozO0*GujpHhPt4x zs2kcHbw_(3z2?{x^+I|q>Vx{Cen^k21JFP;22-*|vh4eVGHyVcaLBml78i6v= zNR)*}q0wjz8jHrEebIO{0Zl}c&}6h9nu4aHX=pmyAI(5|{5k*~hz>$}Ogb3NLbFj0 z%0+Wf9@1l76wO8Rke;&?phM6Cq{r7HRE$bcDLNFDp>kA#D$zo;2rWiS&|&CsbObsQ z9fgiYOVKgtSaclH`YOYrx1QVtm#L4pcEt43TXSiFtJmTf zHodj!Hn>a!y!AM}mbD{dTI8*7G8I)FP)F1W?SeX^UD0l+3+jrxq1{n;q{q)5s3&5X z&RZ{Ls_Lyv_rqoB$y>V`h&u=kMnlk^NUtdkMSG)RXdg5jWuX6U|I2~@<-q@cb6^BX z&qO0p78->{qcLbK8izPl^{x+1z@3ODp~+}JGzGED>|NiRj=Mjafo3AT2Cdh}4?@{U zug%XwdaXGJ<)S$#59OmMnv3S4`KSOLf)=1cRD_BV%kthj`=PjHs2o+GO0*CyLW|K7 zbQn4u9f6KSN1>z9QgjSD79EFt=(KqN@^d0&hZA3qyAJI?fXY>pD75#=bq2JLT=s)OB^cVUY{ex75|4|)O7j1=3 zKqsQ*=p=M9It87IPD7`oGtimnEOa(H2c3(~L+7Il&K5nL${+l&>D0nx(nTn?m_pW`_TR90rVhx z2tAC}qDRo9=rQy-dICL(otC1qQB7J=pUr&Q07Rlr)-Vtp>2>}Pi%m;MGa9S)EI4tnjpQN(G)d9 z%~1=~61775o{KhU2hnb~7EHny@MtUuDEEn zRDcda3s4~{LdB>Am7+sY87fB=s1hwii_l`U1RaJBM@OI|(NXAVv=kkKjz!0z|iIm*v%gH zvXA{7;2?)M%n^=qjN_c(B&Rsd8P0N!^IYH}m$=Lou5yj*+~6j+xXm5za*z8w;31EA z%oCpSjOV=IC9inR8{YDc_k7?ZpZLrdzVeOl{2)kBZ$7^elwbrW1R)9RUPBR@FoY!> z;fX+CR~?Z^L?#MRiAHo{5R+KMCJu3lM|={HkVGUVuwPF?phuRJWF#jADM>|Y(vX&P zq$dLz$wX$dkd0DltLI~Sx7g(*T&icy@v&i5ZmP?A!VrVM2X z?4Qd~o(fc?5|yb!RjN^)8q}l~wW&j0>QSEtG^7!YX+l$)(VP~vq!q1cLtEO>o(^=R z6P@WoSGv)i9`vLaz3D?=`q7^O3}g_48NyJ8F`N;MWE7(r!&t^Ko(W835|f$2RHiYV z8O&rBvzfzO<}sfIEMyUjS;A75v78mGWEHDf!&=s{o(*hd6Pww>R<^O79qeQmyV=8D z_OYJ>9OMv(Il@tnahwyJ-nD&fok)2})9m(v+brfjqSw<*7hL zDp8p#RHYi#sXF`or2WD$#5!cvy8oE5BO6{}gpTGp|i4Qyl+o7uuvwy~WZ>|__a*~4D;v7ZAR zG@ zA`*$nL?J5Ch)xV*5{uZxAujQVPXZE>h{Oc)(j@#rQj(FJ6r>~-sYydx(vhAFWF!-r z$wF4Lk)0gmB#_1CCJ%YZM}7+MCx20pLKLP5MJYyc0)2>oC_za|QJON8QSEtG^7!YX+l$)(VP|px*Dx$O&i+Mj`nn*Bc13>7rN4o z?)0E1z35FJ`qGd73}7IG7|alcGK}GjU?ig$%^1cqj`2)jB9oZR6s9tb>C9jzvzW~s z<}#1@EMOsvSj-ZZvW(@dU?r)hZbx46w6?sAX&Jm4XZc+3-?@{H%a z;3cnk%^TkGj`w`vBcJ%p7rye1@BAQ02=|^q4=Okz2+6O6A`GDkOE|(4f!~NoBq9@q zs6-<=fj&=6ViB7-#3df_NkBppk(l2}!XG3h8OcdON>Y)UG^8aR>B&Gw0zH$=WFafr z$W9J&l8fBrAusvJPXYeqFA7qK!W5w>#VF3-1UkeeC`leGORG@>z0Xi77h(}I??qBU)3OFP=rfsS;dGhOIPH@ee zEMhTBSjsY%vx1eZVl``6%R1JxfsJfpGh5ioHny{ao$O*ad)Ui9_H%%P9O5uXILa}O zbApqc;xs?c|K|igh4gOng|B?$J3k17;6VvSa6%B0UkOEM!Vs2lgeL+&&(8_`oWRcs L{G7o5{sjI5>(LM> literal 0 HcmV?d00001 diff --git a/NzbDrone.Core/Libraries/Castle.Core.xml b/NzbDrone.Core/Libraries/Castle.Core.xml new file mode 100644 index 000000000..d3d950979 --- /dev/null +++ b/NzbDrone.Core/Libraries/Castle.Core.xml @@ -0,0 +1,4937 @@ + + + + Castle.Core + + + + + Assignes a specific dictionary key. + + + + + Defines the contract for customizing dictionary access. + + + + + Determines relative order to apply related behaviors. + + + + + Determines relative order to apply related behaviors. + + + + + Defines the contract for updating dictionary values. + + + + + Sets the stored dictionary value. + + The dictionary adapter. + The key. + The stored value. + The property. + true if the property should be stored. + + + + Abstract adapter for the support + needed by the + + + + + Adds an element with the provided key and value to the object. + + The to use as the key of the element to add. + The to use as the value of the element to add. + An element with the same key already exists in the object. + key is null. + The is read-only.-or- The has a fixed size. + + + + Removes all elements from the object. + + The object is read-only. + + + + Determines whether the object contains an element with the specified key. + + The key to locate in the object. + + true if the contains an element with the key; otherwise, false. + + key is null. + + + + Returns an object for the object. + + + An object for the object. + + + + + Removes the element with the specified key from the object. + + The key of the element to remove. + The object is read-only.-or- The has a fixed size. + key is null. + + + + Copies the elements of the to an , starting at a particular index. + + The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing. + The zero-based index in array at which copying begins. + array is null. + The type of the source cannot be cast automatically to the type of the destination array. + index is less than zero. + array is multidimensional.-or- index is equal to or greater than the length of array.-or- The number of elements in the source is greater than the available space from index to the end of the destination array. + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + + + + Gets a value indicating whether the object has a fixed size. + + + true if the object has a fixed size; otherwise, false. + + + + Gets a value indicating whether the object is read-only. + + + true if the object is read-only; otherwise, false. + + + + Gets an object containing the keys of the object. + + + An object containing the keys of the object. + + + + Gets an object containing the values in the object. + + + An object containing the values in the object. + + + + Gets or sets the with the specified key. + + + + + + Gets the number of elements contained in the . + + + The number of elements contained in the . + + + + Gets a value indicating whether access to the is synchronized (thread safe). + + + true if access to the is synchronized (thread safe); otherwise, false. + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + Abstract implementation of . + + + + + Conract for traversing a . + + + + + Identifies a property should be represented as a nested component. + + + + + Defines the contract for building typed dictionary keys. + + + + + Builds the specified key. + + The dictionary adapter. + The current key. + The property. + The updated key + + + + Defines the contract for retrieving dictionary values. + + + + + Gets the effective dictionary value. + + The dictionary adapter. + The key. + The stored value. + The property. + true if return only existing. + The effective property value. + + + + Applies no prefix. + + + + + Gets or sets the prefix. + + The prefix. + + + + Identifies the dictionary adapter types. + + + + + Identifies an interface or property to be pre-feteched. + + + + + Instructs fetching to occur. + + + + + Instructs fetching according to + + + + + + Gets whether or not fetching should occur. + + + + + Assigns a property to a group. + + + + + Constructs a group assignment. + + The group name. + + + + Constructs a group assignment. + + The group name. + + + + Gets the group the property is assigned to. + + + + + Assigns a specific dictionary key. + + + + + Initializes a new instance of the class. + + The key. + + + + Initializes a new instance of the class. + + The compound key. + + + + Assigns a prefix to the keyed properties of an interface. + + + + + Initializes a default instance of the class. + + + + + Initializes a new instance of the class. + + The prefix for the keyed properties of the interface. + + + + Gets the prefix key added to the properties of the interface. + + + + + Substitutes part of key with another string. + + + + + Initializes a new instance of the class. + + The old value. + The new value. + + + + Requests support for multi-level editing. + + + + + Contract for dictionary initialization. + + + + + Performs any initialization of the + + The dictionary adapter. + The dictionary behaviors. + + + + Generates a new GUID on demand. + + + + + Support for on-demand value resolution. + + + + + Suppress property change notifications. + + + + + Provides simple string formatting from existing properties. + + + + + Gets the string format. + + + + + Gets the format properties. + + + + + Identifies a property should be represented as a delimited string value. + + + + + Gets the separator. + + + + + Converts all properties to strings. + + + + + Gets or sets the format. + + The format. + + + + Suppress property change notifications. + + + + + Contract for property descriptor initialization. + + + + + Performs any initialization of the + + The property descriptor. + The property behaviors. + + + + Assigns a prefix to the keyed properties using the interface name. + + + + + Manages conversion between property values. + + + + + Initializes a new instance of the class. + + The converter. + + + + Gets the effective dictionary value. + + The dictionary adapter. + The key. + The stored value. + The property. + true if return only existing. + The effective property value. + + + + + + + + + Contract for creating additional Dictionary adapters. + + + + + Contract for manipulating the Dictionary adapter. + + + + + Contract for editing the Dictionary adapter. + + + + + Contract for managing Dictionary adapter notifications. + + + + + Contract for validating Dictionary adapter. + + + + + Uses Reflection.Emit to expose the properties of a dictionary + through a dynamic implementation of a typed interface. + + + + + Defines the contract for building typed dictionary adapters. + + + + + Gets a typed adapter bound to the . + + The typed interface. + The underlying source of properties. + An implementation of the typed interface bound to the dictionary. + + The type represented by T must be an interface with properties. + + + + + Gets a typed adapter bound to the . + + The typed interface. + The underlying source of properties. + An implementation of the typed interface bound to the dictionary. + + The type represented by T must be an interface with properties. + + + + + Gets a typed adapter bound to the . + + The typed interface. + The underlying source of properties. + The property descriptor. + An implementation of the typed interface bound to the dictionary. + + The type represented by T must be an interface with properties. + + + + + Gets a typed adapter bound to the . + + The typed interface. + The underlying source of properties. + An implementation of the typed interface bound to the namedValues. + + The type represented by T must be an interface with properties. + + + + + Gets a typed adapter bound to the . + + The typed interface. + The underlying source of properties. + An implementation of the typed interface bound to the namedValues. + + The type represented by T must be an interface with properties. + + + + + Gets a typed adapter bound to the . + + The typed interface. + The underlying source of properties. + An implementation of the typed interface bound to the xpath navigable. + + The type represented by T must be an interface with properties. + + + + + Gets a typed adapter bound to the . + + The typed interface. + The underlying source of properties. + An implementation of the typed interface bound to the xpath navigable. + + The type represented by T must be an interface with properties. + + + + + Gets the associated with the type. + + The typed interface. + The adapter meta-data. + + + + Gets the associated with the type. + + The typed interface. + The property descriptor. + The adapter meta-data. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Describes a dictionary property. + + + + + Initializes an empty class. + + + + + Initializes a new instance of the class. + + The property. + The property behaviors. + + + + Gets the key. + + The dictionary adapter. + The key. + The descriptor. + + + + + Adds the key builder. + + The builder. + + + + Adds the key builders. + + The builders. + + + + Copies the key builders to the other + + + + + + + Copies the selected key builders to the other + + + + + + + + Gets the property value. + + The dictionary adapter. + The key. + The stored value. + The descriptor. + true if return only existing. + + + + + Adds the dictionary getter. + + The getter. + + + + Adds the dictionary getters. + + The getters. + + + + Copies the property getters to the other + + + + + + + Copies the selected property getters to the other + + + + + + + + Sets the property value. + + The dictionary adapter. + The key. + The value. + The descriptor. + + + + + Adds the dictionary setter. + + The setter. + + + + Adds the dictionary setters. + + The setters. + + + + Copies the property setters to the other + + + + + + + Copies the selected property setters to the other + + + + + + + + Adds the behaviors. + + + + + + + Adds the behaviors. + + + + + + + Copies the behaviors to the other + + + + + + + Copies the behaviors to the other + + + + + + + + + + + + + Gets the property name. + + + + + Gets the property type. + + + + + Gets the property. + + The property. + + + + Returns true if the property is dynamic. + + + + + Gets additional state. + + + + + Determines if property should be fetched. + + + + + Determines if notifications should occur. + + + + + Gets the property behaviors. + + + + + Gets the type converter. + + The type converter. + + + + Gets the key builders. + + The key builders. + + + + Gets the setter. + + The setter. + + + + Gets the getter. + + The getter. + + + + Adds the dictionary initializers. + + The initializers. + + + + Adds the dictionary initializers. + + The initializers. + + + + Copies the initializers to the other + + + + + + + Copies the filtered initializers to the other + + + + + + + + Adds the dictionary meta-data initializers. + + The meta-data initializers. + + + + Adds the dictionary meta-data initializers. + + The meta-data initializers. + + + + Copies the meta-initializers to the other + + + + + + + Copies the filtered meta-initializers to the other + + + + + + + + Gets the initializers. + + The initializers. + + + + Gets the meta-data initializers. + + The meta-data initializers. + + + + Contract for dictionary meta-data initialization. + + + + + Performs any initialization of the dictionary adapter meta-data. + + The dictionary adapter factory. + The dictionary adapter meta. + + + + + Contract for dictionary validation. + + + + + Determines if is valid. + + The dictionary adapter. + true if valid. + + + + Validates the . + + The dictionary adapter. + The error summary information. + + + + Validates the for a property. + + The dictionary adapter. + The property to validate. + The property summary information. + + + + Invalidates any results cached by the validator. + + The dictionary adapter. + + + + + + + + + Initializes a new instance of the class. + + The name values. + + + + Determines whether the object contains an element with the specified key. + + The key to locate in the object. + + true if the contains an element with the key; otherwise, false. + + key is null. + + + + Adapts the specified name values. + + The name values. + + + + + Gets a value indicating whether the object is read-only. + + + true if the object is read-only; otherwise, false. + + + + Gets or sets the with the specified key. + + + + + + Helper class for retrieving attributes. + + + + + Gets the type attribute. + + The type. + The type attribute. + + + + Gets the attribute. + + The member. + The member attribute. + + + + Gets the type attributes. + + The type. + The type attributes. + + + + Gets the attributes. + + The member. + The member attributes. + + + + Gets the type converter. + + The member. + + + + + Contract for typed dynamic value resolution. + + + + + + Contract for dynamic value resolution. + + + + + Encapsulates an invocation of a proxied method. + + + + + Overrides the value of an argument at the given with the + new provided. + + + This method accepts an , however the value provided must be compatible + with the type of the argument defined on the method, otherwise an exception will be thrown. + + The index of the argument to override. + The new value for the argument. + + + + Gets the value of the argument at the specified . + + The index. + The value of the argument at the specified . + + + + Returns the concrete instantiation of the , with any generic + parameters bound to real types. + + + The concrete instantiation of the , or the if + not a generic method. + + Can be slower than calling . + + + + Returns the concrete instantiation of , with any + generic parameters bound to real types. + + The concrete instantiation of , or + if not a generic method. + Can be slower than calling . + + + + Proceeds the call to the next interceptor in line, and ultimately to the target method. + + + Since interface proxies without a target don't have the target implementation to proceed to, + it is important, that the last interceptor does not call this method, otherwise a + will be thrown. + + + + + Gets the proxy object on which the intercepted method is invoked. + + Proxy object on which the intercepted method is invoked. + + + + Gets the object on which the invocation is performed. This is different from proxy object + because most of the time this will be the proxy target object. + + + The invocation target. + + + + Gets the type of the target object for the intercepted method. + + The type of the target object. + + + + Gets the arguments that the has been invoked with. + + The arguments the method was invoked with. + + + + Gets the generic arguments of the method. + + The generic arguments, or null if not a generic method. + + + + Gets the representing the method being invoked. + + The representing the method being invoked. + + + + For interface proxies, this will point to the on the target class. + + The method invocation target. + + + + Gets or sets the return value of the method. + + The return value of the method. + + + + Used during the target type inspection process. Implementors have a chance to customize the + proxy generation process. + + + + + Invoked by the generation process to determine if the specified method should be proxied. + + The type which declares the given method. + The method to inspect. + True if the given method should be proxied; false otherwise. + + + + Invoked by the generation process to notify that a member was not marked as virtual. + + The type which declares the non-virtual member. + The non-virtual member. + + This method gives an opportunity to inspect any non-proxyable member of a type that has + been requested to be proxied, and if appropriate - throw an exception to notify the caller. + + + + + Invoked by the generation process to notify that the whole process has completed. + + + + + Interface describing elements composing generated type + + + + + Checks if the method is public or protected. + + + + + + + Performs some basic screening and invokes the + to select methods. + + + + + + + + + Provides functionality for disassembling instances of attributes to CustomAttributeBuilder form, during the process of emiting new types by Dynamic Proxy. + + + + + Disassembles given attribute instance back to corresponding CustomAttributeBuilder. + + An instance of attribute to disassemble + corresponding 1 to 1 to given attribute instance, or null reference. + + Implementers should return that corresponds to given attribute instance 1 to 1, + that is after calling specified constructor with specified arguments, and setting specified properties and fields with values specified + we should be able to get an attribute instance identical to the one passed in . Implementer can return null + if it wishes to opt out of replicating the attribute. Notice however, that for some cases, like attributes passed explicitly by the user + it is illegal to return null, and doing so will result in exception. + + + + + Handles error during disassembly process + + Type of the attribute being disassembled + Exception thrown during the process + usually null, or (re)throws the exception + + + + Here we try to match a constructor argument to its value. + Since we can't get the values from the assembly, we use some heuristics to get it. + a/ we first try to match all the properties on the attributes by name (case insensitive) to the argument + b/ if we fail we try to match them by property type, with some smarts about convertions (i,e: can use Guid for string). + + + + + We have the following rules here. + Try to find a matching type, failing that, if the parameter is string, get the first property (under the assumption that + we can convert it. + + + + + Attributes can only accept simple types, so we return null for null, + if the value is passed as string we call to string (should help with converting), + otherwise, we use the value as is (enums, integer, etc). + + + + + Applied to the assemblies saved by in order to persist the cache data included in the persisted assembly. + + + + + Base class that exposes the common functionalities + to proxy generation. + + + + + Generates a parameters constructor that initializes the proxy + state with just to make it non-null. + + This constructor is important to allow proxies to be XML serializable + + + + + + It is safe to add mapping (no mapping for the interface exists) + + + + + + + + Generates the constructor for the class that extends + + + + + + + + + Default implementation of interface producing in-memory proxy assemblies. + + + + + Abstracts the implementation of proxy type construction. + + + + + Creates a proxy type for given , using provided. + + The class type to proxy. + The proxy generation options. + The generated proxy type. + Thrown when is a generic type definition. + Thrown when is not public. + Note that to avoid this exception, you can mark offending type internal, and define + pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate. + + + + + Creates a proxy type for given , implementing , using provided. + + The class type to proxy. + Additional interface types to proxy. + The proxy generation options. + The generated proxy type. + + Implementers should return a proxy type for the specified class and interfaces. + Additional interfaces should be only 'mark' interfaces, that is, they should work like interface proxy without target. (See method.) + + Thrown when or any of is a generic type definition. + Thrown when or any of is not public. + Note that to avoid this exception, you can mark offending type internal, and define + pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate. + + + + + Creates a proxy type for given , implementing , using provided. + + The class type to proxy. + Additional interface types to proxy. + The proxy generation options. + The generated proxy type. + + Implementers should return a proxy type for the specified class and interfaces. + Additional interfaces should be only 'mark' interfaces, that is, they should work like interface proxy without target. (See method.) + + Thrown when or any of is a generic type definition. + Thrown when or any of is not public. + Note that to avoid this exception, you can mark offending type internal, and define + pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate. + + + + + Creates a proxy type that proxies calls to members on , implementing , using provided. + + The interface type to proxy. + Additional interface types to proxy. + Type implementing on which calls to the interface members should be intercepted. + The proxy generation options. + The generated proxy type. + + Implementers should return a proxy type for the specified interface that 'proceeds' executions to the specified target. + Additional interfaces should be only 'mark' interfaces, that is, they should work like interface proxy without target. (See method.) + + Thrown when or any of is a generic type definition. + Thrown when or any of is not public. + Note that to avoid this exception, you can mark offending type internal, and define + pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate. + + + + + Creates a proxy type for given that delegates all calls to the provided interceptors. + + The interface type to proxy. + Additional interface types to proxy. + The proxy generation options. + The generated proxy type. + + Implementers should return a proxy type for the specified interface and additional interfaces that delegate all executions to the specified interceptors. + + Thrown when or any of is a generic type definition. + Thrown when or any of is not public. + Note that to avoid this exception, you can mark offending type internal, and define + pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate. + + + + + Creates a proxy type for given and that delegates all calls to the provided interceptors and allows interceptors to switch the actual target of invocation. + + The interface type to proxy. + Additional interface types to proxy. + The proxy generation options. + The generated proxy type. + + Implementers should return a proxy type for the specified interface(s) that delegate all executions to the specified interceptors + and uses an instance of the interface as their targets (i.e. ), rather than a class. All classes should then implement interface, + to allow interceptors to switch invocation target with instance of another type implementing called interface. + + Thrown when or any of is a generic type definition. + Thrown when or any of is not public. + Note that to avoid this exception, you can mark offending type internal, and define + pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate. + + + + + Gets or sets the that this logs to. + + + + + Gets the associated with this builder. + + The module scope associated with this builder. + + + + Initializes a new instance of the class with new . + + + + + Initializes a new instance of the class. + + The module scope for generated proxy types. + + + + Registers custom disassembler to handle disassembly of specified type of attributes. + + Type of attributes to handle + Disassembler converting existing instances of Attributes to CustomAttributeBuilders + + When disassembling an attribute Dynamic Proxy will first check if an custom disassembler has been registered to handle attributes of that type, + and if none is found, it'll use the . + + + + + Attributes should be replicated if they are non-inheritable, + but there are some special cases where the attributes means + something to the CLR, where they should be skipped. + + + + + Initializes a new instance of the class. + + Target element. This is either target type or target method for invocation types. + The type of the proxy. This is base type for invocation types. + The interfaces. + The options. + + + + Initializes a new instance of the class. + + Type of the target. + The interfaces. + The options. + + + + + + + + s + Provides appropriate Ldc.X opcode for the type of primitive value to be loaded. + + + + + Provides appropriate Ldind.X opcode for + the type of primitive value to be loaded indirectly. + + + + + Emits a load opcode of the appropriate kind for a constant string or + primitive value. + + + + + + + Emits a load opcode of the appropriate kind for the constant default value of a + type, such as 0 for value types and null for reference types. + + + + + Emits a load indirect opcode of the appropriate type for a value or object reference. + Pops a pointer off the evaluation stack, dereferences it and loads + a value of the specified type. + + + + + + + Emits a store indirectopcode of the appropriate type for a value or object reference. + Pops a value of the specified type and a pointer off the evaluation stack, and + stores the value. + + + + + + + Summary description for PropertiesCollection. + + + + + Wraps a reference that is passed + ByRef and provides indirect load/store support. + + + + + Summary description for NewArrayExpression. + + + + + + + + + + Provides appropriate Stind.X opcode + for the type of primitive value to be stored indirectly. + + + + + Returns list of all unique interfaces implemented given types, including their base interfaces. + + + + + + + Initializes a new instance of the class. + + The name. + Type declaring the original event being overriten, or null. + + The add method. + The remove method. + The attributes. + + + + Represents the scope of uniquenes of names for types and their members + + + + + Gets a unique name based on + + Name suggested by the caller + Unique name based on . + + Implementers should provide name as closely resembling as possible. + Generally if no collision occurs it is suggested to return suggested name, otherwise append sequential suffix. + Implementers must return deterministic names, that is when is called twice + with the same suggested name, the same returned name should be provided each time. Non-deterministic return + values, like appending random suffices will break serialization of proxies. + + + + + Returns new, disposable naming scope. It is responsibilty of the caller to make sure that no naming collision + with enclosing scope, or other subscopes is possible. + + New naming scope. + + + + + + + + + Returns the methods implemented by a type. Use this instead of Type.GetMethods() to work around a CLR issue + where duplicate MethodInfos are returned by Type.GetMethods() after a token of a generic type's method was loaded. + + + + + Determines whether this assembly has internals visible to dynamic proxy. + + The assembly to inspect. + + + + Determines whether the specified method is internal. + + The method. + + true if the specified method is internal; otherwise, false. + + + + + Because we need to cache the types based on the mixed in mixins, we do the following here: + - Get all the mixin interfaces + - Sort them by full name + - Return them by position + + The idea is to have reproducable behavior for the case that mixins are registered in different orders. + This method is here because it is required + + + + + Summary description for ModuleScope. + + + + + The default file name used when the assembly is saved using . + + + + + The default assembly (simple) name used for the assemblies generated by a instance. + + + + + Initializes a new instance of the class; assemblies created by this instance will not be saved. + + + + + Initializes a new instance of the class, allowing to specify whether the assemblies generated by this instance + should be saved. + + If set to true saves the generated module. + + + + Initializes a new instance of the class, allowing to specify whether the assemblies generated by this instance + should be saved and what simple names are to be assigned to them. + + If set to true saves the generated module. + The simple name of the strong-named assembly generated by this . + The path and file name of the manifest module of the strong-named assembly generated by this . + The simple name of the weak-named assembly generated by this . + The path and file name of the manifest module of the weak-named assembly generated by this . + + + + Initializes a new instance of the class, allowing to specify whether the assemblies generated by this instance + should be saved and what simple names are to be assigned to them. + + If set to true saves the generated module. + Naming scope used to provide unique names to generated types and their members (usually via sub-scopes). + The simple name of the strong-named assembly generated by this . + The path and file name of the manifest module of the strong-named assembly generated by this . + The simple name of the weak-named assembly generated by this . + The path and file name of the manifest module of the weak-named assembly generated by this . + + + + Returns a type from this scope's type cache, or null if the key cannot be found. + + The key to be looked up in the cache. + The type from this scope's type cache matching the key, or null if the key cannot be found + + + + Registers a type in this scope's type cache. + + The key to be associated with the type. + The type to be stored in the cache. + + + + Gets the key pair used to sign the strong-named assembly generated by this . + + + + + + Gets the specified module generated by this scope, creating a new one if none has yet been generated. + + If set to true, a strong-named module is returned; otherwise, a weak-named module is returned. + A strong-named or weak-named module generated by this scope, as specified by the parameter. + + + + Gets the strong-named module generated by this scope, creating a new one if none has yet been generated. + + A strong-named module generated by this scope. + + + + Gets the weak-named module generated by this scope, creating a new one if none has yet been generated. + + A weak-named module generated by this scope. + + + + Saves the generated assembly with the name and directory information given when this instance was created (or with + the and current directory if none was given). + + + + This method stores the generated assembly in the directory passed as part of the module information specified when this instance was + constructed (if any, else the current directory is used). If both a strong-named and a weak-named assembly + have been generated, it will throw an exception; in this case, use the overload. + + + If this was created without indicating that the assembly should be saved, this method does nothing. + + Both a strong-named and a weak-named assembly have been generated. + The path of the generated assembly file, or null if no file has been generated. + + + + Saves the specified generated assembly with the name and directory information given when this instance was created + (or with the and current directory if none was given). + + True if the generated assembly with a strong name should be saved (see ); + false if the generated assembly without a strong name should be saved (see . + + + This method stores the specified generated assembly in the directory passed as part of the module information specified when this instance was + constructed (if any, else the current directory is used). + + + If this was created without indicating that the assembly should be saved, this method does nothing. + + + No assembly has been generated that matches the parameter. + + The path of the generated assembly file, or null if no file has been generated. + + + + Loads the generated types from the given assembly into this 's cache. + + The assembly to load types from. This assembly must have been saved via or + , or it must have the manually applied. + + This method can be used to load previously generated and persisted proxy types from disk into this scope's type cache, eg. in order + to avoid the performance hit associated with proxy generation. + + + + + Users of this should use this lock when accessing the cache. + + + + + Gets the strong-named module generated by this scope, or if none has yet been generated. + + The strong-named module generated by this scope, or if none has yet been generated. + + + + Gets the file name of the strongly named module generated by this scope. + + The file name of the strongly named module generated by this scope. + + + + Gets the directory where the strongly named module generated by this scope will be saved, or if the current directory + is used. + + The directory where the strongly named module generated by this scope will be saved when is called + (if this scope was created to save modules). + + + + Gets the weak-named module generated by this scope, or if none has yet been generated. + + The weak-named module generated by this scope, or if none has yet been generated. + + + + Gets the file name of the weakly named module generated by this scope. + + The file name of the weakly named module generated by this scope. + + + + Gets the directory where the weakly named module generated by this scope will be saved, or if the current directory + is used. + + The directory where the weakly named module generated by this scope will be saved when is called + (if this scope was created to save modules). + + + + ProxyBuilder that persists the generated type. + + + The saved assembly contains just the last generated type. + + + + + Initializes a new instance of the class. + + + + + Saves the generated assembly to a physical file. Note that this renders the unusable. + + The path of the generated assembly file, or null if no assembly has been generated. + This method does not support saving multiple files. If both a signed and an unsigned module have been generated, use the + respective methods of the . + + + + Initializes a new instance of the class. + + The hook. + + + + Initializes a new instance of the class. + + + + + Provides proxy objects for classes and interfaces. + + + + + Initializes a new instance of the class. + + Proxy types builder. + + + + Initializes a new instance of the class. + + + + + Creates proxy object intercepting calls to members of interface on object with given . + + Type of the interface implemented by which will be proxied. + The target object, calls to which will be intercepted. + The interceptors called during the invocation of proxied methods. + Object proxying calls to members of on object. + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given array is a null reference (Nothing in Visual Basic). + Thrown when given is not an interface type. + Thrown when no default constructor exists on actual type of object. + Thrown when default constructor of actual type of throws an exception. + + This method generates new proxy type for each type of , which affects performance. If you don't want to proxy types differently depending on the type of the target + use method. + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to members of interface on object with given . + + Type of the interface implemented by which will be proxied. + The target object, calls to which will be intercepted. + The proxy generation options used to influence generated proxy type and object. + The interceptors called during the invocation of proxied methods. + + Object proxying calls to members of on object. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given array is a null reference (Nothing in Visual Basic). + Thrown when given is not an interface type. + Thrown when no default constructor exists on actual type of object. + Thrown when default constructor of actual type of throws an exception. + + This method generates new proxy type for each type of , which affects performance. If you don't want to proxy types differently depending on the type of the target + use method. + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to members of interface on object with given . + + Type of the interface implemented by which will be proxied. + The target object, calls to which will be intercepted. + The interceptors called during the invocation of proxied methods. + + Object proxying calls to members of type on object. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given array is a null reference (Nothing in Visual Basic). + Thrown when given is a generic type definition. + Thrown when given is not an interface type. + Thrown when given does not implement interface. + Thrown when no default constructor exists on actual type of object. + Thrown when default constructor of actual type of throws an exception. + + This method generates new proxy type for each type of , which affects performance. If you don't want to proxy types differently depending on the type of the target + use method. + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to members of interface on object with given . + + Type of the interface implemented by which will be proxied. + The target object, calls to which will be intercepted. + The proxy generation options used to influence generated proxy type and object. + The interceptors called during the invocation of proxied methods. + + Object proxying calls to members of type on object. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given array is a null reference (Nothing in Visual Basic). + Thrown when given is a generic type definition. + Thrown when given is not an interface type. + Thrown when given does not implement interface. + Thrown when no default constructor exists on actual type of object. + Thrown when default constructor of actual type of throws an exception. + + This method generates new proxy type for each type of , which affects performance. If you don't want to proxy types differently depending on the type of the target + use method. + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to members of interface on object with given . + + Type of the interface implemented by which will be proxied. + The target object, calls to which will be intercepted. + Additional interface types. Calls to their members will be proxied as well. + The interceptors called during the invocation of proxied methods. + + Object proxying calls to members of and types on object. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given array is a null reference (Nothing in Visual Basic). + Thrown when given or any of is a generic type definition. + Thrown when given is not an interface type. + Thrown when given does not implement interface. + Thrown when no default constructor exists on actual type of object. + Thrown when default constructor of actual type of throws an exception. + + This method generates new proxy type for each type of , which affects performance. If you don't want to proxy types differently depending on the type of the target + use method. + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to members of interface on object with given . + + Type of the interface implemented by which will be proxied. + The target object, calls to which will be intercepted. + The proxy generation options used to influence generated proxy type and object. + Additional interface types. Calls to their members will be proxied as well. + The interceptors called during the invocation of proxied methods. + + Object proxying calls to members of and types on object. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given array is a null reference (Nothing in Visual Basic). + Thrown when given or any of is a generic type definition. + Thrown when given is not an interface type. + Thrown when given does not implement interface. + Thrown when no default constructor exists on actual type of object. + Thrown when default constructor of actual type of throws an exception. + + This method generates new proxy type for each type of , which affects performance. If you don't want to proxy types differently depending on the type of the target + use method. + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to members of interface on object with given . + Interceptors can use interface to provide other target for method invocation than default . + + Type of the interface implemented by which will be proxied. + The target object, calls to which will be intercepted. + The interceptors called during the invocation of proxied methods. + + Object proxying calls to members of type on object or alternative implementation swapped at runtime by an interceptor. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given array is a null reference (Nothing in Visual Basic). + Thrown when given is a generic type definition. + Thrown when given is not an interface type. + Thrown when given does not implement interface. + Thrown when no default constructor exists on actual type of object. + Thrown when default constructor of actual type of throws an exception. + + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to members of interface on object with given . + Interceptors can use interface to provide other target for method invocation than default . + + Type of the interface implemented by which will be proxied. + The target object, calls to which will be intercepted. + The interceptors called during the invocation of proxied methods. + + Object proxying calls to members of type on object or alternative implementation swapped at runtime by an interceptor. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given array is a null reference (Nothing in Visual Basic). + Thrown when given is not an interface type. + Thrown when no default constructor exists on actual type of object. + Thrown when default constructor of actual type of throws an exception. + + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to members of interface on object with given . + Interceptors can use interface to provide other target for method invocation than default . + + Type of the interface implemented by which will be proxied. + The target object, calls to which will be intercepted. + The proxy generation options used to influence generated proxy type and object. + The interceptors called during the invocation of proxied methods. + + Object proxying calls to members of type on object or alternative implementation swapped at runtime by an interceptor. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given array is a null reference (Nothing in Visual Basic). + Thrown when given is not an interface type. + Thrown when no default constructor exists on actual type of object. + Thrown when default constructor of actual type of throws an exception. + + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to members of interface on object with given . + Interceptors can use interface to provide other target for method invocation than default . + + Type of the interface implemented by which will be proxied. + The target object, calls to which will be intercepted. + Additional interface types. Calls to their members will be proxied as well. + The interceptors called during the invocation of proxied methods. + + Object proxying calls to members of and types on object or alternative implementation swapped at runtime by an interceptor. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given array is a null reference (Nothing in Visual Basic). + Thrown when given or any of is a generic type definition. + Thrown when given is not an interface type. + Thrown when given does not implement interface. + Thrown when no default constructor exists on actual type of object. + Thrown when default constructor of actual type of throws an exception. + + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to members of interface on object with given . + Interceptors can use interface to provide other target for method invocation than default . + + Type of the interface implemented by which will be proxied. + The target object, calls to which will be intercepted. + The proxy generation options used to influence generated proxy type and object. + The interceptors called during the invocation of proxied methods. + + Object proxying calls to members of type on object or alternative implementation swapped at runtime by an interceptor. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given array is a null reference (Nothing in Visual Basic). + Thrown when given is a generic type definition. + Thrown when given is not an interface type. + Thrown when given does not implement interface. + Thrown when no default constructor exists on actual type of object. + Thrown when default constructor of actual type of throws an exception. + + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to members of interface on object with given . + Interceptors can use interface to provide other target for method invocation than default . + + Type of the interface implemented by which will be proxied. + The target object, calls to which will be intercepted. + The proxy generation options used to influence generated proxy type and object. + Additional interface types. Calls to their members will be proxied as well. + The interceptors called during the invocation of proxied methods. + + Object proxying calls to members of and types on object or alternative implementation swapped at runtime by an interceptor. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given array is a null reference (Nothing in Visual Basic). + Thrown when given or any of is a generic type definition. + Thrown when given is not an interface type. + Thrown when given does not implement interface. + Thrown when no default constructor exists on actual type of object. + Thrown when default constructor of actual type of throws an exception. + + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to members of interface on target object generated at runtime with given . + + Type of the interface which will be proxied. + The interceptors called during the invocation of proxied methods. + + Object proxying calls to members of types on generated target object. + + Thrown when given array is a null reference (Nothing in Visual Basic). + Thrown when given is not an interface type. + + Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given implementations. + They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call , since there's no actual implementation to proceed with. + As a result of that also at least one implementation must be provided. + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to members of interface on target object generated at runtime with given . + + Type of the interface which will be proxied. + The interceptors called during the invocation of proxied methods. + + Object proxying calls to members of types on generated target object. + + Thrown when given array is a null reference (Nothing in Visual Basic). + Thrown when given is not an interface type. + + Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given implementations. + They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call , since there's no actual implementation to proceed with. + As a result of that also at least one implementation must be provided. + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to members of interface on target object generated at runtime with given . + + Type of the interface which will be proxied. + The proxy generation options used to influence generated proxy type and object. + The interceptors called during the invocation of proxied methods. + + Object proxying calls to members of types on generated target object. + + Thrown when given array is a null reference (Nothing in Visual Basic). + Thrown when given is not an interface type. + + Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given implementations. + They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call , since there's no actual implementation to proceed with. + As a result of that also at least one implementation must be provided. + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to members of interface on target object generated at runtime with given . + + Type of the interface which will be proxied. + The interceptors called during the invocation of proxied methods. + + Object proxying calls to members of type on generated target object. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given array is a null reference (Nothing in Visual Basic). + Thrown when given is a generic type definition. + Thrown when given is not an interface type. + + Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given implementations. + They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call , since there's no actual implementation to proceed with. + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to members of interface on target object generated at runtime with given . + + Type of the interface which will be proxied. + The interceptors called during the invocation of proxied methods. + + Object proxying calls to members of type on generated target object. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given array is a null reference (Nothing in Visual Basic). + Thrown when given is a generic type definition. + Thrown when given is not an interface type. + + Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given implementations. + They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call , since there's no actual implementation to proceed with. + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to members of interface on target object generated at runtime with given . + + Type of the interface which will be proxied. + Additional interface types. Calls to their members will be proxied as well. + The interceptors called during the invocation of proxied methods. + + Object proxying calls to members of and types on generated target object. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given array is a null reference (Nothing in Visual Basic). + Thrown when given or any of is a generic type definition. + Thrown when given is not an interface type. + + Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given implementations. + They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call , since there's no actual implementation to proceed with. + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to members of interface on target object generated at runtime with given . + + Type of the interface which will be proxied. + The proxy generation options used to influence generated proxy type and object. + The interceptors called during the invocation of proxied methods. + + Object proxying calls to members of on generated target object. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given array is a null reference (Nothing in Visual Basic). + Thrown when given is a generic type definition. + Thrown when given is not an interface type. + + They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call , since there's no actual implementation to proceed with. + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to members of interface on target object generated at runtime with given . + + Type of the interface which will be proxied. + The proxy generation options used to influence generated proxy type and object. + Additional interface types. Calls to their members will be proxied as well. + The interceptors called during the invocation of proxied methods. + + Object proxying calls to members of and types on generated target object. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given array is a null reference (Nothing in Visual Basic). + Thrown when given or any of is a generic type definition. + Thrown when given is not an interface type. + + Since this method uses an empty-shell implementation of to proxy generated at runtime, the actual implementation of proxied methods must be provided by given implementations. + They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call , since there's no actual implementation to proceed with. + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . + + Type of class which will be proxied. + The target object, calls to which will be intercepted. + The interceptors called during the invocation of proxied methods. + + New object of type proxying calls to virtual members of type. + + Thrown when given is not a class type. + Thrown when no default constructor exists on type . + Thrown when default constructor of type throws an exception. + + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . + + Type of class which will be proxied. + The target object, calls to which will be intercepted. + The proxy generation options used to influence generated proxy type and object. + The interceptors called during the invocation of proxied methods. + + New object of type proxying calls to virtual members of type. + + Thrown when given is not a class type. + Thrown when no default constructor exists on type . + Thrown when default constructor of type throws an exception. + + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . + + Type of class which will be proxied. + Additional interface types. Calls to their members will be proxied as well. + The target object, calls to which will be intercepted. + The interceptors called during the invocation of proxied methods. + + New object of type proxying calls to virtual members of and types. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given or any of is a generic type definition. + Thrown when given is not a class type. + Thrown when no default constructor exists on type . + Thrown when default constructor of type throws an exception. + + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . + + Type of class which will be proxied. + The target object, calls to which will be intercepted. + The proxy generation options used to influence generated proxy type and object. + Arguments of constructor of type which should be used to create a new instance of that type. + The interceptors called during the invocation of proxied methods. + + New object of type proxying calls to virtual members of type. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given is a generic type definition. + Thrown when given is not a class type. + Thrown when no constructor exists on type with parameters matching . + Thrown when constructor of type throws an exception. + + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . + + Type of class which will be proxied. + The target object, calls to which will be intercepted. + Arguments of constructor of type which should be used to create a new instance of that type. + The interceptors called during the invocation of proxied methods. + + New object of type proxying calls to virtual members of type. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given is a generic type definition. + Thrown when given is not a class type. + Thrown when no constructor exists on type with parameters matching . + Thrown when constructor of type throws an exception. + + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . + + Type of class which will be proxied. + The target object, calls to which will be intercepted. + The interceptors called during the invocation of proxied methods. + + New object of type proxying calls to virtual members of type. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given is a generic type definition. + Thrown when given is not a class type. + Thrown when no parameterless constructor exists on type . + Thrown when constructor of type throws an exception. + + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . + + Type of class which will be proxied. + The target object, calls to which will be intercepted. + The proxy generation options used to influence generated proxy type and object. + The interceptors called during the invocation of proxied methods. + + New object of type proxying calls to virtual members of type. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given is a generic type definition. + Thrown when given is not a class type. + Thrown when no default constructor exists on type . + Thrown when default constructor of type throws an exception. + + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . + + Type of class which will be proxied. + Additional interface types. Calls to their members will be proxied as well. + The target object, calls to which will be intercepted. + The proxy generation options used to influence generated proxy type and object. + The interceptors called during the invocation of proxied methods. + + New object of type proxying calls to virtual members of and types. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given or any of is a generic type definition. + Thrown when given is not a class type. + Thrown when no default constructor exists on type . + Thrown when default constructor of type throws an exception. + + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . + + Type of class which will be proxied. + Additional interface types. Calls to their members will be proxied as well. + The target object, calls to which will be intercepted. + The proxy generation options used to influence generated proxy type and object. + Arguments of constructor of type which should be used to create a new instance of that type. + The interceptors called during the invocation of proxied methods. + + New object of type proxying calls to virtual members of and types. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given or any of is a generic type definition. + Thrown when given is not a class type. + Thrown when no constructor exists on type with parameters matching . + Thrown when constructor of type throws an exception. + + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . + + Type of class which will be proxied. + The interceptors called during the invocation of proxied methods. + + New object of type proxying calls to virtual members of type. + + Thrown when given is not a class type. + Thrown when no default constructor exists on type . + Thrown when default constructor of type throws an exception. + + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . + + Type of class which will be proxied. + The proxy generation options used to influence generated proxy type and object. + The interceptors called during the invocation of proxied methods. + + New object of type proxying calls to virtual members of type. + + Thrown when given is not a class type. + Thrown when no default constructor exists on type . + Thrown when default constructor of type throws an exception. + + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . + + Type of class which will be proxied. + Additional interface types. Calls to their members will be proxied as well. + The interceptors called during the invocation of proxied methods. + + New object of type proxying calls to virtual members of and types. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given or any of is a generic type definition. + Thrown when given is not a class type. + Thrown when no default constructor exists on type . + Thrown when default constructor of type throws an exception. + + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . + + Type of class which will be proxied. + The proxy generation options used to influence generated proxy type and object. + Arguments of constructor of type which should be used to create a new instance of that type. + The interceptors called during the invocation of proxied methods. + + New object of type proxying calls to virtual members of type. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given is a generic type definition. + Thrown when given is not a class type. + Thrown when no constructor exists on type with parameters matching . + Thrown when constructor of type throws an exception. + + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . + + Type of class which will be proxied. + Arguments of constructor of type which should be used to create a new instance of that type. + The interceptors called during the invocation of proxied methods. + + New object of type proxying calls to virtual members of type. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given is a generic type definition. + Thrown when given is not a class type. + Thrown when no constructor exists on type with parameters matching . + Thrown when constructor of type throws an exception. + + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . + + Type of class which will be proxied. + The interceptors called during the invocation of proxied methods. + + New object of type proxying calls to virtual members of type. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given is a generic type definition. + Thrown when given is not a class type. + Thrown when no parameterless constructor exists on type . + Thrown when constructor of type throws an exception. + + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . + + Type of class which will be proxied. + The proxy generation options used to influence generated proxy type and object. + The interceptors called during the invocation of proxied methods. + + New object of type proxying calls to virtual members of type. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given is a generic type definition. + Thrown when given is not a class type. + Thrown when no default constructor exists on type . + Thrown when default constructor of type throws an exception. + + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . + + Type of class which will be proxied. + Additional interface types. Calls to their members will be proxied as well. + The proxy generation options used to influence generated proxy type and object. + The interceptors called during the invocation of proxied methods. + + New object of type proxying calls to virtual members of and types. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given or any of is a generic type definition. + Thrown when given is not a class type. + Thrown when no default constructor exists on type . + Thrown when default constructor of type throws an exception. + + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . + + Type of class which will be proxied. + Additional interface types. Calls to their members will be proxied as well. + The proxy generation options used to influence generated proxy type and object. + Arguments of constructor of type which should be used to create a new instance of that type. + The interceptors called during the invocation of proxied methods. + + New object of type proxying calls to virtual members of and types. + + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given object is a null reference (Nothing in Visual Basic). + Thrown when given or any of is a generic type definition. + Thrown when given is not a class type. + Thrown when no constructor exists on type with parameters matching . + Thrown when constructor of type throws an exception. + + This method uses implementation to generate a proxy type. + As such caller should expect any type of exception that given implementation may throw. + + + + + Creates the proxy type for class proxy with given class, implementing given and using provided . + + The base class for proxy type. + The interfaces that proxy type should implement. + The options for proxy generation process. + of proxy. + + + + Creates the proxy type for interface proxy with target for given interface, implementing given on given and using provided . + + The interface proxy type should implement. + The additional interfaces proxy type should implement. + Actual type that the proxy type will encompass. + The options for proxy generation process. + of proxy. + + + + Creates the proxy type for interface proxy with target interface for given interface, implementing given on given and using provided . + + The interface proxy type should implement. + The additional interfaces proxy type should implement. + The options for proxy generation process. + of proxy. + + + + Creates the proxy type for interface proxy without target for given interface, implementing given and using provided . + + The interface proxy type should implement. + The additional interfaces proxy type should implement. + The options for proxy generation process. + of proxy. + + + + Gets or sets the that this log to. + + + + + Gets the proxy builder instance used to generate proxy types. + + The proxy builder. + + + + + + + + + + + + + + + For interface proxies, this will point to the + on the target class + + + + + Handles the deserialization of proxies. + + + + + Resets the used for deserialization to a new scope. + + This is useful for test cases. + + + + Resets the used for deserialization to a given . + + The scope to be used for deserialization. + By default, the deserialization process uses a different scope than the rest of the application, which can lead to multiple proxies + being generated for the same type. By explicitly setting the deserialization scope to the application's scope, this can be avoided. + + + + Gets the used for deserialization. + + As has no way of automatically determining the scope used by the application (and the application + might use more than one scope at the same time), uses a dedicated scope instance for deserializing proxy + types. This instance can be reset and set to a specific value via and . + + + + Holds objects representing methods of class. + + + + + Holds objects representing methods of class. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Provides an extension point that allows proxies to choose specific interceptors on + a per method basis. + + + + + Selects the interceptors that should intercept calls to the given . + + The type declaring the method to intercept. + The method that will be intercepted. + All interceptors registered with the proxy. + An array of interceptors to invoke upon calling the . + + This method is called only once per proxy instance, upon the first call to the + . Either an empty array or null are valid return values to indicate + that no interceptor should intercept calls to the method. Although it is not advised, it is + legal to return other implementations than these provided in + . + + + + + Creates a new lock. + + + + + + This interface should be implemented by classes + that are available in a bigger context, exposing + the container to different areas in the same application. + + For example, in Web application, the (global) HttpApplication + subclasses should implement this interface to expose + the configured container + + + + + + Exposes means to change target objects of proxies and invocations + + + + + Changes the target object () of current . + + The new value of target of invocation. + + Although the method takes the actual instance must be of type assignable to , otherwise an will be thrown. + Also while it's technically legal to pass null reference (Nothing in Visual Basic) as , for obvious reasons Dynamic Proxy will not be able to call the intercepted method on such target. + In this case last interceptor in the pipeline mustn't call or a will be throws. + Also while it's technically legal to pass proxy itself as , this would create stack overflow. + In this case last interceptor in the pipeline mustn't call or a will be throws. + + Thrown when is not assignable to the proxied type. + + + + Permanently changes the target object of the proxy. This does not affect target of the current invocation. + + The new value of target of the proxy. + + Although the method takes the actual instance must be of type assignable to proxy's target type, otherwise an will be thrown. + Also while it's technically legal to pass null reference (Nothing in Visual Basic) as , for obvious reasons Dynamic Proxy will not be able to call the intercepted method on such target. + In this case last interceptor in the pipeline mustn't call or a will be throws. + Also while it's technically legal to pass proxy itself as , this would create stack overflow. + In this case last interceptor in the pipeline mustn't call or a will be throws. + + Thrown when is not assignable to the proxied type. + + + + New interface that is going to be used by DynamicProxy 2 + + + + + Get the proxy target (note that null is a valid target!) + + + + + + Gets the interceptors for the proxy + + + + + + Defines that the implementation wants a + in order to + access other components. The creator must be aware + that the component might (or might not) implement + the interface. + + + Used by Castle Project components to, for example, + gather logging factories + + + + + Increments IServiceProvider with a generic service resolution operation. + + + + + Provides a factory that can produce either or + classes. + + + + + Manages the instantiation of s. + + + + + Creates a new logger, getting the logger name from the specified type. + + + + + Creates a new logger. + + + + + Creates a new logger, getting the logger name from the specified type. + + + + + Creates a new logger. + + + + + Creates a new extended logger, getting the logger name from the specified type. + + + + + Creates a new extended logger. + + + + + Creates a new extended logger, getting the logger name from the specified type. + + + + + Creates a new extended logger. + + + + + Creates a new extended logger, getting the logger name from the specified type. + + + + + Creates a new extended logger. + + + + + Creates a new extended logger, getting the logger name from the specified type. + + + + + Creates a new extended logger. + + + + + Creates a new logger, getting the logger name from the specified type. + + + + + Creates a new logger. + + + + + Creates a new logger, getting the logger name from the specified type. + + + + + Creates a new logger. + + + + + Gets the configuration file. + + i.e. log4net.config + + + + + Used to create the TraceLogger implementation of ILogger interface. See . + + + + + Gets the configuration file. + + i.e. log4net.config + + + + + Interface for Context Properties implementations + + + + This interface defines a basic property get set accessor. + + + Based on the ContextPropertiesBase of log4net, by Nicko Cadell. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + NullLogFactory used when logging is turned off. + + + + + Creates an instance of ILogger with the specified name. + + Name. + + + + + Creates an instance of ILogger with the specified name and LoggerLevel. + + Name. + Level. + + + + + Creates outputing + to files. The name of the file is derived from the log name + plus the 'log' extension. + + + + + Provides an interface that supports and + allows the storage and retrieval of Contexts. These are supported in + both log4net and NLog. + + + + + Manages logging. + + + This is a facade for the different logging subsystems. + It offers a simplified interface that follows IOC patterns + and a simplified priority/level/severity abstraction. + + + + + Logs a debug message. + + The message to log + + + + Logs a debug message. + + The exception to log + The message to log + + + + Logs a debug message. + + Format string for the message to log + Format arguments for the message to log + + + + Logs a debug message. + + Format string for the message to log + Format arguments for the message to log + + + + Logs a debug message. + + The exception to log + Format string for the message to log + Format arguments for the message to log + + + + Logs a debug message. + + The format provider to use + Format string for the message to log + Format arguments for the message to log + + + + Logs a debug message. + + The exception to log + The format provider to use + Format string for the message to log + Format arguments for the message to log + + + + Logs an info message. + + The message to log + + + + Logs an info message. + + The exception to log + The message to log + + + + Logs an info message. + + Format string for the message to log + Format arguments for the message to log + + + + Logs an info message. + + Format string for the message to log + Format arguments for the message to log + + + + Logs an info message. + + The exception to log + Format string for the message to log + Format arguments for the message to log + + + + Logs an info message. + + The format provider to use + Format string for the message to log + Format arguments for the message to log + + + + Logs an info message. + + The exception to log + The format provider to use + Format string for the message to log + Format arguments for the message to log + + + + Logs a warn message. + + The message to log + + + + Logs a warn message. + + The exception to log + The message to log + + + + Logs a warn message. + + Format string for the message to log + Format arguments for the message to log + + + + Logs a warn message. + + Format string for the message to log + Format arguments for the message to log + + + + Logs a warn message. + + The exception to log + Format string for the message to log + Format arguments for the message to log + + + + Logs a warn message. + + The format provider to use + Format string for the message to log + Format arguments for the message to log + + + + Logs a warn message. + + The exception to log + The format provider to use + Format string for the message to log + Format arguments for the message to log + + + + Logs an error message. + + The message to log + + + + Logs an error message. + + The exception to log + The message to log + + + + Logs an error message. + + Format string for the message to log + Format arguments for the message to log + + + + Logs an error message. + + Format string for the message to log + Format arguments for the message to log + + + + Logs an error message. + + The exception to log + Format string for the message to log + Format arguments for the message to log + + + + Logs an error message. + + The format provider to use + Format string for the message to log + Format arguments for the message to log + + + + Logs an error message. + + The exception to log + The format provider to use + Format string for the message to log + Format arguments for the message to log + + + + Logs a fatal message. + + The message to log + + + + Logs a fatal message. + + The exception to log + The message to log + + + + Logs a fatal message. + + Format string for the message to log + Format arguments for the message to log + + + + Logs a fatal message. + + Format string for the message to log + Format arguments for the message to log + + + + Logs a fatal message. + + The exception to log + Format string for the message to log + Format arguments for the message to log + + + + Logs a fatal message. + + The format provider to use + Format string for the message to log + Format arguments for the message to log + + + + Logs a fatal message. + + The exception to log + The format provider to use + Format string for the message to log + Format arguments for the message to log + + + + Logs a fatal error message. + + The Message + + + + Logs a fatal error message. + + The Message + The Exception + + + + Logs a fatal error message. + + Message format + Array of objects to write using format + + + + Create a new child logger. + The name of the child logger is [current-loggers-name].[passed-in-name] + + The Subname of this logger. + The New ILogger instance. + If the name has an empty element name. + + + + Determines if messages of priority "debug" will be logged. + + True if "debug" messages will be logged. + + + + Determines if messages of priority "info" will be logged. + + True if "info" messages will be logged. + + + + Determines if messages of priority "warn" will be logged. + + True if "warn" messages will be logged. + + + + Determines if messages of priority "error" will be logged. + + True if "error" messages will be logged. + + + + Determines if messages of priority "fatal" will be logged. + + True if "fatal" messages will be logged. + + + + Determines if messages of priority "fatalError" will be logged. + + True if "fatalError" messages will be logged. + + + + Exposes the Global Context of the extended logger. + + + + + Exposes the Thread Context of the extended logger. + + + + + Exposes the Thread Stack of the extended logger. + + + + + Supporting Logger levels. + + + + + Logging will be off + + + + + Fatal logging level + + + + + Error logging level + + + + + Warn logging level + + + + + Info logging level + + + + + Debug logging level + + + + + The Logger sending everything to the standard output streams. + This is mainly for the cases when you have a utility that + does not have a logger to supply. + + + + + The Level Filtered Logger class. This is a base clase which + provides a LogLevel attribute and reroutes all functions into + one Log method. + + + + + Creates a new LevelFilteredLogger. + + + + + Keep the instance alive in a remoting scenario + + + + + + Logs a debug message. + + The message to log + + + + Logs a debug message. + + The exception to log + The message to log + + + + Logs a debug message. + + Format string for the message to log + Format arguments for the message to log + + + + Logs a debug message. + + The exception to log + Format string for the message to log + Format arguments for the message to log + + + + Logs a debug message. + + The format provider to use + Format string for the message to log + Format arguments for the message to log + + + + Logs a debug message. + + The exception to log + The format provider to use + Format string for the message to log + Format arguments for the message to log + + + + Logs a debug message. + + Message format + Array of objects to write using format + + + + Logs an info message. + + The message to log + + + + Logs an info message. + + The exception to log + The message to log + + + + Logs an info message. + + Format string for the message to log + Format arguments for the message to log + + + + Logs an info message. + + The exception to log + Format string for the message to log + Format arguments for the message to log + + + + Logs an info message. + + The format provider to use + Format string for the message to log + Format arguments for the message to log + + + + Logs an info message. + + The exception to log + The format provider to use + Format string for the message to log + Format arguments for the message to log + + + + Logs an info message. + + Message format + Array of objects to write using format + + + + Logs a warn message. + + The message to log + + + + Logs a warn message. + + The exception to log + The message to log + + + + Logs a warn message. + + Format string for the message to log + Format arguments for the message to log + + + + Logs a warn message. + + The exception to log + Format string for the message to log + Format arguments for the message to log + + + + Logs a warn message. + + The format provider to use + Format string for the message to log + Format arguments for the message to log + + + + Logs a warn message. + + The exception to log + The format provider to use + Format string for the message to log + Format arguments for the message to log + + + + Logs a warn message. + + Message format + Array of objects to write using format + + + + Logs an error message. + + The message to log + + + + Logs an error message. + + The exception to log + The message to log + + + + Logs an error message. + + Format string for the message to log + Format arguments for the message to log + + + + Logs an error message. + + The exception to log + Format string for the message to log + Format arguments for the message to log + + + + Logs an error message. + + The format provider to use + Format string for the message to log + Format arguments for the message to log + + + + Logs an error message. + + The exception to log + The format provider to use + Format string for the message to log + Format arguments for the message to log + + + + Logs an error message. + + Message format + Array of objects to write using format + + + + Logs a fatal message. + + The message to log + + + + Logs a fatal message. + + The exception to log + The message to log + + + + Logs a fatal message. + + Format string for the message to log + Format arguments for the message to log + + + + Logs a fatal message. + + The exception to log + Format string for the message to log + Format arguments for the message to log + + + + Logs a fatal message. + + The format provider to use + Format string for the message to log + Format arguments for the message to log + + + + Logs a fatal message. + + The exception to log + The format provider to use + Format string for the message to log + Format arguments for the message to log + + + + Logs a fatal message. + + Message format + Array of objects to write using format + + + + Logs a fatal error message. + + The Message + + + + Logs a fatal error message. + + The Message + The Exception + + + + Logs a fatal error message. + + Message format + Array of objects to write using format + + + + Implementors output the log content by implementing this method only. + Note that exception can be null + + + + + + + + + The LoggerLevel that this logger + will be using. Defaults to LoggerLevel.Off + + + + + The name that this logger will be using. + Defaults to String.Empty + + + + + Determines if messages of priority "debug" will be logged. + + true if log level flags include the bit + + + + Determines if messages of priority "info" will be logged. + + true if log level flags include the bit + + + + Determines if messages of priority "warn" will be logged. + + true if log level flags include the bit + + + + Determines if messages of priority "error" will be logged. + + true if log level flags include the bit + + + + Determines if messages of priority "fatal" will be logged. + + true if log level flags include the bit + + + + Determines if messages of priority "fatal" will be logged. + + true if log level flags include the bit + + + + Creates a new ConsoleLogger with the Level + set to LoggerLevel.Debug and the Name + set to String.Empty. + + + + + Creates a new ConsoleLogger with the Name + set to String.Empty. + + The logs Level. + + + + Creates a new ConsoleLogger with the Level + set to LoggerLevel.Debug. + + The logs Name. + + + + Creates a new ConsoleLogger. + + The logs Name. + The logs Level. + + + + A Common method to log. + + The level of logging + The name of the logger + The Message + The Exception + + + + Returns a new ConsoleLogger with the name + added after this loggers name, with a dot in between. + + The added hierarchical name. + A new ConsoleLogger. + + + + The Logger using standart Diagnostics namespace. + + + + + Creates a logger based on . + + + + + + Creates a logger based on . + + + + + + + Creates a logger based on . + + + + + + + + The Null Logger class. This is useful for implementations where you need + to provide a logger to a utility class, but do not want any output from it. + It also helps when you have a utility that does not have a logger to supply. + + + + + Creates a new NullLogger. + + + + + No-op. + + Ignored + + + + No-op. + + Ignored + Ignored + + + + No-op. + + Ignored + Ignored + + + + No-op. + + Ignored + Ignored + + + + No-op. + + Ignored + Ignored + Ignored + + + + No-op. + + Ignored + Ignored + Ignored + + + + No-op. + + Ignored + Ignored + Ignored + Ignored + + + + No-op. + + Ignored + + + + No-op. + + Ignored + Ignored + + + + No-op. + + Ignored + Ignored + + + + No-op. + + Ignored + Ignored + + + + No-op. + + Ignored + Ignored + Ignored + + + + No-op. + + Ignored + Ignored + Ignored + + + + No-op. + + Ignored + Ignored + Ignored + Ignored + + + + No-op. + + Ignored + + + + No-op. + + Ignored + Ignored + + + + No-op. + + Ignored + Ignored + + + + No-op. + + Ignored + Ignored + + + + No-op. + + Ignored + Ignored + Ignored + + + + No-op. + + Ignored + Ignored + Ignored + + + + No-op. + + Ignored + Ignored + Ignored + Ignored + + + + No-op. + + Ignored + + + + No-op. + + Ignored + Ignored + + + + No-op. + + Ignored + Ignored + + + + No-op. + + Ignored + Ignored + + + + No-op. + + Ignored + Ignored + Ignored + + + + No-op. + + Ignored + Ignored + Ignored + + + + No-op. + + Ignored + Ignored + Ignored + Ignored + + + + No-op. + + Ignored + + + + No-op. + + Ignored + Ignored + + + + No-op. + + Ignored + Ignored + + + + No-op. + + Ignored + Ignored + + + + No-op. + + Ignored + Ignored + Ignored + + + + No-op. + + Ignored + Ignored + Ignored + + + + No-op. + + Ignored + Ignored + Ignored + Ignored + + + + No-op. + + Ignored + + + + No-op. + + Ignored + Ignored + + + + No-op. + + Ignored + Ignored + + + + Returns this NullLogger. + + Ignored + This ILogger instance. + + + + No-op. + + false + + + + No-op. + + false + + + + No-op. + + false + + + + No-op. + + false + + + + No-op. + + false + + + + No-op. + + false + + + + Returns empty context properties. + + + + + Returns empty context properties. + + + + + Returns empty context stacks. + + + + + The Stream Logger class. This class can stream log information + to any stream, it is suitable for storing a log file to disk, + or to a MemoryStream for testing your components. + + + This logger is not thread safe. + + + + + Creates a new StreamLogger with default encoding + and buffer size. Initial Level is set to Debug. + + + The name of the log. + + + The stream that will be used for logging, + seeking while the logger is alive + + + + + Creates a new StreamLogger with default buffer size. + Initial Level is set to Debug. + + + The name of the log. + + + The stream that will be used for logging, + seeking while the logger is alive + + + The encoding that will be used for this stream. + + + + + + Creates a new StreamLogger. + Initial Level is set to Debug. + + + The name of the log. + + + The stream that will be used for logging, + seeking while the logger is alive + + + The encoding that will be used for this stream. + + + + The buffer size that will be used for this stream. + + + + + + Creates a new StreamLogger with + Debug as default Level. + + The name of the log. + The StreamWriter the log will write to. + + + + The TraceLogger sends all logging to the System.Diagnostics.TraceSource + built into the .net framework. + + + Logging can be configured in the system.diagnostics configuration + section. + + If logger doesn't find a source name with a full match it will + use source names which match the namespace partially. For example you can + configure from all castle components by adding a source name with the + name "Castle". + + If no portion of the namespace matches the source named "Default" will + be used. + + + + + Build a new trace logger based on the named TraceSource + + The name used to locate the best TraceSource. In most cases comes from the using type's fullname. + + + + Build a new trace logger based on the named TraceSource + + The name used to locate the best TraceSource. In most cases comes from the using type's fullname. + The default logging level at which this source should write messages. In almost all cases this + default value will be overridden in the config file. + + + + Create a new child logger. + The name of the child logger is [current-loggers-name].[passed-in-name] + + The Subname of this logger. + The New ILogger instance. + + + + The WebLogger sends everything to the HttpContext.Trace + + + Trace must be enabled on the Asp.Net configuration file (web.config or machine.config) + + + + + Creates a new WebLogger with the priority set to DEBUG. + + + + + Creates a new WebLogger. + + The Log level typecode. + + + + Creates a new WebLogger. + + The Log name. + + + + Creates a new WebLogger. + + The Log name. + The Log level typecode. + + + + A Common method to log. + + The level of logging + The Log name. + The Message + The Exception + + + + Just returns this logger (WebLogger is not hierarchical). + + Ignored + This ILogger instance. + + + + Tries to get the current http context's trace context. + + The current http context's trace context or null if none is + available + + + + This is an abstract implementation + that deals with methods that can be abstracted away + from underlying implementations. + + + AbstractConfiguration makes easier to implementers + to create a new version of + + + + + is a interface encapsulating a configuration node + used to retrieve configuration values. + + + + + Gets the value of the node and converts it + into specified . + + The + + The Default value returned if the convertion fails. + + The Value converted into the specified type. + + + + Gets the name of the node. + + + The Name of the node. + + + + + Gets the value of the node. + + + The Value of the node. + + + + + Gets an of + elements containing all node children. + + The Collection of child nodes. + + + + Gets an of the configuration attributes. + + + + + Gets the value of the node and converts it + into specified . + + The + + The Default value returned if the convertion fails. + + The Value converted into the specified type. + + + + Gets the name of the . + + + The Name of the . + + + + + Gets the value of . + + + The Value of the . + + + + + Gets all child nodes. + + The of child nodes. + + + + Gets node attributes. + + + All attributes of the node. + + + + + A collection of objects. + + + + + Creates a new instance of ConfigurationCollection. + + + + + Creates a new instance of ConfigurationCollection. + + + + + Summary description for MutableConfiguration. + + + + + Initializes a new instance of the class. + + The name. + + + + Gets the value of . + + + The Value of the . + + + + + Pendent + + + + + Deserializes the specified node into an abstract representation of configuration. + + The node. + + + + + If a config value is an empty string we return null, this is to keep + backward compability with old code + + + + + General purpose class to represent a standard pair of values. + + Type of the first value + Type of the second value + + + + Constructs a pair with its values + + + + + + + List of utility methods related to dynamic proxy operations + + + + + Determines whether the specified type is a proxy generated by + DynamicProxy (1 or 2). + + The type. + + true if it is a proxy; otherwise, false. + + + + + Pendent + + + + + Initializes a new instance of the class. + + The target. + + + + Determines whether the object contains an element with the specified key. + + The key to locate in the object. + + true if the contains an element with the key; otherwise, false. + + + is null. + + + + Adds an element with the provided key and value to the object. + + The to use as the key of the element to add. + The to use as the value of the element to add. + + is null. + An element with the same key already exists in the object. + The is read-only.-or- The has a fixed size. + + + + Removes all elements from the object. + + The object is read-only. + + + + Returns an object for the object. + + + An object for the object. + + + + + Removes the element with the specified key from the object. + + The key of the element to remove. + + is null. + The object is read-only.-or- The has a fixed size. + + + + Copies the elements of the to an , starting at a particular index. + + The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing. + The zero-based index in at which copying begins. + + is null. + + is less than zero. + + is multidimensional.-or- is equal to or greater than the length of .-or- The number of elements in the source is greater than the available space from to the end of the destination . + The type of the source cannot be cast automatically to the type of the destination . + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + + + + Gets or sets the with the specified key. + + + + + + Gets an object containing the keys of the object. + + + An object containing the keys of the object. + + + + Gets an object containing the values in the object. + + + An object containing the values in the object. + + + + Gets a value indicating whether the object is read-only. + + + true if the object is read-only; otherwise, false. + + + + Gets a value indicating whether the object has a fixed size. + + + true if the object has a fixed size; otherwise, false. + + + + Gets the number of elements contained in the . + + + The number of elements contained in the . + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + Gets a value indicating whether access to the is synchronized (thread safe). + + + true if access to the is synchronized (thread safe); otherwise, false. + + + + Represents a 'streamable' resource. Can + be a file, a resource in an assembly. + + + + + Returns a reader for the stream + + + It's up to the caller to dispose the reader. + + + + + + Returns a reader for the stream + + + It's up to the caller to dispose the reader. + + + + + + + Returns an instance of + created according to the relativePath + using itself as the root. + + + + + + + + + + Only valid for resources that + can be obtained through relative paths + + + + + + + + + + This returns a new stream instance each time it is called. + It is the responsability of the caller to dispose of this stream + + + + + Depicts the contract for resource factories. + + + + + Used to check whether the resource factory + is able to deal with the given resource + identifier. + + + Implementors should return true + only if the given identificator is supported + by the resource factory + + + + + + + Creates an instance + for the given resource identifier + + + + + + + Creates an instance + for the given resource identifier + + + + + + + + + + + + + + + + + + Adapts a static string content as an + + + + + Enable access to files on network shares + + + + + Email sender abstraction. + + + + + Sends a mail message. + + From field + To field + E-mail's subject + message's body + + + + Sends a message. + + Message instance + + + + Sends multiple messages. + + List of messages + + + + Default implementation. + + + + + Initializes a new instance of the class based on the configuration provided in the application configuration file. + + + This constructor is based on the default configuration in the application configuration file. + + + + + This service implementation + requires a host name in order to work + + The smtp server name + + + + Sends a message. + + If any of the parameters is null + From field + To field + e-mail's subject + message's body + + + + Sends a message. + + If the message is null + Message instance + + + + Configures the sender + with port information and eventual credential + informed + + Message instance + + + + Gets or sets the port used to + access the SMTP server + + + + + Gets the hostname. + + The hostname. + + + + Gets or sets a value which is used to + configure if emails are going to be sent asyncrhonously or not. + + + + + Gets or sets a value that specifies + the amount of time after which a synchronous Send call times out. + + + + + Gets or sets a value indicating whether the email should be sent using + a secure communication channel. + + true if should use SSL; otherwise, false. + + + + Gets or sets the domain. + + The domain. + + + + Gets or sets the name of the user. + + The name of the user. + + + + Gets or sets the password. + + The password. + + + + Gets a value indicating whether credentials were informed. + + + if this instance has credentials; otherwise, . + + + + diff --git a/NzbDrone.Core/Model/EpisodeModel.cs b/NzbDrone.Core/Model/EpisodeModel.cs new file mode 100644 index 000000000..7656d89cb --- /dev/null +++ b/NzbDrone.Core/Model/EpisodeModel.cs @@ -0,0 +1,16 @@ +using NzbDrone.Core.Repository.Quality; +using SubSonic.SqlGeneration.Schema; + +namespace NzbDrone.Core.Model +{ + public class EpisodeModel + { + public string SeriesTitle { get; set; } + public int SeasonNumber { get; set; } + public int EpisodeNumber { get; set; } + public QualityTypes Quality { get; set; } + public string Path { get; set; } + public long Size { get; set; } + public bool Proper { get; set; } + } +} \ No newline at end of file diff --git a/NzbDrone.Core/Model/EpisodeParseResult.cs b/NzbDrone.Core/Model/EpisodeParseResult.cs new file mode 100644 index 000000000..d280f539b --- /dev/null +++ b/NzbDrone.Core/Model/EpisodeParseResult.cs @@ -0,0 +1,12 @@ +using NzbDrone.Core.Repository.Quality; +using SubSonic.SqlGeneration.Schema; + +namespace NzbDrone.Core.Model +{ + internal struct EpisodeParseResult + { + internal string SeriesTitle { get; set; } + internal int SeasonNumber { get; set; } + internal int EpisodeNumber { get; set; } + } +} \ No newline at end of file diff --git a/NzbDrone.Core/Entities/Notification/BasicNotification.cs b/NzbDrone.Core/Model/Notification/BasicNotification.cs similarity index 86% rename from NzbDrone.Core/Entities/Notification/BasicNotification.cs rename to NzbDrone.Core/Model/Notification/BasicNotification.cs index ce256c7e8..3291763c9 100644 --- a/NzbDrone.Core/Entities/Notification/BasicNotification.cs +++ b/NzbDrone.Core/Model/Notification/BasicNotification.cs @@ -1,6 +1,6 @@ using System; -namespace NzbDrone.Core.Entities.Notification +namespace NzbDrone.Core.Model.Notification { public class BasicNotification { @@ -17,7 +17,7 @@ namespace NzbDrone.Core.Entities.Notification public String Title { get; set; } - public NotificationType Type { get; set; } + public BasicNotificationType Type { get; set; } /// /// Gets or sets a value indicating whether or not this message should be automatically dismissed after a period of time. diff --git a/NzbDrone.Core/Model/Notification/BasicNotificationType.cs b/NzbDrone.Core/Model/Notification/BasicNotificationType.cs new file mode 100644 index 000000000..d06d37907 --- /dev/null +++ b/NzbDrone.Core/Model/Notification/BasicNotificationType.cs @@ -0,0 +1,9 @@ +namespace NzbDrone.Core.Model.Notification +{ + public enum BasicNotificationType + { + Info = 0, + Warrning = 1, + Error = 2 + } +} \ No newline at end of file diff --git a/NzbDrone.Core/Entities/Notification/ProgressNotification.cs b/NzbDrone.Core/Model/Notification/ProgressNotification.cs similarity index 82% rename from NzbDrone.Core/Entities/Notification/ProgressNotification.cs rename to NzbDrone.Core/Model/Notification/ProgressNotification.cs index 68185c062..a25ce3946 100644 --- a/NzbDrone.Core/Entities/Notification/ProgressNotification.cs +++ b/NzbDrone.Core/Model/Notification/ProgressNotification.cs @@ -1,7 +1,7 @@ using System; using NLog; -namespace NzbDrone.Core.Entities.Notification +namespace NzbDrone.Core.Model.Notification { public class ProgressNotification : IDisposable { @@ -63,14 +63,14 @@ namespace NzbDrone.Core.Entities.Notification /// Gets or sets the status. /// /// The status. - public NotificationStatus Status { get; set; } + public ProgressNotificationStatus Status { get; set; } public void Dispose() { - if (Status == NotificationStatus.InProgress) + if (Status == ProgressNotificationStatus.InProgress) { - Logger.Error("Progress notification '{0}' was unexpectedly abandoned. ID:{1} Status:{2} CurrentStatus:{3} PercentComplete:{4}", Title, Id, Status, CurrentStatus, PercentComplete); - Status = NotificationStatus.Failed; + Logger.Warn("Progress notification '{0}' was unexpectedly abandoned. ID:{1} Status:{2} CurrentStatus:{3} PercentComplete:{4}", Title, Id, Status, CurrentStatus, PercentComplete); + Status = ProgressNotificationStatus.Failed; } } } diff --git a/NzbDrone.Core/Model/Notification/ProgressNotificationStatus.cs b/NzbDrone.Core/Model/Notification/ProgressNotificationStatus.cs new file mode 100644 index 000000000..b79707b34 --- /dev/null +++ b/NzbDrone.Core/Model/Notification/ProgressNotificationStatus.cs @@ -0,0 +1,9 @@ +namespace NzbDrone.Core.Model.Notification +{ + public enum ProgressNotificationStatus + { + InProgress = 0, + Completed = 1, + Failed = 2 + } +} \ No newline at end of file diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj index e36678b54..bdfb08d1e 100644 --- a/NzbDrone.Core/NzbDrone.Core.csproj +++ b/NzbDrone.Core/NzbDrone.Core.csproj @@ -121,6 +121,7 @@ + False Libraries\Exceptioneer.WindowsFormsClient.dll @@ -149,20 +150,25 @@ - - - - + + + + + + + + + - + @@ -175,15 +181,13 @@ - - - - - - - - - + + + + + + + @@ -215,6 +219,9 @@ + + + diff --git a/NzbDrone.Core/Parser.cs b/NzbDrone.Core/Parser.cs new file mode 100644 index 000000000..65e4022d1 --- /dev/null +++ b/NzbDrone.Core/Parser.cs @@ -0,0 +1,135 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using NLog; +using NzbDrone.Core.Model; +using NzbDrone.Core.Providers; +using NzbDrone.Core.Repository.Quality; + +namespace NzbDrone.Core +{ + internal static class Parser + { + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + + private static readonly Regex[] ReportTitleRegex = new[] + { + new Regex(@"(?.+?)?\W(S)?(?<season>\d+)\w(?<episode>\d+)\W", RegexOptions.IgnoreCase | RegexOptions.Compiled) + }; + + private static readonly Regex NormalizeRegex = new Regex(@"((\s|^)the(\s|$))|((\s|^)and(\s|$))|[^a-z]", RegexOptions.IgnoreCase | RegexOptions.Compiled); + + /// <summary> + /// Parses a post title into list of episodes it contains + /// </summary> + /// <param name="title">Title of the report</param> + /// <returns>List of episodes contained to the post</returns> + internal static List<EpisodeParseResult> ParseEpisodeInfo(string title) + { + Logger.Trace("Parsing string '{0}'", title); + + var result = new List<EpisodeParseResult>(); + + foreach (var regex in ReportTitleRegex) + { + var match = regex.Matches(title); + + if (match.Count != 0) + { + var seriesName = NormalizeTitle(match[0].Groups["title"].Value); + + foreach (Match matchGroup in match) + { + var tuple = new EpisodeParseResult + { + SeriesTitle = seriesName, + SeasonNumber = Convert.ToInt32(matchGroup.Groups["season"].Value), + EpisodeNumber = Convert.ToInt32(matchGroup.Groups["episode"].Value) + }; + + result.Add(tuple); + + Logger.Trace("Episode Parsed. {0}", tuple); + } + } + } + + Logger.Trace("{0} episodes parsed from string.", result.Count); + + return result; + } + + /// <summary> + /// Parses proper status out of a report title + /// </summary> + /// <param name="title">Title of the report</param> + /// <returns></returns> + internal static bool ParseProper(string title) + { + return title.ToLower().Contains("proper"); + } + + internal static QualityTypes ParseQuality(string name) + { + Logger.Trace("Trying to parse quality for {0}", name); + + var result = QualityTypes.Unknown; + name = name.ToLowerInvariant(); + + if (name.Contains("dvd")) + return QualityTypes.DVD; + if (name.Contains("xvid") || name.Contains("divx")) + { + if (name.Contains("bluray") || name.Contains("bdrip")) + { + return QualityTypes.DVD; + } + return QualityTypes.TV; + } + + if (name.Contains("bluray") || name.Contains("bdrip")) + return QualityTypes.Bluray; + if (name.Contains("web-dl")) + return QualityTypes.WEBDL; + if (name.Contains("x264") || name.Contains("h264") || name.Contains("720p")) + return QualityTypes.HDTV; + + //Based on extension + if (result == QualityTypes.Unknown) + { + switch (new FileInfo(name).Extension.ToLower()) + { + case ".avi": + case ".xvid": + case ".wmv": + { + result = QualityTypes.TV; + break; + } + case ".mkv": + { + result = QualityTypes.HDTV; + break; + } + } + } + + Logger.Trace("Quality Parsed:{0} Title:", result, name); + return result; + } + + /// <summary> + /// Normalizes the title. removing all non-word characters as well as common tokens + /// such as 'the' and 'and' + /// </summary> + /// <param name="title">title</param> + /// <returns></returns> + internal static string NormalizeTitle(string title) + { + return NormalizeRegex.Replace(title, String.Empty).ToLower(); + } + } +} diff --git a/NzbDrone.Core/Properties/AssemblyInfo.cs b/NzbDrone.Core/Properties/AssemblyInfo.cs index ea01fbf9d..d6e8b0bfe 100644 --- a/NzbDrone.Core/Properties/AssemblyInfo.cs +++ b/NzbDrone.Core/Properties/AssemblyInfo.cs @@ -13,6 +13,7 @@ // * // */ using System.Reflection; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following @@ -49,4 +50,5 @@ using System.Runtime.InteropServices; // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.2.0.*")] \ No newline at end of file +[assembly: AssemblyVersion("0.2.0.*")] +[assembly: InternalsVisibleTo("NzbDrone.Core.Test")] \ No newline at end of file diff --git a/NzbDrone.Core/Providers/ConfigProvider.cs b/NzbDrone.Core/Providers/ConfigProvider.cs index d6e7531e9..748cc06f2 100644 --- a/NzbDrone.Core/Providers/ConfigProvider.cs +++ b/NzbDrone.Core/Providers/ConfigProvider.cs @@ -1,6 +1,6 @@ using System; using NLog; -using NzbDrone.Core.Entities; +using NzbDrone.Core.Repository; using SubSonic.Repository; namespace NzbDrone.Core.Providers diff --git a/NzbDrone.Core/Providers/DiskProvider.cs b/NzbDrone.Core/Providers/DiskProvider.cs index b4062b1f0..29a2b0d57 100644 --- a/NzbDrone.Core/Providers/DiskProvider.cs +++ b/NzbDrone.Core/Providers/DiskProvider.cs @@ -17,6 +17,11 @@ namespace NzbDrone.Core.Providers return Directory.GetDirectories(path); } + public string[] GetFiles(string path, string pattern, SearchOption searchOption) + { + return Directory.GetFiles(path, pattern, searchOption); + } + public String CreateDirectory(string path) { return Directory.CreateDirectory(path).FullName; diff --git a/NzbDrone.Core/Providers/EpisodeProvider.cs b/NzbDrone.Core/Providers/EpisodeProvider.cs index 5724f2a78..67031e04b 100644 --- a/NzbDrone.Core/Providers/EpisodeProvider.cs +++ b/NzbDrone.Core/Providers/EpisodeProvider.cs @@ -3,8 +3,8 @@ using System.Linq; using System.Collections.Generic; using System.Text.RegularExpressions; using NLog; -using NzbDrone.Core.Entities.Episode; -using NzbDrone.Core.Entities.Quality; +using NzbDrone.Core.Model; +using NzbDrone.Core.Repository; using SubSonic.Repository; namespace NzbDrone.Core.Providers @@ -12,21 +12,6 @@ namespace NzbDrone.Core.Providers public class EpisodeProvider : IEpisodeProvider { //TODO: Remove parsing of the series name, it should be done in series provider - private static readonly Regex ParseRegex = new Regex(@"(?<showName>.*) -(?: - s(?<seasonNumber>\d+)e(?<episodeNumber>\d+)-?e(?<episodeNumber2>\d+) -| s(?<seasonNumber>\d+)e(?<episodeNumber>\d+) -| (?<seasonNumber>\d+)x(?<episodeNumber>\d+) -| (?<airDate>\d{4}.\d{2}.\d{2}) -) -(?: - (?<episodeName>.*?) - (?<release> - (?:hdtv|pdtv|xvid|ws|720p|x264|bdrip|dvdrip|dsr|proper) - .*) -| (?<episodeName>.*) -)", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace); - private readonly IRepository _sonicRepo; private readonly ISeriesProvider _series; @@ -43,35 +28,17 @@ namespace NzbDrone.Core.Providers _seasons = seasonProvider; } - public EpisodeInfo GetEpisode(long id) + public Episode GetEpisode(long id) { - return _sonicRepo.Single<EpisodeInfo>(e => e.EpisodeId == id); + return _sonicRepo.Single<Episode>(e => e.EpisodeId == id); } - public void UpdateEpisode(EpisodeInfo episode) + public IList<Episode> GetEpisodeBySeries(long seriesId) { - var episodeToUpdate = _sonicRepo.Single<EpisodeInfo>(e => e.EpisodeId == episode.EpisodeId); - - episodeToUpdate.AirDate = episode.AirDate; - episodeToUpdate.Overview = episode.Overview; - episodeToUpdate.Title = episode.Title; - episodeToUpdate.EpisodeNumber = episode.EpisodeNumber; - episodeToUpdate.SeasonNumber = episode.SeasonNumber; - - _sonicRepo.Update<EpisodeInfo>(episodeToUpdate); + return _sonicRepo.Find<Episode>(e => e.SeriesId == seriesId); } - public IList<EpisodeInfo> GetEpisodesBySeason(long seasonId) - { - return _sonicRepo.Find<EpisodeInfo>(e => e.SeasonId == seasonId); - } - - public IList<EpisodeInfo> GetEpisodeBySeries(long seriesId) - { - return _sonicRepo.Find<EpisodeInfo>(e => e.SeriesId == seriesId); - } - - public String GetSabTitle(BasicEpisode episode) + public String GetSabTitle(Episode episode) { var series = _series.GetSeries(episode.SeriesId); if (series == null) throw new ArgumentException("Unknown series. ID: " + episode.SeriesId); @@ -85,7 +52,7 @@ namespace NzbDrone.Core.Providers /// </summary> /// <param name="episode">Episode that needs to be checked</param> /// <returns></returns> - public bool IsNeeded(RemoteEpisode episode) + public bool IsNeeded(EpisodeModel episode) { throw new NotImplementedException(); } @@ -97,8 +64,8 @@ namespace NzbDrone.Core.Providers int failCount = 0; var targetSeries = _tvDb.GetSeries(seriesId, true); - var updateList = new List<EpisodeInfo>(); - var newList = new List<EpisodeInfo>(); + var updateList = new List<Episode>(); + var newList = new List<Episode>(); Logger.Debug("Updating season info for series:{0}", seriesId); targetSeries.Episodes.Select(e => new { e.SeasonId, e.SeasonNumber }) @@ -110,7 +77,7 @@ namespace NzbDrone.Core.Providers try { Logger.Debug("Updating info for series:{0} - episode:{1}", seriesId, episode.Id); - var newEpisode = new EpisodeInfo() + var newEpisode = new Episode() { AirDate = episode.FirstAired, EpisodeId = episode.Id, @@ -123,7 +90,7 @@ namespace NzbDrone.Core.Providers Title = episode.EpisodeName }; - if (_sonicRepo.Exists<EpisodeInfo>(e => e.EpisodeId == newEpisode.EpisodeId)) + if (_sonicRepo.Exists<Episode>(e => e.EpisodeId == newEpisode.EpisodeId)) { updateList.Add(newEpisode); } @@ -146,38 +113,5 @@ namespace NzbDrone.Core.Providers Logger.Info("Finished episode refresh for series:{0}. Success:{1} - Fail:{2} ", seriesId, successCount, failCount); } - - - - /// <summary> - /// Parses a post title into list of episode objects - /// </summary> - /// <param name="title">Title of the report</param> - /// <returns>List of episodes relating to the post</returns> - public static List<RemoteEpisode> Parse(string title) - { - var match = ParseRegex.Match(title); - - if (!match.Success) - throw new ArgumentException(String.Format("Title doesn't match any know patterns. [{0}]", title)); - - var result = new List<RemoteEpisode>(); - - result.Add(new RemoteEpisode { EpisodeNumber = Convert.ToInt32(match.Groups["episodeNumber"].Value) }); - - if (match.Groups["episodeNumber2"].Success) - { - result.Add(new RemoteEpisode { EpisodeNumber = Convert.ToInt32(match.Groups["episodeNumber2"].Value) }); - } - - foreach (var ep in result) - { - ep.SeasonNumber = Convert.ToInt32(match.Groups["seasonNumber"].Value); - ep.Proper = title.Contains("PROPER"); - ep.Quality = QualityTypes.Unknown; - } - - return result; - } } } \ No newline at end of file diff --git a/NzbDrone.Core/Providers/Fakes/FakeNotificationProvider.cs b/NzbDrone.Core/Providers/Fakes/FakeNotificationProvider.cs index fe0a4a461..f51e7d6fd 100644 --- a/NzbDrone.Core/Providers/Fakes/FakeNotificationProvider.cs +++ b/NzbDrone.Core/Providers/Fakes/FakeNotificationProvider.cs @@ -1,6 +1,6 @@ using System; using System.Collections.Generic; -using NzbDrone.Core.Entities.Notification; +using NzbDrone.Core.Model.Notification; namespace NzbDrone.Core.Providers.Fakes { @@ -33,8 +33,8 @@ namespace NzbDrone.Core.Providers.Fakes get { - fakeNotification.Status = NotificationStatus.InProgress; - fakeNotification.Status = NotificationStatus.InProgress; + fakeNotification.Status = ProgressNotificationStatus.InProgress; + fakeNotification.Status = ProgressNotificationStatus.InProgress; fakeNotification2.CurrentStatus = DateTime.UtcNow.ToString(); fakeNotification.CurrentStatus = DateTime.Now.ToString(); return new List<ProgressNotification> { fakeNotification }; diff --git a/NzbDrone.Core/Providers/IDiskProvider.cs b/NzbDrone.Core/Providers/IDiskProvider.cs index ec7a0a9e0..6a2643c84 100644 --- a/NzbDrone.Core/Providers/IDiskProvider.cs +++ b/NzbDrone.Core/Providers/IDiskProvider.cs @@ -1,4 +1,5 @@ using System; +using System.IO; namespace NzbDrone.Core.Providers { @@ -7,5 +8,6 @@ namespace NzbDrone.Core.Providers bool Exists(string path); string[] GetDirectories(string path); String CreateDirectory(string path); + string[] GetFiles(string path, string pattern, SearchOption searchOption); } } \ No newline at end of file diff --git a/NzbDrone.Core/Providers/IEpisodeProvider.cs b/NzbDrone.Core/Providers/IEpisodeProvider.cs index 3c4addc88..df444ee75 100644 --- a/NzbDrone.Core/Providers/IEpisodeProvider.cs +++ b/NzbDrone.Core/Providers/IEpisodeProvider.cs @@ -1,23 +1,22 @@ using System; using System.Collections.Generic; -using NzbDrone.Core.Entities.Episode; +using NzbDrone.Core.Model; +using NzbDrone.Core.Repository; namespace NzbDrone.Core.Providers { public interface IEpisodeProvider { - EpisodeInfo GetEpisode(long id); - void UpdateEpisode(EpisodeInfo episode); - IList<EpisodeInfo> GetEpisodesBySeason(long seasonId); - IList<EpisodeInfo> GetEpisodeBySeries(long seriesId); - String GetSabTitle(BasicEpisode episode); + Episode GetEpisode(long id); + IList<Episode> GetEpisodeBySeries(long seriesId); + String GetSabTitle(Episode episode); /// <summary> /// Comprehensive check on whether or not this episode is needed. /// </summary> /// <param name="episode">Episode that needs to be checked</param> /// <returns></returns> - bool IsNeeded(RemoteEpisode episode); + bool IsNeeded(EpisodeModel episode); void RefreshEpisodeInfo(int seriesId); } diff --git a/NzbDrone.Core/Providers/IMediaFileProvider.cs b/NzbDrone.Core/Providers/IMediaFileProvider.cs new file mode 100644 index 000000000..41f1e4b59 --- /dev/null +++ b/NzbDrone.Core/Providers/IMediaFileProvider.cs @@ -0,0 +1,13 @@ +using NzbDrone.Core.Repository; + +namespace NzbDrone.Core.Providers +{ + public interface IMediaFileProvider + { + /// <summary> + /// Scans the specified series folder for media files + /// </summary> + /// <param name="series">The series to be scanned</param> + void Scan(Series series); + } +} \ No newline at end of file diff --git a/NzbDrone.Core/Providers/INotificationProvider.cs b/NzbDrone.Core/Providers/INotificationProvider.cs index e7680f1ff..d4b4c8c12 100644 --- a/NzbDrone.Core/Providers/INotificationProvider.cs +++ b/NzbDrone.Core/Providers/INotificationProvider.cs @@ -1,6 +1,6 @@ using System; using System.Collections.Generic; -using NzbDrone.Core.Entities.Notification; +using NzbDrone.Core.Model.Notification; namespace NzbDrone.Core.Providers { diff --git a/NzbDrone.Core/Providers/ISeasonProvider.cs b/NzbDrone.Core/Providers/ISeasonProvider.cs index 354de4426..3a8f79854 100644 --- a/NzbDrone.Core/Providers/ISeasonProvider.cs +++ b/NzbDrone.Core/Providers/ISeasonProvider.cs @@ -1,5 +1,5 @@ using System.Collections.Generic; -using NzbDrone.Core.Entities; +using NzbDrone.Core.Repository; namespace NzbDrone.Core.Providers { diff --git a/NzbDrone.Core/Providers/ISeriesProvider.cs b/NzbDrone.Core/Providers/ISeriesProvider.cs index 4c464abd6..53310ff75 100644 --- a/NzbDrone.Core/Providers/ISeriesProvider.cs +++ b/NzbDrone.Core/Providers/ISeriesProvider.cs @@ -1,7 +1,8 @@ using System; using System.Collections.Generic; using System.Linq; -using NzbDrone.Core.Entities; +using NzbDrone.Core.Repository; +using NzbDrone.Core.Repository; using TvdbLib.Data; namespace NzbDrone.Core.Providers diff --git a/NzbDrone.Core/Providers/MediaFileProvider.cs b/NzbDrone.Core/Providers/MediaFileProvider.cs new file mode 100644 index 000000000..ffdd2b0ce --- /dev/null +++ b/NzbDrone.Core/Providers/MediaFileProvider.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using NLog; +using NzbDrone.Core.Repository; + +namespace NzbDrone.Core.Providers +{ + public class MediaFileProvider : IMediaFileProvider + { + + + private readonly IDiskProvider _diskProvider; + private readonly IEpisodeProvider _episodeProvider; + + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + private static readonly string[] MediaExtentions = new[] { "*.mkv", "*.avi", "*.wmv" }; + + public MediaFileProvider(IDiskProvider diskProvider, IEpisodeProvider episodeProvider) + { + _diskProvider = diskProvider; + _episodeProvider = episodeProvider; + } + + /// <summary> + /// Scans the specified series folder for media files + /// </summary> + /// <param name="series">The series to be scanned</param> + public void Scan(Series series) + { + var mediaFileList = new List<string>(); + Logger.Info("Scanning '{0}'", series.Path); + foreach (var ext in MediaExtentions) + { + mediaFileList.AddRange(_diskProvider.GetFiles(series.Path, ext, SearchOption.AllDirectories)); + } + + Logger.Info("{0} media files were found", mediaFileList.Count); + + foreach (var file in mediaFileList) + { + var episode = Parser.ParseEpisodeInfo(file); + } + } + } +} diff --git a/NzbDrone.Core/Providers/NotificationProvider.cs b/NzbDrone.Core/Providers/NotificationProvider.cs index a6e714a94..631430db3 100644 --- a/NzbDrone.Core/Providers/NotificationProvider.cs +++ b/NzbDrone.Core/Providers/NotificationProvider.cs @@ -1,7 +1,7 @@ using System; using System.Linq; using System.Collections.Generic; -using NzbDrone.Core.Entities.Notification; +using NzbDrone.Core.Model.Notification; namespace NzbDrone.Core.Providers { @@ -28,7 +28,7 @@ namespace NzbDrone.Core.Providers public List<ProgressNotification> GetProgressNotifications { - get { return new List<ProgressNotification>(_progressNotification.Values.Where(p => p.Status == NotificationStatus.InProgress)); } + get { return new List<ProgressNotification>(_progressNotification.Values.Where(p => p.Status == ProgressNotificationStatus.InProgress)); } } public void Dismiss(Guid notificationId) diff --git a/NzbDrone.Core/Providers/SeasonProvider.cs b/NzbDrone.Core/Providers/SeasonProvider.cs index fc04cf436..bb97862c8 100644 --- a/NzbDrone.Core/Providers/SeasonProvider.cs +++ b/NzbDrone.Core/Providers/SeasonProvider.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using NLog; -using NzbDrone.Core.Entities; +using NzbDrone.Core.Repository; using SubSonic.Repository; namespace NzbDrone.Core.Providers diff --git a/NzbDrone.Core/Providers/SeriesProvider.cs b/NzbDrone.Core/Providers/SeriesProvider.cs index 5b5661fb2..0e1906f3b 100644 --- a/NzbDrone.Core/Providers/SeriesProvider.cs +++ b/NzbDrone.Core/Providers/SeriesProvider.cs @@ -4,8 +4,7 @@ using System.IO; using System.Linq; using System.Text.RegularExpressions; using NLog; -using NzbDrone.Core.Entities; -using NzbDrone.Core.Entities.Notification; +using NzbDrone.Core.Repository; using SubSonic.Repository; using TvdbLib.Data; @@ -16,30 +15,12 @@ namespace NzbDrone.Core.Providers //TODO: Remove parsing of rest of tv show info we just need the show name //Trims all white spaces and separators from the end of the title. - private static readonly Regex CleanTitleRegex = new Regex(@"[\s.][^a-z]*$", RegexOptions.IgnoreCase | RegexOptions.Compiled); - private static readonly Regex ParseRegex = new Regex(@"(?<showName>.*) -(?: - s(?<seasonNumber>\d+)e(?<episodeNumber>\d+)-?e(?<episodeNumber2>\d+) -| s(?<seasonNumber>\d+)e(?<episodeNumber>\d+) -| (?<seasonNumber>\d+)x(?<episodeNumber>\d+) -| (?<airDate>\d{4}.\d{2}.\d{2}) -) -(?: - (?<episodeName>.*?) - (?<release> - (?:hdtv|pdtv|xvid|ws|720p|x264|bdrip|dvdrip|dsr|proper) - .*) -| (?<episodeName>.*) -)", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace); - - private readonly IConfigProvider _config; private readonly IDiskProvider _diskProvider; private readonly IRepository _sonioRepo; private readonly ITvDbProvider _tvDb; private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - private static readonly Regex CleanUpRegex = new Regex(@"((\s|^)the(\s|$))|((\s|^)and(\s|$))|[^a-z]", RegexOptions.IgnoreCase | RegexOptions.Compiled); public SeriesProvider(IDiskProvider diskProvider, IConfigProvider configProvider, IRepository dataRepository, ITvDbProvider tvDbProvider) { @@ -71,21 +52,6 @@ namespace NzbDrone.Core.Providers return _sonioRepo.Exists<Series>(c => c.SeriesId == id && c.Monitored); } - /// <summary> - /// Parses series name out of a post title - /// </summary> - /// <param name="postTitle">Title of the report</param> - /// <returns>Name series this report belongs to</returns> - public static string ParseTitle(string postTitle) - { - var match = ParseRegex.Match(postTitle); - - if (!match.Success) - throw new ArgumentException(String.Format("Title doesn't match any know patterns. [{0}]", postTitle)); - - return CleanTitleRegex.Replace(match.Groups["showName"].Value, String.Empty).Replace(".", " "); - } - public List<String> GetUnmappedFolders() { Logger.Debug("Generating list of unmapped folders"); @@ -130,7 +96,7 @@ namespace NzbDrone.Core.Providers repoSeries.Status = series.Status; repoSeries.Language = series.Language != null ? series.Language.Abbriviation : string.Empty; repoSeries.Path = path; - repoSeries.CleanTitle = CleanUpRegex.Replace(series.SeriesName, "").ToLower(); + repoSeries.CleanTitle = Parser.NormalizeTitle(series.SeriesName); _sonioRepo.Add(repoSeries); } diff --git a/NzbDrone.Core/Providers/SyncProvider.cs b/NzbDrone.Core/Providers/SyncProvider.cs index 8621c16fa..3db2c4ded 100644 --- a/NzbDrone.Core/Providers/SyncProvider.cs +++ b/NzbDrone.Core/Providers/SyncProvider.cs @@ -6,7 +6,7 @@ using System.Linq; using System.Text; using System.Threading; using NLog; -using NzbDrone.Core.Entities.Notification; +using NzbDrone.Core.Model.Notification; namespace NzbDrone.Core.Providers { @@ -58,7 +58,6 @@ namespace NzbDrone.Core.Providers { _notificationProvider.Register(_seriesSyncNotification); _seriesSyncNotification.CurrentStatus = "Analysing Folder"; - Thread.Sleep(20000); var unmappedFolders = _seriesProvider.GetUnmappedFolders(); _seriesSyncNotification.ProgressMax = unmappedFolders.Count; @@ -100,7 +99,7 @@ namespace NzbDrone.Core.Providers _seriesSyncNotification.CurrentStatus = "Series Scan Completed"; Logger.Info("Series folders scan has successfully completed."); Thread.Sleep(3000); - _seriesSyncNotification.Status = NotificationStatus.Completed; + _seriesSyncNotification.Status = ProgressNotificationStatus.Completed; } } catch (Exception e) diff --git a/NzbDrone.Core/Entities/Config.cs b/NzbDrone.Core/Repository/Config.cs similarity index 86% rename from NzbDrone.Core/Entities/Config.cs rename to NzbDrone.Core/Repository/Config.cs index bd65a1a57..898b69cf5 100644 --- a/NzbDrone.Core/Entities/Config.cs +++ b/NzbDrone.Core/Repository/Config.cs @@ -1,6 +1,6 @@ using SubSonic.SqlGeneration.Schema; -namespace NzbDrone.Core.Entities +namespace NzbDrone.Core.Repository { [SubSonicTableNameOverride("Config")] public class Config diff --git a/NzbDrone.Core/Entities/Episode/EpisodeInfo.cs b/NzbDrone.Core/Repository/Episode.cs similarity index 60% rename from NzbDrone.Core/Entities/Episode/EpisodeInfo.cs rename to NzbDrone.Core/Repository/Episode.cs index 34efad5ff..91445091f 100644 --- a/NzbDrone.Core/Entities/Episode/EpisodeInfo.cs +++ b/NzbDrone.Core/Repository/Episode.cs @@ -1,25 +1,29 @@ using System; using SubSonic.SqlGeneration.Schema; -namespace NzbDrone.Core.Entities.Episode +namespace NzbDrone.Core.Repository { - [SubSonicTableNameOverride("EpisodeInfo")] - public class EpisodeInfo : BasicEpisode + public class Episode { [SubSonicPrimaryKey(false)] public virtual int EpisodeId { get; set; } + public virtual int SeriesId { get; set; } + public int SeasonNumber { get; set; } + public int EpisodeNumber { get; set; } public int SeasonId { get; set; } public string Title { get; set; } public DateTime AirDate { get; set; } - [SubSonicLongString] public string Overview { get; set; } public string Language { get; set; } - public int MediaFileId { get; set; } + + [SubSonicNullString] + public string Path { get; set; } + public long? Size { get; set; } [SubSonicToOneRelation(ThisClassContainsJoinKey = true)] public virtual Season Season { get; set; } [SubSonicToOneRelation(ThisClassContainsJoinKey = true)] - public virtual MediaFile File { get; set; } + public virtual Series Series { get; private set; } } } diff --git a/NzbDrone.Core/Entities/MediaFile.cs b/NzbDrone.Core/Repository/EpisodeFile.cs similarity index 50% rename from NzbDrone.Core/Entities/MediaFile.cs rename to NzbDrone.Core/Repository/EpisodeFile.cs index 6670c21aa..4a8891ee4 100644 --- a/NzbDrone.Core/Entities/MediaFile.cs +++ b/NzbDrone.Core/Repository/EpisodeFile.cs @@ -1,15 +1,21 @@ -using NzbDrone.Core.Entities.Quality; +using System; +using NzbDrone.Core.Repository.Quality; using SubSonic.SqlGeneration.Schema; -namespace NzbDrone.Core.Entities +namespace NzbDrone.Core.Repository { - public class MediaFile + class EpisodeFile { [SubSonicPrimaryKey] public virtual int FileId { get; set; } + public int EpisodeId { get; set; } public string Path { get; set; } public QualityTypes Quality { get; set; } - public long Size { get; set; } public bool Proper { get; set; } + public long Size { get; set; } + public DateTime DateAdded { get; set; } + + [SubSonicToOneRelation] + public virtual Episode Episode { get; set; } } } diff --git a/NzbDrone.Core/Entities/Quality/AllowedQuality.cs b/NzbDrone.Core/Repository/Quality/AllowedQuality.cs similarity index 79% rename from NzbDrone.Core/Entities/Quality/AllowedQuality.cs rename to NzbDrone.Core/Repository/Quality/AllowedQuality.cs index ad32a134b..3ff1663f2 100644 --- a/NzbDrone.Core/Entities/Quality/AllowedQuality.cs +++ b/NzbDrone.Core/Repository/Quality/AllowedQuality.cs @@ -1,4 +1,4 @@ -namespace NzbDrone.Core.Entities.Quality +namespace NzbDrone.Core.Repository.Quality { public class AllowedQuality { diff --git a/NzbDrone.Core/Entities/Quality/QualityProfile.cs b/NzbDrone.Core/Repository/Quality/QualityProfile.cs similarity index 95% rename from NzbDrone.Core/Entities/Quality/QualityProfile.cs rename to NzbDrone.Core/Repository/Quality/QualityProfile.cs index 325ae7d81..20e666170 100644 --- a/NzbDrone.Core/Entities/Quality/QualityProfile.cs +++ b/NzbDrone.Core/Repository/Quality/QualityProfile.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.ComponentModel; using SubSonic.SqlGeneration.Schema; -namespace NzbDrone.Core.Entities.Quality +namespace NzbDrone.Core.Repository.Quality { public class QualityProfile { diff --git a/NzbDrone.Core/Entities/Quality/QualityTypes.cs b/NzbDrone.Core/Repository/Quality/QualityTypes.cs similarity index 92% rename from NzbDrone.Core/Entities/Quality/QualityTypes.cs rename to NzbDrone.Core/Repository/Quality/QualityTypes.cs index c27c77d1e..58e2b87fc 100644 --- a/NzbDrone.Core/Entities/Quality/QualityTypes.cs +++ b/NzbDrone.Core/Repository/Quality/QualityTypes.cs @@ -1,4 +1,4 @@ -namespace NzbDrone.Core.Entities.Quality +namespace NzbDrone.Core.Repository.Quality { // ReSharper disable InconsistentNaming /// <summary> @@ -13,7 +13,7 @@ namespace NzbDrone.Core.Entities.Quality /// <summary> /// SD File (Source could be HD) /// </summary> - SDTV = 1, + TV = 1, /// <summary> /// SD File (DVD Source) /// </summary> diff --git a/NzbDrone.Core/Entities/Season.cs b/NzbDrone.Core/Repository/Season.cs similarity index 82% rename from NzbDrone.Core/Entities/Season.cs rename to NzbDrone.Core/Repository/Season.cs index dc343ce3d..42e5ad1fd 100644 --- a/NzbDrone.Core/Entities/Season.cs +++ b/NzbDrone.Core/Repository/Season.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using SubSonic.SqlGeneration.Schema; -namespace NzbDrone.Core.Entities +namespace NzbDrone.Core.Repository { public class Season { @@ -13,7 +13,7 @@ namespace NzbDrone.Core.Entities public string Folder { get; set; } [SubSonicToManyRelation] - public virtual List<Episode.BasicEpisode> Episodes { get; private set; } + public virtual List<Episode> Episodes { get; private set; } [SubSonicToOneRelation(ThisClassContainsJoinKey = true)] public virtual Series Series { get; private set; } diff --git a/NzbDrone.Core/Entities/Series.cs b/NzbDrone.Core/Repository/Series.cs similarity index 84% rename from NzbDrone.Core/Entities/Series.cs rename to NzbDrone.Core/Repository/Series.cs index 304ba27d7..40f70f2ac 100644 --- a/NzbDrone.Core/Entities/Series.cs +++ b/NzbDrone.Core/Repository/Series.cs @@ -1,9 +1,8 @@ using System; using System.Collections.Generic; -using NzbDrone.Core.Entities.Episode; using SubSonic.SqlGeneration.Schema; -namespace NzbDrone.Core.Entities +namespace NzbDrone.Core.Repository { public class Series { @@ -14,6 +13,7 @@ namespace NzbDrone.Core.Entities public string CleanTitle { get; set; } + [SubSonicNullString] public string Status { get; set; } [SubSonicLongString] @@ -33,7 +33,7 @@ namespace NzbDrone.Core.Entities public virtual List<Season> Seasons { get; private set; } [SubSonicToManyRelation] - public virtual List<EpisodeInfo> Episodes { get; private set; } + public virtual List<Episode> Episodes { get; private set; } } diff --git a/NzbDrone.Web/Scripts/Notification.js b/NzbDrone.Web/Scripts/Notification.js index 215a2dc9a..502978d7e 100644 --- a/NzbDrone.Web/Scripts/Notification.js +++ b/NzbDrone.Web/Scripts/Notification.js @@ -33,7 +33,7 @@ $(function () { //set the message text $("#msgText").text(sMsg); //show the message - $('#msgBox').slideUp(speed, null); + $('#msgBox').slideDown(speed, null); } function CloseMsg() { diff --git a/NzbDrone.Web/Views/Series/Details.aspx b/NzbDrone.Web/Views/Series/Details.aspx index 2f0f12f6c..0052d81ce 100644 --- a/NzbDrone.Web/Views/Series/Details.aspx +++ b/NzbDrone.Web/Views/Series/Details.aspx @@ -1,4 +1,4 @@ -<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<NzbDrone.Core.Entities.Series>" %> +<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<NzbDrone.Core.Repository.Series>" %> <%@ Import Namespace="Telerik.Web.Mvc.UI" %> <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> diff --git a/NzbDrone.Web/Views/Series/index.aspx b/NzbDrone.Web/Views/Series/index.aspx index 8e5e604d5..f8ba79d03 100644 --- a/NzbDrone.Web/Views/Series/index.aspx +++ b/NzbDrone.Web/Views/Series/index.aspx @@ -1,4 +1,4 @@ -<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<NzbDrone.Core.Entities.Series>>" %> +<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<NzbDrone.Core.Repository.Series>>" %> <%@ Import Namespace="Telerik.Web.Mvc.UI" %> <%@ Import Namespace="System.Globalization" %> diff --git a/NzbDrone/IISController.cs b/NzbDrone/IISController.cs index 666948adc..13603c94a 100644 --- a/NzbDrone/IISController.cs +++ b/NzbDrone/IISController.cs @@ -1,10 +1,9 @@ using System; -using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; -using System.Text; -using Microsoft.Web.Administration; +using System.Xml.Linq; +using System.Xml.XPath; using NLog; namespace NzbDrone @@ -46,7 +45,16 @@ namespace NzbDrone //Set Variables for the config file. Environment.SetEnvironmentVariable("NZBDRONE_PATH", Config.ProjectRoot); - UpdateIISConfig(); + + try + { + UpdateIISConfig(); + } + catch (Exception e) + { + Logger.Error("An error has occured while trying to update the config file.", e); + } + Logger.Info("Starting process. [{0}]", IISProcess.StartInfo.FileName); IISProcess.Start(); @@ -101,10 +109,22 @@ namespace NzbDrone private static void UpdateIISConfig() { + string configPath = Path.Combine(IISFolder, @"AppServer\applicationhost.config"); + + Logger.Info(@"Server configuration file: {0}", configPath); Logger.Info(@"Configuring server to: [http://localhost:{0}]", Config.Port); - var serverManager = new ServerManager(Path.Combine(IISFolder, @"AppServer\applicationhost.config")); - serverManager.Sites["NZBDrone"].Bindings[0].BindingInformation = string.Format("*:{0}:", Config.Port); - serverManager.CommitChanges(); + + var configXml = XDocument.Load(configPath); + + var bindings = configXml.XPathSelectElement("configuration/system.applicationHost/sites").Elements("site").Where(d => d.Attribute("name").Value.ToLowerInvariant() == "nzbdrone").First().Element("bindings"); + bindings.Descendants().Remove(); + bindings.Add( + new XElement("binding", + new XAttribute("protocol", "http"), + new XAttribute("bindingInformation", String.Format("*:{0}:", Config.Port)) + )); + + configXml.Save(configPath); } private static string CleanPath(string path) diff --git a/NzbDrone/NzbDrone.csproj b/NzbDrone/NzbDrone.csproj index 0b3851033..e3b4625cf 100644 --- a/NzbDrone/NzbDrone.csproj +++ b/NzbDrone/NzbDrone.csproj @@ -50,6 +50,9 @@ <WarningLevel>4</WarningLevel> </PropertyGroup> <ItemGroup> + <Reference Include="Accessibility"> + <EmbedInteropTypes>True</EmbedInteropTypes> + </Reference> <Reference Include="EnvDTE, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <EmbedInteropTypes>True</EmbedInteropTypes> </Reference> @@ -60,9 +63,6 @@ <SpecificVersion>False</SpecificVersion> <HintPath>..\NzbDrone.Core\Libraries\Exceptioneer.WindowsFormsClient.dll</HintPath> </Reference> - <Reference Include="Microsoft.Web.Administration, Version=7.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> - <Private>True</Private> - </Reference> <Reference Include="NLog, Version=2.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL"> <SpecificVersion>False</SpecificVersion> <HintPath>..\NzbDrone.Core\Libraries\NLog.dll</HintPath> diff --git a/NzbDrone/app.config b/NzbDrone/app.config index 990c9b5e3..81d395705 100644 --- a/NzbDrone/app.config +++ b/NzbDrone/app.config @@ -4,6 +4,6 @@ <supportedRuntime version="v4.0" /> </startup> <appSettings> - <add key="port" value="8981" /> + <add key="port" value="8989" /> </appSettings> </configuration> \ No newline at end of file