1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements.  See the NOTICE file distributed with
4  * this work for additional information regarding copyright ownership.
5  * The ASF licenses this file to You under the Apache License, Version 2.0
6  * (the "License"); you may not use this file except in compliance with
7  * the License.  You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 #ifndef _LOG4CXX_HELPERS_OBJECTOUTPUTSTREAM_H
19 #define _LOG4CXX_HELPERS_OBJECTOUTPUTSTREAM_H
20 
21 #include <log4cxx/helpers/objectimpl.h>
22 #include <log4cxx/mdc.h>
23 #include <log4cxx/helpers/outputstream.h>
24 #include <log4cxx/helpers/charsetencoder.h>
25 
26 namespace log4cxx
27 {
28 namespace helpers
29 {
30 /**
31  *  Emulates java serialization.
32  */
33 class LOG4CXX_EXPORT ObjectOutputStream : public ObjectImpl
34 {
35 	public:
36 		DECLARE_ABSTRACT_LOG4CXX_OBJECT(ObjectOutputStream)
37 		BEGIN_LOG4CXX_CAST_MAP()
38 		LOG4CXX_CAST_ENTRY(ObjectOutputStream)
39 		END_LOG4CXX_CAST_MAP()
40 
41 		ObjectOutputStream(OutputStreamPtr os, Pool& p);
42 		virtual ~ObjectOutputStream();
43 
44 		void close(Pool& p);
45 		void flush(Pool& p);
46 		void reset(Pool& p);
47 
48 		void writeObject(const LogString&, Pool& p);
49 		void writeUTFString(const std::string&, Pool& p);
50 		void writeObject(const MDC::Map& mdc, Pool& p);
51 		void writeInt(int val, Pool& p);
52 		void writeLong(log4cxx_time_t val, Pool& p);
53 		void writeProlog(const  char*   className,
54 			int        classDescIncrement,
55 			char*  bytes,
56 			size_t len,
57 			Pool&  p);
58 		void writeNull(Pool& p);
59 
60 		enum { STREAM_MAGIC     = 0xACED    };
61 		enum { STREAM_VERSION   = 5         };
62 		enum
63 		{
64 			TC_NULL         = 0x70,
65 			TC_REFERENCE    = 0x71,
66 			TC_CLASSDESC    = 0x72,
67 			TC_OBJECT       = 0x73,
68 			TC_STRING       = 0x74,
69 			TC_ARRAY        = 0x75,
70 			TC_CLASS        = 0x76,
71 			TC_BLOCKDATA    = 0x77,
72 			TC_ENDBLOCKDATA = 0x78,
73 			TC_RESET        = 0x79
74 		};
75 		enum
76 		{
77 			SC_WRITE_METHOD = 0x01,
78 			SC_SERIALIZABLE = 0x02
79 		};
80 
81 		void writeByte(char val, Pool& p);
82 		void writeBytes(const char* bytes, size_t len, Pool& p);
83 
84 	private:
85 		ObjectOutputStream(const ObjectOutputStream&);
86 		ObjectOutputStream& operator=(const ObjectOutputStream&);
87 
88 		OutputStreamPtr                     os;
89 		log4cxx::helpers::CharsetEncoderPtr utf8Encoder;
90 		const   unsigned int                        objectHandleDefault;
91 		unsigned int                        objectHandle;
92 		typedef std::map<std::string, unsigned int> ClassDescriptionMap;
93 		ClassDescriptionMap*                classDescriptions;
94 };
95 
96 LOG4CXX_PTR_DEF(ObjectOutputStream);
97 } // namespace helpers
98 
99 } //namespace log4cxx
100 
101 #endif //_LOG4CXX_HELPERS_OUTPUTSTREAM_H
102 
103