Zipper-1.5/0000755000175000017500000000000012134544216013002 5ustar sebastiasebastiaZipper-1.5/English.lproj/0000755000175000017500000000000012134544215015517 5ustar sebastiasebastiaZipper-1.5/English.lproj/MainMenu.nib/0000755000175000017500000000000012134544215017777 5ustar sebastiasebastiaZipper-1.5/English.lproj/MainMenu.nib/classes.nib0000644000175000017500000000065611722163014022131 0ustar sebastiasebastia{ IBClasses = ( { ACTIONS = {showPreferences = id; }; CLASS = AppDelegate; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, { ACTIONS = {extract = id; extractFlat = id; tableViewDoubleAction = id; }; CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; } ); IBVersion = 1; }Zipper-1.5/English.lproj/MainMenu.nib/info.nib0000644000175000017500000000106311744365477021445 0ustar sebastiasebastia IBDocumentLocation 69 68 356 240 0 0 1440 938 IBEditorPositions 29 139 527 272 44 0 0 1440 938 IBFramework Version 489.0 IBOpenObjects 29 IBSystem Version 8S165 Zipper-1.5/English.lproj/MainMenu.nib/keyedobjects.nib0000644000175000017500000003126111744365500023153 0ustar sebastiasebastiabplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver ]IB.objectdata 159@CFJNu{   ")*+0789=DHIJKOVZ[\`gklmpt{|}   %)*+,089+:>FG+HLTU+VZabcdhopqrw~pU#./02679B/BCIRW/XZ^g/ghmv/wy///  /)/23;<>|@$     U$null  !"#$%&'()*+,-./0_NSObjectsValues_NSAccessibilityConnectors_NSClassesValuesZNSOidsKeys[NSNamesKeys]NSClassesKeys_NSAccessibilityOidsValues\NSOidsValues_NSVisibleWindowsV$class]NSConnections]NSNamesValues]NSObjectsKeys_NSAccessibilityOidsKeys[NSFramework]NSFontManagerYNSNextOidVNSRoot$%#& ȁ234[NSClassName678YNS.string]NSApplication:;<=X$classesZ$classname=>?_NSMutableStringXNSStringXNSObject:;ABB?^NSCustomObject6D8_IBCocoaFrameworkGHIZNS.objects:;KLLM?\NSMutableSetUNSSetGOt$PQRSTUVWXYZ[\]^_`abcdefghijklmnopqrs #(.27<@FKQV[`ejoty}ĀvwxyzWNSLabelXNSSource |}~VNSMenu]NSMnemonicLoc_NSKeyEquivModMaskWNSTitleYNSOnImageZNSKeyEquiv\NSMixedImage  VNSName[NSMenuItemsЁXMinimizeQm2^NSResourceNameWNSImage_NSMenuCheckmark:;?_NSCustomResource_%NSCustomResource2_NSMenuMixedState:;?ZNSMenuItem68_performMiniaturize::;?_NSNibControlConnector^NSNibConnectorvwy|}~ _Bring All to FrontP68_arrangeInFront:vwy"|}~ !̀ڀЀ[Zipper HelpQ?68YshowHelp:vwyՀ'$|}~%&̀πЀZClear Menu68_clearRecentDocuments:vw0y]NSDestination-)|}~*+,Ѐ[Quit ZipperQq68Zterminate:vw0y1/|}*0\About Zipper6 8_orderFrontStandardAboutPanel:vw0y63|}~*45[Hide OthersQh_hideOtherApplications:vw0y!;8|}~$&*9:[Hide ZipperUhide:vw0-y/?=|}~2*>XShow All_unhideAllApplications:vw:y?ABCDEGЀUCloseQw]performClose:vwLyNJG|}~PQHIWYԀЀ_Check Spelling as You Type_toggleContinuousSpellChecking:vw]y_PL|}~abdMNOhjЀTUndoQz6n8Uundo:vwqysUR|}~avxMSTTCopyQc6~8Ucopy:vwyZW|}~PHXY^Check SpellingQ;68^checkSpelling:vwy_\|}~aM]^UPasteQv68Vpaste:vwyda|}~bc߀Ѐ]Stop Speaking]stopSpeaking:vwyif|}~aMghSCutQx68Tcut:vwyĀnk|}~PHlmiSpelling &Q:68_showGuessPanel:vwyԀsp|}~aMqrTRedoQZ68Uredo:vwyxu|}~aMvwZSelect AllQa68ZselectAll:vwy|z|}~b{^Start Speaking^startSpeaking:vwy~|}~aMVDeleteWdelete:vw y|}~ TZoom\performZoom:vwy|}~!$UNSTag&(ЀeFind &Qf_performFindPanelAction:vw-y/|}~247YFind NextQgvw;y=|}~@BE]Find PreviousQGvwIyK|}~NPS_Use Selection for FindQevwWyY|}~\^_Jump to SelectionQj_centerSelectionInVisibleArea:vweyg|}~ajlM_Paste and Match StyleQV_pasteAsPlainText:vwstyv|}~y{*lPreferences &Q,23[AppDelegate_showPreferences:vwy|}~>BSNewQn\newDocument:vwy|}~>BeOpen &Qo]openDocument:vwy|}~>EBTView_tableViewDoubleAction:vwy|}~>$BZExtract...Xextract:vwyÀ|}~>7B€_Extract flat...QE\extractFlat:vws0ŀƀXdelegate:;ѣ?_NSNibOutletConnector:;ԣ?^NSMutableArrayWNSArrayGAg_Ks//Yzv=!>P Ns<aɀLʀf3рր/%܀kb~R=$퀛z p*)󀥀 uW\8BHaGA׀M |}~"]NSIsSeparator* |}~$%>(-YNSSubmenuXNSActionB%ˀ[Open Recent^submenuAction:6.8G3tՀ$__NSRecentDocumentsMenu:;8||?|}~$%aP<AMHҀXSpellingGDtNkWG|}~$%LQ׀؀STV  Ё THelp6W8G[t|}~$%aafMb݀VSpeechGitza|}~$%apuMTFind6v8Gzt/=KY|}~$%>׀BTFile68Gt<ʀ뀻A|}~>""\NSIsDisabledB  |}~"* |}~"* VZipperGtv!//쀥ɀ83=)|}~$%ɀ*XServicesπЀ68Gt__NSServicesMenu|}~"* \_NSAppleMenu|}~$%a׀MTEdit68Gt_ sgLpfR\~uр܀|}~a""M  |}~a""M  68VWindowGtz |}~"  ^_NSWindowsMenu|}~$%#(׀ |}~$%,1׀* XMainMenuG4tր[_NSMainMenu:;=բ?G?Aaa>aaaaPaa>>a>aP>a>aP0>0>aM*MBM*M׀ *ʀMM׀Hր܀MM*BB*%*b M׀Bဇ**M׀HBM**B рMbH*B׀B M Gvs>PN<0뀱 р)BHWGրAkׁ G !" 68Q76868Q9:;?VNSNullW%NSNullS12168Q2T1111[NSMenuItem268Q16868\File's Owner[NSMenuItem1628G G Gfs\h<NvbisRoYdk/afnl^pKg]mPeWj0cZT=qa_ XQ>zU/`[Prs!VS_gYRQ/܀AGWpoĀ퀰~fy=bj[뀖׀Va %}7*t3ʀF(zрM`<)\րB .eKH u8$2k#ɀL@ GAfBCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ :IzR\8ojSO%}9|'gQH~GtG G :;?^NSIBObjectData#,1:LQVdf (4B^k~  "$-9;=FP^`ir} &qsuwy{})1;FSUZ_acegiz#%')<EJU^tv    - / 1 3 T V X Z \ ^ ` m o q s     . < > @ B D e g i k m o q  & ( 9 ; = ? A b d i k m o q s     , . 0 2 4 6 8 A Z g i k m       3 T a c e g $&(*KMOQSUWfhq)+-/=KXZ\^ "$&GIKMOQSXZcikxz|~  ,9;=?`bdfhjls{  &(*,79S`bdf  3579;=?AZ\ikmo  *,@QSUWYz|~    -/13TVXZ\^`km{!,5BDFHmoqsuwy     ESUWY[]_` 2468:<>@BKT[]_ac   !&(*,UWY[]_acejsu~ 3@BDFGIKMNsuwy{} "$&(*3DFHJLUW`acu!#%')+-/13579;=fhjlmoqst   DFHKMOQSVdfhjlnprtvxz|~ ! # % ' ) + - / 1 3 5 7 9 < > @ B D F H J L O X !! !!! !"!$!)!5!>!@!B!K!M!V!c!e!q!z!|!!!!!!!"n"p"r"t"v"x"z"|"~"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""##### # # ##########!###%#'#)#+#-#/#1#3#5#7#9#;#=#@#I$$$$!$$$'$*$-$0$3$6$9$<$?$B$E$H$K$N$Q$T$W$Z$]$`$c$f$i$l$o$r$u$x${$~$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%%%% %%%%%%% %#%&%)%,%/%2%5%8%;%>%A%D%G%J%M%O%Q%S%U%W%Y%[%]%_%a%c%e%g%i%k%n%p%r%t%v%x%z%|%~%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&& & &&&&&&&&#&$&&&/&0&3&<&=&@&I&N&]Zipper-1.5/English.lproj/Credits.rtf0000644000175000017500000000106311744360123017631 0ustar sebastiasebastia{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf480 {\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural \f0\b\fs24 \cf0 Engineering: \f1\b0 \ Dirk Olmes\ Riccardo Mottola\ \ \f0\b Human Interface Design: \f1\b0 \ Dirk Olmes\ \ \f0\b Testing: \f1\b0 \ Hopefully not nobody\ \ \f0\b Documentation: \f1\b0 \ Does one exist?\ \ \f0\b With special thanks to: \f1\b0 \ Sebastian Reitenbach\ }Zipper-1.5/English.lproj/InfoPlist.strings0000644000175000017500000000036212101053650021032 0ustar sebastiasebastia/* Localized versions of Info.plist keys */ NSHumanReadableCopyright = " The GNUstep Application Project, 2008-2013"; Zipper-1.5/English.lproj/Preferences.nib/0000755000175000017500000000000012134544215020527 5ustar sebastiasebastiaZipper-1.5/English.lproj/Preferences.nib/classes.nib0000644000175000017500000000257212101053650022654 0ustar sebastiasebastia{ IBClasses = ( {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, { ACTIONS = { cancelPressed = id; findDefaultOpenApp = id; findExecutable = id; okPressed = id; }; CLASS = PreferencesController; LANGUAGE = ObjC; OUTLETS = { "_bsdTarButton" = NSButton; "_bunzip2TextField" = NSTextField; "_bzip2TextField" = NSTextField; "_defaultOpenApp" = NSTextField; "_gunzipTextField" = NSTextField; "_gzipTextField" = NSTextField; "_lhaTextField" = NSTextField; "_lzxTextField" = NSTextField; "_panel" = NSPanel; "_rarTextField" = NSTextField; "_sevenZipTextField" = NSTextField; "_tarTextField" = NSTextField; "_unaceTextField" = NSTextField; "_unarjTextField" = NSTextField; "_unzipTextField" = NSTextField; "_xzTextField" = NSTextField; "_zipTextField" = NSTextField; "_zooTextField" = NSTextField; scrollView = NSScrollView; }; SUPERCLASS = NSObject; } ); IBVersion = 1; }Zipper-1.5/English.lproj/Preferences.nib/info.nib0000644000175000017500000000070012101053650022141 0ustar sebastiasebastia IBDocumentLocation 20 5 356 240 0 0 800 578 IBFramework Version 364.0 IBOpenObjects 5 IBSystem Version 7W98 Zipper-1.5/English.lproj/Preferences.nib/keyedobjects.nib0000644000175000017500000003707612101053650023701 0ustar sebastiasebastiabplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver ]IB.objectdata +/067;?biv~   !"%&)-.1259:=>AEFOXYZ]_bcehlmptxyz{~ "#&')*-./234789<=>ABCFGIJMNPQTUWX[\^_bcefijkopstwxz{   "-./26.78;<=>?BCEFHIKLNOQRTUWXZ\^`acdfgijlmoprsuvxy|~jjGHIJKLMNOPQRSTUVWXYZ[\]^_`abcde7fghijklmnopqrstuv+wxyz{|}~}mtU$null  !"#$%&'()*[NSNamesKeys[NSFramework_NSObjectsValues]NSNamesValues]NSConnections]NSFontManagerVNSRootYNSNextOid_NSVisibleWindows]NSObjectsKeys]NSClassesKeysZNSOidsKeys\NSOidsValuesV$class_NSClassesValuescbd_`,-.[NSClassName_PreferencesController1234X$classesZ$classname45^NSCustomObjectXNSObject_IBCocoaFramework89:ZNS.objects12<==>5\NSMutableSetUNSSet8@a ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_` '.6=DKRYhnu:<>@BDFHJLNPRTVXZ\^cde"fgh]NSDestinationWNSLabelXNSSource jklmnoppqrstu_NSNextResponder[NSSuperviewWNSFrameYNSEnabledUNSTagVNSCell  wjxk,yz{z|}ZNSSubviews[NSFrameSize&('_{{229, 401}, {98, 32}}nhtt_NSPeriodicDelay_NSPeriodicInterval_NSAlternateImage_NSAlternateContentsYNSSupportZNSContents]NSControlView^NSButtonFlags2]NSButtonFlags[NSCellFlags_NSKeyEquivalent\NSCellFlags2@gBrowse &VNSSizeVNSNameXNSfFlags"AP\LucidaGrande125VNSFontPYNS.string125_NSMutableStringXNSString12o5\NSButtonCell]%NSButtonCell\NSActionCell125XNSButtonYNSControlVNSView[NSResponder_findExecutable:125_NSNibControlConnector^NSNibConnectorcde"%&jklmopprs_{{336, 410}, {68, 18}}]NSNormalImage"Hjklmnopprs?@_{{229, 317}, {98, 32}}ntABcde"gJEjklmnopprs FG_{{229, 289}, {98, 32}}n#t$HIcde"'g(QLjklmnopp*rs+,MN_{{229, 261}, {98, 32}}n/(t+0OPcde"3g4XSjklmnopp6rs78TU_{{229, 233}, {98, 32}}n;4t7<VWcde?@"ZgjklmoppBrCD[f\_{{75, 409}, {152, 22}}GHIJr?KLMN[NSTextColor_NSDrawsBackground_NSBackgroundColorbeqA]@PQRSTU7VWWNSColor[NSColorName\NSColorSpace]NSCatalogName`_^aVSystem_textBackgroundColor[R\WWNSWhiteB112^PP5PQRS`a7VWdcYtextColor[RdWB012fggo5_NSTextFieldCell12ijjk5[NSTextField\%NSTextField]_tarTextFieldcdeno"imjklmoqqrrCsjklwjkluvvw~|_{{14, 14}, {210, 22}}GHIJrnKLMN__defaultOpenAppcde"|g}tojklmoqqrspq_{{226, 7}, {98, 32}}}trs_findDefaultOpenApp:cde"9v_NSWindowStyleMask_NSWindowBackingYNSMinSize]NSWindowTitle]NSWindowClass\NSWindowRect\NSScreenRectYNSMaxSize\NSWindowViewYNSWTFlags[NSViewClass 6xyw57x8z_{{40, 81}, {485, 467}}[PreferencesWNSPanelTView8avwjklq\NSBorderType_NSTitlePosition[NSTitleCellYNSOffsets]NSTransparent]NSContentViewYNSBoxType}8aq8an}125^NSMutableArrayWNSArray_{{2, 2}, {332, 50}}125_{{17, 56}, {336, 67}}V{0, 0}GIKMʀ_Default open App"A0[RWM0 0.8000000112Ф5UNSBoxwjklzz]NSNextKeyView[NSHScrollerXNSsFlags[NSVScroller2/R+38azwjklppYNSBGColorYNSDocViewYNScvFlags) *8ap8a.?h(4     ƀʀπҀ׀ڀހ "jklmopprC_{{11, 411}, {59, 17}}GIKNUtar: PQRS7VW\controlColor[RWK0.66666669PQRS`!7VW_controlTextColorjklmopp$rC%_{{11, 383}, {59, 17}}GI(KNWunzip: jklmopp+rC,_{{75, 381}, {152, 22}}GHIJrKLMNjklmopp0rC1_{{75, 325}, {152, 22}}GHIJrKLMNjklmopp5rC6_{{75, 297}, {152, 22}}GHIJrKLMNjklmopp:rC;_{{75, 269}, {152, 22}}GHIJrKLMNjklmopp?rC@_{{75, 241}, {152, 22}}GHIJrKLMNjklmoppDrCE_{{11, 327}, {59, 17}}GIHKNUrar: jklmoppKrCL_{{11, 299}, {59, 17}}GIOKNUlha: jklmoppRrCS_{{11, 271}, {59, 17}}GIVKNUlzx: jklmoppYrCZ_{{11, 244}, {59, 17}}GI]KNV7zip: jklmopp`rCa_{{11, 355}, {59, 17}}GIdKNUzip: jklmoppgrCh_{{75, 353}, {152, 22}}GHIJrKLMNjklmnopplrsmn_{{229, 345}, {98, 32}}nqtmrĀjklmoppurCvǀ_{{11, 216}, {59, 17}}GIyKNVgzip: jklmnopp|rs}~_{{229, 205}, {98, 32}}nt}̀jklmopprCЀ_{{75, 213}, {152, 22}}GHIJrKLMNjklmnopprs _{{229, 177}, {98, 32}}ntՀjklmopprC؀_{{75, 185}, {152, 22}}GHIJrKLMNjklmopprCۀ_{{11, 188}, {59, 17}}GIKNXgunzip: jklmopprC߀_{{11, 160}, {59, 17}}GIKNWbzip2: jklmopprC_{{75, 157}, {152, 22}}GHIJrKLMNjklmnopprs_{{229, 149}, {98, 32}}ntjklmnopprs _{{229, 121}, {98, 32}}ntjklmopprC_{{11, 132}, {59, 17}}GIKNYbunzip2: jklmopprCĀ_{{75, 129}, {152, 22}}GHIJrKLMNjklmopprCɀ_{{11, 104}, {59, 17}}GIKNWunarj: jklmnopprsр _{{229, 93}, {98, 32}}ntjklmopprCف_{{75, 101}, {152, 22}}GHIJrKLMNjklmopprCށ_{{75, 73}, {152, 22}}GHIJr KLMNjklmnopprs _{{229, 65}, {98, 32}}n t jklmopprC  _{{11, 76}, {59, 17}}GI KN Wunace: jklmopprC_{{11, 48}, {59, 17}}GI KNUzoo: jklmnopprs_{{229, 37}, {98, 32}}n tjklmopprC_{{75, 45}, {152, 22}}GHIJrKLMNjklmnopprs_{{229, 9}, {98, 32}}n t jklmopprC !_{{75, 17}, {152, 22}}GHIJrKLMNjklmopprC#$_{{11, 20}, {59, 17}}GIKN%Txz: Z{428, 445}125\NSCustomView_{{1, 1}, {428, 314}}12 !!5ZNSClipViewjk#$lm%&'(r)*+,ZNSCurValueXNSTargetYNSPercentXNSAction"?,."?4a-_{{429, 1}, {15, 314}}\_doScroller:120115ZNSScrollerjk#$l&34)t*5"=V!01_{{-100, -100}, {428, 15}}_{{20, 131}, {445, 316}}129::5\NSScrollView_{{1, 1}, {485, 467}}_{{0, 0}, {800, 578}}Z{213, 129}Z{485, 572}12@AA5_NSWindowTemplateXdelegatecdeD";]_lhaTextFieldcdeG"=]_lzxTextFieldcdeJ"?]_rarTextFieldcdeM"A__sevenZipTextFieldcdeP"CV_panelcdeS"E__unzipTextFieldcdeV"G]_zipTextFieldcde"YgIcde"[gKcde"]gMcde_"O^_gzipTextFieldcdeb"Q__gunzipTextFieldcdee"S\_xzTextFieldcdeh"U__bzip2TextFieldcdek"W__bunzip2TextFieldcde n"Y__unaceTextFieldcdeq"[__unarjTextFieldcdet"]]_zooTextFieldcdew"_ZscrollView8z{8n(  } p4 qv?h a12}58{8pqppppppppppppppppqpppppppppppppppp"ppppvppppppppp8{4n"(  } 4 ?h 8{4efghijklmnopqrstuvwxyz{|}~_NSTextField111111133]NSTextField12\File's Owner_NSTextField11111111_NSTextField211111111^NSTextField212_NSButton31111112_NSTextField2111111133_NSTextField1111_NSTextField211111_NSTextField21111\NSButton3111^NSButton311111_NSButton3111111_NSButton311111132_NSButton311111133_NSButton31111113_NSTextField111111131_NSTextField2111111132_NSTextField21111111_NSTextField211111113ZNSButton31_NSTextField111111_NSTextField111111132_NSTextField11111112_NSTextField11111113[NSButton311\NSTextField2]NSButton31111_NSTextField211111112]NSTextField11YNSButton3^NSTextField111_NSTextField2111UPanel^NSTextField211_NSTextField2111111]NSTextField21_NSTextField2111111131YNSButton1_NSTextField11111\NSTextField1YNSButton4YNSButton2ZNSButton32_NSButton311111131_NSTextField1111111_NSButton3111111189{89{8{YRNDSO]vETB}P`\QW_AJ L[KFqM nYGV?H^p4" Z(hI UC X8{Y      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFÁāŁƁǁȁɁʁˁ́́΁ρЁсҁӁԁՁցׁ؁فځہ܁݁ށ߁3/K40Z#,?8@F);1LG^!Y2S$B\=T]">5'O+XV*-.IQ(6HDAMU7[:NW9PJ<EC125^NSIBObjectData#,1:LQVdfX^#1<IPbegjmoqsuwz}'.;AJ 5GS[ekrtvwy{} 3F\fq     $ & ( * 7 @ E L M V ` b k r    % = L ] _ a c | ~      ! * 3 : M a j v x z   " [ ] _ h y { }     $ 3 D F H e g i  "[]_hy{}1357P "$->@B[]_az+-/13:P]ehqv 8:<>SUWYq&(*3IZ]_ #%(*,.14=@B[gpx *,.0235>AJOX_nv $-6<iw  $ .028MOQ^kw7\uwy+-/Hm &?AC[|~8:AZ\^v6oqs|PRT]vxz-/1:SUWp    + L N V o q s !$!&!(!1!N!P!R!T!m!!!!!!!!" " ""."0"2"K"p"""""""""""# #D#F#H#Q#j#m#p######$ $'$*$,$/$G$$$$$$$$$$$% % %%'%H%K%Q%n%q%s%v%%%%%%%%& &2&O&R&U&l&&&&&&&&'')','/'F'g'j'o'z''''''''(( ((("(%(((+(0(3(K(X(a(l(w((((((((())*)5)@)I)N)a)j){)~))))))))))* * **%*(*:*K*N*\*m*p************++++)+:+=+Q+b+e+w++++++++++,Z,],f,k,t,,-[-d-----------------.... ....... .#.&.).,./.2.5.8.;.>.A.D.G.J.M.P.S.V.Y.\._.b.e.h.k.......///*/=/J/Y/k//////00 0!080N0d0p0}00000000111+151H1U1_1i1t111111223>3A3D3G3J3M3P3S3V3Y3\3_3b3e3h3k3n3q3t3w3z3}33333333333333333333333333333333333333333334444 4 4444444"4%4(4+4.4144474:4=4@4C4F4I4K4M4O4Q4S4U4W4Y4[4]4_4a4c4e4g4i4k4m4o4q4s4u4w4y4{4}44444444444444444444444444444444444444444444444444Zipper-1.5/English.lproj/ZipperDocument.nib/0000755000175000017500000000000012134544215021236 5ustar sebastiasebastiaZipper-1.5/English.lproj/ZipperDocument.nib/classes.nib0000644000175000017500000000054011722163014023360 0ustar sebastiasebastia{ IBClasses = ( {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, { CLASS = ZipperDocument; LANGUAGE = ObjC; OUTLETS = {"_tableView" = NSTableView; "_tableViewDataSource" = TableViewDataSource; }; SUPERCLASS = NSDocument; } ); IBVersion = 1; }Zipper-1.5/English.lproj/ZipperDocument.nib/info.nib0000644000175000017500000000070511744324644022675 0ustar sebastiasebastia IBDocumentLocation 384 117 356 240 0 0 1440 938 IBFramework Version 489.0 IBOpenObjects 5 IBSystem Version 8S165 Zipper-1.5/English.lproj/ZipperDocument.nib/keyedobjects.nib0000644000175000017500000001440411744331547024416 0ustar sebastiasebastiabplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver ]IB.objectdata 156<=AEKSw  !$)*,/89?@FPQXY^_bhrsyz  $-67.89:=@O^_`jabcdefiloU$null  !"#$%&'()*+,-./0_NSObjectsValues_NSAccessibilityConnectors_NSClassesValuesZNSOidsKeys[NSNamesKeys]NSClassesKeys_NSAccessibilityOidsValues\NSOidsValues_NSVisibleWindowsV$class]NSConnections]NSNamesValues]NSObjectsKeys_NSAccessibilityOidsKeys[NSFramework]NSFontManagerYNSNextOidVNSRootistjrukg234[NSClassName^ZipperDocument789:X$classesZ$classname:;^NSCustomObjectXNSObject_IBCocoaFramework>?@ZNS.objects78BCCD;\NSMutableSetUNSSet>FJGHI FH?LMN0PQR]NSDestinationWNSLabelXNSSourceDE TUVWXYZ[\]^_`abcdefghijklhnopqrstuv_NSIntercellSpacingWidth\NSHeaderView_NSColumnAutoresizingStyle_NSNextResponder[NSRowHeight_NSDraggingSourceMaskForLocalYNSEnabledYNSTvFlags[NSSuperview_NSIntercellSpacingHeight_NSDraggingSourceMaskForNonLocal\NSCornerView[NSFrameSize[NSGridColor^NSTableColumns_NSBackgroundColorXNSvFlags"@@  "A J "@C @8xW\yz{|}d~RRgZNSSubviews]NSNextKeyViewYNSBGColorYNSDocViewYNScvFlagsWNSFrameR & S TZ{477, 264}`W\dRv[NSTableView xW\yz{|}dffg\ & ]TY{477, 17}78;_NSTableHeaderViewVNSView[NSResponderW\}dvxW`\y_dhqh_NSHeaderClipView[NSHScrollerXNSsFlags[NSVScroller]NSContentView\NSScrollAmtsQO^O Y2U _OA A AA_{{478, 0}, {16, 17}}78;]_NSCornerView>J-2:?Rkk^NSResizingMask\NSHeaderCellZNSMinWidthWNSWidth\NSIdentifier^NSIsResizeable\NSIsEditableZNSDataCellZNSMaxWidth "B  $"Dz,Tnamec[NSTextColorYNSSupportZNSContents[NSCellFlags\NSCellFlags2#TNameVNSSizeVNSNameXNSfFlags"A0 \LucidaGrande78;VNSFontWNSWhite\NSColorSpaceK0.3333329978;WNSColor[NSColorName]NSCatalogName"! VSystem_headerTextColorB078     ;_NSTableHeaderCell_NSTextFieldCell\NSActionCellVNSCellcR]NSControlView&)% +!@"AP(' _controlBackgroundColor"K0.66666669&"* _controlTextColor78+    ;78-..;]NSTableColumnR123kk6ր /"B. 1,Tdatec=0#TDatecR&)% +RHIJKkkNր 4"A "BH3 9,TsizecRUW65#TSizeu[87 [headerColor`B1cR&)% +Rjklmkkpր <"A"C @; >,TpathcRwW6=#TPathcR&)% +78;^NSMutableArrayWNSArrayBA YgridColorD0.578;\%NSTableViewYNSControlXdelegate78;_NSNibOutletConnector^NSNibConnectorLMNRQ0 GEZ_tableViewLMNQ0IfE_NSWindowStyleMask_NSWindowBackingYNSMinSize]NSWindowTitle]NSWindowClass\NSWindowRect\NSScreenRectYNSMaxSize\NSWindowViewYNSWTFlags[NSViewClasscKLJbdO@xeN_{{218, 469}, {494, 297}}VZipperYNS.stringXNSWindowM78;_NSMutableStringXNSStringTViewMxW}.ʀP`a>J?>Jhq UY?>JR ?_{{1, 17}, {477, 264}}78ޤ;ZNSClipViewW\}dvXNSTargetYNSPercentXNSActionVX"?{9W_{{478, 17}, {15, 264}}\_doScroller:78;ZNSScrollerW\}dvZX"?\ɀ[_{{1, 281}, {477, 15}}>Jf ?_{{1, 0}, {477, 17}}Z{494, 297}78;\NSScrollView_{{1, 9}, {494, 297}}78;_{{0, 0}, {1440, 938}}Z{213, 129}_{3.40282e+38, 3.40282e+38}78   ;_NSWindowTemplateVwindow> R I:O-2h78;>0RRRR I O h>%R0I -h>./01234lmnopqh]NSScrollView1VWindow\File's Owner^NSTableColumn1>;h>>h>ARI0HG :HOF2 -Ih>PQRSTUVWXYZ[\vwxyz{|}~h    >gJ?>jh>mh78pqq;^NSIBObjectData#,1:LQVdfu{+GTgn| )2;FKZcvKer(5AM\py~ "$/HTVXZ\^0COXdr-<IT\ix         # ( 9 @ G P U W Y \ i r w ~   # & ( 1 < P b o v    ! 6 8 : < > Q Z c l q      B D F K P R S T V X ] z | ~   ! & + - . / 1 3 8 U W Y [ ] _ d #,3JYjlnpr} -7DNZ\^`bdfhjlqsu "-/13579BEGIajs~68:<>@BGIajmoq!&9@IZ\^`bdfhjluz()+457@Y[]_acegikmoqs|rZipper-1.5/AceArchive.h0000644000175000017500000000153412070542734015152 0ustar sebastiasebastia/* AceArchive.h Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: Sebastian Reitenbach This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import #import "Archive.h" @interface AceArchive : Archive { } - (int)expandFiles:(NSArray *)files withPathInfo:(BOOL)usePathInfo toPath:(NSString *)path; - (NSArray *)listContents; @end Zipper-1.5/AceArchive.m0000644000175000017500000001047712070542735015166 0ustar sebastiasebastia/* AceArchive.m Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: Sebastian Reitenbach This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import #import "AceArchive.h" #import "FileInfo.h" #import "NSString+Custom.h" #import "Preferences.h" #import "NSArray+Custom.h" #import "common.h" static NSData *_magicBytes; @interface AceArchive (PrivateAPI) - (NSData *)dataByRunningAce; @end @implementation AceArchive : Archive /** * register our supported file extensions with our superclass. */ + (void)initialize { // ace has "**ACE**" on the 7. char char aceBytes[] = { 0xea, 0x60 }; _magicBytes = [[NSData dataWithBytes:aceBytes length:2] retain]; [self registerFileExtension:@"ace" forArchiveClass:self]; } + (NSString *)unarchiveExecutable { return [Preferences unaceExecutable]; } /** * ace archives do contain info about compression ratio. */ + (BOOL)hasRatio; { return YES; } + (ArchiveType)archiveType { return ACE; } + (NSData *)magicBytes { return _magicBytes; } //------------------------------------------------------------------------------ // expanding the archive //------------------------------------------------------------------------------ - (int)expandFiles:(NSArray *)files withPathInfo:(BOOL)usePathInfo toPath:(NSString *)path { //FileInfo *fileInfo; NSMutableArray *args; args = [NSMutableArray array]; if (usePathInfo) { [args addObject:@"x"]; } else { [args addObject:@"e"]; } [args addObject:@"-y"]; [args addObject:[self path]]; // this doesn't work with unace, either extract // whole archive, or nothing /* if (files != nil) { NSEnumerator *cursor = [files objectEnumerator]; while ((fileInfo = [cursor nextObject]) != nil) { [args addObject:[fileInfo fullPath]]; } } */ // there is no parameter allowing to specify destination dir return [self runUnarchiverWithArguments:args inDirectory:path]; } - (NSArray *)listContents { NSUInteger lineCount, i; NSString *path = nil; NSMutableArray *results = [NSMutableArray array]; NSData *data = [self dataByRunningAce]; NSString *string = [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease]; NSArray *lines = [string componentsSeparatedByString:@"\n"]; // take out first 8 lines (header) and last 2 lines (footer) lines = [lines subarrayWithRange:NSMakeRange(8, [lines count] - 8)]; lines = [lines subarrayWithRange:NSMakeRange(0, [lines count] - 3)]; lineCount = [lines count]; for (i = 0; i < lineCount; i++) { NSString *line = nil; NSArray *components; NSString *date, *ratio; int length; NSCalendarDate *calendarDate; FileInfo *info; line = [lines objectAtIndex:i]; components = [[line componentsSeparatedByString:@"|"] arrayByRemovingEmptyStrings]; path = [components objectAtIndex:5]; length = [[components objectAtIndex:2] intValue]; ratio = [components objectAtIndex:4]; date = [components objectAtIndex:0]; date = [NSString stringWithFormat:@"%@ %@", date, [components objectAtIndex:1]]; calendarDate = [NSCalendarDate dateWithString:date calendarFormat:@"%d.%m.%y %H:%M"]; info = [FileInfo newWithPath:path date:calendarDate size:[NSNumber numberWithInt:length] ratio:ratio]; [results addObject:info]; } return results; } @end //------------------------------------------------------------------------------ // private API //------------------------------------------------------------------------------ @implementation AceArchive (PrivateAPI) - (NSData *)dataByRunningAce { // Args for unace: // v view verbose contents of archive, verbose is needed to // see the directory structure NSArray *args = [NSArray arrayWithObjects:@"v", [self path], nil]; return [self dataByRunningUnachiverWithArguments:args]; } @end Zipper-1.5/AppDelegate.h0000644000175000017500000000150411720410764015326 0ustar sebastiasebastia/* AppDelegate.h Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: Dirk Olmes Riccardo Mottola This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import @class NSTableView, Archive, TableViewDataSource; @interface AppDelegate : NSObject { } - (void)showPreferences:(id)sender; @end Zipper-1.5/AppDelegate.m0000644000175000017500000000551712070542302015334 0ustar sebastiasebastia/* AppDelegate.m Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: Dirk Olmes Riccardo Mottola This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import #import #import "AppDelegate.h" #import "ZipArchive.h" #import "TarArchive.h" #import "RarArchive.h" #import "LhaArchive.h" #import "LzxArchive.h" #import "GzipArchive.h" #import "SevenZipArchive.h" #import "ZooArchive.h" #import "ArjArchive.h" #import "AceArchive.h" #import "PreferencesController.h" #import "ArchiveService.h" @implementation AppDelegate : NSObject /** * load all Archive subclasses so that they can register their supported file extensions */ + (void)initialize { [LhaArchive class]; [RarArchive class]; [TarArchive class]; [ZipArchive class]; [LzxArchive class]; [GzipArchive class]; [SevenZipArchive class]; [ZooArchive class]; [ArjArchive class]; [AceArchive class]; } //------------------------------------------------------------------------------ // NSApp delegate methods //------------------------------------------------------------------------------ - (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)theApplication { return NO; } - (void)applicationDidFinishLaunching:(NSNotification *)note { [NSApp setServicesProvider:[[ArchiveService alloc] init]]; } /** * do cleanup, especially remove temporary files that were created while we ran */ -(void)applicationWillTerminate:(NSNotification *)aNotification { NSEnumerator *cursor; NSString *element; // clean up all temporary Zipper directories cursor = [[[NSFileManager defaultManager] directoryContentsAtPath:NSTemporaryDirectory()] objectEnumerator]; while ((element = [cursor nextObject]) != nil) { if ([element hasPrefix:@"Zipper"]) { NSString *path; path = [NSString pathWithComponents:[NSArray arrayWithObjects:NSTemporaryDirectory(), element, nil]]; [[NSFileManager defaultManager] removeFileAtPath:path handler:nil]; } } } //------------------------------------------------------------------------------ // action methods //------------------------------------------------------------------------------ - (void)showPreferences:(id)sender { PreferencesController *prefController; prefController = [[PreferencesController alloc] init]; [prefController showPreferencesPanel]; [prefController release]; } @end Zipper-1.5/Archive.h0000644000175000017500000000446612070542302014537 0ustar sebastiasebastia/* Archive.h Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: Dirk Olmes Riccardo Mottola This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import #import #ifdef __MACTYPES__ #define FileInfo FinderFileInfo #endif @class NSString, FileInfo, NSArray; typedef enum { SortByPath = 1, SortBySize = 2, SortByFilename = 4, SortByDate = 8, SortByRatio = 16 } SortByOptions; @interface Archive : NSObject { @private NSArray *_elements; NSString *_path; SortByOptions _sortAttribute; NSComparisonResult _sortOrder; } + (Archive *)newWithPath:(NSString *)path; - (id)initWithPath:(NSString *)path; - (NSString *)path; - (NSArray *)listContents; - (void)sortByPath; - (void)sortBySize; - (void)sortByFilename; - (void)sortByDate; - (void)sortByRatio; - (NSComparisonResult)sortOrder; - (int)elementCount; - (FileInfo *)elementAtIndex:(int)index; - (NSArray *)elements; - (void)setElements:(NSArray *)elements; + (BOOL)executableDoesExist; + (NSString *)archiveExecutable; + (NSString *)unarchiveExecutable; - (int)expandFiles:(NSArray *)files withPathInfo:(BOOL)usePathInfo toPath:(NSString *)path; - (NSData *)dataByRunningUnachiverWithArguments:(NSArray *)args; + (int)runArchiverWithArguments:(NSArray *)args inDirectory:(NSString *)workDir; + (int)runUnarchiverWithArguments:(NSArray *)args inDirectory:(NSString *)workDir; - (int)runUnarchiverWithArguments:(NSArray *)args; - (int)runUnarchiverWithArguments:(NSArray *)args inDirectory:(NSString *)workDir; + (BOOL)hasRatio; + (BOOL)canExtractWithoutFullPath; + (ArchiveType)archiveType; + (NSData *)magicBytes; + (void)registerFileExtension:(NSString *)extension forArchiveClass:(Class)clazz; + (Class)classForFileExtension:(NSString *)fileExtension; + (NSArray *)allFileExtensions; + (NSArray *)allArchivers; @end Zipper-1.5/Archive.m0000644000175000017500000002477512070542302014551 0ustar sebastiasebastia/* Archive.m Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: Dirk Olmes Riccardo Mottola This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import #import "Archive.h" #import "FileInfo.h" #import "NSString+Custom.h" #import "NSObject+Custom.h" #import "Preferences.h" #define X_EXE_NOT_FOUND @"ExecutableNotFoundException" /** * This dictionary holds all the file extensions that Archive and its subclasses * are able to decompress. Archive subclasses register themselves with * the Archive class. */ static NSMutableDictionary *_fileExtMappings = nil; @interface Archive (PrivateAPI) - (void)sortElementsBySortOrder:(int) sortOrder selector:(SEL)selector; @end @implementation Archive : NSObject + (void)initialize { if (_fileExtMappings == nil) { _fileExtMappings = [[NSMutableDictionary alloc] init]; } } /** * All subclasses must register the file extensions they support with the Archive * class. This faciliates dynamic addition of Archive subclasses and helps * the app discover who's responsible for certain file extensions. */ + (void)registerFileExtension:(NSString *)extension forArchiveClass:(Class)clazz { [_fileExtMappings setObject:clazz forKey:extension]; } + (Class)classForFileExtension:(NSString *)fileExtension; { return [_fileExtMappings objectForKey:fileExtension]; } + (NSArray *)allFileExtensions; { return [_fileExtMappings allKeys]; } /** * Returns an NSArray containing all archiver classes that are currently registered. */ + (NSArray *)allArchivers; { return [_fileExtMappings allValues]; } /** * Returns YES if this kind of archives contains information about the compression ratio of * the archive, else NO. */ + (BOOL)hasRatio { return NO; } /** * Returns YES if this kind of archiver can uncopress files 'flat' i.e. without directory * information, else NO. */ + (BOOL)canExtractWithoutFullPath { return YES; } /** * Returns an NSData that can be compared against the first 4 bytes of the file to * determine the file type. This implementation returns nil. */ + (NSData *)magicBytes { return nil; } + (Archive *)newWithPath:(NSString *)path { NSParameterAssert(path != nil); return [[[self alloc] initWithPath:path] autorelease]; } - (id)initWithPath:(NSString *)path { [super init]; _path = [path retain]; _elements = nil; _sortOrder = NSOrderedAscending; _sortAttribute = SortByPath; return self; } - (void)dealloc { [_path release]; [_elements release]; [super dealloc]; } - (NSString *)path { return _path; } //------------------------------------------------------------------------------ // managing our elements //------------------------------------------------------------------------------ - (NSArray *)elements { if (_elements == nil) { [self setElements:[self listContents]]; } return _elements; } - (void)setElements:(NSArray *)elements { [_elements release]; _elements = elements; [_elements retain]; } - (int)elementCount { return [[self elements] count]; } - (FileInfo *)elementAtIndex:(int)index { return [[self elements] objectAtIndex:index]; } //------------------------------------------------------------------------------ // sorting our elements //------------------------------------------------------------------------------ - (void)sortByPath { NSArray * sortedElements = nil; // make sure we start by ordering in descending order when this column is clicked first if (_sortAttribute != SortByPath) { _sortAttribute = SortByPath; _sortOrder = NSOrderedDescending; } if (_sortOrder == NSOrderedAscending) { sortedElements = [[self elements] sortedArrayUsingSelector:@selector(comparePathDescending:)]; _sortOrder = NSOrderedDescending; } else { sortedElements = [[self elements] sortedArrayUsingSelector:@selector(comparePathAscending:)]; _sortOrder = NSOrderedAscending; } [self setElements:sortedElements]; } - (void)sortBySize { NSArray *sortedElements; // make sure we start by ordering in descending order when this column is clicked first if (_sortAttribute != SortBySize) { _sortAttribute = SortBySize; _sortOrder = NSOrderedDescending; } if (_sortOrder == NSOrderedAscending) { sortedElements = [[self elements] sortedArrayUsingSelector:@selector(compareSizeDescending:)]; _sortOrder = NSOrderedDescending; } else { sortedElements = [[self elements] sortedArrayUsingSelector:@selector(compareSizeAscending:)]; _sortOrder = NSOrderedAscending; } [self setElements:sortedElements]; } - (void)sortByFilename { NSArray *sortedElements; // make sure we start by ordering in descending order when this column is clicked first if (_sortAttribute != SortByFilename) { _sortAttribute = SortByFilename; _sortOrder = NSOrderedDescending; } if (_sortOrder == NSOrderedAscending) { sortedElements = [[self elements] sortedArrayUsingSelector:@selector(compareFilenameDescending:)]; _sortOrder = NSOrderedDescending; } else { sortedElements = [[self elements] sortedArrayUsingSelector:@selector(compareFilenameAscending:)]; _sortOrder = NSOrderedAscending; } [self setElements:sortedElements]; } - (void)sortByDate { NSArray *sortedElements; // make sure we start by ordering in descending order when this column is clicked first if (_sortAttribute != SortByDate) { _sortAttribute = SortByDate; _sortOrder = NSOrderedDescending; } if (_sortOrder == NSOrderedAscending) { sortedElements = [[self elements] sortedArrayUsingSelector:@selector(compareDateDescending:)]; _sortOrder = NSOrderedDescending; } else { sortedElements = [[self elements] sortedArrayUsingSelector:@selector(compareDateAscending:)]; _sortOrder = NSOrderedAscending; } [self setElements:sortedElements]; } - (void)sortByRatio { NSArray *sortedElements; // make sure we start by ordering in descending order when this column is clicked first if (_sortAttribute != SortByRatio) { _sortAttribute = SortByRatio; _sortOrder = NSOrderedDescending; } if (_sortOrder == NSOrderedAscending) { sortedElements = [[self elements] sortedArrayUsingSelector:@selector(compareRatioDescending:)]; _sortOrder = NSOrderedDescending; } else { sortedElements = [[self elements] sortedArrayUsingSelector:@selector(compareRatioAscending:)]; _sortOrder = NSOrderedAscending; } [self setElements:sortedElements]; } - (NSComparisonResult)sortOrder { return _sortOrder; } //------------------------------------------------------------------------------ // expanding the archive //------------------------------------------------------------------------------ - (int)expandFiles:(NSArray *)files withPathInfo:(BOOL)usePathInfo toPath:(NSString *)path { [self methodIsAbstract:_cmd]; // shut up the compiler return 0; } - (NSData *)dataByRunningUnachiverWithArguments:(NSArray *)args { NSData *inData; NSFileHandle *readHandle; NSPipe *pipe; NSTask *task; NSMutableData *result; NSParameterAssert(args != nil); NSParameterAssert([[self class] executableDoesExist]); pipe = [NSPipe pipe]; readHandle = [pipe fileHandleForReading]; task = [[NSTask alloc] init]; [task setLaunchPath:[[self class] unarchiveExecutable]]; [task setArguments:args]; [task setStandardOutput:pipe]; [task launch]; result = [NSMutableData dataWithCapacity:1024]; while ((inData = [readHandle availableData]) && [inData length]) { [result appendData:inData]; } [task release]; return result; } // for archivers which have parameters to specify a destination directory - (int)runUnarchiverWithArguments:(NSArray *)args { return [[self class] runUnarchiverWithArguments:args inDirectory:nil]; } // for archivers which do not have parameters to specify a destination directory - (int)runUnarchiverWithArguments:(NSArray *)args inDirectory:(NSString *)workDir { return [[self class] runUnarchiverWithArguments:args inDirectory:workDir]; } + (int)runUnarchiverWithArguments:(NSArray *)args inDirectory:(NSString *)workDir { int result; NSTask *task; NSFileHandle *readHandle; NSPipe *pipe; NSParameterAssert([self executableDoesExist]); pipe = [NSPipe pipe]; readHandle = [pipe fileHandleForReading]; task = [[NSTask alloc] init]; [task setLaunchPath:[self unarchiveExecutable]]; [task setArguments:args]; [task setStandardOutput:pipe]; [task setStandardError:pipe]; if (workDir != nil) { [task setCurrentDirectoryPath:workDir]; } [task launch]; [task waitUntilExit]; result = [task terminationStatus]; [task release]; return result; } + (int)runArchiverWithArguments:(NSArray *)args inDirectory:(NSString *)workDir { int result; NSTask *task; NSParameterAssert([self executableDoesExist]); task = [[NSTask alloc] init]; [task setLaunchPath:[self archiveExecutable]]; [task setArguments:args]; if (workDir != nil) { [task setCurrentDirectoryPath:workDir]; } [task launch]; [task waitUntilExit]; result = [task terminationStatus]; [task release]; return result; } - (NSArray *)listContents { [self methodIsAbstract:_cmd]; // shut up the compiler return nil; } + (BOOL)executableDoesExist { NSString *exePath; exePath = [self unarchiveExecutable]; if (exePath == nil) { return NO; } return [[NSFileManager defaultManager] isExecutableFileAtPath:exePath]; } /* * Returns the full path to the executable that's used to extract the archive. This method * raises an exception indicating that subclasses have to override it. */ + (NSString *)unarchiveExecutable { [self methodIsAbstract:_cmd]; // shut up the compiler return nil; } /* * Returns the full path to the executable that's used to create the archive. This method * raises an exception indicating that subclasses have to override it. */ + (NSString *)archiveExecutable { [self methodIsAbstract:_cmd]; // shut up the compiler return nil; } /** * Returns the user presentable name for this kind of archive. This method raises an exception * indicating that subclasses have to override it. */ + (ArchiveType)archiveType { [self methodIsAbstract:_cmd]; return UNKNOWN; } @end Zipper-1.5/ArchiveService.h0000644000175000017500000000310712070335353016055 0ustar sebastiasebastia/* ArchiveService.m Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: Dirk Olmes Riccardo Mottola This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import @interface ArchiveService : NSObject { } - (void)createLhaArchive:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error; - (void)createTarArchive:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error; - (void)createZippedTarArchive:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error; - (void)createBZippedTarArchive:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error; - (void)createXzTarArchive:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error; - (void)createZipArchive:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error; - (void)create7zArchive:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error; - (void)createZooArchive:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error; @end Zipper-1.5/ArchiveService.m0000644000175000017500000001453612070335353016072 0ustar sebastiasebastia/* ArchiveService.h Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: Dirk Olmes Riccardo Mottola This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import #import #import "ArchiveService.h" #import "LhaArchive.h" #import "SevenZipArchive.h" #import "TarArchive.h" #import "ZipArchive.h" #import "ZooArchive.h" #import "common.h" @interface ArchiveService (PrivateAPI) - (void)createArchiveForFiles:(NSArray *)filenames archiveType: (ArchiveType) archiveType; @end @implementation ArchiveService : NSObject - (void)createZooArchive:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error; { NSArray *types; id filenames; types = [pboard types]; if ([types containsObject:NSFilenamesPboardType] == NO) { *error = @"We expect filenames on the pasteboard!"; return; } filenames = [pboard propertyListForType:NSFilenamesPboardType]; if (filenames == nil) { *error = @"could not read filenames off the pasteboard!"; return; } [self createArchiveForFiles:filenames archiveType:ZOO]; } - (void)create7zArchive:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error; { NSArray *types; id filenames; types = [pboard types]; if ([types containsObject:NSFilenamesPboardType] == NO) { *error = @"We expect filenames on the pasteboard!"; return; } filenames = [pboard propertyListForType:NSFilenamesPboardType]; if (filenames == nil) { *error = @"could not read filenames off the pasteboard!"; return; } [self createArchiveForFiles:filenames archiveType:SEVENZIP]; } - (void)createLhaArchive:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error; { NSArray *types; id filenames; types = [pboard types]; if ([types containsObject:NSFilenamesPboardType] == NO) { *error = @"We expect filenames on the pasteboard!"; return; } filenames = [pboard propertyListForType:NSFilenamesPboardType]; if (filenames == nil) { *error = @"could not read filenames off the pasteboard!"; return; } [self createArchiveForFiles:filenames archiveType:LHA]; } - (void)createZipArchive:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error; { NSArray *types; id filenames; types = [pboard types]; if ([types containsObject:NSFilenamesPboardType] == NO) { *error = @"We expect filenames on the pasteboard!"; return; } filenames = [pboard propertyListForType:NSFilenamesPboardType]; if (filenames == nil) { *error = @"could not read filenames off the pasteboard!"; return; } [self createArchiveForFiles:filenames archiveType:ZIP]; } - (void)createTarArchive:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error; { NSArray *types; id filenames; types = [pboard types]; if ([types containsObject:NSFilenamesPboardType] == NO) { *error = @"We expect filenames on the pasteboard!"; return; } filenames = [pboard propertyListForType:NSFilenamesPboardType]; if (filenames == nil) { *error = @"could not read filenames off the pasteboard!"; return; } [self createArchiveForFiles:filenames archiveType:TAR]; } - (void)createZippedTarArchive:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error; { NSArray *types; id filenames; types = [pboard types]; if ([types containsObject:NSFilenamesPboardType] == NO) { *error = @"We expect filenames on the pasteboard!"; return; } filenames = [pboard propertyListForType:NSFilenamesPboardType]; if (filenames == nil) { *error = @"could not read filenames off the pasteboard!"; return; } [self createArchiveForFiles:filenames archiveType:TARGZ]; } - (void)createBZippedTarArchive:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error; { NSArray *types; id filenames; types = [pboard types]; if ([types containsObject:NSFilenamesPboardType] == NO) { *error = @"We expect filenames on the pasteboard!"; return; } filenames = [pboard propertyListForType:NSFilenamesPboardType]; if (filenames == nil) { *error = @"could not read filenames off the pasteboard!"; return; } [self createArchiveForFiles:filenames archiveType:TARBZ2]; } - (void)createXzTarArchive:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error; { NSArray *types; id filenames; types = [pboard types]; if ([types containsObject:NSFilenamesPboardType] == NO) { *error = @"We expect filenames on the pasteboard!"; return; } filenames = [pboard propertyListForType:NSFilenamesPboardType]; if (filenames == nil) { *error = @"could not read filenames off the pasteboard!"; return; } [self createArchiveForFiles:filenames archiveType:TARXZ]; } @end @implementation ArchiveService (PrivateAPI) - (void)createArchiveForFiles:(NSArray *)filenames archiveType: (ArchiveType) archiveType; { int rc; NSSavePanel *panel = [NSSavePanel savePanel]; [panel setTitle:@"Archive destination"]; rc = [panel runModalForDirectory:NSHomeDirectory() file:nil]; if (rc == NSOKButton) { NSString *archiveFile = [panel filename]; // create the archive switch (archiveType) { case TAR: case TARGZ: case TARBZ2: case TARXZ: [TarArchive createArchive:archiveFile withFiles:filenames archiveType:archiveType]; break; case LHA: [LhaArchive createArchive:archiveFile withFiles:filenames archiveType:archiveType]; break; case ZIP: [ZipArchive createArchive:archiveFile withFiles:filenames archiveType:archiveType]; break; case SEVENZIP: [SevenZipArchive createArchive:archiveFile withFiles:filenames archiveType:archiveType]; break; case ZOO: [ZooArchive createArchive:archiveFile withFiles:filenames archiveType:archiveType]; break; default: NSRunAlertPanel(@"Error", @"Archive type not supported for archive creation", @"OK", nil, nil, nil); } } } @end Zipper-1.5/ArjArchive.h0000644000175000017500000000153412070531456015175 0ustar sebastiasebastia/* ArjArchive.h Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: Sebastian Reitenbach This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import #import "Archive.h" @interface ArjArchive : Archive { } - (int)expandFiles:(NSArray *)files withPathInfo:(BOOL)usePathInfo toPath:(NSString *)path; - (NSArray *)listContents; @end Zipper-1.5/ArjArchive.m0000644000175000017500000001014712070542302015172 0ustar sebastiasebastia/* ArjArchive.m Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: Sebastian Reitenbach This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import #import "ArjArchive.h" #import "FileInfo.h" #import "NSString+Custom.h" #import "Preferences.h" #import "NSArray+Custom.h" #import "common.h" static NSData *_magicBytes; @interface ArjArchive (PrivateAPI) - (NSData *)dataByRunningArj; @end @implementation ArjArchive : Archive /** * register our supported file extensions with our superclass. */ + (void)initialize { // arj starts with 0xea60 char arjBytes[] = { 0xea, 0x60 }; _magicBytes = [[NSData dataWithBytes:arjBytes length:2] retain]; [self registerFileExtension:@"arj" forArchiveClass:self]; } + (NSString *)unarchiveExecutable { return [Preferences unarjExecutable]; } /** * arj archives do contain info about compression ratio. */ + (BOOL)hasRatio; { return YES; } + (ArchiveType)archiveType { return ARJ; } + (NSData *)magicBytes { return _magicBytes; } //------------------------------------------------------------------------------ // expanding the archive //------------------------------------------------------------------------------ - (int)expandFiles:(NSArray *)files withPathInfo:(BOOL)usePathInfo toPath:(NSString *)path { //FileInfo *fileInfo; NSMutableArray *args; args = [NSMutableArray array]; [args addObject:@"x"]; [args addObject:[self path]]; // this doesn't work with unarj, either extract // whole archive, or nothing /* if (files != nil) { NSEnumerator *cursor = [files objectEnumerator]; while ((fileInfo = [cursor nextObject]) != nil) { [args addObject:[fileInfo fullPath]]; } } */ // there is no parameter allowing to specify destination dir return [self runUnarchiverWithArguments:args inDirectory:path]; } - (NSArray *)listContents { NSUInteger lineCount, i; NSString *path = nil; NSMutableArray *results = [NSMutableArray array]; NSData *data = [self dataByRunningArj]; NSString *string = [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease]; NSArray *lines = [string componentsSeparatedByString:@"\n"]; // take out first 7 lines (header) and last 2 lines (footer) lines = [lines subarrayWithRange:NSMakeRange(6, [lines count] - 6)]; lines = [lines subarrayWithRange:NSMakeRange(0, [lines count] - 3)]; lineCount = [lines count]; for (i = 0; i < lineCount; i++) { NSString *line = nil; NSArray *components; NSString *date, *ratio; int length; NSCalendarDate *calendarDate; FileInfo *info; line = [lines objectAtIndex:i]; components = [[line componentsSeparatedByString:@" "] arrayByRemovingEmptyStrings]; path = [components objectAtIndex:0]; length = [[components objectAtIndex:1] intValue]; ratio = [components objectAtIndex:3]; date = [components objectAtIndex:4]; date = [NSString stringWithFormat:@"%@ %@", date, [components objectAtIndex:5]]; calendarDate = [NSCalendarDate dateWithString:date calendarFormat:@"%d-%m-%y %H:%M:%S"]; info = [FileInfo newWithPath:path date:calendarDate size:[NSNumber numberWithInt:length] ratio:ratio]; [results addObject:info]; } return results; } //------------------------------------------------------------------------------ // private API //------------------------------------------------------------------------------ - (NSData *)dataByRunningArj { // Args for unarj: // l view contents of archive NSArray *args = [NSArray arrayWithObjects:@"l", [self path], nil]; return [self dataByRunningUnachiverWithArguments:args]; } @end Zipper-1.5/ChangeLog0000644000175000017500000002053112134544765014566 0ustar sebastiasebastia2013-05-20 Sebastian Reitenbach * Version 1.5 2013-02-07 Sebastian Reitenbach * TableViewDataSource.m some NSInteger conversions 2013-01-27 Sebastian Reitenbach * Resources/PreferencesController.gorm * put the controls into a Scrollview, similar to the nib 2013-01-26 Riccardo Mottola * PreferencesController.[h,m] * English.lproj/Preferences.nib Update NIB and put controls inside a Scrollview, which has to be scrolled top the top on load. 2013-01-26 Riccardo Mottola * TarArchive.m (archiveType) Return ArchiveType and not NSString. 2013-01-26: Sebastian Reitenbach * bump copyright to 2013 2013-01-01: Sebastian Reitenbach * Archive.[h|m] new method, to allow specify working directory when unarchiving * ArjArchive.[h|m], ZooArchive.[h|m] Use the new method to specify the working directory instead of using chdir(2) * Redirect output from archiver programs to a pipe, unarj doesn't have a parameter to suppress output when extracting * [Rar|Arj]Archive.[h|m], add license header * GNUmakefile, ZipperInfo.plist, AceArchive.[h|m], add ACE archive handling 2012-12-31: Sebastian Reitenbach * ArchiveService.[h|m], ZipperInfo.plist, ZooArchive.[h|m] * Make Zoo archive extraction work, add service to create zoo archives * FileInfo.m fix description method * ZooArchive.m Make creation of zoo archives work * RarArchive.m NSArray count returns NSUInteger, not int * ArjArchive.[h|m] add them, and make watching contents and extraction work unsing unarj * ZipperInfo.plist, Archive.m AppDelegate.m add ArjArchive hooks 2012-12-27: Sebastian Reitenbach * *Archive.m Archive.[h|m], new common.h, *Archive.[h|m], ArchiveService.[h|m], GNUmakefile define and use typedef enum ArchiveType for the different archive types. * ZipperInfo.plist, ArchiveService.[h|m], service to create tar, and .tar.xz archives * TarArchive.m, ArchiveService.m, use a NSRunAlertPanel instead of NSLog to tell the user about problems. * PreferencesController.[h|m], Preferences.[h|m], Resouces/Preferences.gorm, start adding support for more archivers * ZooArchive.[h|m], AppDelegate.m, GNUmakefile initial support for ZOO archives 2012-12-24: Sebastian Reitenbach * ZipArchive.m remove a bogus check, and fix comment * ArchiveService.[h|m], ZipperInfo.plist, LhaArchive.[h|m] Add creation of LHA Archives * SevenZipArchive.[h|m], ZipperInfo.plist, ArchiveService.[h|m] Add creation of 7z Archives 2012-12-23: Sebastian Reitenbach * ArchiveService.[h|m], TarArchive.[h|m] * Allow creating of tar.gz and tar.bz2 archives * English.lproj/Preferences.nib, Resources/Preferences.gorm, Preferences.[h|m], PreferencesController.[h|m], ZipperInfo.plist Also configure zip binary in Preferences in addition to the unzip binary, and add Service to create zip files 2012-08-08 Sebastian Reitenbach * GzipArchive.m * LhaArchive.m * LzxArchive.m * RarArchive.m * SevenZipArchive.m * TarArchive.m * ZipArchive.m Protect filenames to be extracted to be counted as parameters of the unzipping tools 2012-07-12 Sebastian Reitenbach * ZipperDocument.m Add Action methods to (de)selectAll: * Resources/ZipperDocument.gorm Allow Empty selection * Resources/MainMenu.gorm add Edit submenu with entries to (de)select All 2012-04-21 Riccardo Mottola * PreferencesController.m send perform close and trap close and stop modal (on Macintosh otherwise the close button would not stop modal) 2012-04-20 Riccardo Mottola * PreferencesController.[h,m] Set textfields to empty string if the value is nil. * ZipperDocument.m Define sel_isEqual replacement for old Mac runtimes. * FileInfo.m Append file name to path by using the appropriate method. 2012-04-20 Riccardo Mottola * TarArchive.m: Swap order of arguments and skip empty arguments which confuse BSD tar. * FileInfo.m Fix unreliable parsing of paths (filename contained in folders). 2012-02-29 Riccardo Mottola * ZipperCell.[h,m] Do not use private drawAttributedText. Add boilerplate. 2012-02-25 Riccardo Mottola * Archive.[h,m] * Preferences.[h,m] * TableViewDataSource.[h,m] * ZipperDocument.m Remove ASSIGN macro, add boiler plate 2012-02-23 Sebastian Reitenbach * NSObject+Custom.[m|h] make the return not volatile of method methodIsAbstract: 2012-02-23 Riccardo Mottola * TableViewDataSource.m * ZipperDocument.m Move table delegate method to ZipperDocument, now the real table delegate. 2012-02-23 Sebastian Reitenbach * TableViewDataSource.m, get rid of unused variable 2012-02-23 Riccardo Mottola * ZipperCell.m Remove access to private class variables * PreferencesController.m Do not create a modal session and let NSApp manage it. 2012-02-22 Sebastian Reitenbach * PreferencesController.m Add -dealloc method * NSFileManager+Custom.m, ZipperDocument.m, GzipArchive.m get rid of set but unused variables 2012-02-22 Riccardo Mottola * FileInfo.m * ZipperDocument.m Do not use NSNotFound but NSOrderedDescending 2012-02-22 Sebastian Reitenbach * ZipperDocument.m prevent starting the default open application when double clicking the table header 2012-02-22 Riccardo Mottola * PreferencesController.[h,m] * ZipperDocument.[h,m] Do not leak the preferences controller. * Archive.[h,m] Correct types. 2012-02-22 Riccardo Mottola * PreferencesController.m Do not release on window closure to prevent crash. 2012-02-21 Riccardo Mottola * FileInfo.h * FileInfo.m * ZipArchive.h * ZipArchive.m Do not autorelease and fix memory leak. 2012-02-20 Riccardo Mottola * AppDelegate.[h,m] Do not open an untitled document. Add boilerplate. * Archive.[h,m] * ArchiveService.[h,m] * FileInfo.[h,m] * ZipperDocument.[h,m] Add boilerplate. Cleanup. 2012-02-19: Sebastian Reitenbach * ZipperDocument.m: setDoubleAction to open the double clicked file with its default viewer, rework opening a file with the default openApp * PreferencesController.m: Go to the GNUSTEP_SYSTEM_APPS directory when looking for a default open application, use an even easier way now. * Connect the Document/View in the Main Menu to the double Click Action 2012-02-17: Sebastian Reitenbach * RarArchive.m fix the offset of the header and footer of unar output * SevenZipArchive.m fix the offset of the header and footer of 7z output * Preferences.m set the default rar executable to unrar * ZipperDocument.gorm make the columns in the table resizable 2012-02-16 Riccardo Mottola * GNUmakefile * PreferencesController.h * PreferencesController.m Migrated preferences GUI to Gorm, fixed typos. 2012-02-15 Sebastian Reitenbach * ZipperDocument.m replace deprecated sel_eq with sel_isEqual * GzipArchive.m, TarArchive.m, remove some weird ; 2012-02-15 Riccardo Mottola * GNUmakefile * Resources/ZipperDocument.gorm * ZipperDocument.[h,m] Migrate to Gorm. 2012-02-15 Riccardo Mottola * ZipperDocument.h Explicit IBOutlet. * AppDelegate.m * GNUmakefile * ZipperInfo.plist * main.m * Resources/MainMenu.gorm Migrate main menu to Gorm. 2012-02-13 Riccardo Mottola * TarArchive.m: Fix date parsing in BSD-tar archives, sanity checks. * ZipArchive.m: Fix date parsing and some sanity checks. 2012-02-13 Riccardo Mottola * TarArchive.m: Fix date parsing in gnu-tar archives, sanity checks. 2012-02-13 Riccardo Mottola for Sebastian Reitenbach * Resources/MainMenu-GNUstep.gsmarkup Fix menu equivalents. * PreferencesController.m Remember 7zip executable 2012-02-13 Riccardo Mottola Initial GAP check-in License changed to GPLv2 in accordance with the original author Packed resources into Resources subdirectory Zipper-1.5/FileInfo.h0000644000175000017500000000402711722163014014644 0ustar sebastiasebastia/* FileInfo.h Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: Dirk Olmes Riccardo Mottola This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import #ifdef __MACTYPES__ #define FileInfo FinderFileInfo #endif @class NSString, NSCalendarDate, NSNumber; @interface FileInfo : NSObject { @private NSString *_path; NSString *_filename; NSCalendarDate *_date; NSNumber *_size; NSString *_ratio; } + (FileInfo *)newWithPath:(NSString *)path date:(NSCalendarDate *)date size:(NSNumber *)size; + (FileInfo *)newWithPath:(NSString *)path date:(NSCalendarDate *)date size:(NSNumber *)size ratio:(NSString *)ratio; - (id)initWithPath:(NSString *)path date:(NSCalendarDate *)date size:(NSNumber *)size ratio:(NSString *)ratio; - (NSString *)path; // returns the complete path that's build from [self path] and [self filename] - (NSString *)fullPath; - (NSString *)filename; - (NSCalendarDate *)date; - (NSNumber *)size; - (NSString *)ratio; - (NSComparisonResult)comparePathAscending:(id)other; - (NSComparisonResult)comparePathDescending:(id)other; - (NSComparisonResult)compareSizeAscending:(id)other; - (NSComparisonResult)compareSizeDescending:(id)other; - (NSComparisonResult)compareFilenameAscending:(id)other; - (NSComparisonResult)compareFilenameDescending:(id)other; - (NSComparisonResult)compareDateAscending:(id)other; - (NSComparisonResult)compareDateDescending:(id)other; - (NSComparisonResult)compareRatioAscending:(id)other; - (NSComparisonResult)compareRatioDescending:(id)other; @end Zipper-1.5/FileInfo.m0000644000175000017500000001444112100343163014646 0ustar sebastiasebastia/* FileInfo.m Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: Dirk Olmes Riccardo Mottola This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import #import "FileInfo.h" #import "NSString+Custom.h" @interface FileInfo (PrivateAPI) - (NSComparisonResult)negateComparisonResult:(NSComparisonResult)result; - (void)extractFilenameAndPathFromString:(NSString *)string; @end @implementation FileInfo : NSObject + (FileInfo *)newWithPath:(NSString *)path date:(NSCalendarDate *)date size:(NSNumber *)size { return [[FileInfo alloc] initWithPath:path date:date size:size ratio:nil]; } + (FileInfo *)newWithPath:(NSString *)path date:(NSCalendarDate *)date size:(NSNumber *)size ratio:(NSString *)ratio; { return [[FileInfo alloc] initWithPath:path date:date size:size ratio:ratio]; } - (id)initWithPath:(NSString *)path date:(NSCalendarDate *)date size:(NSNumber *)size ratio:(NSString *)ratio { [super init]; [self extractFilenameAndPathFromString:path]; _date = [date retain]; _size = [size retain]; _ratio = [ratio retain]; return self; } - (void)dealloc { [_path release]; [_filename release]; [_date release]; [_size release]; [_ratio release]; [super dealloc]; } - (void)extractFilenameAndPathFromString:(NSString *)string; { NSString *path = string; // tar files can contain symlinks that have to be handled special if ([string containsString:@"->"]) { NSScanner *scanner = [NSScanner scannerWithString:string]; [scanner scanUpToString:@"->" intoString:&path]; } _filename = [[path lastPathComponent] retain]; // path is all that's before the filename _path = [path stringByDeletingLastPathComponent]; [_path retain]; } - (NSString *)path { return _path; } - (NSString *)filename { return _filename; } - (NSString *)fullPath { if ([self path] != nil) { return [[self path] stringByAppendingPathComponent:[self filename]]; } return [self filename]; } - (NSCalendarDate *)date { return _date; } - (NSNumber *)size { return _size; } - (NSString *)ratio; { return _ratio; } - (NSString *)description { return [NSString stringWithFormat:@"<%@: 0x%ld '%@' '%@' %@ \"%@\" \"%@\">", [self class], self, [self filename], [self path], [self size], [self date], [self ratio]]; } //------------------------------------------------------------------------------ // compare methods //------------------------------------------------------------------------------ - (NSComparisonResult)negateComparisonResult:(NSComparisonResult)result { if (result == NSOrderedAscending) { return NSOrderedDescending; } else if (result == NSOrderedDescending) { return NSOrderedAscending; } return result; } /** return NSOrderedDescending if not found or error*/ - (NSComparisonResult)comparePathAscending:(id)other { NSComparisonResult result = NSOrderedDescending; if ([other isKindOfClass:[FileInfo class]]) { if ([self path] == nil) { return NSOrderedAscending; } if ([other path] == nil) { // elements with no path should be listed first return NSOrderedDescending; } // when comparing files by path, consider the filename also if the // paths are equal result = [[self path] compare:[other path]]; if (result == NSOrderedSame) { result = [self compareFilenameAscending:other]; } return result; } [NSException raise:@"CannotCompareException" format:@"cannot compare a FileInfo instance with an instance of %@", [other class]]; // this code is never reached, just shut up the compiler return NSOrderedDescending; } - (NSComparisonResult)comparePathDescending:(id)other { return [self negateComparisonResult:[self comparePathAscending:other]]; } - (NSComparisonResult)compareSizeAscending:(id)other { if ([other isKindOfClass:[FileInfo class]]) { return [[self size] compare:[other size]]; } [NSException raise:@"CannotCompareException" format:@"cannot compare a FileInfo instance with an instance of %@", [other class]]; // this code is never reached, just shut up the compiler return NSOrderedDescending; } - (NSComparisonResult)compareSizeDescending:(id)other { return [self negateComparisonResult:[self compareSizeAscending:other]]; } - (NSComparisonResult)compareFilenameAscending:(id)other { if ([other isKindOfClass:[FileInfo class]]) { // comare filenames case-insensitive to ensure absolute ordering by alphabet return [[self filename] compare:[other filename] options:NSCaseInsensitiveSearch]; } [NSException raise:@"CannotCompareException" format:@"cannot compare a FileInfo instance with an instance of %@", [other class]]; // this code is never reached, just shut up the compiler return NSOrderedDescending; } - (NSComparisonResult)compareFilenameDescending:(id)other { return [self negateComparisonResult:[self compareFilenameAscending:other]]; } - (NSComparisonResult)compareDateAscending:(id)other { if ([other isKindOfClass:[FileInfo class]]) { return [[self date] compare:[other date]]; } [NSException raise:@"CannotCompareException" format:@"cannot compare a FileInfo instance with an instance of %@", [other class]]; // this code is never reached, just shut up the compiler return NSOrderedDescending; } - (NSComparisonResult)compareDateDescending:(id)other { return [self negateComparisonResult:[self compareDateAscending:other]]; } - (NSComparisonResult)compareRatioAscending:(id)other; { if ([other isKindOfClass:[FileInfo class]]) { return [[self ratio] compare:[other ratio]]; } [NSException raise:@"CannotCompareException" format:@"cannot compare a FileInfo instance with an instance of %@", [other class]]; // this code is never reached, just shut up the compiler return NSOrderedDescending; } - (NSComparisonResult)compareRatioDescending:(id)other; { return [self negateComparisonResult:[self compareRatioAscending:other]]; } @end Zipper-1.5/GNUmakefile0000644000175000017500000000273112123155710015052 0ustar sebastiasebastiainclude $(GNUSTEP_MAKEFILES)/common.make APP_NAME = Zipper PACKAGE_NAME = Zipper VERSION = 1.5 Zipper_APPLICATION_ICON = zipper.tiff ADDITIONAL_GUI_LIBS += Zipper_RESOURCE_FILES = \ Resources/MainMenu.gorm \ Resources/Preferences.gorm \ Resources/ZipperDocument.gorm \ Resources/FileIcon.tiff \ Resources/no_order.tiff \ Resources/sort_ascending.tiff \ Resources/sort_descending.tiff \ Resources/zipper.tiff Zipper_OBJC_FILES = \ AppDelegate.m \ Archive.m \ ArchiveService.m\ FileInfo.m \ GzipArchive.m\ LhaArchive.m\ LzxArchive.m\ main.m \ NSArray+Custom.m\ NSFileManager+Custom.m\ NSObject+Custom.m \ NSString+Custom.m \ Preferences.m\ PreferencesController.m\ RarArchive.m\ SevenZipArchive.m\ ZooArchive.m\ ArjArchive.m\ AceArchive.m\ TableViewDataSource.m\ TarArchive.m\ ZipArchive.m\ ZipperCell.m\ ZipperDocument.m Zipper_HEADER_FILES = \ AppDelegate.h \ Archive.h \ ArchiveService.h\ config.h \ FileInfo.h \ GzipArchive.h\ LhaArchive.h\ LzxArchive.h\ NSArray+Custom.h\ NSFileManager+Custom.h\ NSObject+Custom.h \ NSString+Custom.h \ Preferences.h\ PreferencesController.h\ RarArchive.h\ SevenZipArchive.h\ ZooArchive.h\ ArjArchive.h\ AceArchive.h\ TableViewDataSource.h\ TarArchive.h\ ZipArchive.h\ ZipperCell.h\ ZipperDocument.h\ common.h ADDITIONAL_OBJCFLAGS = -Wall -Wno-import include $(GNUSTEP_MAKEFILES)/aggregate.make include $(GNUSTEP_MAKEFILES)/application.make -include GNUmakefile.postamble Zipper-1.5/GzipArchive.h0000644000175000017500000000033011716222152015357 0ustar sebastiasebastia#import #import "Archive.h" @interface GzipArchive : Archive { } - (int)expandFiles:(NSArray *)files withPathInfo:(BOOL)usePathInfo toPath:(NSString *)path; - (NSArray *)listContents; @end Zipper-1.5/GzipArchive.m0000644000175000017500000000361112067061041015367 0ustar sebastiasebastia#import #import "GzipArchive.h" #import "FileInfo.h" #import "NSString+Custom.h" #import "Preferences.h" #import "NSArray+Custom.h" #import "NSFileManager+Custom.h" @interface GzipArchive (PrivateAPI) @end /** * This Archvie subclass handles plain gzipped files, i.e. not .tar.gz files. See TarArchive * for the handling of gzipped tar archives. */ @implementation GzipArchive : Archive /** * register our supported file extensions with superclass. */ + (void)initialize { [self registerFileExtension:@"gz" forArchiveClass:self]; } + (NSString *)unarchiveExecutable { return [Preferences gzipExecutable]; } /** * Gzip files represent a single compressed file in this scope and thus can be decompressed * without path. */ + (BOOL)canExtractWithoutFullPath { return YES; } + (ArchiveType)archiveType { return GZIP; } //------------------------------------------------------------------------------ // expanding the archive //------------------------------------------------------------------------------ - (int)expandFiles:(NSArray *)files withPathInfo:(BOOL)usePathInfo toPath:(NSString *)path { NSArray *arguments; NSString *destPath; destPath = [path stringByAppendingPathComponent:[self path]]; // make sure the full path underneath the temp dir exists [[NSFileManager defaultManager] createDirectoryPathWithParents: [destPath stringByDeletingLastPathComponent]]; // make a copy of the file to extract it in the temp dir [[NSFileManager defaultManager] copyPath:[self path] toPath:destPath handler:nil]; // extract it arguments = [NSArray arrayWithObjects:@"-d", destPath, @"--", nil]; return [self runUnarchiverWithArguments:arguments]; } - (NSArray *)listContents { FileInfo *info; NSString *path; path = [[self path] stringByDeletingPathExtension]; info = [FileInfo newWithPath:path date:nil size:nil]; return [NSArray arrayWithObject:info]; } @end Zipper-1.5/Info.plist0000644000175000017500000001077212123155710014754 0ustar sebastiasebastia CFBundleDevelopmentRegion English CFBundleDocumentTypes CFBundleTypeExtensions zip ZIP jar JAR ear EAR CFBundleTypeIconFile CFBundleTypeName Zip CFBundleTypeOSTypes ???? CFBundleTypeRole Editor LSTypeIsPackage NSDocumentClass ZipperDocument CFBundleTypeExtensions 7z 7Z 7za 7ZA CFBundleTypeName 7Zip CFBundleTypeRole Editor LSTypeIsPackage NSDocumentClass ZipperDocument NSPersistentStoreTypeKey Binary CFBundleTypeExtensions tar TAR CFBundleTypeName Tar CFBundleTypeRole Editor LSTypeIsPackage NSDocumentClass ZipperDocument NSPersistentStoreTypeKey Binary CFBundleTypeExtensions gz GZ tgz TGZ CFBundleTypeName TarGz CFBundleTypeRole Editor LSTypeIsPackage NSDocumentClass ZipperDocument NSPersistentStoreTypeKey Binary CFBundleTypeExtensions bz2 BZ2 tbz2 TBZ2 CFBundleTypeName TarBz CFBundleTypeRole Editor LSTypeIsPackage NSDocumentClass ZipperDocument NSPersistentStoreTypeKey Binary CFBundleTypeExtensions rar RAR CFBundleTypeName Rar CFBundleTypeRole Editor LSTypeIsPackage NSDocumentClass ZipperDocument NSPersistentStoreTypeKey Binary CFBundleTypeExtensions lha LHA CFBundleTypeName Lha CFBundleTypeRole Editor LSTypeIsPackage NSDocumentClass ZipperDocument NSPersistentStoreTypeKey Binary CFBundleTypeExtensions lzx LZX CFBundleTypeName Lzx CFBundleTypeRole Editor LSTypeIsPackage NSDocumentClass ZipperDocument NSPersistentStoreTypeKey Binary CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIconFile Zipper CFBundleIdentifier org.gap.Zipper CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString 1.5 CFBundleSignature ???? CFBundleVersion 1.5 NSMainNibFile MainMenu NSPrincipalClass NSApplication Zipper-1.5/LhaArchive.h0000644000175000017500000000051312067061041015153 0ustar sebastiasebastia#import #import "Archive.h" @interface LhaArchive : Archive { } - (int)expandFiles:(NSArray *)files withPathInfo:(BOOL)usePathInfo toPath:(NSString *)path; - (NSArray *)listContents; + (void)createArchive:(NSString *)archivePath withFiles:(NSArray *)filenames archiveType:(ArchiveType) archiveType; @end Zipper-1.5/LhaArchive.m0000644000175000017500000001204312067061041015161 0ustar sebastiasebastia#import #import "LhaArchive.h" #import "FileInfo.h" #import "NSString+Custom.h" #import "Preferences.h" #import "NSArray+Custom.h" @interface LhaArchive (PrivateAPI) - (NSData *)dataByRunningLha; @end @implementation LhaArchive : Archive /** * register our supported file extensions with our superclass. */ + (void)initialize { [self registerFileExtension:@"lha" forArchiveClass:self]; } + (NSString *)archiveExecutable { return [Preferences lhaExecutable]; } + (NSString *)unarchiveExecutable { return [Preferences lhaExecutable]; } /** * lha archives do contain info about compression ratio. */ + (BOOL)hasRatio; { return YES; } + (ArchiveType)archiveType { return LHA; } //------------------------------------------------------------------------------ // expanding the archive //------------------------------------------------------------------------------ - (int)expandFiles:(NSArray *)files withPathInfo:(BOOL)usePathInfo toPath:(NSString *)path { FileInfo *fileInfo; NSMutableArray *args; NSString *argString; argString = @"e"; if (usePathInfo == NO) { argString = [argString stringByAppendingString:@"i"]; } // destination dir argString = [argString stringByAppendingString:@"w="]; argString = [argString stringByAppendingString:path]; args = [NSMutableArray array]; [args addObject:argString]; // protect against archives and files starting with - [args addObject:@"--"]; [args addObject:[self path]]; if (files != nil) { NSEnumerator *cursor = [files objectEnumerator]; while ((fileInfo = [cursor nextObject]) != nil) { [args addObject:[fileInfo fullPath]]; } } return [self runUnarchiverWithArguments:args]; } - (NSArray *)listContents { NSEnumerator *cursor; NSString *line; NSMutableArray *results = [NSMutableArray array]; NSData *data = [self dataByRunningLha]; NSString *string = [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease]; NSArray *lines = [string componentsSeparatedByString:@"\n"]; // take out first 2 lines (header) and last 2 lines (footer) lines = [lines subarrayWithRange:NSMakeRange(2, [lines count] - 2)]; lines = [lines subarrayWithRange:NSMakeRange(0, [lines count] - 3)]; cursor = [lines objectEnumerator]; while ((line = [cursor nextObject]) != nil) { NSArray *components; int length; NSString *path, *ratio, *month, *day, *year, *dateString; NSCalendarDate *date; FileInfo *info; if ([line hasSuffix:@"/"]) { // skip directory entries continue; } components = [line componentsSeparatedByString:@" "]; components = [components arrayByRemovingEmptyStrings]; length = [[components objectAtIndex:3] intValue]; path = [components objectAtIndex:10]; ratio = [components objectAtIndex:4]; month = [components objectAtIndex:7]; day = [components objectAtIndex:8]; year = [components objectAtIndex:9]; dateString = [NSString stringWithFormat:@"%@ %@ %@", month, day, year]; date = [NSCalendarDate dateWithString:dateString calendarFormat:@"%b %d %Y"]; info = [FileInfo newWithPath:path date:date size:[NSNumber numberWithInt:length] ratio:ratio]; [results addObject:info]; } return results; } //------------------------------------------------------------------------------ // creating archives //------------------------------------------------------------------------------ + (void)createArchive:(NSString *)archivePath withFiles:(NSArray *)filenames archiveType: (ArchiveType) archiveType { NSEnumerator *filenameCursor; NSString *filename; NSString *workdir; NSMutableArray *arguments; // make sure archivePath has the correct suffix if ([archivePath hasSuffix:@".lha"] == NO) { archivePath = [archivePath stringByAppendingString:@".lha"]; } // build arguments for commandline: lha a filename arguments = [NSMutableArray array]; [arguments addObject:@"a"]; [arguments addObject:archivePath]; // filenames contains absolute paths, convert them to relative paths. This works // because you can select only files/directories below a current directory in // GWorkspace so all the files *have* to have a common filesystem root. filenameCursor = [filenames objectEnumerator]; while ((filename = [filenameCursor nextObject]) != nil) { [arguments addObject:[filename lastPathComponent]]; } // change into this directory when running the task workdir = [[filenames objectAtIndex:0] stringByDeletingLastPathComponent]; [self runArchiverWithArguments:arguments inDirectory:workdir]; } //------------------------------------------------------------------------------ // private API //------------------------------------------------------------------------------ - (NSData *)dataByRunningLha { NSData *data; NSArray *args = [NSArray arrayWithObjects:@"v", @"--", [self path], nil]; data = [self dataByRunningUnachiverWithArguments:args]; return data; } @end Zipper-1.5/main.m0000644000175000017500000000022111716677723014116 0ustar sebastiasebastia#import #import int main(int argc, const char *argv[]) { return NSApplicationMain(argc, argv); } Zipper-1.5/LzxArchive.h0000644000175000017500000000032711716222153015232 0ustar sebastiasebastia#import #import "Archive.h" @interface LzxArchive : Archive { } - (int)expandFiles:(NSArray *)files withPathInfo:(BOOL)usePathInfo toPath:(NSString *)path; - (NSArray *)listContents; @end Zipper-1.5/LzxArchive.m0000644000175000017500000000654612067061042015246 0ustar sebastiasebastia#import #import "LzxArchive.h" #import "FileInfo.h" #import "NSString+Custom.h" #import "Preferences.h" #import "NSArray+Custom.h" @interface LzxArchive (PrivateAPI) - (NSData *)dataByRunningLzx; @end @implementation LzxArchive : Archive /** * register our supported file extensions with our superclass. */ + (void)initialize { [self registerFileExtension:@"lzx" forArchiveClass:self]; } + (NSString *)unarchiveExecutable { return [Preferences lzxExecutable]; } /** * lzx archives can only be unpacked with path info */ + (BOOL)canExtractWithoutFullPath { return NO; } /** * lzx archives do not contain info about compression ratio. */ + (BOOL)hasRatio; { return NO; } + (ArchiveType)archiveType { return LZX; } //------------------------------------------------------------------------------ // expanding the archive //------------------------------------------------------------------------------ /** * the unlzx command does not allow to unpack single files from the archive. We * resort to unpacking the entire archive instead ... */ - (int)expandFiles:(NSArray *)files withPathInfo:(BOOL)usePathInfo toPath:(NSString *)path { NSArray *args; args = [NSArray arrayWithObjects:@"-x", @"--", [self path], nil]; return [[self class] runUnarchiverWithArguments:args inDirectory:path]; } - (NSArray *)listContents { NSEnumerator *cursor; NSString *line; NSMutableArray *results = [NSMutableArray array]; NSData *data = [self dataByRunningLzx]; NSString *string = [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease]; NSArray *lines = [string componentsSeparatedByString:@"\n"]; // take out first 2 lines (header) and last 2 lines (footer) lines = [lines subarrayWithRange:NSMakeRange(2, [lines count] - 2)]; lines = [lines subarrayWithRange:NSMakeRange(0, [lines count] - 3)]; cursor = [lines objectEnumerator]; while ((line = [cursor nextObject]) != nil) { NSArray *components; int length; NSString *path, *dateString, *timeString; NSCalendarDate *date; FileInfo *info; components = [line componentsSeparatedByString:@" "]; components = [components arrayByRemovingEmptyStrings]; timeString = [components objectAtIndex:2]; if ([timeString isEqual:@"Merged"]) { // skip lines that continue "Merged" in the time column, they contain no usable info continue; } length = [[components objectAtIndex:0] intValue]; path = [components objectAtIndex:5]; if ([path hasPrefix:@"\""]) { path = [path substringFromIndex:1]; } if ([path hasSuffix:@"\""]) { path = [path substringToIndex:[path length] - 1]; } dateString = [components objectAtIndex:3]; dateString = [NSString stringWithFormat:@"%@ %@", dateString, timeString]; date = [NSCalendarDate dateWithString:dateString calendarFormat:@"%d-%b-%Y %H:%M:%S"]; info = [FileInfo newWithPath:path date:date size:[NSNumber numberWithInt:length]]; [results addObject:info]; } return results; } //------------------------------------------------------------------------------ // private API //------------------------------------------------------------------------------ - (NSData *)dataByRunningLzx { NSData *data; NSArray *args = [NSArray arrayWithObjects:@"-v", @"--", [self path], nil]; data = [self dataByRunningUnachiverWithArguments:args]; return data; } @end Zipper-1.5/NSArray+Custom.h0000644000175000017500000000015511716222153015737 0ustar sebastiasebastia#import @interface NSArray (Custom) - (NSArray *)arrayByRemovingEmptyStrings; @end Zipper-1.5/NSArray+Custom.m0000644000175000017500000000106311716222153015743 0ustar sebastiasebastia#import #import "NSArray+Custom.h" @implementation NSArray (Custom) - (NSArray *)arrayByRemovingEmptyStrings; { NSMutableArray *retValue; NSEnumerator *cursor; id element; retValue = [NSMutableArray array]; cursor = [self objectEnumerator]; while ((element = [cursor nextObject]) != nil) { if ([element isKindOfClass:[NSString class]]) { if ([element isEqual:@""] == NO) { [retValue addObject:element]; } } else { [retValue addObject:element]; } } return [[retValue copy] autorelease]; } @end Zipper-1.5/NSFileManager+Custom.h0000644000175000017500000000034711716222153017036 0ustar sebastiasebastia#import @interface NSFileManager (Custom) - (NSString *)locateExecutable:(NSString *)aFilename; - (NSString *)createTemporaryDirectory; - (void)createDirectoryPathWithParents:(NSString *)aPath; @end Zipper-1.5/NSFileManager+Custom.m0000644000175000017500000000431011721231337017035 0ustar sebastiasebastia#import #import "NSFileManager+Custom.h" @implementation NSFileManager (Custom) /** * Scans the PATH environment variable for aFilename and * returns the full path, or nil if aFilename cannot be found. */ - (NSString *)locateExecutable:(NSString *)aFilename; { NSString *fullPath = nil; NSDictionary *environment = nil; NSString *path = nil; NSScanner *pathScanner; BOOL found = NO; environment = [[NSProcessInfo processInfo] environment]; path = [environment objectForKey:@"PATH"]; pathScanner = [NSScanner scannerWithString:path]; while (([pathScanner isAtEnd] == NO) && (found == NO)) { NSString *directory = nil; [pathScanner scanUpToString:@":" intoString:&directory]; [pathScanner scanString:@":" intoString:NULL]; fullPath = [directory stringByAppendingPathComponent:aFilename]; found = [self fileExistsAtPath:fullPath]; } if (found == NO) { fullPath = nil; } return fullPath; } /** * creates a temporary directory unique for Zipper. */ - (NSString *)createTemporaryDirectory; { int attempt = 0; NSParameterAssert(NSTemporaryDirectory() != nil); // don't get caught in an endless loop. If we need more than 500 attempts // to find a temp dir, something's wrong anyway while (attempt < 500) { NSString *tempDir; NSString *tempPath; tempDir = [NSString stringWithFormat:@"Zipper-%d", attempt++]; tempPath = [NSString pathWithComponents:[NSArray arrayWithObjects: NSTemporaryDirectory(), tempDir, nil]]; if ([self fileExistsAtPath:tempPath] == NO) { if ([self createDirectoryAtPath:tempPath attributes:nil]) { return tempPath; } } } [NSException raise:NSInvalidArgumentException format:@"Could not create temporary directory"]; return nil; } - (void)createDirectoryPathWithParents:(NSString *)aPath { NSString *parent; BOOL isDir; parent = [aPath stringByDeletingLastPathComponent]; if (([self fileExistsAtPath:parent isDirectory:&isDir] && isDir) == NO) { // parent path does not exist, create it first [self createDirectoryPathWithParents:parent]; } // parent exists, create directory [self createDirectoryAtPath:aPath attributes:nil]; } @end Zipper-1.5/NSObject+Custom.h0000644000175000017500000000015511721500267016070 0ustar sebastiasebastia#import @interface NSObject (Custom) - (void)methodIsAbstract:(SEL)selector; @end Zipper-1.5/NSObject+Custom.m0000644000175000017500000000057311721500267016101 0ustar sebastiasebastia#import #import "NSObject+Custom.h" @implementation NSObject (Custom) - (void)methodIsAbstract:(SEL)selector; { [NSException raise:NSInternalInconsistencyException format:@"*** No concrete implementation for selector '%@' in class %@. Abstract definition must be overriden.", NSStringFromSelector(selector), NSStringFromClass(isa)]; } @end Zipper-1.5/NSString+Custom.h0000644000175000017500000000027711716222155016136 0ustar sebastiasebastia#import @interface NSString (Convenience) - (BOOL)containsString:(NSString *)string; - (BOOL)isEmpty; - (NSString *)stringByRemovingWhitespaceFromBeginning; @end Zipper-1.5/NSString+Custom.m0000644000175000017500000000137511716222155016143 0ustar sebastiasebastia#import #import "NSString+Custom.h" @implementation NSString (Convenience) - (BOOL)containsString:(NSString *)string { return (([self rangeOfString:string]).length > 0); } - (BOOL)isEmpty { return [self isEqual:@""]; } - (NSString *)stringByRemovingWhitespaceFromBeginning { NSCharacterSet *whitespaceSet = nil; NSScanner *theScanner = nil; whitespaceSet = [NSCharacterSet whitespaceCharacterSet]; theScanner = [NSScanner scannerWithString:self]; // do not skip automatically over any chars [theScanner setCharactersToBeSkipped:nil]; // skip all blanks from beginning [theScanner scanCharactersFromSet:whitespaceSet intoString:NULL]; return [self substringFromIndex:[theScanner scanLocation]]; } @end Zipper-1.5/Preferences.h0000644000175000017500000000651412067104301015412 0ustar sebastiasebastia/* Preferences.h Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: Dirk Olmes Riccardo Mottola This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import #define PREF_KEY_TAR @"TarExecutable" #define PREF_KEY_ZIP @"ZipExecutable" #define PREF_KEY_UNZIP @"UnzipExecutable" #define PREF_KEY_SEVEN_ZIP @"7ZipExecutable" #define PREF_KEY_RAR @"RarExecutable" #define PREF_KEY_LHA @"LhaExecutable" #define PREF_KEY_LZX @"LzxExecutable" #define PREF_KEY_GZIP @"GzipExecutable" #define PREF_KEY_GUNZIP @"GunzipExecutable" #define PREF_KEY_BZIP2 @"Bzip2Executable" #define PREF_KEY_BUNZIP2 @"Bunzip2Executable" #define PREF_KEY_UNARJ @"UnarjExecutable" #define PREF_KEY_UNACE @"UnaceExecutable" #define PREF_KEY_ZOO @"ZooExecutable" #define PREF_KEY_XZ @"XzExecutable" #define PREF_KEY_BSD_TAR @"BSDTar" #define PREF_KEY_OPEN_DIR @"LastOpenDirectory" #define PREF_KEY_EXTRACT_DIR @"LastExtractDirectory" #define PREF_KEY_DEFAULT_OPEN_APP @"DefaultOpenApp" @interface Preferences : NSObject { } + (void)usePreferences:(NSDictionary *)newPrefs; /** * Default accessors. These methods try to find the executable but return * nil if nothing could be found. */ + (NSString *)tarExecutable; + (NSString *)zipExecutable; + (NSString *)unzipExecutable; + (NSString *)sevenZipExecutable; + (NSString *)rarExecutable; + (NSString *)lhaExecutable; + (NSString *)lzxExecutable; + (NSString *)gzipExecutable; + (NSString *)gunzipExecutable; + (NSString *)bzip2Executable; + (NSString *)bunzip2Executable; + (NSString *)unarjExecutable; + (NSString *)unaceExecutable; + (NSString *)zooExecutable; + (NSString *)xzExecutable; /** * Setters for the various executables. All expect a full path to the executable and raise * exceptions if a wrong value was specified. */ + (void)setTarExecutable:(NSString *)newTar; + (void)setZipExecutable:(NSString *)newZip; + (void)setUnzipExecutable:(NSString *)newUnzip; + (void)setSevenZipExecutable:(NSString *)new7zip; + (void)setRarExecutable:(NSString *)newRar; + (void)setLhaExecutable:(NSString *)newLha; + (void)setLzxExecutable:(NSString *)newLzx; + (void)setGzipExecutable:(NSString *)newGzip; + (void)setGunzipExecutable:(NSString *)newGzip; + (void)setBzip2Executable:(NSString *)newGzip; + (void)setBunzip2Executable:(NSString *)newGzip; + (void)setUnarjExecutable:(NSString *)newGzip; + (void)setUnaceExecutable:(NSString *)newGzip; + (void)setZooExecutable:(NSString *)newGzip; + (void)setXzExecutable:(NSString *)newGzip; + (BOOL)isBsdTar; + (void)setIsBsdTar:(BOOL)flag; + (NSString *)lastOpenDirectory; + (void)setLastOpenDirectory:(NSString *)path; + (NSString *)lastExtractDirectory; + (void)setLastExtractDirectory:(NSString *)path; + (NSString *)compressionArgumentForFile:(NSString *)fileName; + (NSString *)defaultOpenApp; + (void)setDefaultOpenApp:(NSString *)path; + (void)save; @end Zipper-1.5/Preferences.m0000644000175000017500000002404512067104301015416 0ustar sebastiasebastia/* Preferences.m Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: Dirk Olmes Riccardo Mottola This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import #import "Preferences.h" #import "NSFileManager+Custom.h" #define X_MISSING_PREF @"MissingPreferenceException" #define X_WRONG_PREF @"WrongPreferenceException" @interface Preferences (PrivateAPI) + (NSString *)stringForKey:(NSString *)key; + (BOOL)boolForKey:(NSString *)key; + (void)checkExecutable:(NSString *)executable withName:(NSString *)name; @end /** * This class encapsulates the access to the app's preferences. It faciliates providing a * Dictionary that will be used instead of NSUserDefaults and searching the PATH environment * variable. */ @implementation Preferences : NSObject /** * To faciliate unit testing it's possible to provide the Preferences class with an NSDictionary * that makes up the preferences. */ static NSDictionary *_replacementPrefs = nil; /** * Additional Preferences loaded from PropertyList file */ static NSDictionary *_plistPrefs; /** * This is the mapping between file extensions and tar's extract option. This option differs * from platform to platform. In order to encapsulate this, Preferences manages this mapping * and clients can ask for a compression argument with compressionArgumentForFile: */ static NSMutableDictionary *_extensionMapping = nil; + (void)initialize { NSString *path; if (_extensionMapping == nil) { _extensionMapping = [[NSMutableDictionary dictionaryWithObjectsAndKeys: @"", @"tar", @"-z", @"gz", @"-z", @"tgz", @"-j", @"bz2", nil] retain]; } // see if there's a property list containing preferences to use path = [[NSBundle bundleForClass:self] pathForResource:@"DefaultPreferences" ofType:@"plist"]; if (path != nil) { _plistPrefs = [[NSDictionary dictionaryWithContentsOfFile:path] retain]; } } + (void)usePreferences:(NSDictionary *)newPrefs; { [_replacementPrefs release]; _replacementPrefs = newPrefs; [_replacementPrefs retain]; } + (NSString *)tarExecutable; { NSString *tar = [self stringForKey:PREF_KEY_TAR]; if (tar == nil) { // search the PATH tar = [[NSFileManager defaultManager] locateExecutable:@"tar"]; } return tar; } + (void)setTarExecutable:(NSString *)newTar { if (newTar != nil) { [[NSUserDefaults standardUserDefaults] setObject:newTar forKey:PREF_KEY_TAR]; } } + (BOOL)isBsdTar; { return [self boolForKey:PREF_KEY_BSD_TAR]; } + (void)setIsBsdTar:(BOOL)flag { [[NSUserDefaults standardUserDefaults] setBool:flag forKey:PREF_KEY_BSD_TAR]; if (flag == YES) { // on BSD tar also uses -z for extracting .bz archives [_extensionMapping setObject:@"-z" forKey:@"bz2"]; } else { [_extensionMapping setObject:@"-j" forKey:@"bz2"]; } } + (NSString *)zipExecutable; { NSString *zip = [self stringForKey:PREF_KEY_ZIP]; if (zip == nil) { zip = [[NSFileManager defaultManager] locateExecutable:@"zip"]; } return zip; } + (void)setZipExecutable:(NSString *)newZip { if (newZip != nil) { [[NSUserDefaults standardUserDefaults] setObject:newZip forKey:PREF_KEY_ZIP]; } } + (NSString *)unzipExecutable; { NSString *unzip = [self stringForKey:PREF_KEY_UNZIP]; if (unzip == nil) { unzip = [[NSFileManager defaultManager] locateExecutable:@"unzip"]; } return unzip; } + (void)setUnzipExecutable:(NSString *)newUnzip { if (newUnzip != nil) { [[NSUserDefaults standardUserDefaults] setObject:newUnzip forKey:PREF_KEY_UNZIP]; } } + (NSString *)sevenZipExecutable; { NSString *zip = [self stringForKey:PREF_KEY_SEVEN_ZIP]; if (zip == nil) { zip = [[NSFileManager defaultManager] locateExecutable:@"7z"]; // corner case: only 7za may be available on the system if (zip == nil) { zip = [[NSFileManager defaultManager] locateExecutable:@"7za"]; } } return zip; } + (void)setSevenZipExecutable:(NSString *)new7zip { if (new7zip != nil) { [[NSUserDefaults standardUserDefaults] setObject:new7zip forKey:PREF_KEY_SEVEN_ZIP]; } } + (NSString *)rarExecutable; { NSString *rar = [self stringForKey:PREF_KEY_RAR]; if (rar == nil) { rar = [[NSFileManager defaultManager] locateExecutable:@"unrar"]; } return rar; } + (void)setRarExecutable:(NSString *)newRar; { if (newRar != nil) { [[NSUserDefaults standardUserDefaults] setObject:newRar forKey:PREF_KEY_RAR]; } } + (NSString *)lhaExecutable { NSString *lha = [self stringForKey:PREF_KEY_LHA]; if (lha == nil) { lha = [[NSFileManager defaultManager] locateExecutable:@"lha"]; } return lha; } + (void)setLhaExecutable:(NSString *)newLha; { if (newLha != nil) { [[NSUserDefaults standardUserDefaults] setObject:newLha forKey:PREF_KEY_LHA]; } } + (NSString *)lzxExecutable { NSString *lzx = [self stringForKey:PREF_KEY_LZX]; if (lzx == nil) { lzx = [[NSFileManager defaultManager] locateExecutable:@"unlzx"]; } return lzx; } + (void)setLzxExecutable:(NSString *)newLzx; { if (newLzx != nil) { [[NSUserDefaults standardUserDefaults] setObject:newLzx forKey:PREF_KEY_LZX]; } } + (NSString *)gzipExecutable { NSString *gzip = [self stringForKey:PREF_KEY_GZIP]; if (gzip == nil) { gzip = [[NSFileManager defaultManager] locateExecutable:@"gzip"]; } return gzip; } + (void)setGzipExecutable:(NSString *)newGzip { if (newGzip != nil) { [[NSUserDefaults standardUserDefaults] setObject:newGzip forKey:PREF_KEY_GZIP]; } } + (NSString *)gunzipExecutable { NSString *gunzip = [self stringForKey:PREF_KEY_GUNZIP]; if (gunzip == nil) { gunzip = [[NSFileManager defaultManager] locateExecutable:@"gunzip"]; } return gunzip; } + (void)setGunzipExecutable:(NSString *)newGunzip { if (newGunzip != nil) { [[NSUserDefaults standardUserDefaults] setObject:newGunzip forKey:PREF_KEY_GUNZIP]; } } + (NSString *)bzip2Executable { NSString *bzip2 = [self stringForKey:PREF_KEY_BZIP2]; if (bzip2 == nil) { bzip2 = [[NSFileManager defaultManager] locateExecutable:@"bzip2"]; } return bzip2; } + (void)setBzip2Executable:(NSString *)newBzip2 { if (newBzip2 != nil) { [[NSUserDefaults standardUserDefaults] setObject:newBzip2 forKey:PREF_KEY_BZIP2]; } } + (NSString *)bunzip2Executable { NSString *bunzip2 = [self stringForKey:PREF_KEY_BUNZIP2]; if (bunzip2 == nil) { bunzip2 = [[NSFileManager defaultManager] locateExecutable:@"bunzip2"]; } return bunzip2; } + (void)setBunzip2Executable:(NSString *)newBunzip2 { if (newBunzip2 != nil) { [[NSUserDefaults standardUserDefaults] setObject:newBunzip2 forKey:PREF_KEY_BUNZIP2]; } } + (NSString *)unarjExecutable { NSString *unarj = [self stringForKey:PREF_KEY_UNARJ]; if (unarj == nil) { unarj = [[NSFileManager defaultManager] locateExecutable:@"unarj"]; } return unarj; } + (void)setUnarjExecutable:(NSString *)newUnarj { if (newUnarj != nil) { [[NSUserDefaults standardUserDefaults] setObject:newUnarj forKey:PREF_KEY_UNARJ]; } } + (NSString *)unaceExecutable { NSString *unace = [self stringForKey:PREF_KEY_UNACE]; if (unace == nil) { unace = [[NSFileManager defaultManager] locateExecutable:@"unace"]; } return unace; } + (void)setUnaceExecutable:(NSString *)newUnace { if (newUnace != nil) { [[NSUserDefaults standardUserDefaults] setObject:newUnace forKey:PREF_KEY_UNACE]; } } + (NSString *)zooExecutable { NSString *zoo = [self stringForKey:PREF_KEY_ZOO]; if (zoo == nil) { zoo = [[NSFileManager defaultManager] locateExecutable:@"zoo"]; } return zoo; } + (void)setZooExecutable:(NSString *)newZoo { if (newZoo != nil) { [[NSUserDefaults standardUserDefaults] setObject:newZoo forKey:PREF_KEY_ZOO]; } } + (NSString *)xzExecutable { NSString *xz = [self stringForKey:PREF_KEY_XZ]; if (xz == nil) { xz = [[NSFileManager defaultManager] locateExecutable:@"xz"]; } return xz; } + (void)setXzExecutable:(NSString *)newXz { if (newXz != nil) { [[NSUserDefaults standardUserDefaults] setObject:newXz forKey:PREF_KEY_XZ]; } } + (NSString *)lastOpenDirectory { return [self stringForKey:PREF_KEY_OPEN_DIR]; } + (void)setLastOpenDirectory:(NSString *)path; { [[NSUserDefaults standardUserDefaults] setObject:path forKey:PREF_KEY_OPEN_DIR]; } + (NSString *)lastExtractDirectory; { return [self stringForKey:PREF_KEY_EXTRACT_DIR]; } + (void)setLastExtractDirectory:(NSString *)path; { [[NSUserDefaults standardUserDefaults] setObject:path forKey:PREF_KEY_EXTRACT_DIR]; } + (NSString *)compressionArgumentForFile:(NSString *)fileName { if (fileName != nil) { return [_extensionMapping objectForKey:[fileName pathExtension]]; } return nil; } /** * Returns the name of the app that will be used to open files that don't have a * pathExtension. */ + (NSString *)defaultOpenApp; { return [self stringForKey:PREF_KEY_DEFAULT_OPEN_APP]; } + (void)setDefaultOpenApp:(NSString *)path; { [[NSUserDefaults standardUserDefaults] setObject:path forKey:PREF_KEY_DEFAULT_OPEN_APP]; } + (void)save { [[NSUserDefaults standardUserDefaults] synchronize]; } //------------------------------------------------------------------------------ // private API //------------------------------------------------------------------------------ + (NSString *)stringForKey:(NSString *)key; { NSString *value; if (_replacementPrefs != nil) { return [_replacementPrefs objectForKey:key]; } value = [[NSUserDefaults standardUserDefaults] stringForKey:key]; if ((value == nil) && (_plistPrefs != nil)) { value = [_plistPrefs objectForKey:key]; } return value; } + (BOOL)boolForKey:(NSString *)key { if (_replacementPrefs != nil) { NSString *value = [_replacementPrefs objectForKey:key]; return [value isEqual:@"YES"]; } return [[NSUserDefaults standardUserDefaults] boolForKey:key]; } @end Zipper-1.5/PreferencesController.h0000644000175000017500000000356012101053647017461 0ustar sebastiasebastia/* PreferencesController.h Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: Dirk Olmes Riccardo Mottola This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import @class NSPanel, NSForm, NSTextField, ScrollView, Archive; @interface PreferencesController : NSObject { IBOutlet NSPanel *_panel; IBOutlet NSScrollView *scrollView; IBOutlet NSButton *_bsdTarButton; IBOutlet NSTextField *_defaultOpenApp; IBOutlet NSTextField *_tarTextField; IBOutlet NSTextField *_unzipTextField; IBOutlet NSTextField *_zipTextField; IBOutlet NSTextField *_rarTextField; IBOutlet NSTextField *_lhaTextField; IBOutlet NSTextField *_lzxTextField; IBOutlet NSTextField *_sevenZipTextField; IBOutlet NSTextField *_gzipTextField; IBOutlet NSTextField *_gunzipTextField; IBOutlet NSTextField *_bzip2TextField; IBOutlet NSTextField *_bunzip2TextField; IBOutlet NSTextField *_unarjTextField; IBOutlet NSTextField *_unaceTextField; IBOutlet NSTextField *_zooTextField; IBOutlet NSTextField *_xzTextField; // this holds a reference to an Archive subclass that the user // needs to set before he can leave the prefs dialog id _archiveClass; } - (void)showPreferencesPanel; - (IBAction)cancelPressed:(id)sender; - (IBAction)okPressed:(id)sender; - (IBAction)findExecutable:(id)sender; - (IBAction)findDefaultOpenApp:(id)sender; @end Zipper-1.5/PreferencesController.m0000644000175000017500000002146312101053650017462 0ustar sebastiasebastia/* PreferencesController.m Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: Dirk Olmes Riccardo Mottola This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import #import #import "PreferencesController.h" #import "Preferences.h" #import "Archive.h" #define TAG_TAR 1 #define TAG_UNZIP 2 #define TAG_RAR 3 #define TAG_LHA 4 #define TAG_LZX 5 #define TAG_SEVEN_ZIP 6 #define TAG_ZIP 7 #define TAG_GZIP 8 #define TAG_GUNZIP 9 #define TAG_BZIP2 10 #define TAG_BUNZIP2 11 #define TAG_UNARJ 12 #define TAG_UNACE 13 #define TAG_ZOO 14 #define TAG_XZ 15 @implementation PreferencesController : NSObject - (id)init { NSString *string; BOOL tarFlag; [super init]; [NSBundle loadNibNamed: @"Preferences" owner: self]; // tar string = [Preferences tarExecutable]; if (!string) string = @""; [_tarTextField setStringValue:string]; // unzip string = [Preferences unzipExecutable]; if (!string) string = @""; [_unzipTextField setStringValue:string]; // zip string = [Preferences zipExecutable]; if (!string) string = @""; [_zipTextField setStringValue:string]; // rar string = [Preferences rarExecutable]; if (!string) string = @""; [_rarTextField setStringValue:string]; // lha string = [Preferences lhaExecutable]; if (!string) string = @""; [_lhaTextField setStringValue:string]; // lzx string = [Preferences lzxExecutable]; if (!string) string = @""; [_lzxTextField setStringValue:string]; // 7z string = [Preferences sevenZipExecutable]; if (!string) string = @""; [_sevenZipTextField setStringValue:string]; // gzip string = [Preferences gzipExecutable]; if (!string) string = @""; [_gzipTextField setStringValue:string]; // gunzip string = [Preferences gunzipExecutable]; if (!string) string = @""; [_gunzipTextField setStringValue:string]; // bzip2 string = [Preferences bzip2Executable]; if (!string) string = @""; [_bzip2TextField setStringValue:string]; // bunzip2 string = [Preferences bunzip2Executable]; if (!string) string = @""; [_bunzip2TextField setStringValue:string]; // unarj string = [Preferences unarjExecutable]; if (!string) string = @""; [_unarjTextField setStringValue:string]; // unace string = [Preferences unaceExecutable]; if (!string) string = @""; [_unaceTextField setStringValue:string]; // zoo string = [Preferences zooExecutable]; if (!string) string = @""; [_zooTextField setStringValue:string]; // xz string = [Preferences xzExecutable]; if (!string) string = @""; [_xzTextField setStringValue:string]; // bsd tar checkbox tarFlag = [Preferences isBsdTar]; [_bsdTarButton setState:tarFlag]; // default open app text field string = [[Preferences defaultOpenApp] lastPathComponent]; if (!string) string = @""; [_defaultOpenApp setStringValue:string]; return self; } - (void)awakeFromNib { NSClipView *cView; NSLog(@"fix scroll"); cView = [scrollView contentView]; [cView scrollToPoint: NSMakePoint(0.0, NSMaxY([[scrollView documentView] frame])-NSHeight([cView bounds]))]; [scrollView reflectScrolledClipView: cView]; } - (void)dealloc { [_panel release]; [_archiveClass release]; [super dealloc]; } /** * runs the Preferences Panel in a modal event loop */ - (void)showPreferencesPanel { [NSApp runModalForWindow:_panel]; // control flow returns to the panel ... until 'ok' or 'cancel' is pressed [_panel close]; } -(void)windowWillClose:(NSNotification *)aNotification { [NSApp stopModal]; } - (IBAction)okPressed:(id)sender { NSString *string; NS_DURING string = [_tarTextField stringValue]; [Preferences setTarExecutable:string]; string = [_unzipTextField stringValue]; [Preferences setUnzipExecutable:string]; string = [_zipTextField stringValue]; [Preferences setZipExecutable:string]; string = [_rarTextField stringValue]; [Preferences setRarExecutable:string]; string = [_lhaTextField stringValue]; [Preferences setLhaExecutable:string]; string = [_lzxTextField stringValue]; [Preferences setLzxExecutable:string]; string = [_sevenZipTextField stringValue]; [Preferences setSevenZipExecutable:string]; string = [_gzipTextField stringValue]; [Preferences setGzipExecutable:string]; string = [_gunzipTextField stringValue]; [Preferences setGunzipExecutable:string]; string = [_bzip2TextField stringValue]; [Preferences setBzip2Executable:string]; string = [_bunzip2TextField stringValue]; [Preferences setBunzip2Executable:string]; string = [_unarjTextField stringValue]; [Preferences setUnarjExecutable:string]; string = [_unaceTextField stringValue]; [Preferences setUnaceExecutable:string]; string = [_zooTextField stringValue]; [Preferences setZooExecutable:string]; string = [_xzTextField stringValue]; [Preferences setXzExecutable:string]; [Preferences setIsBsdTar:[_bsdTarButton state]]; [Preferences save]; [_panel performClose:self]; NS_HANDLER NSRunAlertPanel(@"Error in Preferences", [localException reason], nil, nil, nil); NS_ENDHANDLER } - (IBAction)cancelPressed:(id)sender { [_panel performClose:self]; } - (IBAction)findExecutable:(id)sender { NSOpenPanel *openPanel; int rc; openPanel = [NSOpenPanel openPanel]; [openPanel setTitle:@"Find executable"]; [openPanel setCanChooseFiles:YES]; [openPanel setCanChooseDirectories:NO]; rc = [openPanel runModalForDirectory:@"/" file:nil types:nil]; if (rc == NSOKButton) { NSString *path = [openPanel filename]; NS_DURING switch ([sender tag]) { case TAG_TAR: [_tarTextField setStringValue:path]; [Preferences setTarExecutable:path]; break; case TAG_UNZIP: [_unzipTextField setStringValue:path]; [Preferences setUnzipExecutable:path]; break; case TAG_ZIP: [_zipTextField setStringValue:path]; [Preferences setZipExecutable:path]; break; case TAG_RAR: [_rarTextField setStringValue:path]; [Preferences setRarExecutable:path]; break; case TAG_LHA: [_lhaTextField setStringValue:path]; [Preferences setLhaExecutable:path]; break; case TAG_LZX: [_lzxTextField setStringValue:path]; [Preferences setLzxExecutable:path]; break; case TAG_SEVEN_ZIP: [_sevenZipTextField setStringValue:path]; [Preferences setSevenZipExecutable:path]; break; case TAG_GZIP: [_gzipTextField setStringValue:path]; [Preferences setGzipExecutable:path]; break; case TAG_GUNZIP: [_gunzipTextField setStringValue:path]; [Preferences setGunzipExecutable:path]; break; case TAG_BZIP2: [_bzip2TextField setStringValue:path]; [Preferences setBzip2Executable:path]; break; case TAG_BUNZIP2: [_bunzip2TextField setStringValue:path]; [Preferences setBunzip2Executable:path]; break; case TAG_UNARJ: [_unarjTextField setStringValue:path]; [Preferences setUnarjExecutable:path]; break; case TAG_UNACE: [_unaceTextField setStringValue:path]; [Preferences setUnaceExecutable:path]; break; case TAG_ZOO: [_zooTextField setStringValue:path]; [Preferences setZooExecutable:path]; break; case TAG_XZ: [_xzTextField setStringValue:path]; [Preferences setXzExecutable:path]; break; default: [NSException raise:NSInvalidArgumentException format:@"invalid tag of find button"]; } NS_HANDLER NSRunAlertPanel(@"Error in Preferences", [localException reason], nil, nil, nil); NS_ENDHANDLER } } - (IBAction)findDefaultOpenApp:(id)sender { NSOpenPanel *openPanel; NSString *gnustepSystemApps; int rc; gnustepSystemApps = [NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSSystemDomainMask, YES) objectAtIndex:0]; openPanel = [NSOpenPanel openPanel]; [openPanel setTitle:@"Find default open app"]; [openPanel setTreatsFilePackagesAsDirectories:YES]; [openPanel setCanChooseFiles:NO]; [openPanel setCanChooseDirectories:YES]; rc = [openPanel runModalForDirectory:gnustepSystemApps file:nil types:nil]; if (rc == NSOKButton) { [_defaultOpenApp setStringValue:[[openPanel filename] lastPathComponent]]; [Preferences setDefaultOpenApp:[openPanel filename]]; } } @end Zipper-1.5/RarArchive.h0000644000175000017500000000145012070531457015203 0ustar sebastiasebastia/* RarArchive.h Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import #import "Archive.h" @interface RarArchive : Archive { } - (int)expandFiles:(NSArray *)files withPathInfo:(BOOL)usePathInfo toPath:(NSString *)path; - (NSArray *)listContents; @end Zipper-1.5/RarArchive.m0000644000175000017500000001050312070531457015207 0ustar sebastiasebastia/* RarArchive.m Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import #import "RarArchive.h" #import "FileInfo.h" #import "NSString+Custom.h" #import "Preferences.h" #import "NSArray+Custom.h" #import "common.h" static NSData *_magicBytes; @interface RarArchive (PrivateAPI) - (NSData *)dataByRunningRar; @end @implementation RarArchive : Archive /** * register our supported file extensions with our superclass. */ + (void)initialize { // rar files start with 'R a r !' char rarBytes[] = { 'R', 'a', 'r', '!' }; _magicBytes = [[NSData dataWithBytes:rarBytes length:4] retain]; [self registerFileExtension:@"rar" forArchiveClass:self]; } + (NSString *)unarchiveExecutable { return [Preferences rarExecutable]; } /** * rar archives do contain info about compression ratio. */ + (BOOL)hasRatio; { return YES; } + (ArchiveType)archiveType { return RAR; } + (NSData *)magicBytes { return _magicBytes; } //------------------------------------------------------------------------------ // expanding the archive //------------------------------------------------------------------------------ - (int)expandFiles:(NSArray *)files withPathInfo:(BOOL)usePathInfo toPath:(NSString *)path { FileInfo *fileInfo; NSMutableArray *args; args = [NSMutableArray array]; if (usePathInfo) { [args addObject:@"x"]; } else { [args addObject:@"e"]; } // protect against archives and files starting with - [args addObject:@"--"]; [args addObject:[self path]]; if (files != nil) { NSEnumerator *cursor = [files objectEnumerator]; while ((fileInfo = [cursor nextObject]) != nil) { [args addObject:[fileInfo fullPath]]; } } // destination dir [args addObject:path]; return [self runUnarchiverWithArguments:args]; } - (NSArray *)listContents { NSUInteger lineCount, i; NSString *path = nil; NSMutableArray *results = [NSMutableArray array]; NSData *data = [self dataByRunningRar]; NSString *string = [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease]; NSArray *lines = [string componentsSeparatedByString:@"\n"]; // take out first 9 lines (header) and last 3 lines (footer) lines = [lines subarrayWithRange:NSMakeRange(8, [lines count] - 8)]; lines = [lines subarrayWithRange:NSMakeRange(0, [lines count] - 4)]; lineCount = [lines count]; for (i = 0; i < lineCount; i++) { NSString *line = nil; line = [lines objectAtIndex:i]; if ((i % 2) == 0) { path = [line stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; } else { NSArray *components; NSString *date, *ratio; int length; NSCalendarDate *calendarDate; FileInfo *info; components = [[line componentsSeparatedByString:@" "] arrayByRemovingEmptyStrings]; // continue only for non-directory entries if ([[components objectAtIndex:5] hasPrefix:@"d"] == NO) { length = [[components objectAtIndex:0] intValue]; ratio = [components objectAtIndex:2]; date = [components objectAtIndex:3]; date = [NSString stringWithFormat:@"%@ %@", date, [components objectAtIndex:4]]; calendarDate = [NSCalendarDate dateWithString:date calendarFormat:@"%d-%m-%y %H:%M"]; info = [FileInfo newWithPath:path date:calendarDate size:[NSNumber numberWithInt:length] ratio:ratio]; [results addObject:info]; } } } return results; } //------------------------------------------------------------------------------ // private API //------------------------------------------------------------------------------ - (NSData *)dataByRunningRar { // Args for rar: // v view contents of archive // -c- suppress archive comment NSArray *args = [NSArray arrayWithObjects:@"v", @"-c-", @"--", [self path], nil]; return [self dataByRunningUnachiverWithArguments:args]; } @end Zipper-1.5/SevenZipArchive.h0000644000175000017500000000052012067061043016212 0ustar sebastiasebastia#import #import "Archive.h" @interface SevenZipArchive : Archive { } - (int)expandFiles:(NSArray *)files withPathInfo:(BOOL)usePathInfo toPath:(NSString *)path; - (NSArray *)listContents; + (void)createArchive:(NSString *)archivePath withFiles:(NSArray *)filenames archiveType:(ArchiveType) archiveType; @end Zipper-1.5/SevenZipArchive.m0000644000175000017500000001277712067061043016240 0ustar sebastiasebastia#import #import "SevenZipArchive.h" #import "FileInfo.h" #import "NSString+Custom.h" #import "Preferences.h" #import "NSArray+Custom.h" @interface SevenZipArchive (PrivateAPI) - (NSData *)dataByRunningSevenZip; - (NSArray *)listSevenZipContents:(NSArray *)lines; @end @implementation SevenZipArchive : Archive /** * register our supported file extensions with superclass. */ + (void)initialize { [self registerFileExtension:@"7z" forArchiveClass:self]; [self registerFileExtension:@"7za" forArchiveClass:self]; } + (NSString *)archiveExecutable { return [Preferences sevenZipExecutable]; } + (NSString *)unarchiveExecutable { return [Preferences sevenZipExecutable]; } + (BOOL)hasRatio; { return NO; } + (ArchiveType)archiveType { return SEVENZIP; } //------------------------------------------------------------------------------ // expanding the archive //------------------------------------------------------------------------------ - (int)expandFiles:(NSArray *)files withPathInfo:(BOOL)usePathInfo toPath:(NSString *)path { FileInfo *fileInfo; NSMutableArray *args; args = [NSMutableArray array]; if (usePathInfo == YES) { [args addObject:@"x"]; } else { // extract flat [args addObject:@"e"]; } // assume yes on all queries (needed for silently overwriting files) [args addObject:@"-y"]; // destination dir, path must not be separated with blank from the 'o' option [args addObject:[@"-o" stringByAppendingString:path]]; // protect for archives and files starting with - [args addObject:@"--"]; // add archive filename [args addObject:[self path]]; if (files != nil) { NSEnumerator *cursor = [files objectEnumerator]; while ((fileInfo = [cursor nextObject]) != nil) { [args addObject:[fileInfo fullPath]]; } } return [self runUnarchiverWithArguments:args]; } - (NSArray *)listContents { NSData *data = [self dataByRunningSevenZip]; NSString *string = [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease]; NSArray *lines = [string componentsSeparatedByString:@"\n"]; // take out first 8 lines (header) and last 2 lines (footer) lines = [lines subarrayWithRange:NSMakeRange(17, [lines count] - 17)]; lines = [lines subarrayWithRange:NSMakeRange(0, [lines count] - 3)]; return [self listSevenZipContents:lines]; } //------------------------------------------------------------------------------ // creating archives //------------------------------------------------------------------------------ + (void)createArchive:(NSString *)archivePath withFiles:(NSArray *)filenames archiveType: (ArchiveType) archiveType { NSEnumerator *filenameCursor; NSString *filename; NSString *workdir; NSMutableArray *arguments; // make sure archivePath has the correct suffix if ([archivePath hasSuffix:@".7z"] == NO) { archivePath = [archivePath stringByAppendingString:@".7z"]; } // build arguments for commandline: 7z a filename arguments = [NSMutableArray array]; [arguments addObject:@"a"]; [arguments addObject:archivePath]; // filenames contains absolute paths, convert them to relative paths. This works // because you can select only files/directories below a current directory in // GWorkspace so all the files *have* to have a common filesystem root. filenameCursor = [filenames objectEnumerator]; while ((filename = [filenameCursor nextObject]) != nil) { [arguments addObject:[filename lastPathComponent]]; } // change into this directory when running the task workdir = [[filenames objectAtIndex:0] stringByDeletingLastPathComponent]; [self runArchiverWithArguments:arguments inDirectory:workdir]; } //------------------------------------------------------------------------------ // private API //------------------------------------------------------------------------------ - (NSArray *)listSevenZipContents:(NSArray *)lines { NSEnumerator *cursor; NSString *line; NSMutableArray *results = [NSMutableArray array]; cursor = [lines objectEnumerator]; while ((line = [cursor nextObject]) != nil) { int length; NSString *path, *date, *time, *attributes; NSCalendarDate *calendarDate; FileInfo *info; NSArray *components; if ([line length] == 0) { continue; } components = [line componentsSeparatedByString:@" "]; components = [components arrayByRemovingEmptyStrings]; // directly skip directory entries. Fortunately, 7zip displays attributes for each file attributes = [components objectAtIndex:2]; if ([attributes characterAtIndex:0] == 'D') { continue; } length = [[components objectAtIndex:3] intValue]; // extract the path, it's always the last element path = [[components lastObject] stringByRemovingWhitespaceFromBeginning]; date = [components objectAtIndex:0]; time = [components objectAtIndex:1]; date = [NSString stringWithFormat:@"%@ %@", date, time]; calendarDate = [NSCalendarDate dateWithString:date calendarFormat:@"%Y-%m-%d %H:%M:%S"]; info = [FileInfo newWithPath:path date:calendarDate size:[NSNumber numberWithInt:length]]; [results addObject:info]; } return results; } - (NSData *)dataByRunningSevenZip { // l = list NSArray *args = [NSArray arrayWithObjects:@"l", @"--", [self path], nil]; return [self dataByRunningUnachiverWithArguments:args]; } @end Zipper-1.5/TableViewDataSource.h0000644000175000017500000000175211722162461017015 0ustar sebastiasebastia/* TableViewDataSource.h Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: Dirk Olmes Riccardo Mottola This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import @class Archive; #define COL_ID_NAME @"name" #define COL_ID_DATE @"date" #define COL_ID_SIZE @"size" #define COL_ID_PATH @"path" #define COL_ID_RATIO @"ratio" @interface TableViewDataSource : NSObject { @private Archive *_archive; } - (void)setArchive:(Archive *)archive; @end Zipper-1.5/TableViewDataSource.m0000644000175000017500000000507512104667540017027 0ustar sebastiasebastia/* TableViewDataSource.m Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: Dirk Olmes Riccardo Mottola This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import #import "TableViewDataSource.h" #import "Archive.h" #import "FileInfo.h" #define X_INVALID_COL_ID @"InvalidColumIdentiferException" @implementation TableViewDataSource : NSObject - (void)setArchive:(Archive *)archive; { [_archive release]; _archive = archive; [_archive retain]; } //------------------------------------------------------------------------------ // Implementation NSTableView DataSource //------------------------------------------------------------------------------ - (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView { return [_archive elementCount]; } - (void) tableView: (NSTableView *)tableView willDisplayCell: (id)aCell forTableColumn: (NSTableColumn *)tableColumn row: (NSInteger)row { NSImage *image; FileInfo *fileInfo = [_archive elementAtIndex: row]; NSString *identifier = [tableColumn identifier]; if ([identifier isEqual:COL_ID_NAME]) { image = [[NSWorkspace sharedWorkspace] iconForFile: [fileInfo filename]]; [image setScalesWhenResized: YES]; [image setSize: NSMakeSize(16,16)]; [aCell setImage: image]; } } - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex { FileInfo *fileInfo = [_archive elementAtIndex:rowIndex]; NSString *identifier = [aTableColumn identifier]; if ([identifier isEqual:COL_ID_NAME]) { return [fileInfo filename]; } else if ([identifier isEqual:COL_ID_DATE]) { return [[fileInfo date] descriptionWithCalendarFormat:@"%y-%m-%d %H:%M:%S"]; } else if ([identifier isEqual:COL_ID_SIZE]) { return [fileInfo size]; } else if ([identifier isEqual:COL_ID_PATH]) { return [fileInfo path]; } else if ([identifier isEqual:COL_ID_RATIO]) { return [fileInfo ratio]; } else { [NSException raise:X_INVALID_COL_ID format:@"invalid column identifier '%@'", identifier]; } // shut up the compiler return nil; } @end Zipper-1.5/TarArchive.h0000644000175000017500000000205612101060334015172 0ustar sebastiasebastia/* TarArchive.h Zipper Copyright (C) 2012-2013 Free Software Foundation, Inc Authors: Dirk Olmes Riccardo Mottola Sebastian Reitenbach This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import #import "Archive.h" @interface TarArchive : Archive { } - (int)expandFiles:(NSArray *)files withPathInfo:(BOOL)usePathInfo toPath:(NSString *)path; - (NSArray *)listContents; + (void)createArchive:(NSString *)archivePath withFiles:(NSArray *)filenames archiveType:(ArchiveType) archiveType; @end Zipper-1.5/TarArchive.m0000644000175000017500000002151112101060334015174 0ustar sebastiasebastia/* TarArchive.m Zipper Copyright (C) 2012-2013 Free Software Foundation, Inc Authors: Dirk Olmes Riccardo Mottola Sebastian Reitenbach This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import #import #import "TarArchive.h" #import "FileInfo.h" #import "NSString+Custom.h" #import "Preferences.h" #import "NSArray+Custom.h" @interface TarArchive (PrivateAPI) - (NSData *)dataByRunningTar; - (FileInfo *)fileInfoFromLine:(NSString *)line; @end @implementation TarArchive : Archive /** * register our supported file extensions with superclass. */ + (void)initialize { [self registerFileExtension:@"tar" forArchiveClass:self]; [self registerFileExtension:@"tar.gz" forArchiveClass:self]; [self registerFileExtension:@"tgz" forArchiveClass:self]; [self registerFileExtension:@"tar.bz2" forArchiveClass:self]; [self registerFileExtension:@"tar.xz" forArchiveClass:self]; } + (NSString *)unarchiveExecutable { return [Preferences tarExecutable]; } /** * Tar files inherently have the full path info and can't be uncompressed flat. */ + (BOOL)canExtractWithoutFullPath { return NO; } + (ArchiveType)archiveType { return TAR; } //------------------------------------------------------------------------------ // expanding the archive //------------------------------------------------------------------------------ - (int)expandFiles:(NSArray *)files withPathInfo:(BOOL)usePathInfo toPath:(NSString *)path { FileInfo *fileInfo; NSString *compressionArg; NSMutableArray *args; compressionArg = [Preferences compressionArgumentForFile:[self path]]; NSParameterAssert(compressionArg != nil); args = [NSMutableArray array]; [args addObject:@"-x"]; if (compressionArg != nil && [compressionArg length] > 0) { // compression method [args addObject:compressionArg]; } // the archive [args addObject:@"-f"]; [args addObject:[self path]]; // destination dir [args addObject:@"-C"]; [args addObject:path]; if (files != nil) { NSEnumerator *cursor = [files objectEnumerator]; while ((fileInfo = [cursor nextObject]) != nil) { [args addObject:[fileInfo fullPath]]; } } return [self runUnarchiverWithArguments:args]; } - (NSArray *)listContents { NSString *line; NSMutableArray *results = [NSMutableArray array]; NSData *data; NSString *string; NSArray *lines; NSEnumerator *cursor; data = [self dataByRunningTar]; string = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; lines = [string componentsSeparatedByString:@"\n"]; [string release]; cursor = [lines objectEnumerator]; while ((line = [cursor nextObject]) != nil) { FileInfo *info; // BSD tar seems to add linefeed at the end of the line. strip that if ([line hasSuffix:@"\r"]) { line = [line substringToIndex:[line length] - 1]; } // we skip empty lines and plain directory entries if (([line length] == 0) || [line hasSuffix:@"/"]) { continue; } info = [self fileInfoFromLine:line]; if (info) [results addObject:info]; } return results; } //------------------------------------------------------------------------------ // creating archives //------------------------------------------------------------------------------ + (void)createArchive:(NSString *)archivePath withFiles:(NSArray *)filenames archiveType: (ArchiveType) archiveType { NSEnumerator *filenameCursor; NSString *filename; NSString *workdir; NSMutableArray *arguments; // make sure archivePath has the correct suffix // and build the command line arguments arguments = [NSMutableArray array]; switch (archiveType) { case TAR: if ([archivePath hasSuffix:@".tar"] == NO) { archivePath = [archivePath stringByAppendingString:@".tar"]; } [arguments addObject:@"-cf"]; break; case TARGZ: if ([archivePath hasSuffix:@".tar.gz"] == NO) { archivePath = [archivePath stringByAppendingString:@".tar.gz"]; } [arguments addObject:@"-czf"]; break; case TARBZ2: if ([archivePath hasSuffix:@".tar.bz2"] == NO) { archivePath = [archivePath stringByAppendingString:@".tar.bz2"]; } [arguments addObject:@"-cjf"]; break; case TARXZ: if ([Preferences isBsdTar]) { // this is at least true on OpenBSD NSRunAlertPanel(@"Error", @"BSD tar doesn't support creation of tar.xz archives", @"OK", nil, nil, nil); return; } if ([archivePath hasSuffix:@".tar.xz"] == NO) { archivePath = [archivePath stringByAppendingString:@".tar.xz"]; } [arguments addObject:@"-cJf"]; break; default: NSRunAlertPanel(@"Error", @"This type of tar archive is not supported for archive creation", @"OK", nil, nil, nil); return; } [arguments addObject:archivePath]; // filenames contains absolute paths, convert them to relative paths. This works // because you can select only files/directories below a current directory in // GWorkspace so all the files *have* to have a common filesystem root. filenameCursor = [filenames objectEnumerator]; while ((filename = [filenameCursor nextObject]) != nil) { [arguments addObject:[filename lastPathComponent]]; } // change into this directory when running the task workdir = [[filenames objectAtIndex:0] stringByDeletingLastPathComponent]; // create the archive. In the case of TarArchive the unarchiver can also create // archives [self runUnarchiverWithArguments:arguments inDirectory:workdir]; } //------------------------------------------------------------------------------ // private API //------------------------------------------------------------------------------ - (NSData *)dataByRunningTar { NSString *compressionArg; NSMutableArray *arguments; compressionArg = [Preferences compressionArgumentForFile:[self path]]; NSParameterAssert(compressionArg != nil); arguments = [NSMutableArray arrayWithObject:@"-tv"]; if ([compressionArg isEqual:@""] == NO) { [arguments addObject:compressionArg]; } [arguments addObject:@"-f"]; [arguments addObject:[self path]]; return [self dataByRunningUnachiverWithArguments:arguments]; } - (FileInfo *)fileInfoFromLine:(NSString *)line { int index, length = -1; NSString *path = nil; NSString *dateString = nil; NSString *time = nil; NSCalendarDate *calendarDate = nil; NSArray *components; FileInfo *fileInfo = nil; if (line == nil || [line length] == 0) return nil; if ([line hasPrefix:@"tar: "]) return nil; components = [line componentsSeparatedByString:@" "]; components = [components arrayByRemovingEmptyStrings]; if ([Preferences isBsdTar]) { NSArray *dateComponents; // BSD tar length = [[components objectAtIndex:4] intValue]; dateComponents = [components subarrayWithRange:NSMakeRange(5, 3)]; dateString = [dateComponents componentsJoinedByString:@" "]; if ([dateString rangeOfString:@":"].location != NSNotFound) calendarDate = [NSCalendarDate dateWithString:dateString calendarFormat:@"%b %d %H:%M"]; else calendarDate = [NSCalendarDate dateWithString:dateString calendarFormat:@"%b %d %Y"]; index = [line rangeOfString:[components objectAtIndex:7]].location; index += [[components objectAtIndex:7] length]; } else { // linux tar NSString *date; length = [[components objectAtIndex:2] intValue]; date = [components objectAtIndex:3]; time = [components objectAtIndex:4]; dateString = [NSString stringWithFormat:@"%@ %@", date, time]; calendarDate = [NSCalendarDate dateWithString:dateString calendarFormat:@"%Y-%m-%d %H:%M"]; if (calendarDate == nil) calendarDate = [NSCalendarDate dateWithString:dateString calendarFormat:@"%Y-%m-%d %H:%M:%S"]; index = [line rangeOfString:dateString].location; index += [dateString length]; } // The path is everything after the date string. Since it can contain blanks, // do *not* just grab any objects from components array if (index > 0) { path = [[line substringFromIndex:index] stringByRemovingWhitespaceFromBeginning]; fileInfo = [FileInfo newWithPath:path date:calendarDate size:[NSNumber numberWithInt:length]]; } return fileInfo; } @end Zipper-1.5/ZipArchive.h0000644000175000017500000000175112067061045015222 0ustar sebastiasebastia/* ZipArchive.h Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: Dirk Olmes Riccardo Mottola This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import #import "Archive.h" @interface ZipArchive : Archive { } - (int)expandFiles:(NSArray *)files withPathInfo:(BOOL)usePathInfo toPath:(NSString *)path; - (NSArray *)listContents; + (void)createArchive:(NSString *)archivePath withFiles:(NSArray *)filenames archiveType:(ArchiveType) archiveType; @end Zipper-1.5/ZipArchive.m0000644000175000017500000001544112067061045015230 0ustar sebastiasebastia/* ZipArchive.m Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: Dirk Olmes Riccardo Mottola This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import #import "ZipArchive.h" #import "FileInfo.h" #import "NSString+Custom.h" #import "Preferences.h" #import "NSArray+Custom.h" // if the output contains this string in the first line, we have to use a different // parsing routine #define MINI_UNZIP_IDENTIFIER @"MiniUnz" static NSData *_magicBytes = nil; @interface ZipArchive (PrivateAPI) - (NSData *)dataByRunningUnzip; - (NSArray *)listUnzipContents:(NSArray *)lines; @end @implementation ZipArchive : Archive /** * register our supported file extensions with superclass. */ + (void)initialize { // zip files start with 'P K 0x003 0x004' char zipBytes[] = { 'P', 'K', 0x003, 0x004 }; _magicBytes = [[NSData dataWithBytes:zipBytes length:4] retain]; [self registerFileExtension:@"zip" forArchiveClass:self]; [self registerFileExtension:@"jar" forArchiveClass:self]; } + (NSString *)archiveExecutable { return [Preferences zipExecutable]; } + (NSString *)unarchiveExecutable { return [Preferences unzipExecutable]; } + (BOOL)hasRatio; { // unzip does provide info about the compression ratio return YES; } + (ArchiveType)archiveType { return ZIP; } + (NSData *)magicBytes { return _magicBytes; } //------------------------------------------------------------------------------ // expanding the archive //------------------------------------------------------------------------------ - (int)expandFiles:(NSArray *)files withPathInfo:(BOOL)usePathInfo toPath:(NSString *)path { FileInfo *fileInfo; NSMutableArray *args; args = [NSMutableArray array]; // be really quiet [args addObject:@"-qq"]; // overwrite without warning [args addObject:@"-o"]; if (usePathInfo == NO) { // junk paths [args addObject:@"-j"]; } // destination dir [args addObject:@"-d"]; [args addObject:path]; // protect against archives and files starting with - [args addObject:@"--"]; [args addObject:[self path]]; if (files != nil) { NSEnumerator *cursor = [files objectEnumerator]; while ((fileInfo = [cursor nextObject]) != nil) { [args addObject:[fileInfo fullPath]]; } } return [self runUnarchiverWithArguments:args]; } - (NSArray *)listContents { NSData *data = [self dataByRunningUnzip]; NSString *string = [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease]; NSArray *lines = [string componentsSeparatedByString:@"\n"]; if ([[lines objectAtIndex:0] containsString:MINI_UNZIP_IDENTIFIER]) { // take out the first 6 lines (header) lines = [lines subarrayWithRange:NSMakeRange(6, [lines count] - 6)]; } return [self listUnzipContents:lines]; } - (NSArray *)listUnzipContents:(NSArray *)lines { NSEnumerator *cursor; NSString *line; NSMutableArray *results = [NSMutableArray array]; cursor = [lines objectEnumerator]; while ((line = [cursor nextObject]) != nil) { int length, index; NSString *path, *date, *time, *ratio, *checksum; NSCalendarDate *calendarDate; NSArray *components; if (line == nil || [line length] == 0) continue; components = [line componentsSeparatedByString:@" "]; components = [components arrayByRemovingEmptyStrings]; length = [[components objectAtIndex:0] intValue]; ratio = [components objectAtIndex:3]; // extract the path. The checksum is the last token before the full path // (which can contain blanks) checksum = [components objectAtIndex:6]; index = [line rangeOfString:checksum].location; index += [checksum length]; path = [[line substringFromIndex:index] stringByRemovingWhitespaceFromBeginning]; date = [components objectAtIndex:4]; time = [components objectAtIndex:5]; date = [NSString stringWithFormat:@"%@ %@", date, time]; calendarDate = [NSCalendarDate dateWithString:date calendarFormat:@"%m-%d-%Y %H:%M"]; // we skip plain directory entries if ([path hasSuffix:@"/"] == NO) { FileInfo *info; info = [FileInfo newWithPath:path date:calendarDate size:[NSNumber numberWithInt:length] ratio:ratio]; if (info) [results addObject:info]; [info release]; } } return results; } //------------------------------------------------------------------------------ // creating archives //------------------------------------------------------------------------------ + (void)createArchive:(NSString *)archivePath withFiles:(NSArray *)filenames archiveType: (ArchiveType) archiveType { NSEnumerator *filenameCursor; NSString *filename; NSString *workdir; NSMutableArray *arguments; // make sure archivePath has the correct suffix if ([archivePath hasSuffix:@".zip"] == NO) { archivePath = [archivePath stringByAppendingString:@".zip"]; } // build arguments for commandline: zip -r filename arguments = [NSMutableArray array]; [arguments addObject:@"-r"]; [arguments addObject:archivePath]; // filenames contains absolute paths, convert them to relative paths. This works // because you can select only files/directories below a current directory in // GWorkspace so all the files *have* to have a common filesystem root. filenameCursor = [filenames objectEnumerator]; while ((filename = [filenameCursor nextObject]) != nil) { [arguments addObject:[filename lastPathComponent]]; } // change into this directory when running the task workdir = [[filenames objectAtIndex:0] stringByDeletingLastPathComponent]; [self runArchiverWithArguments:arguments inDirectory:workdir]; } //------------------------------------------------------------------------------ // private API //------------------------------------------------------------------------------ - (NSData *)dataByRunningUnzip { // l = list // v = display all zip infos (Ratio etc.) // qq = quiet, this is important for skipping comments in archives and for skipping // the nice headers for readable output NSArray *args = [NSArray arrayWithObjects:@"-lvqq", @"--", [self path], nil]; return [self dataByRunningUnachiverWithArguments:args]; } @end Zipper-1.5/ZipperCell.h0000644000175000017500000000135711723355621015235 0ustar sebastiasebastia/* ZipperCell.h Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: Dirk Olmes Riccardo Mottola This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import @interface ZipperCell : NSTextFieldCell @end Zipper-1.5/ZipperCell.m0000644000175000017500000000512511723355621015237 0ustar sebastiasebastia/* ZipperCell.m Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: Dirk Olmes Riccardo Mottola This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import #import "ZipperCell.h" @implementation ZipperCell : NSTextFieldCell - (id) init { self = [super initTextCell: @""]; return self; } /* * drawInteriorWithFrame is copied from NSCell.m and NSTextFieldCell.m * and modified to to display an image _and_ text. */ - (void) drawInteriorWithFrame: (NSRect)cellFrame inView: (NSView*)controlView { NSAttributedString *attStrVal; if ([self drawsBackground]) { [[self backgroundColor] set]; NSRectFill ([self drawingRectForBounds: cellFrame]); } if (![controlView window]) { return; } cellFrame = [self drawingRectForBounds: cellFrame]; //FIXME: Check if this is also neccessary for images, // Add spacing between border and inside if ([self isBordered] || [self isBezeled]) { cellFrame.origin.x += 3; cellFrame.size.width -= 6; cellFrame.origin.y += 1; cellFrame.size.height -= 2; } if ([self image]) { NSSize size; NSPoint position; size = [[self image] size]; position.x = 0.; position.y = MAX(NSMidY(cellFrame) - (size.height/2.),0.); /* * Images are always drawn with their bottom-left corner * at the origin so we must adjust the position to take * account of a flipped view. */ if ([controlView isFlipped]) position.y += size.height; [[self image] compositeToPoint: position operation: NSCompositeSourceOver]; cellFrame.origin.x += size.width+3; cellFrame.size.width -= (size.width+3); } attStrVal = [self attributedStringValue]; if (attStrVal) { NSRect aRect; NSSize stringSize; stringSize = [attStrVal size]; aRect = cellFrame; aRect.origin.y = NSMidY (aRect) - stringSize.height/2; aRect.size.height = stringSize.height; [attStrVal drawInRect: cellFrame]; } if ([self showsFirstResponder]) { NSDottedFrameRect(cellFrame); } } @end Zipper-1.5/ZipperDocument.h0000644000175000017500000000167211720473401016126 0ustar sebastiasebastia/* ZipperDocument.h Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: Dirk Olmes Riccardo Mottola «rm@gnu.org> This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import @class Archive, TableViewDataSource; @interface ZipperDocument : NSDocument { IBOutlet NSTableView *_tableView; Archive *_archive; IBOutlet TableViewDataSource *_tableViewDataSource; } - (TableViewDataSource *)tableViewDataSource; @end Zipper-1.5/ZipperDocument.m0000644000175000017500000003533112070542302016126 0ustar sebastiasebastia/* ZipperDocument.m Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: Dirk Olmes Riccardo Mottola This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import #import #import "ZipperDocument.h" #import "ZipperCell.h" #import "Archive.h" #import "TableViewDataSource.h" #import "PreferencesController.h" #import "Preferences.h" #import "NSFileManager+Custom.h" #import "FileInfo.h" #define X_INVALID_COL_ID @"InvalidColumIdentiferException" #if !defined (GNUSTEP) && (MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4) #define sel_isEqual(s1,s2) ((s1)==(s2)) #endif @interface ZipperDocument (PrivateAPI) - (BOOL)openArchiveWithPath:(NSString *)path; - (void)addRatioColumn; - (void)removeRatioColumn; - (void)extractIncludingPathInfo:(BOOL)includePathInfo; - (void)setArchive:(Archive *)archive; - (void)openFile:(NSString *)file withDefaultApp:(NSString *)defaultApp; - (Class)archiveClassForFile:(NSString *)filename; - (Class)archiveClassByFileExtension:(NSString *)path; - (Class)archiveClassByFileContents:(NSString *)path; - (BOOL)createUnarchiveDestinationIfNecessary:(NSString *)path; @end @implementation ZipperDocument : NSDocument - (id)init { [super init]; _tableViewDataSource = nil; return self; } - (void)dealloc { [_archive release]; [_tableViewDataSource release]; [super dealloc]; } //----------------------------------------------------------------------------- // NSDocument overrides //----------------------------------------------------------------------------- /*" Name of the .gsmarkup file to load */ - (NSString *)windowNibName { return @"ZipperDocument"; } /*" Override of NSDocument, called when document is about to be opened */ - (void)windowControllerDidLoadNib:(NSWindowController *)controller; { NSSize size; NSTableColumn *tableColumn; NSCell *cell = [[ZipperCell alloc] init]; [super windowControllerDidLoadNib: controller]; [_tableView setDataSource: [self tableViewDataSource]]; [_tableView reloadData]; [_tableView setDoubleAction: @selector(tableViewDoubleAction:)]; // allow for a little bit more space between the columns size = [_tableView intercellSpacing]; size.width += 5.0; [_tableView setIntercellSpacing:size]; // right-align the size column tableColumn = [_tableView tableColumnWithIdentifier:COL_ID_SIZE]; [[tableColumn dataCell] setAlignment:NSRightTextAlignment]; // set the ZipperCell for the name column tableColumn = [_tableView tableColumnWithIdentifier:COL_ID_NAME]; [tableColumn setDataCell:cell]; [cell release]; } - (BOOL)readFromFile:(NSString *)fileName ofType:(NSString *)docType { return [self openArchiveWithPath:fileName]; } //----------------------------------------------------------------------------- // Opening archive files //----------------------------------------------------------------------------- - (BOOL)openArchiveWithPath:(NSString *)path { Class archiveClass = nil; archiveClass = [self archiveClassForFile:path]; NSAssert1(archiveClass != nil, @"No archive class registered for '%@'. This should not happen", path); if ([archiveClass executableDoesExist] == NO) { // ouch, no executable set (yet) NSString *message; PreferencesController *prefsController; message = [NSString stringWithFormat: @"Missing unarchiver for file \"%@\". Please provide a value!", path]; NSRunAlertPanel(@"Error in Preferences", message, nil, nil, nil); // bring up the prefs panel prefsController = [[PreferencesController alloc] init]; [prefsController showPreferencesPanel]; [prefsController release]; // invoke recursively as the unarchiver should have been set in prefs by now if ([archiveClass executableDoesExist]) { return [self openArchiveWithPath:path]; } else { // no archiver executable set via prefs, give up return NO; } } if ([archiveClass hasRatio]) { [self addRatioColumn]; } else { [self removeRatioColumn]; } [self setArchive:[archiveClass newWithPath:path]]; [_archive sortByFilename]; [_tableView reloadData]; return YES; } - (Class)archiveClassForFile:(NSString *)path { Class archiveClass; archiveClass = [self archiveClassByFileContents:path]; if (archiveClass == nil) { archiveClass = [self archiveClassByFileExtension:path]; } return archiveClass; } - (Class)archiveClassByFileExtension:(NSString *)path { NSString *extension, *secondExtension; Class archiveClass = nil; extension = [[path pathExtension] lowercaseString]; secondExtension = [[[path stringByDeletingPathExtension] pathExtension] lowercaseString]; if ([extension isEqual:@""] == NO) { NSString *fullExtension; if ([secondExtension isEqual:@""]) { // extension is .gz, .bz etc. fullExtension = extension; } else { // extension is .tar.gz etc. fullExtension = [secondExtension stringByAppendingPathExtension:extension]; } archiveClass = [Archive classForFileExtension:fullExtension]; if (archiveClass == nil) { NSLog(@"No archive class registered for '%@'.", fullExtension); // try only the last extension archiveClass = [Archive classForFileExtension:extension]; } } return archiveClass; } /*" * Peek inside path to determine file type. This is necessary as some file extensions * are ambiguous, e.g. .rar files can either be Java resource archives or rar-packaged files */ - (Class)archiveClassByFileContents:(NSString *)path { NSFileHandle *fileHandle; NSData *data, *headerData; NSEnumerator *archiverEnum; Class archiverClass; fileHandle = [NSFileHandle fileHandleForReadingAtPath:path]; data = [fileHandle readDataOfLength:4]; archiverEnum = [[Archive allArchivers] objectEnumerator]; while ((archiverClass = [archiverEnum nextObject]) != nil) { headerData = [archiverClass magicBytes]; if ((headerData != nil) && [headerData isEqualToData:data]) { return archiverClass; } } return nil; } //----------------------------------------------------------------------------- // validating the UI //----------------------------------------------------------------------------- - (BOOL)validateMenuItem:(NSMenuItem *)anItem { SEL action = [anItem action]; if (sel_isEqual(action, @selector(openFile:)) || sel_isEqual(action, @selector(showPreferences:))) { return YES; } // enable the extract menu item only if we have something to extract if (_archive == nil) { return NO; } // do not enable the 'extract flat' menu item if the extractor does not support it if (([anItem tag] == 2) && ([[_archive class] canExtractWithoutFullPath] == NO)) { return NO; } return YES; } //------------------------------------------------------------------------------ // action methods //------------------------------------------------------------------------------ - (void)extract:(id)sender { [self extractIncludingPathInfo:YES]; } - (void)extractFlat:(id)sender { [self extractIncludingPathInfo:NO]; } - (void)extractIncludingPathInfo:(BOOL)includePathInfo { NSOpenPanel *openPanel; int rc; if (_archive == nil) { return; } openPanel = [NSOpenPanel openPanel]; //[openPanel setDelegate:self]; [openPanel setTitle:@"Extract to"]; [openPanel setCanChooseFiles:NO]; [openPanel setCanChooseDirectories:YES]; rc = [openPanel runModalForDirectory:[Preferences lastExtractDirectory] file:nil types:nil]; if (rc == NSOKButton) { NSString *message; int result; NSString *path = [openPanel directory]; // make sure the destination path exists if ([self createUnarchiveDestinationIfNecessary:path] == NO) { return; } if ([_tableView selectedRow] == -1) { // no rows selected ... extract the whole archive result = [_archive expandFiles:nil withPathInfo:includePathInfo toPath:path]; } else { NSNumber *rowIndex; // retrieve selected rows && extract them NSMutableArray *extractFiles = [NSMutableArray array]; NSEnumerator *rows = [_tableView selectedRowEnumerator]; while ((rowIndex = [rows nextObject]) != nil) { [extractFiles addObject:[_archive elementAtIndex:[rowIndex intValue]]]; } result = [_archive expandFiles:extractFiles withPathInfo:includePathInfo toPath:path]; } // save the selected directory for later [Preferences setLastExtractDirectory:path]; if (!result) { message = [NSString stringWithFormat:@"Successfully expanded to %@", path]; } else { message = [NSString stringWithFormat:@"A problem occured expanding archive to %@", path]; } NSRunAlertPanel(@"Expand", message, nil, nil, nil); } } - (void)selectAll:(id)sender { [_tableView selectAll: self]; } - (void)deselectAll:(id)sender { [_tableView deselectAll: self]; } - (void)tableViewDoubleAction:(id)sender { NSEnumerator *enumerator; NSMutableArray *filesToExtract; NSNumber *row; NSString *tempDir; FileInfo *info; if ([_tableView clickedRow] == -1) { return; } // collect all files to extract filesToExtract = [NSMutableArray array]; enumerator = [_tableView selectedRowEnumerator]; while ((row = [enumerator nextObject]) != nil) { [filesToExtract addObject:[_archive elementAtIndex:[row intValue]]]; } tempDir = [[NSFileManager defaultManager] createTemporaryDirectory]; [_archive expandFiles:filesToExtract withPathInfo:YES toPath:tempDir]; // NSWorkspace hopefully knows how to handle the file enumerator = [filesToExtract objectEnumerator]; while ((info = [enumerator nextObject]) != nil) { NSString *tempFile; tempFile = [NSString pathWithComponents:[NSArray arrayWithObjects:tempDir, [info fullPath], nil]]; [self openFile:tempFile withDefaultApp:[Preferences defaultOpenApp]]; } } //- (BOOL)panel:(id)sender isValidFilename:(NSString *)filename //{ // NSLog(@"panel:isValidFilename: %@", filename); // return YES; //} // //- (NSString *)panel:(id)sender userEnteredFilename:(NSString *)filename confirmed:(BOOL)okFlag //{ // NSLog(@"userEnteredFilename: %@", filename); // return filename; //} //------------------------------------------------------------------------------ // private API //------------------------------------------------------------------------------ - (void)addRatioColumn { NSTableColumn *ratioColumn; int colIndex; // do it only if the tableView was already loaded if (_tableView != nil) { ratioColumn = [_tableView tableColumnWithIdentifier:COL_ID_RATIO]; if (ratioColumn == nil) { ratioColumn = [[(NSTableColumn *)[NSTableColumn alloc] initWithIdentifier:COL_ID_RATIO] autorelease]; [[ratioColumn headerCell] setStringValue:@"Ratio"]; [ratioColumn setWidth:50.0]; [[ratioColumn dataCell] setAlignment:NSRightTextAlignment]; [_tableView addTableColumn:ratioColumn]; } // here we have a ratio column for sure colIndex = [_tableView columnWithIdentifier:COL_ID_RATIO]; [_tableView moveColumn:colIndex toColumn:3]; [_tableView reloadData]; } } - (void)removeRatioColumn; { if (_tableView != nil) { NSTableColumn *ratioCol; ratioCol = [_tableView tableColumnWithIdentifier:COL_ID_RATIO]; if (ratioCol != nil) { [_tableView removeTableColumn:ratioCol]; } } } /** * Returns the DataSource for our table view */ - (TableViewDataSource *)tableViewDataSource { if (_tableViewDataSource == nil) { _tableViewDataSource = [[TableViewDataSource alloc] init]; [_tableViewDataSource setArchive:_archive]; } return _tableViewDataSource; } - (void)setArchive:(Archive *)archive { [_archive release]; _archive = archive; [_archive retain]; // make sure the data source knows the archive as well [_tableViewDataSource setArchive:archive]; } - (void)openFile:(NSString *)file withDefaultApp:(NSString *)defaultApp; { int rc; // this sux: if the file does not have an extension, NSWorkspace does not know how to // handle it. Handling of files should be based on file's contents instead of its // extension, like the unix command 'file' does. rc = [[NSWorkspace sharedWorkspace] openFile:file]; if (rc == NO) { // NSWorkspace could not open the file, try again with the default app we've been given if (defaultApp != nil) { rc = [[NSWorkspace sharedWorkspace] openFile:file withApplication:defaultApp]; } else { NSRunAlertPanel(@"Could not open", @"No default open application set in preferences", nil, nil, nil); return; } } if (rc == NO) { NSRunAlertPanel(@"Could not open", @"Don't know how to open file %@", nil, nil, nil, file); } } - (BOOL)createUnarchiveDestinationIfNecessary:(NSString *)path { BOOL isDir, dirExists; dirExists = [[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDir]; if (dirExists == NO) { int rc; rc = NSRunAlertPanel(@"Nonexisting destination", @"The directory '%@' does not exist, do you want to create it?", @"Yes", @"No", nil, path); if (rc == NSAlertDefaultReturn) { [[NSFileManager defaultManager] createDirectoryPathWithParents:path]; } else { return NO; } } return YES; } //------------------------------------------------------------------------------ // NSTableView delegate methods //------------------------------------------------------------------------------ - (void)tableView:(NSTableView *)tableView didClickTableColumn:(NSTableColumn *)tableColumn { NSString *identifier = [tableColumn identifier]; NSImage *image; if ([identifier isEqual:COL_ID_NAME]) [_archive sortByFilename]; else if ([identifier isEqual:COL_ID_DATE]) [_archive sortByDate]; else if ([identifier isEqual:COL_ID_SIZE]) [_archive sortBySize]; else if ([identifier isEqual:COL_ID_PATH]) [_archive sortByPath]; else if ([identifier isEqual:COL_ID_RATIO]) [_archive sortByRatio]; else [NSException raise:X_INVALID_COL_ID format:@"invalid column identifier '%@'", identifier]; // reflect the current sort ordering in tableColumn's indicator image image = nil; if ([_archive sortOrder] == NSOrderedAscending) { // TODO gnustep-gui does not have an image preregistered under that name image = [NSImage imageNamed:@"NSAscendingSortIndicator"]; } else { // TODO gnustep-gui does not have an image preregistered under that name image = [NSImage imageNamed:@"NSDescendingSortIndicator"]; } // TODO this isn't implemented in gnustep-gui [tableView setIndicatorImage:image inTableColumn:tableColumn]; [tableView reloadData]; } @end Zipper-1.5/ZipperInfo.plist0000644000175000017500000001017712123155710016145 0ustar sebastiasebastia{ ApplicationDescription = "GUI for various compressed file formats"; ApplicationName = "Zipper"; ApplicationRelease = "1.5"; ApplicationURL = "http://gap.nongnu.org/zipper/"; NSIcon = "zipper.tiff"; NSMainNibFile = MainMenu.gorm; NSPrincipalClass = NSApplication; Authors = ("The GAP Team", "Dirk Olmes "); Copyright = "Copyright (C) 2008-2013"; CopyrightDescription = "Released under GPLv2 or later"; NSTypes = ( { NSName = "Ace"; NSHumanReadableName = "Ace Archive"; NSUnixExtensions = ( "ace", "ACE" ); NSIcon = "FileIcon.tiff"; NSDocumentClass = "ZipperDocument"; NSRole = "Editor"; }, { NSName = "Arj"; NSHumanReadableName = "Arj Archive"; NSUnixExtensions = ( "arj", "ARJ" ); NSIcon = "FileIcon.tiff"; NSDocumentClass = "ZipperDocument"; NSRole = "Editor"; }, { NSName = "Zoo"; NSHumanReadableName = "Zoo Archive"; NSUnixExtensions = ( "zoo", "ZOO" ); NSIcon = "FileIcon.tiff"; NSDocumentClass = "ZipperDocument"; NSRole = "Editor"; }, { NSName = "Zip"; NSHumanReadableName = "Zip Archive"; NSUnixExtensions = ( "zip", "ZIP", "jar", "JAR", "ear", "EAR" ); NSIcon = "FileIcon.tiff"; NSDocumentClass = "ZipperDocument"; NSRole = "Editor"; }, { NSName = "7Zip"; NSHumanReadableName = "7Zip Archive"; NSUnixExtensions = ( "7z", "7Z", "7za", "7ZA" ); NSIcon = "FileIcon.tiff"; NSDocumentClass = "ZipperDocument"; NSRole = "Editor"; }, { NSName = "Tar"; NSHumanReadableName = "Tar Archive"; NSUnixExtensions = ( "tar", "TAR" ); NSIcon = "FileIcon.tiff"; NSDocumentClass = "ZipperDocument"; NSRole = "Editor"; }, { NSName = "TarGz"; NSHumanReadableName = "Compressed Tar Archive"; NSUnixExtensions = ( "gz", "GZ", "tgz", "TGZ" ); NSIcon = "FileIcon.tiff"; NSDocumentClass = "ZipperDocument"; NSRole = "Editor"; }, { NSName = "TarBz2"; NSHumanReadableName = "Compressed Tar Archive"; NSUnixExtensions = ( "bz2", "BZ2", "tbz2", "TBZ2" ); NSIcon = "FileIcon.tiff"; NSDocumentClass = "ZipperDocument"; NSRole = "Editor"; }, { NSName = "Rar"; NSHumanReadableName = "Rar Archive"; NSUnixExtensions = ( "rar", "RAR" ); NSIcon = "FileIcon.tiff"; NSDocumentClass = "ZipperDocument"; NSRole = "Editor"; }, { NSName = "Lha"; NSHumanReadableName = "Lha Archive"; NSUnixExtensions = ( "lha", "LHA" ); NSIcon = "FileIcon.tiff"; NSDocumentClass = "ZipperDocument"; NSRole = "Editor"; }, { NSName = "Lzx"; NSHumanReadableName = "Lzx Archive"; NSUnixExtensions = ( "lzx", "LZX" ); NSIcon = "FileIcon.tiff"; NSDocumentClass = "ZipperDocument"; NSRole = "Editor"; } ); NSServices = ( { NSPortName = "Zipper"; NSMessage = "createZooArchive"; NSSendTypes = (NSFilenamesPboardType); NSMenuItem = { default = "Zipper/Create zoo archive"; }; }, { NSPortName = "Zipper"; NSMessage = "create7zArchive"; NSSendTypes = (NSFilenamesPboardType); NSMenuItem = { default = "Zipper/Create 7z archive"; }; }, { NSPortName = "Zipper"; NSMessage = "createLhaArchive"; NSSendTypes = (NSFilenamesPboardType); NSMenuItem = { default = "Zipper/Create lha archive"; }; }, { NSPortName = "Zipper"; NSMessage = "createZipArchive"; NSSendTypes = (NSFilenamesPboardType); NSMenuItem = { default = "Zipper/Create zip archive"; }; }, { NSPortName = "Zipper"; NSMessage = "createTarArchive"; NSSendTypes = (NSFilenamesPboardType); NSMenuItem = { default = "Zipper/Create tar archive"; }; }, { NSPortName = "Zipper"; NSMessage = "createZippedTarArchive"; NSSendTypes = (NSFilenamesPboardType); NSMenuItem = { default = "Zipper/Create tar.gz archive"; }; }, { NSPortName = "Zipper"; NSMessage = "createBZippedTarArchive"; NSSendTypes = (NSFilenamesPboardType); NSMenuItem = { default = "Zipper/Create tar.bz2 archive"; }; }, { NSPortName = "Zipper"; NSMessage = "createXzTarArchive"; NSSendTypes = (NSFilenamesPboardType); NSMenuItem = { default = "Zipper/Create tar.xz archive"; }; } ); } Zipper-1.5/ZooArchive.h0000644000175000017500000000172112067112243015221 0ustar sebastiasebastia/* ZooArchive.h Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: Sebastian Reitenbach This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import #import "Archive.h" @interface ZooArchive : Archive { } - (int)expandFiles:(NSArray *)files withPathInfo:(BOOL)usePathInfo toPath:(NSString *)path; - (NSArray *)listContents; + (void)createArchive:(NSString *)archivePath withFiles:(NSArray *)filenames archiveType:(ArchiveType) archiveType; @end Zipper-1.5/ZooArchive.m0000644000175000017500000001734612070530760015242 0ustar sebastiasebastia/* ZooArchive.m Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: Sebastian Reitenbach This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ #import #import "ZooArchive.h" #import "FileInfo.h" #import "NSString+Custom.h" #import "Preferences.h" #import "NSArray+Custom.h" static NSData *_magicBytes = nil; @interface ZooArchive (PrivateAPI) - (NSData *)dataByRunningZoo; - (NSArray *)listZooContents:(NSArray *)lines; @end @implementation ZooArchive : Archive /** * register our supported file extensions with superclass. */ + (void)initialize { // zoo files start with 0xfdc4a7dc char zooBytes[] = { 0xfd, 0xc4, 0xa7, 0xdc }; _magicBytes = [[NSData dataWithBytes:zooBytes length:4] retain]; [self registerFileExtension:@"zoo" forArchiveClass:self]; } + (NSString *)archiveExecutable { return [Preferences zooExecutable]; } + (NSString *)unarchiveExecutable { return [Preferences zooExecutable]; } + (BOOL)hasRatio; { // unzip does provide info about the compression ratio return YES; } + (ArchiveType)archiveType { return ZOO; } + (NSData *)magicBytes { return _magicBytes; } //------------------------------------------------------------------------------ // expanding the archive //------------------------------------------------------------------------------ - (int)expandFiles:(NSArray *)files withPathInfo:(BOOL)usePathInfo toPath:(NSString *)path { FileInfo *fileInfo; NSMutableArray *args; args = [NSMutableArray array]; // be really quiet if (usePathInfo == YES) { // overwrite without warning [args addObject:@"x.OOqqq"]; } else { // junk paths [args addObject:@"x:OOqqq"]; } [args addObject:[self path]]; if (files != nil) { NSEnumerator *cursor = [files objectEnumerator]; while ((fileInfo = [cursor nextObject]) != nil) { [args addObject:[fileInfo fullPath]]; } } // zoo doesn't seem to support a parameter to specify destination directory return [self runUnarchiverWithArguments:args inDirectory:path]; } - (NSArray *)listContents { NSData *data = [self dataByRunningZoo]; NSString *string = [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease]; NSArray *lines = [string componentsSeparatedByString:@"\n"]; return [self listZooContents:lines]; } - (NSArray *)listZooContents:(NSArray *)lines { NSEnumerator *cursor; NSString *line; NSMutableArray *results = [NSMutableArray array]; cursor = [lines objectEnumerator]; while ((line = [cursor nextObject]) != nil) { int length, index; NSString *path, *date, *ratio, *checksum; NSCalendarDate *calendarDate; NSArray *components; if (line == nil || [line length] == 0) continue; components = [line componentsSeparatedByString:@" "]; components = [components arrayByRemovingEmptyStrings]; length = [[components objectAtIndex:0] intValue]; ratio = [components objectAtIndex:1]; // extract the path. The checksum is the last token before the full path // (which can contain blanks) checksum = [components objectAtIndex:6]; index = [line rangeOfString:checksum].location; index += [checksum length]; path = [[line substringFromIndex:index] stringByRemovingWhitespaceFromBeginning]; date = [NSString stringWithFormat:@"%@ %@ %@ %@", [components objectAtIndex:3], [components objectAtIndex:4], [components objectAtIndex:5], [components objectAtIndex:6]]; calendarDate = [NSCalendarDate dateWithString:date calendarFormat:@"%d %b %y %H:%M:%S"]; // we skip plain directory entries if ([path hasSuffix:@"/"] == NO) { FileInfo *info; info = [FileInfo newWithPath:path date:calendarDate size:[NSNumber numberWithInt:length] ratio:ratio]; if (info) [results addObject:info]; [info release]; } } return results; } //------------------------------------------------------------------------------ // creating archives //------------------------------------------------------------------------------ // this method should probably be split into separate methods + (void)createArchive:(NSString *)archivePath withFiles:(NSArray *)filenames archiveType: (ArchiveType) archiveType { NSEnumerator *filenameCursor; NSString *filename; NSString *workdir; NSMutableArray *arguments; NSPipe *pipe; NSData *inData; NSFileHandle *readHandle; NSTask *task; NSMutableData *result; NSString *string; NSArray *files; // make sure archivePath has the correct suffix if ([archivePath hasSuffix:@".zoo"] == NO) { archivePath = [archivePath stringByAppendingString:@".zoo"]; } // build arguments for commandline: zoo aqqq filename // zoo doesn't recursively add directories to the archive, so we have to // create a list of files on our own and // change into this directory before searching for the files later on workdir = [[filenames objectAtIndex:0] stringByDeletingLastPathComponent]; // We use find to find all files below the potential directories // should work at least on Linux/*BSD/ type of systems arguments = [NSMutableArray array]; // filenames contains absolute paths, convert them to relative paths. This works // because you can select only files/directories below a current directory in // GWorkspace so all the files *have* to have a common filesystem root. filenameCursor = [filenames objectEnumerator]; while ((filename = [filenameCursor nextObject]) != nil) { [arguments addObject:[filename lastPathComponent]]; } [arguments addObject:@"-type"]; [arguments addObject:@"f"]; pipe = [NSPipe pipe]; readHandle = [pipe fileHandleForReading]; task = [[NSTask alloc] init]; [task setLaunchPath:@"find"]; [task setArguments:arguments]; [task setCurrentDirectoryPath:workdir]; [task setStandardOutput:pipe]; [task launch]; result = [NSMutableData dataWithCapacity:1024]; while ((inData = [readHandle availableData]) && [inData length]) { [result appendData:inData]; } string = [[[NSString alloc] initWithData:result encoding:NSASCIIStringEncoding] autorelease]; files = [string componentsSeparatedByString:@"\n"]; [task release]; // build arguments for commandline: zoo aqqq filename // do the arguments need to be released before reusing them? arguments = [NSMutableArray array]; [arguments addObject:@"aqqq"]; [arguments addObject:archivePath]; filenameCursor = [files objectEnumerator]; while ((filename = [filenameCursor nextObject]) != nil) { [arguments addObject:filename]; } [self runArchiverWithArguments:arguments inDirectory:workdir]; } //------------------------------------------------------------------------------ // private API //------------------------------------------------------------------------------ - (NSData *)dataByRunningZoo { // l = list // q = quiet, this is important for skipping comments in archives and for skipping // the nice headers for readable output NSArray *args = [NSArray arrayWithObjects:@"lq", [self path], nil]; return [self dataByRunningUnachiverWithArguments:args]; } @end Zipper-1.5/common.h0000644000175000017500000000167312100767277014461 0ustar sebastiasebastia/* common.h Zipper Copyright (C) 2012 Free Software Foundation, Inc Authors: Sebastian Reitenbach This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details */ typedef enum { UNKNOWN = 0, SEVENZIP, ACE, ARC, ARJ, BZIP2, CAB, GZIP, LHA, LZO, LZX, RAR, TAR, TARBZ2, TARGZ, TARXZ, TGZ, XZ, ZIP, ZOO } ArchiveType; #if !defined (GNUSTEP) && (MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4) #define NSUInteger unsigned #define NSInteger int #endif Zipper-1.5/Resources/0000755000175000017500000000000012134544216014754 5ustar sebastiasebastiaZipper-1.5/Resources/MainMenu.gorm/0000755000175000017500000000000012134544215017427 5ustar sebastiasebastiaZipper-1.5/Resources/MainMenu.gorm/data.classes0000644000175000017500000000077211720232714021723 0ustar sebastiasebastia{ "## Comment" = "Do NOT change this file, Gorm maintains it"; AppController = { Actions = ( "showPrefPanel:" ); Outlets = ( ); Super = NSObject; }; AppDelegate = { Actions = ( "showPreferences:" ); Outlets = ( ); Super = NSObject; }; FirstResponder = { Actions = ( "extract:", "extractFlat:", "newAction:", "orderFrontFontPanel:", "showPrefPanel:", "showPreferences:", "tableViewDoubleAction:" ); Super = NSObject; }; }Zipper-1.5/Resources/MainMenu.gorm/data.info0000644000175000017500000000027011777553333021231 0ustar sebastiasebastiaGNUstep archive00003070:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0& % Typed StreamZipper-1.5/Resources/MainMenu.gorm/objects.gorm0000644000175000017500000001317611777553333021773 0ustar sebastiasebastiaGNUstep archive00003070:00000011:000000e1:00000001:01GSNibContainer1NSObject01 NSMutableSet1NSSet&01 GSNibItem01NSString& % AppDelegate  &01NSMenu0&%Zipper01NSMutableArray1 NSArray&01 NSMenuItem0 &%Info0 &&&%0 1 NSImage0 1 NSMutableString&%common_2DCheckMark0 0 & % common_2DDash2submenuAction:%0 0&0 0& % Info Panel...0&&&% %0 0&%Preferences...0&&&% %0 0&%Help...0&%?&&% %0 0&%Document0&&&%0 0&%NSMenuCheckmark0 0 &%NSMenuMixedState%0!0"&0# 0$&%Open...0%&%o&&%%0& 0'& % Open Recent&&%%0('0)&0* 0+& % Clear List&&%%!0, 0-& % Extract...0.&%e&&%%0/ 00&%Extract flat...01&%E&&%%02 03&%View04&%V&&%%05 06&%Close&&%%07 08&%Edit09&&&%%0:80;&0< 0=& % Select All0>&%a&&%%0? 0@& % Deselect All0A&%d&&%%0B 0C&%Windows0D&&&% %0EC0F&0G 0H&%Arrange In Front0I&&&% %0J 0K&%Miniaturize Window0L&%m&&% %0M 0N& % Close Window0O&%w&&% %0P 0Q&%Services0R&&&% %0SQ0T&0U 0V&%Hide0W&%h&&% %0X 0Y&%Quit0Z&%q&&% %0[&0\&0]1 NSMutableDictionary1 NSDictionary&50^& % MenuItem19U0_& % MenuItem1X0`& % MenuItem20a& % MenuItem30b& % MenuItem40c& % MenuItem50d&%Menu(1)(0e& % MenuItem6P0f&%MenuItemU0g& % MenuItem(0)0h& % MenuItem(5)/0i& % MenuItem7B0j& % MenuItem8G0k& % MenuItem9J0l& % MenuItem(2)&0m& % MenuItem(7)*0n& % GormNSMenu0o& % MenuItem200p& % MenuItem210q& % MenuItem220r& % MenuItem(11)?0s& % MenuItem230t&%AppDelegate(0)0u& % MenuItem24P0v& % MenuItem25X0w& % MenuItem260x&%Menu(0)!0y& % MenuItem(4),0z& % MenuItem(9)70{& % GormNSMenu1S0|& % GormNSMenu2E0}&%Menu(2):0~& % GormNSMenu30& % MenuItem(1)#0& % MenuItem(6)20&%NSServicesMenuS0& % MenuItem10M0& % NSWindowsMenuE0& % MenuItem11B0& % MenuItem12U0& % MenuItem(10)50&%NSRecentDocumentsMenu(0& % MenuItem(15)<0& % MenuItem13B0& % MenuItem14U0&%NSMenu0& % MenuItem15B0& % MenuItem16G0& % MenuItem17J0&% NSOwner0& % NSApplication0& % MenuItem18M0& % MenuItem(3)*0& % MenuItem(8)70&4401NSNibConnector0&% NSOwner00v0w0~w0p~0q~0s~0u0u0000001NSNibControlConnectorw0&%submenuAction:00&%submenuAction:0u0&%submenuAction:00&% NSFirst0&%hide:0v0& % terminate:0p0&%orderFrontStandardInfoPanel:00&%arrangeInFront:00&%performMiniaturize:00& % performClose:0g0xg0x00& % openDocument:0lx0l000&%clearRecentDocuments:0±lx0ñ&%submenuAction:0ıx0űg0Ʊ&%submenuAction:0DZyx0ȱhx0ɱx0ʱt0˱qt0̱&%showPreferences:01NSNibOutletConnectort0α&%delegate0ϱy0б&%extract:0ѱh0ұ& % extractFlat:0ӱ0Ա& % performClose:0ձ0ֱ&%tableViewDoubleAction:0ױ0ر}0ٱ}0ڱ0۱& % selectAll:0ܱ0ݱ&%submenuAction:0ޱr}0߱r0& % deselectAll:0 &Zipper-1.5/Resources/FileIcon.tiff0000644000175000017500000002000611716222162017312 0ustar sebastiasebastiaII*    Q  &ZY>g12c] ( =?ñOM- VXڠJH i opĻЦHImqq !ȃy}  00<9 17ĶRR  8;č./y : egӻǀ  ]WOSt$0áøȚ*0 cf>C  gjPTaeW^5;ÂHKʇ.&r [(-Ȟ ojɫ‡9 psÑ GEױƿ[W :A" s#)np+6  ) ֥Ĩ..vCY` b$"kbb]\Y @H-- ?      Cws><IJ%Z^ne&KN|{ȳĩfi 6 !!A<Ǧĝeh]cX`IN;:61{X 2 8 CC69՚KNMVƺŵǫо¿ҸϾηok>  OPwtut"')EGimlmGE00" 8D-2/<ĻˍHH、¹ϹǽȺŽͯrsTZևǔEKCJϒвsnE  \aRQu{JNʱý˵ǭĊr(Y[Ž|y49٣üкʮȶ̕ # 19ňfo IK÷öonJPVYb_ot$( !ח¼Ϻɽ˽˽˱ffHI̅ee>GӑacXXԩpo78bdɅ " +, VZff~,,{{MI[a [Y˾κξcbqsձ@KTSָHJ]]&% 47DR3= #ōKP  ajyz_e   ldga^ce$+ .*Ͱ̽ɾ˽˽˺{CM`]TZ&EJ٭ˏ(2"  ʈIH$ebкʈGHY[լǹ¼Ѫ)(&(|=8Ze    =>է¼νĺϷńKG.6%,pqŸƫVW!%!(ޒ֫¯ȻͻʷȺɵū¢'* YckdfZ]nnvqzvƳìīƯȠdm[Y͍<;.(^g563401549:57),(.~u}14KKŒTY"'՜ɺخ]d4<  `>& EGjipnxzqsinchTZ=B02??isEF,'uy<846~ĶĬqpEC>9o CD`b!( !)W^.-VS՗/,ORǜȦss("\    ,0?=  "fljn&%ptDZƸDŽ21 `  ˈfhgg!  $&--҂ƵëOS )   J]_+%   PU¤ŞΛ>Gs"88,)  +2ӧ»λȕ8; Z ~Ιfm    "$ͫǿӝ7< E/2:<++ωefȵȺahBD!   ][Է˸ɺɂ"E2 )&ܰʶÜ+5 O".2KJ)&miĸɺEN V c=B˸KP\ @67}|~ tJP&* < s 0) 2@(R/home/dirk/Projects/GNUstep/Zipper/zipper-48.tiffCreated with The GIMPHHZipper-1.5/Resources/Zipper.icns0000644000175000017500000001376711744331547017130 0ustar sebastiasebastiaicnsich#H~?????~< ~?????~< ih32 U UU$_ 83_#b??47fUD߶mmTdfUyֈ' f4:  39jXH 7x C^ f)n  xm 36 jU?fc~~DYdUU 1״lU ZXfUUU&̹0/m 1FOUODE>@ =.".OEHm3?HU?Um|t&L޲Qr~UU_cK0.HaWWU.U/]c+-^fN-*R֔wj^aHA=<4 W>]sLf?.a!/WlK5 F<=ObUQM?b~` aŬ!|B(DÑe:_nr*+(P[nuN&2Av+ Bkg $xR^E-qi<#H00c d%~Gdrh,:ij;q&0yt3S:Yzc#X+)k9kx7U32RvOcؘ5 f?fHmUAp" )+>a U3UU)0rJP/6I#t +e5h\hHf$U<6%e3U  f 30 $ 5a+YMx U8s$UAwpU']*UHH$ U$_ <3? ]m5cfUE߭u[ XU3U {ʇf4N? $69fc$ @z Ga k .s * }~H A<r?fhK]UUUf7"԰SHU3= XMU* U UU ,͹=8k5 )Hf;UGݥ^, #$HTXf}zlw\<+=jj^wvWݿS.U'*&)m5*i4oHدp UUq&\N )}<ҙ4 fHUmKAs!16>efU0)  yU/P,  >L 2z /i g12c] ( =?ñOM- VXڠJH i opĻЦHImqq !ȃy}  00<9 17ĶRR  8;č./y : egӻǀ  ]WOSt$0áøȚ*0 cf>C  gjPTaeW^5;ÂHKʇ.&r [(-Ȟ ojɫ‡9 psÑ GEױƿ[W :A" s#)np+6  ) ֥Ĩ..vCY` b$"kbb]\Y @H-- ?      Cws><IJ%Z^ne&KN|{ȳĩfi 6 !!A<Ǧĝeh]cX`IN;:61{X 2 8 CC69՚KNMVƺŵǫо¿ҸϾηok>  OPwtut"')EGimlmGE00" 8D-2/<ĻˍHH、¹ϹǽȺŽͯrsTZևǔEKCJϒвsnE  \aRQu{JNʱý˵ǭĊr(Y[Ž|y49٣üкʮȶ̕ # 19ňfo IK÷öonJPVYb_ot$( !ח¼Ϻɽ˽˽˱ffHI̅ee>GӑacXXԩpo78bdɅ " +, VZff~,,{{MI[a [Y˾κξcbqsձ@KTSָHJ]]&% 47DR3= #ōKP  ajyz_e   ldga^ce$+ .*Ͱ̽ɾ˽˽˺{CM`]TZ&EJ٭ˏ(2"  ʈIH$ebкʈGHY[լǹ¼Ѫ)(&(|=8Ze    =>է¼νĺϷńKG.6%,pqŸƫVW!%!(ޒ֫¯ȻͻʷȺɵū¢'* YckdfZ]nnvqzvƳìīƯȠdm[Y͍<;.(^g563401549:57),(.~u}14KKŒTY"'՜ɺخ]d4<  `>& EGjipnxzqsinchTZ=B02??isEF,'uy<846~ĶĬqpEC>9o CD`b!( !)W^.-VS՗/,ORǜȦss("\    ,0?=  "fljn&%ptDZƸDŽ21 `  ˈfhgg!  $&--҂ƵëOS )   J]_+%   PU¤ŞΛ>Gs"88,)  +2ӧ»λȕ8; Z ~Ιfm    "$ͫǿӝ7< E/2:<++ωefȵȺahBD!   ][Է˸ɺɂ"E2 )&ܰʶÜ+5 O".2KJ)&miĸɺEN V c=B˸KP\ @67}|~ tJP&* < s 0) 2@(R/home/dirk/Projects/GNUstep/Zipper/zipper-48.tiffCreated with The GIMPHHZipper-1.5/Resources/Preferences.gorm/0000755000175000017500000000000012134544216020160 5ustar sebastiasebastiaZipper-1.5/Resources/Preferences.gorm/data.classes0000644000175000017500000000153312101272614022444 0ustar sebastiasebastia{ "## Comment" = "Do NOT change this file, Gorm maintains it"; FirstResponder = { Actions = ( "cancelPressed:", "findDefaultOpenApp:", "findExecutable:", "okPressed:" ); Super = NSObject; }; PreferencesController = { Actions = ( "cancelPressed:", "okPressed:", "findExecutable:", "findDefaultOpenApp:" ); Outlets = ( "_panel", "_bsdTarButton", "_defaultOpenApp", "_tarTextField", "_unzipTextField", "_rarTextField", "_lhaTextField", "_lzxTextField", "_sevenZipTextField", "_archiveClass", "_zipTextField", "_bunzip2TextField", "_bzip2TextField", "_gunzipTextField", "_gzipTextField", "_unaceTextField", "_unarjTextField", "_zooTextField", "_xzTextField", scrollView ); Super = NSObject; }; }Zipper-1.5/Resources/Preferences.gorm/data.info0000644000175000017500000000027012101272614021737 0ustar sebastiasebastiaGNUstep archive00003070:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0& % Typed StreamZipper-1.5/Resources/Preferences.gorm/objects.gorm0000644000175000017500000005265112101272614022502 0ustar sebastiasebastiaGNUstep archive00003070:00000021:000001e3:00000000:01GSNibContainer1NSObject01 NSMutableSet1NSSet&01GSWindowTemplate1GSClassSwapper01NSString&% NSPanel1NSPanel1 NSWindow1 NSResponder% ? @" @y0 @v& % @h @01 NSView% ? @" @y0 @v  @y0 @v&01 NSMutableArray1 NSArray&01NSButton1 NSControl% @` @ @L @8  @L @8& 0 &%0 1 NSButtonCell1 NSActionCell1NSCell0 &%Cancel0 1NSFont%&&&&&&&&&&&&&&%0 &0 &&&& &&0% @g @ @L @8  @L @8& 0 &%00&%Ok &&&&&&&&&&&&&&%0&0&&&& &&01NSBox% @$ @B @w @I  @w @I& 0 &0 % @ @ @w @9  @w @9&0 &01 NSTextField% @ @r@ @5  @r@ @5&0 &%01NSTextFieldCell0& &&&&&&&& &&&&&&%01NSColor0&% NSNamedColorSpace0&%System0&%textBackgroundColor0 0!& % textColor0"% @r  @R @8  @R @8&0# &%0$0%& % Browse... &&&&&&&&&&&&&&%0&&0'&&&& &&0(0)&%Default open App )&&&&&&&&&&&&&& @ @%%0*1 NSScrollView% @$ @V @w @p  @w @p&0+ &0,1 NSClipView% @5 @ @v @p  @v @p&0- &0. %  @vP @xP  @vP @xP&0/ &..00% @. @w  @J @2  @J @2&01 &%0203&%tar:04% A@3&&&&&&&& &&&&&&% 05% @R@ @v @` @5  @` @5&06 &%0708& 8&&&&&&&& &&&&&&% 09% @j @v @R @8  @R @8&0: &%0;0<& % Browse... &&&&&&&&&&&&&&%0=&0>&&&& &&0?% @r @w@ @Q @0  @Q @0&0@ &%0A0B&%BSD Tar0C1NSImage0D1NSMutableString&%common_SwitchOff &&&&&&&&&&&&&&%0E&0F&0G0H&%common_SwitchOn&&& &&0I% @j @u  @R @8  @R @8&0J &%0K0L& % Browse... &&&&&&&&&&&&&&%0M&0N&&&& &&0O% @R@ @uP @` @5  @` @5&0P &%0Q0R& R&&&&&&&& &&&&&&% 0S% @. @u @M @,  @M @,&0T &%0U0V&%unzip:4V&&&&&&&& &&&&&&% 0W% @. @s @J @2  @J @2&0X &%0Y0Z&%zip4Z&&&&&&&& &&&&&&% 0[% @R@ @s @` @5  @` @5&0\ &%0]0^& ^&&&&&&&& &&&&&&% 0_% @j @s @R @8  @R @8&0` &%0a0b& % Browse... &&&&&&&&&&&&&&%0c&0d&&&& &&0e% @j @q @R @8  @R @8&0f &%0g0h& % Browse... &&&&&&&&&&&&&&%0i&0j&&&& &&0k% @R@ @r @` @5  @` @5&0l &%0m0n& n&&&&&&&& &&&&&&% 0o% @. @r@ @T @2  @T @2&0p &%0q0r&%rar:4r&&&&&&&& &&&&&&% 0s% @. @p @J @2  @J @2&0t &%0u0v&%lha:4v&&&&&&&& &&&&&&% 0w% @. @n @T @2  @T @2&0x &%0y0z&%lzx:4z&&&&&&&& &&&&&&% 0{% @. @j @I @2  @I @2&0| &%0}0~&%7zip:4~&&&&&&&& &&&&&&% 0% @. @g @J @2  @J @2&0 &%00&%gzip:4&&&&&&&& &&&&&&% 0% @. @d  @J @2  @J @2&0 &%00&%gunzip:4&&&&&&&& &&&&&&% 0% @. @a @K @2  @K @2&0 &%00&%bzip2:4&&&&&&&& &&&&&&% 0% @. @[ @L @2  @L @2&0 &%00&%bunzip2:4&&&&&&&& &&&&&&% 0% @. @U @H @2  @H @2&0 &%00&%unarj:4&&&&&&&& &&&&&&% 0% @. @M @J @2  @J @2&0 &%00&%unace:4&&&&&&&& &&&&&&% 0% @. @@ @J @2  @J @2&0 &%00&%zoo:4&&&&&&&& &&&&&&% 0% @. @ @J @2  @J @2&0 &%00&%xz:4&&&&&&&& &&&&&&% 0% @R@ @ @` @5  @` @5&0 &%00& &&&&&&&& &&&&&&% 0% @R@ @= @` @5  @` @5&0 &%00& &&&&&&&& &&&&&&% 0% @R@ @K @` @5  @` @5&0 &%00& &&&&&&&& &&&&&&% 0% @R@ @T@ @` @5  @` @5&0 &%00& &&&&&&&& &&&&&&% 0% @R@ @Z @` @5  @` @5&0 &%00& &&&&&&&& &&&&&&% 0% @R@ @` @` @5  @` @5&0 &%00& &&&&&&&& &&&&&&% 0% @R@ @c @` @5  @` @5&0 &%00& &&&&&&&& &&&&&&% 0% @R@ @g  @` @5  @` @5&0 &%00& &&&&&&&& &&&&&&% 0% @R@ @j` @` @5  @` @5&0 &%00±& &&&&&&&& &&&&&&% 0ñ% @R@ @m @` @5  @` @5&0ı &%0ű0Ʊ& &&&&&&&& &&&&&&% 0DZ% @R@ @pp @` @5  @` @5&0ȱ &%0ɱ0ʱ& &&&&&&&& &&&&&&% 0˱% @j @p@ @R @8  @R @8&0̱ &%0ͱ0α& % Browse... &&&&&&&&&&&&&&%0ϱ&0б&&&& &&0ѱ% @j @m@ @R @8  @R @8&0ұ &%0ӱ0Ա& % Browse... &&&&&&&&&&&&&&%0ձ&0ֱ&&&& &&0ױ% @j @j @R @8  @R @8&0ر &%0ٱ0ڱ& % Browse... &&&&&&&&&&&&&&%0۱&0ܱ&&&& &&0ݱ% @j @f @R @8  @R @8&0ޱ &%0߱0& % Browse... &&&&&&&&&&&&&&%0&0&&&& &&0% @j @c` @R @8  @R @8&0 &% 00& % Browse... &&&&&&&&&&&&&&%0&0&&&& &&0% @j @`@ @R @8  @R @8&0 &% 00& % Browse... &&&&&&&&&&&&&&%0&0&&&& &&0% @j @Z @R @8  @R @8&0 &% 00& % Browse... &&&&&&&&&&&&&&%0&0&&&& &&0% @j @S @R @8  @R @8&0 &% 00& % Browse... &&&&&&&&&&&&&&%0&0&&&& &&0% @j @J @R @8  @R @8&0 &% 00& % Browse... &&&&&&&&&&&&&&%0&P&&&& &&P% @j @: @R @8  @R @8&P &%PP& % Browse... &&&&&&&&&&&&&&%P&P&&&& &&P% @j  @R @8  @R @8&P &%P P & % Browse... &&&&&&&&&&&&&&%P &P &&&& &&P P&% SystemP&% controlBackgroundColorP1 NSScroller% @ @ @2 @p  @2 @p&P &%PP& &&&&&&&&&&&&&&&,% A A A A PP&% windowBackgroundColorP&%WindowP& % Preferences @yP @A @yP @È%&   @ @P &P &P1NSMutableDictionary1 NSDictionary&& % Button(7)"P?& % Button(11)P@& % Button(16)PA& % TextField(0)0PB& % TextField(5){PC& % TextField(16)PD& % TextField(28)PE& % TextField(30)PF& % TextField(23)PG& % TextField(11)PH& % Button(9)PI& % Button(4)PJ& % Button(13)PK& % Button(18)PL& % Scroller(0)PM% @5 @w @t @2  @t @2&PN &%PO &&&&&&&&&&&&&&&PP& % TextField(2)oPQ& % TextField(7)OPR& % TextField(25)PS& % TextField(18)PT& % TextField(20)PU& % TextField(13)[PV&%View(1).PW& % Button(1)IPX& % Button(6)?PY&% NSOwnerPZ&%PreferencesControllerP[ &ccP\1NSNibConnector%P]&% NSOwnerP^/%P_AVP`)VPaPVPb5VPcVPdBVPe*VPfQVPg7VPhVPi#VPjGVPk0VPlWVPm=VPn&VPoIVPp1VPqXVPr-2Ps>2Pt$/PuH/Pv1 NSNibOutletConnector%]Pw&%delegatePx ]*Py& % _tarTextFieldPz ]QP{&%_unzipTextFieldP| ]7P}& % _rarTextFieldP~ ]P& % _lhaTextFieldP ]#P& % _lzxTextFieldP ]GP&%_sevenZipTextFieldP ]XP& % _bsdTarButtonP ]-P&%_defaultOpenAppP ]%P&%_panelP1!NSNibControlConnector0]P&%findExecutable:P!W]P!=]P!&]P!I]P!1]P!>]P&%findDefaultOpenApp:P!H]P& % okPressed:P!$]P&%cancelPressed:P2/P:2PUVP;VPVP ]UP& % _zipTextFieldP!]P&%findExecutable:P VPCVP?VP+VPSVP'VP8VPTVP9VP"VPFVP.VPJVP4VPVPRVP<VP!VPDVP@VP(VP!?]P&%findExecutable:P!']P&%findExecutable:P!J]P&%findExecutable:P!4]P&%findExecutable:P!]P&%findExecutable:P!@]P&%findExecutable:P!(]P±&%findExecutable:Pñ,VPıEVPűKVPƱ!K]PDZ&%findExecutable:Pȱ ]CPɱ&%_gzipTextFieldPʱ ]SP˱&%_gunzipTextFieldP̱ ]TPͱ&%_bzip2TextFieldPα ]9Pϱ&%_bunzip2TextFieldPб ]"Pѱ&%_unarjTextFieldPұ ]!Pӱ&%_unaceTextFieldPԱ ]DPձ& % _zooTextFieldPֱ ]EPױ& % _xzTextFieldPرV/Pٱ6/Pڱ6P۱L6Pܱ!L6Pݱ& % _doScroll:Pޱ36P߱!36P& % _doScroll:P ]6P& % scrollViewP&Zipper-1.5/Resources/ZipperDocument.gorm/0000755000175000017500000000000012134544216020667 5ustar sebastiasebastiaZipper-1.5/Resources/ZipperDocument.gorm/data.classes0000644000175000017500000000031011717035776023165 0ustar sebastiasebastia{ "## Comment" = "Do NOT change this file, Gorm maintains it"; ZipperDocument = { Actions = ( ); Outlets = ( "_tableView", "_tableViewDataSource" ); Super = NSDocument; }; }Zipper-1.5/Resources/ZipperDocument.gorm/data.info0000644000175000017500000000027011777553333022470 0ustar sebastiasebastiaGNUstep archive00003070:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0& % Typed StreamZipper-1.5/Resources/ZipperDocument.gorm/objects.gorm0000644000175000017500000001070711777553333023227 0ustar sebastiasebastiaGNUstep archive00003070:0000001f:00000069:00000000:01GSNibContainer1NSObject01 NSMutableSet1NSSet&01GSWindowTemplate1GSClassSwapper01NSString&% NSWindow1NSWindow1 NSResponder% ? A C C&% C D@01 NSView% ? A C C  C C&01 NSMutableArray1 NSArray&01 NSScrollView%  C C  C C&0 &0 1 NSClipView% A A C C  C C&0 &0 1 NSTableView1 NSControl%  C C!  C C!&0 &%0 1NSCell0&01NSFont%&&&&&&&&&&&&&&0 &01 NSTableColumn0&%name C A GP01NSTableHeaderCell1NSTextFieldCell1 NSActionCell0&%Name0% &&&&&&&& &&&&&&%01NSColor0&% NSNamedColorSpace0&% System0&% controlShadowColor00&% windowFrameTextColor0&&&&&&&& &&&&&&%00&%System0&%textBackgroundColor0 0!& % textColor0"0#&%date B A GP0$0%&%Date%&&&&&&&& &&&&&&%0&&&&&&&&& &&&&&&% 0'0(&%size B A GP0)0*&%Size*&&&&&&&& &&&&&&%0+0,&&&&&&&&& &&&&&&% 0-0.&%path C> A GP0/00&%Path0&&&&&&&& &&&&&&%01,&&&&&&&& &&&&&&% 0203& %  gridColor0405&% controlBackgroundColor061NSTableHeaderView%  C A  C A&07 &081GSTableCornerView% @ @ A A  A A&09 &%% A @ @0: &40;1 NSScroller% @ A A C  A C&0< &%0=&&&&&&&&&&&&&&&0>% A @ C A  C A&0? &648 % A A A A ;>0@0A&% windowBackgroundColor0B&%Window0C&%ZipperC @@ B  F@ F@%&  D D@0D &0E &0F1NSMutableDictionary1 NSDictionary& 0G&%TableColumn(1)"0H&% NSOwner0I&%ZipperDocument0J&%Window0K& % ClipView(1)>0L& % ScrollView(0)0M&%TableColumn(0)0N& % TableView(0) 0O& % ClipView(0) 0P& % Scroller(0);0Q&%TableHeaderView(0)60R&%TableCornerView(0)80S&%View(0)0T &0U1NSNibConnectorJ0V&% NSOwner0WSJ0XLS0YNO0ZMN0[GN0\1NSNibOutletConnectorVN0]& % _tableView0^VJ0_&%_window0`OL0aPL0b1NSNibControlConnectorPL0c& % _doScroll:0dKL0eQK0fRL0gNV0h&%delegate0i&Zipper-1.5/Zipper-T.xcodeproj/0000755000175000017500000000000012134544216016450 5ustar sebastiasebastiaZipper-1.5/Zipper-T.xcodeproj/project.pbxproj0000644000175000017500000006516512117147630021541 0ustar sebastiasebastia// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 42; objects = { /* Begin PBXBuildFile section */ 853301A114F3063400ED9766 /* GzipArchive.m in Sources */ = {isa = PBXBuildFile; fileRef = 8533018214F3063400ED9766 /* GzipArchive.m */; }; 853301A214F3063400ED9766 /* LhaArchive.m in Sources */ = {isa = PBXBuildFile; fileRef = 8533018414F3063400ED9766 /* LhaArchive.m */; }; 853301A314F3063400ED9766 /* LzxArchive.m in Sources */ = {isa = PBXBuildFile; fileRef = 8533018614F3063400ED9766 /* LzxArchive.m */; }; 853301A414F3063400ED9766 /* NSArray+Custom.m in Sources */ = {isa = PBXBuildFile; fileRef = 8533018814F3063400ED9766 /* NSArray+Custom.m */; }; 853301A514F3063400ED9766 /* NSFileManager+Custom.m in Sources */ = {isa = PBXBuildFile; fileRef = 8533018A14F3063400ED9766 /* NSFileManager+Custom.m */; }; 853301A614F3063400ED9766 /* NSObject+Custom.m in Sources */ = {isa = PBXBuildFile; fileRef = 8533018C14F3063400ED9766 /* NSObject+Custom.m */; }; 853301A714F3063400ED9766 /* NSString+Custom.m in Sources */ = {isa = PBXBuildFile; fileRef = 8533018E14F3063400ED9766 /* NSString+Custom.m */; }; 853301A814F3063400ED9766 /* Preferences.m in Sources */ = {isa = PBXBuildFile; fileRef = 8533019014F3063400ED9766 /* Preferences.m */; }; 853301A914F3063400ED9766 /* PreferencesController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8533019214F3063400ED9766 /* PreferencesController.m */; }; 853301AA14F3063400ED9766 /* RarArchive.m in Sources */ = {isa = PBXBuildFile; fileRef = 8533019414F3063400ED9766 /* RarArchive.m */; }; 853301AB14F3063400ED9766 /* SevenZipArchive.m in Sources */ = {isa = PBXBuildFile; fileRef = 8533019614F3063400ED9766 /* SevenZipArchive.m */; }; 853301AC14F3063400ED9766 /* TableViewDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 8533019814F3063400ED9766 /* TableViewDataSource.m */; }; 853301AD14F3063400ED9766 /* TarArchive.m in Sources */ = {isa = PBXBuildFile; fileRef = 8533019A14F3063400ED9766 /* TarArchive.m */; }; 853301AE14F3063400ED9766 /* ZipArchive.m in Sources */ = {isa = PBXBuildFile; fileRef = 8533019C14F3063400ED9766 /* ZipArchive.m */; }; 853301AF14F3063400ED9766 /* ZipperCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8533019E14F3063400ED9766 /* ZipperCell.m */; }; 853301B014F3063400ED9766 /* ZipperDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = 853301A014F3063400ED9766 /* ZipperDocument.m */; }; 85AD29D016B1FEBA0004F3B6 /* AceArchive.m in Sources */ = {isa = PBXBuildFile; fileRef = 85AD29CD16B1FEBA0004F3B6 /* AceArchive.m */; }; 85AD29D116B1FEBA0004F3B6 /* ArjArchive.m in Sources */ = {isa = PBXBuildFile; fileRef = 85AD29CF16B1FEBA0004F3B6 /* ArjArchive.m */; }; 85AD29E416B201290004F3B6 /* ZooArchive.m in Sources */ = {isa = PBXBuildFile; fileRef = 85AD29E316B201290004F3B6 /* ZooArchive.m */; }; 85D2D21D14E9A2D300203A28 /* FileInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 85D2D21C14E9A2D300203A28 /* FileInfo.m */; }; 85D2D22414E9A2E000203A28 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 85D2D21F14E9A2E000203A28 /* AppDelegate.m */; }; 85D2D22514E9A2E000203A28 /* Archive.m in Sources */ = {isa = PBXBuildFile; fileRef = 85D2D22114E9A2E000203A28 /* Archive.m */; }; 85D2D22614E9A2E000203A28 /* ArchiveService.m in Sources */ = {isa = PBXBuildFile; fileRef = 85D2D22314E9A2E000203A28 /* ArchiveService.m */; }; 85D812C01541E8A6004CC1BE /* Zipper.icns in Resources */ = {isa = PBXBuildFile; fileRef = 85D812BF1541E8A6004CC1BE /* Zipper.icns */; }; 85F3D4BF14F8E1D20065F37B /* ZipperDocument.nib in Resources */ = {isa = PBXBuildFile; fileRef = 85F3D4BD14F8E1D20065F37B /* ZipperDocument.nib */; }; 85F3D4C214F8E1E10065F37B /* Preferences.nib in Resources */ = {isa = PBXBuildFile; fileRef = 85F3D4C014F8E1E10065F37B /* Preferences.nib */; }; 85F3D4D814F8FF7F0065F37B /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 85F3D4D714F8FF7F0065F37B /* Cocoa.framework */; }; 8D15AC2C0486D014006FF6A4 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 2A37F4B9FDCFA73011CA2CEA /* Credits.rtf */; }; 8D15AC2D0486D014006FF6A4 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 2A37F4B6FDCFA73011CA2CEA /* MainMenu.nib */; }; 8D15AC2F0486D014006FF6A4 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165FFE840EACC02AAC07 /* InfoPlist.strings */; }; 8D15AC320486D014006FF6A4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A37F4B0FDCFA73011CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 089C1660FE840EACC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 2A37F4B0FDCFA73011CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 2A37F4B7FDCFA73011CA2CEA /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/MainMenu.nib; sourceTree = ""; }; 2A37F4BAFDCFA73011CA2CEA /* English */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = English; path = English.lproj/Credits.rtf; sourceTree = ""; }; 2A37F4C4FDCFA73011CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 2A37F4C5FDCFA73011CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 8533018114F3063400ED9766 /* GzipArchive.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = GzipArchive.h; sourceTree = ""; }; 8533018214F3063400ED9766 /* GzipArchive.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = GzipArchive.m; sourceTree = ""; }; 8533018314F3063400ED9766 /* LhaArchive.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = LhaArchive.h; sourceTree = ""; }; 8533018414F3063400ED9766 /* LhaArchive.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = LhaArchive.m; sourceTree = ""; }; 8533018514F3063400ED9766 /* LzxArchive.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = LzxArchive.h; sourceTree = ""; }; 8533018614F3063400ED9766 /* LzxArchive.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = LzxArchive.m; sourceTree = ""; }; 8533018714F3063400ED9766 /* NSArray+Custom.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = "NSArray+Custom.h"; sourceTree = ""; }; 8533018814F3063400ED9766 /* NSArray+Custom.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = "NSArray+Custom.m"; sourceTree = ""; }; 8533018914F3063400ED9766 /* NSFileManager+Custom.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = "NSFileManager+Custom.h"; sourceTree = ""; }; 8533018A14F3063400ED9766 /* NSFileManager+Custom.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = "NSFileManager+Custom.m"; sourceTree = ""; }; 8533018B14F3063400ED9766 /* NSObject+Custom.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = "NSObject+Custom.h"; sourceTree = ""; }; 8533018C14F3063400ED9766 /* NSObject+Custom.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = "NSObject+Custom.m"; sourceTree = ""; }; 8533018D14F3063400ED9766 /* NSString+Custom.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = "NSString+Custom.h"; sourceTree = ""; }; 8533018E14F3063400ED9766 /* NSString+Custom.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = "NSString+Custom.m"; sourceTree = ""; }; 8533018F14F3063400ED9766 /* Preferences.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = Preferences.h; sourceTree = ""; }; 8533019014F3063400ED9766 /* Preferences.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = Preferences.m; sourceTree = ""; }; 8533019114F3063400ED9766 /* PreferencesController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PreferencesController.h; sourceTree = ""; }; 8533019214F3063400ED9766 /* PreferencesController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = PreferencesController.m; sourceTree = ""; }; 8533019314F3063400ED9766 /* RarArchive.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = RarArchive.h; sourceTree = ""; }; 8533019414F3063400ED9766 /* RarArchive.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = RarArchive.m; sourceTree = ""; }; 8533019514F3063400ED9766 /* SevenZipArchive.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SevenZipArchive.h; sourceTree = ""; }; 8533019614F3063400ED9766 /* SevenZipArchive.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = SevenZipArchive.m; sourceTree = ""; }; 8533019714F3063400ED9766 /* TableViewDataSource.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = TableViewDataSource.h; sourceTree = ""; }; 8533019814F3063400ED9766 /* TableViewDataSource.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = TableViewDataSource.m; sourceTree = ""; }; 8533019914F3063400ED9766 /* TarArchive.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = TarArchive.h; sourceTree = ""; }; 8533019A14F3063400ED9766 /* TarArchive.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = TarArchive.m; sourceTree = ""; }; 8533019B14F3063400ED9766 /* ZipArchive.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ZipArchive.h; sourceTree = ""; }; 8533019C14F3063400ED9766 /* ZipArchive.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = ZipArchive.m; sourceTree = ""; }; 8533019D14F3063400ED9766 /* ZipperCell.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ZipperCell.h; sourceTree = ""; }; 8533019E14F3063400ED9766 /* ZipperCell.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = ZipperCell.m; sourceTree = ""; }; 8533019F14F3063400ED9766 /* ZipperDocument.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ZipperDocument.h; sourceTree = ""; }; 853301A014F3063400ED9766 /* ZipperDocument.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = ZipperDocument.m; sourceTree = ""; }; 85AD29CC16B1FEBA0004F3B6 /* AceArchive.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AceArchive.h; sourceTree = ""; }; 85AD29CD16B1FEBA0004F3B6 /* AceArchive.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = AceArchive.m; sourceTree = ""; }; 85AD29CE16B1FEBA0004F3B6 /* ArjArchive.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ArjArchive.h; sourceTree = ""; }; 85AD29CF16B1FEBA0004F3B6 /* ArjArchive.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = ArjArchive.m; sourceTree = ""; }; 85AD29D216B1FEC70004F3B6 /* common.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; 85AD29E216B201290004F3B6 /* ZooArchive.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ZooArchive.h; sourceTree = ""; }; 85AD29E316B201290004F3B6 /* ZooArchive.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = ZooArchive.m; sourceTree = ""; }; 85D2D21B14E9A2D300203A28 /* FileInfo.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = FileInfo.h; sourceTree = ""; }; 85D2D21C14E9A2D300203A28 /* FileInfo.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = FileInfo.m; sourceTree = ""; }; 85D2D21E14E9A2E000203A28 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 85D2D21F14E9A2E000203A28 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 85D2D22014E9A2E000203A28 /* Archive.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = Archive.h; sourceTree = ""; }; 85D2D22114E9A2E000203A28 /* Archive.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = Archive.m; sourceTree = ""; }; 85D2D22214E9A2E000203A28 /* ArchiveService.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ArchiveService.h; sourceTree = ""; }; 85D2D22314E9A2E000203A28 /* ArchiveService.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = ArchiveService.m; sourceTree = ""; }; 85D812BF1541E8A6004CC1BE /* Zipper.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = Zipper.icns; path = Resources/Zipper.icns; sourceTree = ""; }; 85F3D4BE14F8E1D20065F37B /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/ZipperDocument.nib; sourceTree = ""; }; 85F3D4C114F8E1E10065F37B /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/Preferences.nib; sourceTree = ""; }; 85F3D4D714F8FF7F0065F37B /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 8D15AC360486D014006FF6A4 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 8D15AC370486D014006FF6A4 /* Zipper.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Zipper.app; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 8D15AC330486D014006FF6A4 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 85F3D4D814F8FF7F0065F37B /* Cocoa.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 1058C7A6FEA54F5311CA2CBB /* Linked Frameworks */ = { isa = PBXGroup; children = ( 85F3D4D714F8FF7F0065F37B /* Cocoa.framework */, ); name = "Linked Frameworks"; sourceTree = ""; }; 1058C7A8FEA54F5311CA2CBB /* Other Frameworks */ = { isa = PBXGroup; children = ( 2A37F4C4FDCFA73011CA2CEA /* AppKit.framework */, 2A37F4C5FDCFA73011CA2CEA /* Foundation.framework */, ); name = "Other Frameworks"; sourceTree = ""; }; 19C28FB0FE9D524F11CA2CBB /* Products */ = { isa = PBXGroup; children = ( 8D15AC370486D014006FF6A4 /* Zipper.app */, ); name = Products; sourceTree = ""; }; 2A37F4AAFDCFA73011CA2CEA /* Zipper */ = { isa = PBXGroup; children = ( 2A37F4ABFDCFA73011CA2CEA /* Classes */, 2A37F4AFFDCFA73011CA2CEA /* Other Sources */, 2A37F4B8FDCFA73011CA2CEA /* Resources */, 2A37F4C3FDCFA73011CA2CEA /* Frameworks */, 19C28FB0FE9D524F11CA2CBB /* Products */, ); name = Zipper; sourceTree = ""; }; 2A37F4ABFDCFA73011CA2CEA /* Classes */ = { isa = PBXGroup; children = ( 85AD29E216B201290004F3B6 /* ZooArchive.h */, 85AD29E316B201290004F3B6 /* ZooArchive.m */, 85AD29CC16B1FEBA0004F3B6 /* AceArchive.h */, 85AD29CD16B1FEBA0004F3B6 /* AceArchive.m */, 85AD29CE16B1FEBA0004F3B6 /* ArjArchive.h */, 85AD29CF16B1FEBA0004F3B6 /* ArjArchive.m */, 8533018114F3063400ED9766 /* GzipArchive.h */, 8533018214F3063400ED9766 /* GzipArchive.m */, 8533018314F3063400ED9766 /* LhaArchive.h */, 8533018414F3063400ED9766 /* LhaArchive.m */, 8533018514F3063400ED9766 /* LzxArchive.h */, 8533018614F3063400ED9766 /* LzxArchive.m */, 8533018714F3063400ED9766 /* NSArray+Custom.h */, 8533018814F3063400ED9766 /* NSArray+Custom.m */, 8533018914F3063400ED9766 /* NSFileManager+Custom.h */, 8533018A14F3063400ED9766 /* NSFileManager+Custom.m */, 8533018B14F3063400ED9766 /* NSObject+Custom.h */, 8533018C14F3063400ED9766 /* NSObject+Custom.m */, 8533018D14F3063400ED9766 /* NSString+Custom.h */, 8533018E14F3063400ED9766 /* NSString+Custom.m */, 8533018F14F3063400ED9766 /* Preferences.h */, 8533019014F3063400ED9766 /* Preferences.m */, 8533019114F3063400ED9766 /* PreferencesController.h */, 8533019214F3063400ED9766 /* PreferencesController.m */, 8533019314F3063400ED9766 /* RarArchive.h */, 8533019414F3063400ED9766 /* RarArchive.m */, 8533019514F3063400ED9766 /* SevenZipArchive.h */, 8533019614F3063400ED9766 /* SevenZipArchive.m */, 8533019714F3063400ED9766 /* TableViewDataSource.h */, 8533019814F3063400ED9766 /* TableViewDataSource.m */, 8533019914F3063400ED9766 /* TarArchive.h */, 8533019A14F3063400ED9766 /* TarArchive.m */, 8533019B14F3063400ED9766 /* ZipArchive.h */, 8533019C14F3063400ED9766 /* ZipArchive.m */, 8533019D14F3063400ED9766 /* ZipperCell.h */, 8533019E14F3063400ED9766 /* ZipperCell.m */, 8533019F14F3063400ED9766 /* ZipperDocument.h */, 853301A014F3063400ED9766 /* ZipperDocument.m */, 85D2D21E14E9A2E000203A28 /* AppDelegate.h */, 85D2D21F14E9A2E000203A28 /* AppDelegate.m */, 85D2D22014E9A2E000203A28 /* Archive.h */, 85D2D22114E9A2E000203A28 /* Archive.m */, 85D2D22214E9A2E000203A28 /* ArchiveService.h */, 85D2D22314E9A2E000203A28 /* ArchiveService.m */, 85D2D21B14E9A2D300203A28 /* FileInfo.h */, 85D2D21C14E9A2D300203A28 /* FileInfo.m */, ); name = Classes; sourceTree = ""; }; 2A37F4AFFDCFA73011CA2CEA /* Other Sources */ = { isa = PBXGroup; children = ( 85AD29D216B1FEC70004F3B6 /* common.h */, 2A37F4B0FDCFA73011CA2CEA /* main.m */, ); name = "Other Sources"; sourceTree = ""; }; 2A37F4B8FDCFA73011CA2CEA /* Resources */ = { isa = PBXGroup; children = ( 85D812BF1541E8A6004CC1BE /* Zipper.icns */, 85F3D4C014F8E1E10065F37B /* Preferences.nib */, 85F3D4BD14F8E1D20065F37B /* ZipperDocument.nib */, 2A37F4B6FDCFA73011CA2CEA /* MainMenu.nib */, 2A37F4B9FDCFA73011CA2CEA /* Credits.rtf */, 8D15AC360486D014006FF6A4 /* Info.plist */, 089C165FFE840EACC02AAC07 /* InfoPlist.strings */, ); name = Resources; sourceTree = ""; }; 2A37F4C3FDCFA73011CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( 1058C7A6FEA54F5311CA2CBB /* Linked Frameworks */, 1058C7A8FEA54F5311CA2CBB /* Other Frameworks */, ); name = Frameworks; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 8D15AC270486D014006FF6A4 /* Zipper */ = { isa = PBXNativeTarget; buildConfigurationList = C05733C708A9546B00998B17 /* Build configuration list for PBXNativeTarget "Zipper" */; buildPhases = ( 8D15AC2B0486D014006FF6A4 /* Resources */, 8D15AC300486D014006FF6A4 /* Sources */, 8D15AC330486D014006FF6A4 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = Zipper; productInstallPath = "$(HOME)/Applications"; productName = Zipper; productReference = 8D15AC370486D014006FF6A4 /* Zipper.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 2A37F4A9FDCFA73011CA2CEA /* Project object */ = { isa = PBXProject; buildConfigurationList = C05733CB08A9546B00998B17 /* Build configuration list for PBXProject "Zipper-T" */; hasScannedForEncodings = 1; mainGroup = 2A37F4AAFDCFA73011CA2CEA /* Zipper */; projectDirPath = ""; targets = ( 8D15AC270486D014006FF6A4 /* Zipper */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 8D15AC2B0486D014006FF6A4 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 8D15AC2C0486D014006FF6A4 /* Credits.rtf in Resources */, 8D15AC2D0486D014006FF6A4 /* MainMenu.nib in Resources */, 8D15AC2F0486D014006FF6A4 /* InfoPlist.strings in Resources */, 85F3D4BF14F8E1D20065F37B /* ZipperDocument.nib in Resources */, 85F3D4C214F8E1E10065F37B /* Preferences.nib in Resources */, 85D812C01541E8A6004CC1BE /* Zipper.icns in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 8D15AC300486D014006FF6A4 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 8D15AC320486D014006FF6A4 /* main.m in Sources */, 85D2D21D14E9A2D300203A28 /* FileInfo.m in Sources */, 85D2D22414E9A2E000203A28 /* AppDelegate.m in Sources */, 85D2D22514E9A2E000203A28 /* Archive.m in Sources */, 85D2D22614E9A2E000203A28 /* ArchiveService.m in Sources */, 853301A114F3063400ED9766 /* GzipArchive.m in Sources */, 853301A214F3063400ED9766 /* LhaArchive.m in Sources */, 853301A314F3063400ED9766 /* LzxArchive.m in Sources */, 853301A414F3063400ED9766 /* NSArray+Custom.m in Sources */, 853301A514F3063400ED9766 /* NSFileManager+Custom.m in Sources */, 853301A614F3063400ED9766 /* NSObject+Custom.m in Sources */, 853301A714F3063400ED9766 /* NSString+Custom.m in Sources */, 853301A814F3063400ED9766 /* Preferences.m in Sources */, 853301A914F3063400ED9766 /* PreferencesController.m in Sources */, 853301AA14F3063400ED9766 /* RarArchive.m in Sources */, 853301AB14F3063400ED9766 /* SevenZipArchive.m in Sources */, 853301AC14F3063400ED9766 /* TableViewDataSource.m in Sources */, 853301AD14F3063400ED9766 /* TarArchive.m in Sources */, 853301AE14F3063400ED9766 /* ZipArchive.m in Sources */, 853301AF14F3063400ED9766 /* ZipperCell.m in Sources */, 853301B014F3063400ED9766 /* ZipperDocument.m in Sources */, 85AD29D016B1FEBA0004F3B6 /* AceArchive.m in Sources */, 85AD29D116B1FEBA0004F3B6 /* ArjArchive.m in Sources */, 85AD29E416B201290004F3B6 /* ZooArchive.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 089C165FFE840EACC02AAC07 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 089C1660FE840EACC02AAC07 /* English */, ); name = InfoPlist.strings; sourceTree = ""; }; 2A37F4B6FDCFA73011CA2CEA /* MainMenu.nib */ = { isa = PBXVariantGroup; children = ( 2A37F4B7FDCFA73011CA2CEA /* English */, ); name = MainMenu.nib; sourceTree = ""; }; 2A37F4B9FDCFA73011CA2CEA /* Credits.rtf */ = { isa = PBXVariantGroup; children = ( 2A37F4BAFDCFA73011CA2CEA /* English */, ); name = Credits.rtf; sourceTree = ""; }; 85F3D4BD14F8E1D20065F37B /* ZipperDocument.nib */ = { isa = PBXVariantGroup; children = ( 85F3D4BE14F8E1D20065F37B /* English */, ); name = ZipperDocument.nib; sourceTree = ""; }; 85F3D4C014F8E1E10065F37B /* Preferences.nib */ = { isa = PBXVariantGroup; children = ( 85F3D4C114F8E1E10065F37B /* English */, ); name = Preferences.nib; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ C05733C808A9546B00998B17 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; PRODUCT_NAME = Zipper; WRAPPER_EXTENSION = app; ZERO_LINK = YES; }; name = Debug; }; C05733C908A9546B00998B17 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( ppc, i386, ); GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_MODEL_TUNING = G5; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; PRODUCT_NAME = Zipper; WRAPPER_EXTENSION = app; }; name = Release; }; C05733CC08A9546B00998B17 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; PREBINDING = NO; SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; }; name = Debug; }; C05733CD08A9546B00998B17 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; PREBINDING = NO; SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ C05733C708A9546B00998B17 /* Build configuration list for PBXNativeTarget "Zipper" */ = { isa = XCConfigurationList; buildConfigurations = ( C05733C808A9546B00998B17 /* Debug */, C05733C908A9546B00998B17 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; C05733CB08A9546B00998B17 /* Build configuration list for PBXProject "Zipper-T" */ = { isa = XCConfigurationList; buildConfigurations = ( C05733CC08A9546B00998B17 /* Debug */, C05733CD08A9546B00998B17 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 2A37F4A9FDCFA73011CA2CEA /* Project object */; } Zipper-1.5/Zipper.xcode/0000755000175000017500000000000012134544216015354 5ustar sebastiasebastiaZipper-1.5/Zipper.xcode/project.pbxproj0000644000175000017500000006311312101053650020423 0ustar sebastiasebastia// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 39; objects = { 080E96DDFE201D6D7F000001 = { children = ( 856F13EF16B34EEB00EA844F, 856F13F016B34EEB00EA844F, 856F13F116B34EEB00EA844F, 856F13F216B34EEB00EA844F, 856F13F316B34EEB00EA844F, 856F13F416B34EEB00EA844F, 856BDBCE14F5ADBA0040E2AC, 856BDBCF14F5ADBA0040E2AC, 856BDBD014F5ADBA0040E2AC, 856BDBD114F5ADBA0040E2AC, 856BDBD214F5ADBA0040E2AC, 856BDBD314F5ADBA0040E2AC, 856BDBD414F5ADBA0040E2AC, 856BDBD514F5ADBA0040E2AC, 856BDBD614F5ADBA0040E2AC, 856BDBD714F5ADBA0040E2AC, 856BDBD814F5ADBA0040E2AC, 856BDBD914F5ADBA0040E2AC, 856BDBDA14F5ADBA0040E2AC, 856BDBDB14F5ADBA0040E2AC, 856BDBDC14F5ADBA0040E2AC, 856BDBDD14F5ADBA0040E2AC, 856BDBDE14F5ADBA0040E2AC, 856BDBDF14F5ADBA0040E2AC, 856BDBE014F5ADBA0040E2AC, 856BDBE114F5ADBA0040E2AC, 856BDBE214F5ADBA0040E2AC, 856BDBE314F5ADBA0040E2AC, 856BDBE414F5ADBA0040E2AC, 856BDBE514F5ADBA0040E2AC, 856BDBE614F5ADBA0040E2AC, 856BDBE714F5ADBA0040E2AC, 856BDBE814F5ADBA0040E2AC, 856BDBE914F5ADBA0040E2AC, 856BDBEA14F5ADBA0040E2AC, 856BDBEB14F5ADBA0040E2AC, 856BDBEC14F5ADBA0040E2AC, 856BDBED14F5ADBA0040E2AC, 856BDBC814F5AD690040E2AC, 856BDBC914F5AD690040E2AC, 856BDBBA14F5AC470040E2AC, 856BDBBB14F5AC470040E2AC, 856BDBBC14F5AC470040E2AC, 856BDBBD14F5AC470040E2AC, 856BDBBE14F5AC470040E2AC, 856BDBBF14F5AC470040E2AC, ); isa = PBXGroup; name = Classes; refType = 4; sourceTree = ""; }; 089C165CFE840E0CC02AAC07 = { children = ( 089C165DFE840E0CC02AAC07, ); isa = PBXVariantGroup; name = InfoPlist.strings; refType = 4; sourceTree = ""; }; 089C165DFE840E0CC02AAC07 = { fileEncoding = 10; isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; refType = 4; sourceTree = ""; }; //080 //081 //082 //083 //084 //100 //101 //102 //103 //104 1058C7A0FEA54F0111CA2CBB = { children = ( 8599C97014FFFDC6003FEA11, ); isa = PBXGroup; name = "Linked Frameworks"; refType = 4; sourceTree = ""; }; 1058C7A2FEA54F0111CA2CBB = { children = ( 29B97325FDCFA39411CA2CEA, 29B97324FDCFA39411CA2CEA, ); isa = PBXGroup; name = "Other Frameworks"; refType = 4; sourceTree = ""; }; //100 //101 //102 //103 //104 //190 //191 //192 //193 //194 19C28FACFE9D520D11CA2CBB = { children = ( 8D1107320486CEB800E47090, ); isa = PBXGroup; name = Products; refType = 4; sourceTree = ""; }; //190 //191 //192 //193 //194 //290 //291 //292 //293 //294 29B97313FDCFA39411CA2CEA = { buildSettings = { }; buildStyles = ( 4A9504CCFFE6A4B311CA0CBA, 4A9504CDFFE6A4B311CA0CBA, ); hasScannedForEncodings = 1; isa = PBXProject; mainGroup = 29B97314FDCFA39411CA2CEA; projectDirPath = ""; targets = ( 8D1107260486CEB800E47090, ); }; 29B97314FDCFA39411CA2CEA = { children = ( 080E96DDFE201D6D7F000001, 29B97315FDCFA39411CA2CEA, 29B97317FDCFA39411CA2CEA, 29B97323FDCFA39411CA2CEA, 19C28FACFE9D520D11CA2CBB, ); isa = PBXGroup; name = Zipper; path = ""; refType = 4; sourceTree = ""; }; 29B97315FDCFA39411CA2CEA = { children = ( 856F13EB16B34ED100EA844F, 29B97316FDCFA39411CA2CEA, ); isa = PBXGroup; name = "Other Sources"; path = ""; refType = 4; sourceTree = ""; }; 29B97316FDCFA39411CA2CEA = { fileEncoding = 4; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; refType = 4; sourceTree = ""; }; 29B97317FDCFA39411CA2CEA = { children = ( 8570AAB1155B212300D2B034, 8571DDB714F6E134006BAD68, 8571DDB914F6E134006BAD68, 8D1107310486CEB800E47090, 089C165CFE840E0CC02AAC07, 29B97318FDCFA39411CA2CEA, ); isa = PBXGroup; name = Resources; path = ""; refType = 4; sourceTree = ""; }; 29B97318FDCFA39411CA2CEA = { children = ( 29B97319FDCFA39411CA2CEA, ); isa = PBXVariantGroup; name = MainMenu.nib; path = ""; refType = 4; sourceTree = ""; }; 29B97319FDCFA39411CA2CEA = { isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/MainMenu.nib; refType = 4; sourceTree = ""; }; 29B97323FDCFA39411CA2CEA = { children = ( 1058C7A0FEA54F0111CA2CBB, 1058C7A2FEA54F0111CA2CBB, ); isa = PBXGroup; name = Frameworks; path = ""; refType = 4; sourceTree = ""; }; 29B97324FDCFA39411CA2CEA = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; refType = 0; sourceTree = ""; }; 29B97325FDCFA39411CA2CEA = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; refType = 0; sourceTree = ""; }; //290 //291 //292 //293 //294 //4A0 //4A1 //4A2 //4A3 //4A4 4A9504CCFFE6A4B311CA0CBA = { buildSettings = { COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_OPTIMIZATION_LEVEL = 0; ZERO_LINK = YES; }; isa = PBXBuildStyle; name = Development; }; 4A9504CDFFE6A4B311CA0CBA = { buildSettings = { COPY_PHASE_STRIP = YES; GCC_ENABLE_FIX_AND_CONTINUE = NO; ZERO_LINK = NO; }; isa = PBXBuildStyle; name = Deployment; }; //4A0 //4A1 //4A2 //4A3 //4A4 //850 //851 //852 //853 //854 856BDBBA14F5AC470040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; refType = 4; sourceTree = ""; }; 856BDBBB14F5AC470040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; refType = 4; sourceTree = ""; }; 856BDBBC14F5AC470040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Archive.h; refType = 4; sourceTree = ""; }; 856BDBBD14F5AC470040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Archive.m; refType = 4; sourceTree = ""; }; 856BDBBE14F5AC470040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ArchiveService.h; refType = 4; sourceTree = ""; }; 856BDBBF14F5AC470040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ArchiveService.m; refType = 4; sourceTree = ""; }; 856BDBC014F5AC470040E2AC = { fileRef = 856BDBBA14F5AC470040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDBC114F5AC470040E2AC = { fileRef = 856BDBBB14F5AC470040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDBC214F5AC470040E2AC = { fileRef = 856BDBBC14F5AC470040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDBC314F5AC470040E2AC = { fileRef = 856BDBBD14F5AC470040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDBC414F5AC470040E2AC = { fileRef = 856BDBBE14F5AC470040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDBC514F5AC470040E2AC = { fileRef = 856BDBBF14F5AC470040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDBC814F5AD690040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FileInfo.h; refType = 4; sourceTree = ""; }; 856BDBC914F5AD690040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FileInfo.m; refType = 4; sourceTree = ""; }; 856BDBCA14F5AD690040E2AC = { fileRef = 856BDBC814F5AD690040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDBCB14F5AD690040E2AC = { fileRef = 856BDBC914F5AD690040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDBCE14F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GzipArchive.h; refType = 4; sourceTree = ""; }; 856BDBCF14F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GzipArchive.m; refType = 4; sourceTree = ""; }; 856BDBD014F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LhaArchive.h; refType = 4; sourceTree = ""; }; 856BDBD114F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LhaArchive.m; refType = 4; sourceTree = ""; }; 856BDBD214F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LzxArchive.h; refType = 4; sourceTree = ""; }; 856BDBD314F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LzxArchive.m; refType = 4; sourceTree = ""; }; 856BDBD414F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSArray+Custom.h"; refType = 4; sourceTree = ""; }; 856BDBD514F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSArray+Custom.m"; refType = 4; sourceTree = ""; }; 856BDBD614F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSFileManager+Custom.h"; refType = 4; sourceTree = ""; }; 856BDBD714F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSFileManager+Custom.m"; refType = 4; sourceTree = ""; }; 856BDBD814F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSObject+Custom.h"; refType = 4; sourceTree = ""; }; 856BDBD914F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSObject+Custom.m"; refType = 4; sourceTree = ""; }; 856BDBDA14F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSString+Custom.h"; refType = 4; sourceTree = ""; }; 856BDBDB14F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSString+Custom.m"; refType = 4; sourceTree = ""; }; 856BDBDC14F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Preferences.h; refType = 4; sourceTree = ""; }; 856BDBDD14F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Preferences.m; refType = 4; sourceTree = ""; }; 856BDBDE14F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PreferencesController.h; refType = 4; sourceTree = ""; }; 856BDBDF14F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PreferencesController.m; refType = 4; sourceTree = ""; }; 856BDBE014F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RarArchive.h; refType = 4; sourceTree = ""; }; 856BDBE114F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RarArchive.m; refType = 4; sourceTree = ""; }; 856BDBE214F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SevenZipArchive.h; refType = 4; sourceTree = ""; }; 856BDBE314F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SevenZipArchive.m; refType = 4; sourceTree = ""; }; 856BDBE414F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TableViewDataSource.h; refType = 4; sourceTree = ""; }; 856BDBE514F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TableViewDataSource.m; refType = 4; sourceTree = ""; }; 856BDBE614F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TarArchive.h; refType = 4; sourceTree = ""; }; 856BDBE714F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TarArchive.m; refType = 4; sourceTree = ""; }; 856BDBE814F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ZipArchive.h; refType = 4; sourceTree = ""; }; 856BDBE914F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ZipArchive.m; refType = 4; sourceTree = ""; }; 856BDBEA14F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ZipperCell.h; refType = 4; sourceTree = ""; }; 856BDBEB14F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ZipperCell.m; refType = 4; sourceTree = ""; }; 856BDBEC14F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ZipperDocument.h; refType = 4; sourceTree = ""; }; 856BDBED14F5ADBA0040E2AC = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ZipperDocument.m; refType = 4; sourceTree = ""; }; 856BDBEE14F5ADBA0040E2AC = { fileRef = 856BDBCE14F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDBEF14F5ADBA0040E2AC = { fileRef = 856BDBCF14F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDBF014F5ADBA0040E2AC = { fileRef = 856BDBD014F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDBF114F5ADBA0040E2AC = { fileRef = 856BDBD114F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDBF214F5ADBA0040E2AC = { fileRef = 856BDBD214F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDBF314F5ADBA0040E2AC = { fileRef = 856BDBD314F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDBF414F5ADBA0040E2AC = { fileRef = 856BDBD414F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDBF514F5ADBA0040E2AC = { fileRef = 856BDBD514F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDBF614F5ADBA0040E2AC = { fileRef = 856BDBD614F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDBF714F5ADBA0040E2AC = { fileRef = 856BDBD714F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDBF814F5ADBA0040E2AC = { fileRef = 856BDBD814F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDBF914F5ADBA0040E2AC = { fileRef = 856BDBD914F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDBFA14F5ADBA0040E2AC = { fileRef = 856BDBDA14F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDBFB14F5ADBA0040E2AC = { fileRef = 856BDBDB14F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDBFC14F5ADBA0040E2AC = { fileRef = 856BDBDC14F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDBFD14F5ADBA0040E2AC = { fileRef = 856BDBDD14F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDBFE14F5ADBA0040E2AC = { fileRef = 856BDBDE14F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDBFF14F5ADBA0040E2AC = { fileRef = 856BDBDF14F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDC0014F5ADBA0040E2AC = { fileRef = 856BDBE014F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDC0114F5ADBA0040E2AC = { fileRef = 856BDBE114F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDC0214F5ADBA0040E2AC = { fileRef = 856BDBE214F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDC0314F5ADBA0040E2AC = { fileRef = 856BDBE314F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDC0414F5ADBA0040E2AC = { fileRef = 856BDBE414F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDC0514F5ADBA0040E2AC = { fileRef = 856BDBE514F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDC0614F5ADBA0040E2AC = { fileRef = 856BDBE614F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDC0714F5ADBA0040E2AC = { fileRef = 856BDBE714F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDC0814F5ADBA0040E2AC = { fileRef = 856BDBE814F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDC0914F5ADBA0040E2AC = { fileRef = 856BDBE914F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDC0A14F5ADBA0040E2AC = { fileRef = 856BDBEA14F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDC0B14F5ADBA0040E2AC = { fileRef = 856BDBEB14F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDC0C14F5ADBA0040E2AC = { fileRef = 856BDBEC14F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856BDC0D14F5ADBA0040E2AC = { fileRef = 856BDBED14F5ADBA0040E2AC; isa = PBXBuildFile; settings = { }; }; 856F13EB16B34ED100EA844F = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = common.h; refType = 4; sourceTree = ""; }; 856F13EC16B34ED100EA844F = { fileRef = 856F13EB16B34ED100EA844F; isa = PBXBuildFile; settings = { }; }; 856F13EF16B34EEB00EA844F = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AceArchive.h; refType = 4; sourceTree = ""; }; 856F13F016B34EEB00EA844F = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AceArchive.m; refType = 4; sourceTree = ""; }; 856F13F116B34EEB00EA844F = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ArjArchive.h; refType = 4; sourceTree = ""; }; 856F13F216B34EEB00EA844F = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ArjArchive.m; refType = 4; sourceTree = ""; }; 856F13F316B34EEB00EA844F = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ZooArchive.h; refType = 4; sourceTree = ""; }; 856F13F416B34EEB00EA844F = { fileEncoding = 30; isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ZooArchive.m; refType = 4; sourceTree = ""; }; 856F13F516B34EEB00EA844F = { fileRef = 856F13EF16B34EEB00EA844F; isa = PBXBuildFile; settings = { }; }; 856F13F616B34EEB00EA844F = { fileRef = 856F13F016B34EEB00EA844F; isa = PBXBuildFile; settings = { }; }; 856F13F716B34EEB00EA844F = { fileRef = 856F13F116B34EEB00EA844F; isa = PBXBuildFile; settings = { }; }; 856F13F816B34EEB00EA844F = { fileRef = 856F13F216B34EEB00EA844F; isa = PBXBuildFile; settings = { }; }; 856F13F916B34EEB00EA844F = { fileRef = 856F13F316B34EEB00EA844F; isa = PBXBuildFile; settings = { }; }; 856F13FA16B34EEB00EA844F = { fileRef = 856F13F416B34EEB00EA844F; isa = PBXBuildFile; settings = { }; }; 8570AAB1155B212300D2B034 = { isa = PBXFileReference; lastKnownFileType = image.icns; name = Zipper.icns; path = Resources/Zipper.icns; refType = 4; sourceTree = ""; }; 8570AAB2155B212300D2B034 = { fileRef = 8570AAB1155B212300D2B034; isa = PBXBuildFile; settings = { }; }; 8571DDB714F6E134006BAD68 = { children = ( 8571DDB814F6E134006BAD68, ); isa = PBXVariantGroup; name = Preferences.nib; path = ""; refType = 4; sourceTree = ""; }; 8571DDB814F6E134006BAD68 = { isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/Preferences.nib; refType = 4; sourceTree = ""; }; 8571DDB914F6E134006BAD68 = { children = ( 8571DDBA14F6E134006BAD68, ); isa = PBXVariantGroup; name = ZipperDocument.nib; path = ""; refType = 4; sourceTree = ""; }; 8571DDBA14F6E134006BAD68 = { isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/ZipperDocument.nib; refType = 4; sourceTree = ""; }; 8571DDBB14F6E134006BAD68 = { fileRef = 8571DDB714F6E134006BAD68; isa = PBXBuildFile; settings = { }; }; 8571DDBC14F6E134006BAD68 = { fileRef = 8571DDB914F6E134006BAD68; isa = PBXBuildFile; settings = { }; }; 8599C97014FFFDC6003FEA11 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; refType = 0; sourceTree = ""; }; 8599C97114FFFDC6003FEA11 = { fileRef = 8599C97014FFFDC6003FEA11; isa = PBXBuildFile; settings = { }; }; //850 //851 //852 //853 //854 //8D0 //8D1 //8D2 //8D3 //8D4 8D1107260486CEB800E47090 = { buildPhases = ( 8D1107290486CEB800E47090, 8D11072C0486CEB800E47090, 8D11072E0486CEB800E47090, ); buildRules = ( ); buildSettings = { GCC_CW_ASM_SYNTAX = NO; GCC_ENABLE_CPP_EXCEPTIONS = NO; GCC_ENABLE_CPP_RTTI = NO; GCC_ENABLE_PASCAL_STRINGS = NO; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_MODEL_TUNING = G3; GCC_PRECOMPILE_PREFIX_HEADER = NO; GCC_PREFIX_HEADER = ""; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; PRODUCT_NAME = Zipper; WRAPPER_EXTENSION = app; }; dependencies = ( ); isa = PBXNativeTarget; name = Zipper; productInstallPath = "$(HOME)/Applications"; productName = Zipper; productReference = 8D1107320486CEB800E47090; productType = "com.apple.product-type.application"; }; 8D1107290486CEB800E47090 = { buildActionMask = 2147483647; files = ( 8D11072A0486CEB800E47090, 8D11072B0486CEB800E47090, 856BDBC014F5AC470040E2AC, 856BDBC214F5AC470040E2AC, 856BDBC414F5AC470040E2AC, 856BDBCA14F5AD690040E2AC, 856BDBEE14F5ADBA0040E2AC, 856BDBF014F5ADBA0040E2AC, 856BDBF214F5ADBA0040E2AC, 856BDBF414F5ADBA0040E2AC, 856BDBF614F5ADBA0040E2AC, 856BDBF814F5ADBA0040E2AC, 856BDBFA14F5ADBA0040E2AC, 856BDBFC14F5ADBA0040E2AC, 856BDBFE14F5ADBA0040E2AC, 856BDC0014F5ADBA0040E2AC, 856BDC0214F5ADBA0040E2AC, 856BDC0414F5ADBA0040E2AC, 856BDC0614F5ADBA0040E2AC, 856BDC0814F5ADBA0040E2AC, 856BDC0A14F5ADBA0040E2AC, 856BDC0C14F5ADBA0040E2AC, 8571DDBB14F6E134006BAD68, 8571DDBC14F6E134006BAD68, 8570AAB2155B212300D2B034, 856F13EC16B34ED100EA844F, 856F13F516B34EEB00EA844F, 856F13F716B34EEB00EA844F, 856F13F916B34EEB00EA844F, ); isa = PBXResourcesBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; 8D11072A0486CEB800E47090 = { fileRef = 29B97318FDCFA39411CA2CEA; isa = PBXBuildFile; settings = { }; }; 8D11072B0486CEB800E47090 = { fileRef = 089C165CFE840E0CC02AAC07; isa = PBXBuildFile; settings = { }; }; 8D11072C0486CEB800E47090 = { buildActionMask = 2147483647; files = ( 8D11072D0486CEB800E47090, 856BDBC114F5AC470040E2AC, 856BDBC314F5AC470040E2AC, 856BDBC514F5AC470040E2AC, 856BDBCB14F5AD690040E2AC, 856BDBEF14F5ADBA0040E2AC, 856BDBF114F5ADBA0040E2AC, 856BDBF314F5ADBA0040E2AC, 856BDBF514F5ADBA0040E2AC, 856BDBF714F5ADBA0040E2AC, 856BDBF914F5ADBA0040E2AC, 856BDBFB14F5ADBA0040E2AC, 856BDBFD14F5ADBA0040E2AC, 856BDBFF14F5ADBA0040E2AC, 856BDC0114F5ADBA0040E2AC, 856BDC0314F5ADBA0040E2AC, 856BDC0514F5ADBA0040E2AC, 856BDC0714F5ADBA0040E2AC, 856BDC0914F5ADBA0040E2AC, 856BDC0B14F5ADBA0040E2AC, 856BDC0D14F5ADBA0040E2AC, 856F13F616B34EEB00EA844F, 856F13F816B34EEB00EA844F, 856F13FA16B34EEB00EA844F, ); isa = PBXSourcesBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; 8D11072D0486CEB800E47090 = { fileRef = 29B97316FDCFA39411CA2CEA; isa = PBXBuildFile; settings = { ATTRIBUTES = ( ); }; }; 8D11072E0486CEB800E47090 = { buildActionMask = 2147483647; files = ( 8599C97114FFFDC6003FEA11, ); isa = PBXFrameworksBuildPhase; runOnlyForDeploymentPostprocessing = 0; }; 8D1107310486CEB800E47090 = { fileEncoding = 4; isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; refType = 4; sourceTree = ""; }; 8D1107320486CEB800E47090 = { explicitFileType = wrapper.application; includeInIndex = 0; isa = PBXFileReference; path = Zipper.app; refType = 3; sourceTree = BUILT_PRODUCTS_DIR; }; }; rootObject = 29B97313FDCFA39411CA2CEA; }