xref: /AOO41X/main/padmin/source/newppdlg.cxx (revision 466d5a0b1cd4680d6b00897b7eaafb6844398eb8)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #include <stdio.h>
25 #include <unistd.h>
26 
27 #include "helper.hxx"
28 #include "padialog.hrc"
29 #include "newppdlg.hxx"
30 #include "padialog.hxx"
31 #include "progress.hxx"
32 
33 #include "vcl/ppdparser.hxx"
34 #include "vcl/helper.hxx"
35 #include "vcl/svapp.hxx"
36 #include "vcl/mnemonic.hxx"
37 
38 #include "tools/urlobj.hxx"
39 
40 #include "osl/file.hxx"
41 
42 #include <list>
43 
44 #define PPDIMPORT_GROUP "PPDImport"
45 
46 using namespace padmin;
47 using namespace psp;
48 using namespace osl;
49 using namespace rtl;
50 
PPDImportDialog(Window * pParent)51 PPDImportDialog::PPDImportDialog( Window* pParent ) :
52         ModalDialog( pParent, PaResId( RID_PPDIMPORT_DLG ) ),
53         m_aOKBtn( this, PaResId( RID_PPDIMP_BTN_OK ) ),
54         m_aCancelBtn( this, PaResId( RID_PPDIMP_BTN_CANCEL ) ),
55         m_aPathTxt( this, PaResId( RID_PPDIMP_TXT_PATH ) ),
56         m_aPathBox( this, PaResId( RID_PPDIMP_LB_PATH ) ),
57         m_aSearchBtn( this, PaResId( RID_PPDIMP_BTN_SEARCH ) ),
58         m_aDriverTxt( this, PaResId( RID_PPDIMP_TXT_DRIVER ) ),
59         m_aDriverLB( this, PaResId( RID_PPDIMP_LB_DRIVER ) ),
60         m_aPathGroup( this, PaResId( RID_PPDIMP_GROUP_PATH ) ),
61         m_aDriverGroup( this, PaResId( RID_PPDIMP_GROUP_DRIVER ) ),
62         m_aLoadingPPD( PaResId( RID_PPDIMP_STR_LOADINGPPD ) )
63 {
64     FreeResource();
65 
66     String aText( m_aDriverTxt.GetText() );
67     aText.SearchAndReplaceAscii( "%s", Button::GetStandardText( BUTTON_OK ) );
68     m_aDriverTxt.SetText( MnemonicGenerator::EraseAllMnemonicChars( aText ) );
69 
70     Config& rConfig = getPadminRC();
71     rConfig.SetGroup( PPDIMPORT_GROUP );
72     m_aPathBox.SetText( String( rConfig.ReadKey( "LastDir" ), RTL_TEXTENCODING_UTF8 ) );
73     for( int i = 0; i < 11; i++ )
74     {
75         ByteString aEntry( rConfig.ReadKey( ByteString::CreateFromInt32( i ) ) );
76         if( aEntry.Len() )
77             m_aPathBox.InsertEntry( String( aEntry, RTL_TEXTENCODING_UTF8 ) );
78     }
79 
80     m_aOKBtn.SetClickHdl( LINK( this, PPDImportDialog, ClickBtnHdl ) );
81     m_aCancelBtn.SetClickHdl( LINK( this, PPDImportDialog, ClickBtnHdl ) );
82     m_aSearchBtn.SetClickHdl( LINK( this, PPDImportDialog, ClickBtnHdl ) );
83     m_aPathBox.SetSelectHdl( LINK( this, PPDImportDialog, SelectHdl ) );
84     m_aPathBox.SetModifyHdl( LINK( this, PPDImportDialog, ModifyHdl ) );
85 
86     if( m_aPathBox.GetText().Len() )
87         Import();
88 }
89 
~PPDImportDialog()90 PPDImportDialog::~PPDImportDialog()
91 {
92     while( m_aDriverLB.GetEntryCount() )
93     {
94         delete (String*)m_aDriverLB.GetEntryData( 0 );
95         m_aDriverLB.RemoveEntry( 0 );
96     }
97 }
98 
Import()99 void PPDImportDialog::Import()
100 {
101     String aImportPath( m_aPathBox.GetText() );
102 
103     Config& rConfig = getPadminRC();
104     rConfig.SetGroup( PPDIMPORT_GROUP );
105     rConfig.WriteKey( "LastDir", ByteString( aImportPath, RTL_TEXTENCODING_UTF8 ) );
106 
107     int nEntries = m_aPathBox.GetEntryCount();
108     while( nEntries-- )
109         if( aImportPath == m_aPathBox.GetEntry( nEntries ) )
110             break;
111     if( nEntries < 0 )
112     {
113         int nNextEntry = rConfig.ReadKey( "NextEntry" ).ToInt32();
114         rConfig.WriteKey( ByteString::CreateFromInt32( nNextEntry ), ByteString( aImportPath, RTL_TEXTENCODING_UTF8 ) );
115         nNextEntry = nNextEntry < 10 ? nNextEntry+1 : 0;
116         rConfig.WriteKey( "NextEntry", ByteString::CreateFromInt32( nNextEntry ) );
117         m_aPathBox.InsertEntry( aImportPath );
118     }
119     while( m_aDriverLB.GetEntryCount() )
120     {
121         delete (String*)m_aDriverLB.GetEntryData( 0 );
122         m_aDriverLB.RemoveEntry( 0 );
123     }
124 
125     ProgressDialog aProgress( Application::GetFocusWindow() );
126     aProgress.startOperation( m_aLoadingPPD );
127 
128     ::std::list< String > aFiles;
129     FindFiles( aImportPath, aFiles, String( RTL_CONSTASCII_USTRINGPARAM( "PS;PPD;PS.GZ;PPD.GZ" ) ), true );
130 
131     int i = 0;
132     aProgress.setRange( 0, aFiles.size() );
133     while( aFiles.size() )
134     {
135         aProgress.setValue( ++i );
136         aProgress.setFilename( aFiles.front() );
137         INetURLObject aPath( aImportPath, INET_PROT_FILE, INetURLObject::ENCODE_ALL );
138         aPath.Append( aFiles.front() );
139         String aPrinterName = PPDParser::getPPDPrinterName( aPath.PathToFileName() );
140         aFiles.pop_front();
141 
142         if( ! aPrinterName.Len() )
143         {
144 #if OSL_DEBUG_LEVEL > 1
145             fprintf( stderr, "Warning: File %s has empty printer name.\n",
146                      rtl::OUStringToOString( aPath.PathToFileName(), osl_getThreadTextEncoding() ).getStr() );
147 #endif
148             continue;
149         }
150 
151         sal_uInt16 nPos = m_aDriverLB.InsertEntry( aPrinterName );
152         m_aDriverLB.SetEntryData( nPos, new String( aPath.PathToFileName() ) );
153     }
154 }
155 
IMPL_LINK(PPDImportDialog,ClickBtnHdl,PushButton *,pButton)156 IMPL_LINK( PPDImportDialog, ClickBtnHdl, PushButton*, pButton )
157 {
158     if( pButton == &m_aCancelBtn )
159     {
160         EndDialog( 0 );
161     }
162     else if( pButton == &m_aOKBtn )
163     {
164         // copy the files
165         ::std::list< rtl::OUString > aToDirs;
166         psp::getPrinterPathList( aToDirs, PRINTER_PPDDIR );
167         ::std::list< rtl::OUString >::iterator writeDir = aToDirs.begin();
168         m_aImportedFiles.clear();
169 
170         for( int i = 0; i < m_aDriverLB.GetSelectEntryCount(); i++ )
171         {
172             INetURLObject aFile( *(String*)m_aDriverLB.GetEntryData(
173                 m_aDriverLB.GetSelectEntryPos( i )
174                 ), INET_PROT_FILE, INetURLObject::ENCODE_ALL );
175             OUString aFromUni( aFile.GetMainURL(INetURLObject::DECODE_TO_IURI) );
176 
177             do
178             {
179                 INetURLObject aToFile( *writeDir, INET_PROT_FILE, INetURLObject::ENCODE_ALL );
180                 aToFile.Append( aFile.GetName() );
181                 OUString aToUni( aToFile.GetMainURL(INetURLObject::DECODE_TO_IURI) );
182                 if( ! File::copy( aFromUni, aToUni ) )
183                 {
184                     m_aImportedFiles.push_back( aToUni );
185                     break;
186                 }
187                 ++writeDir;
188             } while( writeDir != aToDirs.end() );
189         }
190         EndDialog( 1 );
191     }
192     else if( pButton == &m_aSearchBtn )
193     {
194         String aPath( m_aPathBox.GetText() );
195         if( chooseDirectory( aPath ) )
196         {
197             m_aPathBox.SetText( aPath );
198             Import();
199         }
200     }
201     return 0;
202 }
203 
IMPL_LINK(PPDImportDialog,SelectHdl,ComboBox *,pListBox)204 IMPL_LINK( PPDImportDialog, SelectHdl, ComboBox*, pListBox )
205 {
206     if( pListBox == &m_aPathBox )
207     {
208         Import();
209     }
210     return 0;
211 }
212 
IMPL_LINK(PPDImportDialog,ModifyHdl,ComboBox *,pListBox)213 IMPL_LINK( PPDImportDialog, ModifyHdl, ComboBox*, pListBox )
214 {
215     if( pListBox == &m_aPathBox )
216     {
217         ByteString aDir( m_aPathBox.GetText(), osl_getThreadTextEncoding() );
218         if( ! access( aDir.GetBuffer(), F_OK ) )
219             Import();
220     }
221     return 0;
222 }
223