First working version of a local service. Still some design and
[platform/upstream/libzypp.git] / zypp / repo / PluginServices.cc
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 #include <iostream>
10 #include <sstream>
11 #include "zypp/base/Logger.h"
12 #include "zypp/base/Gettext.h"
13 #include "zypp/base/String.h"
14 #include "zypp/base/InputStream.h"
15 #include "zypp/base/UserRequestException.h"
16
17 #include "zypp/repo/PluginServices.h"
18 #include "zypp/ServiceInfo.h"
19 #include "zypp/RepoInfo.h"
20 #include "zypp/PathInfo.h"
21
22 using std::endl;
23 using std::stringstream;
24
25 ///////////////////////////////////////////////////////////////////
26 namespace zypp
27 { /////////////////////////////////////////////////////////////////
28   ///////////////////////////////////////////////////////////////////
29   namespace repo
30   { /////////////////////////////////////////////////////////////////
31
32     class PluginServices::Impl
33     {
34     public:
35       static void loadServices( const Pathname &path,
36           const PluginServices::ProcessService &callback );
37     };
38
39     void PluginServices::Impl::loadServices( const Pathname &path,
40                                   const PluginServices::ProcessService & callback/*,
41                                   const ProgressData::ReceiverFnc &progress*/ )
42     {
43       std::list<Pathname> entries;
44       if (PathInfo(path).isExist())
45       {
46         if ( filesystem::readdir( entries, path, false ) != 0 )
47         {          
48           // TranslatorExplanation '%s' is a pathname
49             ZYPP_THROW(Exception(str::form(_("Failed to read directory '%s'"), path.c_str())));
50         }
51
52         //str::regex allowedServiceExt("^\\.service(_[0-9]+)?$");
53         for_(it, entries.begin(), entries.end() )
54         {
55           ServiceInfo service_info;
56           service_info.setAlias((*it).basename());
57           Url url;
58           url.setPathName((*it).asString());
59           url.setScheme("file");
60           service_info.setUrl(url);
61           service_info.setType(ServiceType::PLUGIN);
62           callback(service_info);
63         }
64
65       }
66     }
67
68     PluginServices::PluginServices( const Pathname &path,
69                                   const ProcessService & callback/*,
70                                   const ProgressData::ReceiverFnc &progress */)
71     {
72       Impl::loadServices(path, callback/*, progress*/);
73     }
74
75     PluginServices::~PluginServices()
76     {}
77
78     std::ostream & operator<<( std::ostream & str, const PluginServices & obj )
79     {
80       return str;
81     }
82
83     /////////////////////////////////////////////////////////////////
84   } // namespace repo
85   ///////////////////////////////////////////////////////////////////
86   /////////////////////////////////////////////////////////////////
87 } // namespace zypp
88 ///////////////////////////////////////////////////////////////////