]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/contrib/error.h
add basic tests for GetTempDir()
[apt.git] / apt-pkg / contrib / error.h
index fc7b38f1b92f7ca8c7296e5c3eff630fb7688503..7d09b2d4ad5320b3bb872879df08abd4acb2cadb 100644 (file)
@@ -114,6 +114,34 @@ public:                                                                    /*{{{*/
         */
        bool DebugE(const char *Function,const char *Description,...) __like_printf(3) __cold;
 
+       /** \brief adds an errno message with the given type
+        *
+        * \param type of the error message
+        * \param Function which failed
+        * \param Description of the error
+        */
+       bool InsertErrno(MsgType const &type, const char* Function,
+                        const char* Description,...) __like_printf(4) __cold;
+
+       /** \brief adds an errno message with the given type
+        *
+        * args needs to be initialized with va_start and terminated
+        * with va_end by the caller. msgSize is also an out-parameter
+        * in case the msgSize was not enough to store the complete message.
+        *
+        * \param type of the error message
+        * \param Function which failed
+        * \param Description is the format string for args
+        * \param args list from a printf-like function
+        * \param errsv is the errno the error is for
+        * \param msgSize is the size of the char[] used to store message
+        * \return true if the message was added, false if not - the caller
+        * should call this method again in that case
+        */
+       bool InsertErrno(MsgType type, const char* Function,
+                        const char* Description, va_list &args,
+                        int const errsv, size_t &msgSize);
+
        /** \brief add an fatal error message to the list
         *
         *  Most of the stuff we consider as "error" is also "fatal" for
@@ -169,6 +197,29 @@ public:                                                                    /*{{{*/
         */
        bool Debug(const char *Description,...) __like_printf(2) __cold;
 
+       /** \brief adds an error message with the given type
+        *
+        * \param type of the error message
+        * \param Description of the error
+        */
+       bool Insert(MsgType const &type, const char* Description,...) __like_printf(3) __cold;
+
+       /** \brief adds an error message with the given type
+        *
+        * args needs to be initialized with va_start and terminated
+        * with va_end by the caller. msgSize is also an out-parameter
+        * in case the msgSize was not enough to store the complete message.
+        *
+        * \param type of the error message
+        * \param Description is the format string for args
+        * \param args list from a printf-like function
+        * \param msgSize is the size of the char[] used to store message
+        * \return true if the message was added, false if not - the caller
+        * should call this method again in that case
+        */
+       bool Insert(MsgType type, const char* Description,
+                        va_list &args, size_t &msgSize) __cold;
+
        /** \brief is an error in the list?
         *
         *  \return \b true if an error is included in the list, \b false otherwise
@@ -204,19 +255,55 @@ public:                                                                   /*{{{*/
         *  displayed or not.
         *
         *  \param[out] out output stream to write the messages in
-        *  \param WithoutNotice output notices or not
+        *  \param threshold minimim level considered
+         *  \param mergeStack 
         */
-       void DumpErrors(std::ostream &out, MsgType const &trashhold = WARNING);
+       void DumpErrors(std::ostream &out, MsgType const &threshold = WARNING,
+                       bool const &mergeStack = true);
 
        /** \brief dumps the list of messages to std::cerr
         *
         *  Note that all messages are discarded, also the notices
         *  displayed or not.
         *
-        *  \param WithoutNotice print notices or not
+        *  \param threshold minimum level printed
+        */
+       void inline DumpErrors(MsgType const &threshold) {
+               DumpErrors(std::cerr, threshold);
+       }
+
+        // mvo: we do this instead of using a default parameter in the
+        //      previous declaration to avoid a (subtle) API break for
+        //      e.g. sigc++ and mem_fun0
+       /** \brief dumps the messages of type WARNING or higher to std::cerr
+        *
+        *  Note that all messages are discarded, displayed or not.
+        *
         */
-       void inline DumpErrors(MsgType const &trashhold = WARNING) {
-               DumpErrors(std::cerr, trashhold);
+       void inline DumpErrors() {
+                DumpErrors(WARNING);
+       }
+
+       /** \brief put the current Messages into the stack
+        *
+        *  All "old" messages will be pushed into a stack to
+        *  them later back, but for now the Message query will be
+        *  empty and performs as no messages were present before.
+        *
+        * The stack can be as deep as you want - all stack operations
+        * will only operate on the last element in the stack.
+        */
+       void PushToStack();
+
+       /** \brief throw away all current messages */
+       void RevertToStack();
+
+       /** \brief merge current and stack together */
+       void MergeWithStack();
+
+       /** \brief return the deep of the stack */
+       size_t StackCount() const {
+               return Stacks.size();
        }
 
        GlobalError();
@@ -244,10 +331,15 @@ private:                                                          /*{{{*/
        std::list<Item> Messages;
        bool PendingFlag;
 
-       bool InsertErrno(MsgType type, const char* Function,
-                        const char* Description, va_list const &args);
-       bool Insert(MsgType type, const char* Description,
-                        va_list const &args);
+       struct MsgStack {
+               std::list<Item> const Messages;
+               bool const PendingFlag;
+
+               MsgStack(std::list<Item> const &Messages, bool const &Pending) :
+                        Messages(Messages), PendingFlag(Pending) {};
+       };
+
+       std::list<MsgStack> Stacks;
                                                                        /*}}}*/
 };
                                                                        /*}}}*/