yatecbase.h

00001 /*
00002  * yatecbase.h
00003  * This file is part of the YATE Project http://YATE.null.ro
00004  *
00005  * Common base classes for all telephony clients
00006  *
00007  * Yet Another Telephony Engine - a fully featured software PBX and IVR
00008  * Copyright (C) 2004-2006 Null Team
00009  *
00010  * This program is free software; you can redistribute it and/or modify
00011  * it under the terms of the GNU General Public License as published by
00012  * the Free Software Foundation; either version 2 of the License, or
00013  * (at your option) any later version.
00014  *
00015  * This program is distributed in the hope that it will be useful,
00016  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00017  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
00018  * GNU General Public License for more details.
00019  *
00020  * You should have received a copy of the GNU General Public License
00021  * along with this program; if not, write to the Free Software
00022  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
00023  */
00024 
00025 #ifndef __YATECBASE_H
00026 #define __YATECBASE_H
00027 
00028 #ifndef __cplusplus
00029 #error C++ is required
00030 #endif
00031                                                                                 
00032 #include <yatephone.h>
00033 
00037 namespace TelEngine {
00038 
00039 class Client;
00040 class ClientChannel;
00041 class ClientDriver;
00042 
00048 class YATE_API Window : public GenObject
00049 {
00050     friend class Client;
00051 public:
00056     Window(const char* id = 0);
00057 
00061     virtual ~Window();
00062 
00067     virtual const String& toString() const;
00068 
00069     /*
00070      * Get the window's title (may not be displayed on screen)
00071      * @return Title of this window
00072      */
00073     virtual void title(const String& text);
00074 
00079     virtual void context(const String& text);
00080 
00086     virtual bool setParams(const NamedList& params);
00087 
00092     virtual void setOver(const Window* parent) = 0;
00093 
00099     virtual bool hasElement(const String& name) = 0;
00100 
00107     virtual bool setActive(const String& name, bool active) = 0;
00108 
00115     virtual bool setFocus(const String& name, bool select = false) = 0;
00116 
00123     virtual bool setShow(const String& name, bool visible) = 0;
00124 
00131     virtual bool setText(const String& name, const String& text) = 0;
00132 
00139     virtual bool setCheck(const String& name, bool checked) = 0;
00140 
00147     virtual bool setSelect(const String& name, const String& item) = 0;
00148 
00155     virtual bool setUrgent(const String& name, bool urgent) = 0;
00156 
00163     virtual bool hasOption(const String& name, const String& item) = 0;
00164 
00173     virtual bool addOption(const String& name, const String& item, bool atStart = false, const String& text = String::empty()) = 0;
00174 
00181     virtual bool delOption(const String& name, const String& item) = 0;
00182 
00183     virtual bool addTableRow(const String& name, const String& item, const NamedList* data = 0, bool atStart = false);
00184     virtual bool delTableRow(const String& name, const String& item);
00185     virtual bool setTableRow(const String& name, const String& item, const NamedList* data);
00186     virtual bool getTableRow(const String& name, const String& item, NamedList* data = 0);
00187     virtual bool clearTable(const String& name);
00188     virtual bool getText(const String& name, String& text) = 0;
00189     virtual bool getCheck(const String& name, bool& checked) = 0;
00190     virtual bool getSelect(const String& name, String& item) = 0;
00191     virtual void populate() = 0;
00192     virtual void init() = 0;
00193     virtual void show() = 0;
00194     virtual void hide() = 0;
00195     virtual void size(int width, int height) = 0;
00196     virtual void move(int x, int y) = 0;
00197     virtual void moveRel(int dx, int dy) = 0;
00198     virtual bool related(const Window* wnd) const;
00199     virtual void menu(int x, int y) = 0;
00200 
00205     inline const String& id() const
00206         { return m_id; }
00207 
00208     /*
00209      * Get the window's title (may not be displayed on screen)
00210      * @return Title of this window
00211      */
00212     inline const String& title() const
00213         { return m_title; }
00214 
00219     inline const String& context() const
00220         { return m_context; }
00221 
00226     inline bool visible() const
00227         { return m_visible; }
00228 
00233     inline void visible(bool yes)
00234         { if (yes) show(); else hide(); }
00235 
00240     inline bool master() const
00241         { return m_master; }
00242 
00247     inline bool popup() const
00248         { return m_popup; }
00249 
00250 protected:
00251     String m_id;
00252     String m_title;
00253     String m_context;
00254     bool m_visible;
00255     bool m_master;
00256     bool m_popup;
00257 };
00258 
00263 class YATE_API UIFactory : public String
00264 {
00265 public:
00266     UIFactory(const char* type, const char* name);
00267     virtual ~UIFactory();
00268 };
00269 
00274 class YATE_API Client : public Thread
00275 {
00276     friend class Window;
00277     friend class ClientChannel;
00278     friend class ClientDriver;
00279 public:
00280     Client(const char *name = 0);
00281     virtual ~Client();
00282     virtual void run();
00283     virtual void main() = 0;
00284     virtual void lock() = 0;
00285     virtual void unlock() = 0;
00286     inline void lockOther()
00287         { if (!m_oneThread) lock(); }
00288     inline void unlockOther()
00289         { if (!m_oneThread) unlock(); }
00290     virtual void allHidden() = 0;
00291     virtual bool createWindow(const String& name) = 0;
00292     virtual bool addToLog(const String& text, Window* wnd = 0);
00293     virtual bool setStatus(const String& text, Window* wnd = 0);
00294     bool addToLogLocked(const String& text, Window* wnd = 0);
00295     bool setStatusLocked(const String& text, Window* wnd = 0);
00296     virtual bool action(Window* wnd, const String& name);
00297     virtual bool toggle(Window* wnd, const String& name, bool active);
00298     virtual bool select(Window* wnd, const String& name, const String& item, const String& text = String::empty());
00299     virtual bool callRouting(const String& caller, const String& called, Message* msg = 0);
00300     virtual bool callIncoming(const String& caller, const String& dest = String::empty(), Message* msg = 0);
00301     virtual void updateCDR(const Message& msg);
00302     void clearActive(const String& id);
00303     void callAccept(const char* callId = 0);
00304     void callReject(const char* callId = 0);
00305     void callHangup(const char* callId = 0);
00306     bool callStart(const String& target, const String& line = String::empty(),
00307         const String& proto = String::empty(), const String& account = String::empty());
00308     bool emitDigit(char digit);
00309     inline bool oneThread() const
00310         { return m_oneThread; }
00311     inline int line() const
00312         { return m_line; }
00313     void line(int newLine);
00314     bool hasElement(const String& name, Window* wnd = 0, Window* skip = 0);
00315     bool setActive(const String& name, bool active, Window* wnd = 0, Window* skip = 0);
00316     bool setFocus(const String& name, bool select = false, Window* wnd = 0, Window* skip = 0);
00317     bool setShow(const String& name, bool visible, Window* wnd = 0, Window* skip = 0);
00318     bool setText(const String& name, const String& text, Window* wnd = 0, Window* skip = 0);
00319     bool setCheck(const String& name, bool checked, Window* wnd = 0, Window* skip = 0);
00320     bool setSelect(const String& name, const String& item, Window* wnd = 0, Window* skip = 0);
00321     bool setUrgent(const String& name, bool urgent, Window* wnd = 0, Window* skip = 0);
00322     bool hasOption(const String& name, const String& item, Window* wnd = 0, Window* skip = 0);
00323     bool addOption(const String& name, const String& item, bool atStart, const String& text = String::empty(), Window* wnd = 0, Window* skip = 0);
00324     bool delOption(const String& name, const String& item, Window* wnd = 0, Window* skip = 0);
00325     bool addTableRow(const String& name, const String& item, const NamedList* data = 0, bool atStart = false, Window* wnd = 0, Window* skip = 0);
00326     bool delTableRow(const String& name, const String& item, Window* wnd = 0, Window* skip = 0);
00327     bool setTableRow(const String& name, const String& item, const NamedList* data, Window* wnd = 0, Window* skip = 0);
00328     bool getTableRow(const String& name, const String& item, NamedList* data = 0, Window* wnd = 0, Window* skip = 0);
00329     bool clearTable(const String& name, Window* wnd = 0, Window* skip = 0);
00330     bool getText(const String& name, String& text, Window* wnd = 0, Window* skip = 0);
00331     bool getCheck(const String& name, bool& checked, Window* wnd = 0, Window* skip = 0);
00332     bool getSelect(const String& name, String& item, Window* wnd = 0, Window* skip = 0);
00333     void moveRelated(const Window* wnd, int dx, int dy);
00334     inline bool initialized() const
00335         { return m_initialized; }
00336     inline static Client* self()
00337         { return s_client; }
00338     inline static bool changing()
00339         { return (s_changing > 0); }
00340     inline const String& activeId() const
00341         { return m_activeId; }
00342     static Window* getWindow(const String& name);
00343     static bool setVisible(const String& name, bool show = true);
00344     static bool getVisible(const String& name);
00345     static bool openPopup(const String& name, const NamedList* params = 0, const Window* parent = 0);
00346     static bool openMessage(const char* text, const Window* parent = 0, const char* context = 0);
00347     static bool openConfirm(const char* text, const Window* parent = 0, const char* context = 0);
00348     static ObjList* listWindows();
00349     void idleActions();
00350 protected:
00351     virtual void loadWindows() = 0;
00352     virtual void initWindows();
00353     virtual void initClient();
00354     virtual void exitClient();
00355     virtual void setChannelDisplay(ClientChannel* chan);
00356     virtual bool updateCallHist(const NamedList& params);
00357     void addChannel(ClientChannel* chan);
00358     void delChannel(ClientChannel* chan);
00359     void setChannel(ClientChannel* chan);
00360     void setChannelInternal(ClientChannel* chan);
00361     void selectChannel(ClientChannel* chan, bool force = false);
00362     void updateFrom(const String& id);
00363     void updateFrom(const ClientChannel* chan);
00364     void enableAction(const ClientChannel* chan, const String& action);
00365     inline bool needProxy() const
00366         { return m_oneThread && !isCurrent(); }
00367     bool driverLockLoop();
00368     static bool driverLock(long maxwait = 0);
00369     static void driverUnlock();
00370     ObjList m_windows;
00371     String m_activeId;
00372     bool m_initialized;
00373     int m_line;
00374     bool m_oneThread;
00375     bool m_multiLines;
00376     bool m_autoAnswer;
00377     static Client* s_client;
00378     static int s_changing;
00379 };
00380 
00385 class YATE_API ClientChannel : public Channel
00386 {
00387     friend class ClientDriver;
00388 public:
00389     ClientChannel(const String& party, const char* target = 0, const Message* msg = 0);
00390     virtual ~ClientChannel();
00391     virtual bool msgProgress(Message& msg);
00392     virtual bool msgRinging(Message& msg);
00393     virtual bool msgAnswered(Message& msg);
00394     virtual bool callRouted(Message& msg);
00395     virtual void callAccept(Message& msg);
00396     virtual void callRejected(const char* error, const char* reason, const Message* msg);
00397     virtual bool enableAction(const String& action) const;
00398     void callAnswer();
00399     bool openMedia(bool replace = false);
00400     void closeMedia();
00401     inline const String& party() const
00402         { return m_party; }
00403     inline const String& description() const
00404         { return m_desc; }
00405     inline bool flashing() const
00406         { return m_flashing; }
00407     inline void noticed()
00408         { m_flashing = false; }
00409     inline int line() const
00410         { return m_line; }
00411     void line(int newLine);
00412 protected:
00413     virtual void disconnected(bool final, const char* reason);
00414     void update(bool client = true);
00415     String m_party;
00416     String m_desc;
00417     String m_reason;
00418     u_int64_t m_time;
00419     int m_line;
00420     bool m_flashing;
00421     bool m_canAnswer;
00422     bool m_canTransfer;
00423     bool m_canConference;
00424 };
00425 
00430 class YATE_API ClientDriver : public Driver
00431 {
00432 public:
00433     ClientDriver();
00434     virtual ~ClientDriver();
00435     virtual void initialize() = 0;
00436     virtual bool factory(UIFactory* factory, const char* type);
00437     virtual bool msgExecute(Message& msg, String& dest);
00438     virtual void msgTimer(Message& msg);
00439     virtual bool msgRoute(Message& msg);
00440     ClientChannel* findLine(int line);
00441     inline static ClientDriver* self()
00442         { return s_driver; }
00443     inline static const String& device()
00444         { return s_device; }
00445 protected:
00446     void setup();
00447     static ClientDriver* s_driver;
00448     static String s_device;
00449 };
00450 
00451 }; // namespace TelEngine
00452 
00453 #endif /* __YATECBASE_H */
00454 
00455 /* vi: set ts=8 sw=4 sts=4 noet: */

Generated on Mon Oct 22 07:43:07 2007 for Yate by  doxygen 1.5.2