@@ -1344,6 +1344,7 @@ def __init__(self,
1344
1344
"""
1345
1345
1346
1346
self ._closed = False
1347
+ self ._initialized = False
1347
1348
1348
1349
self ._reader = None
1349
1350
self ._own_stream = None
@@ -1399,6 +1400,8 @@ def __init__(self,
1399
1400
# Store the file to close it later
1400
1401
self ._backing_file = file
1401
1402
1403
+ self ._initialized = True
1404
+
1402
1405
except Exception as e :
1403
1406
if self ._own_stream :
1404
1407
self ._own_stream .close ()
@@ -1458,6 +1461,8 @@ def __init__(self,
1458
1461
)
1459
1462
1460
1463
self ._backing_file = file
1464
+
1465
+ self ._initialized = True
1461
1466
except Exception as e :
1462
1467
if self ._own_stream :
1463
1468
self ._own_stream .close ()
@@ -1509,12 +1514,10 @@ def __init__(self,
1509
1514
)
1510
1515
)
1511
1516
1517
+ self ._initialized = True
1518
+
1512
1519
def __enter__ (self ):
1513
1520
self ._ensure_valid_state ()
1514
-
1515
- if not self ._reader :
1516
- raise C2paError ("Invalid Reader when entering context" )
1517
-
1518
1521
return self
1519
1522
1520
1523
def __exit__ (self , exc_type , exc_val , exc_tb ):
@@ -1532,10 +1535,12 @@ def _ensure_valid_state(self):
1532
1535
"""Ensure the reader is in a valid state for operations.
1533
1536
1534
1537
Raises:
1535
- C2paError: If the reader is closed or invalid
1538
+ C2paError: If the reader is closed, not initialized, or invalid
1536
1539
"""
1537
1540
if self ._closed :
1538
1541
raise C2paError (Reader ._ERROR_MESSAGES ['closed_error' ])
1542
+ if not self ._initialized :
1543
+ raise C2paError ("Reader is not properly initialized" )
1539
1544
if not self ._reader :
1540
1545
raise C2paError (Reader ._ERROR_MESSAGES ['closed_error' ])
1541
1546
@@ -1585,6 +1590,9 @@ def _cleanup_resources(self):
1585
1590
finally :
1586
1591
self ._backing_file = None
1587
1592
1593
+ # Reset initialized state after cleanup
1594
+ self ._initialized = False
1595
+
1588
1596
except Exception :
1589
1597
# Ensure we don't raise exceptions during cleanup
1590
1598
pass
@@ -2079,6 +2087,7 @@ def __init__(self, manifest_json: Any):
2079
2087
C2paError.Json: If the manifest JSON cannot be serialized
2080
2088
"""
2081
2089
self ._closed = False
2090
+ self ._initialized = False
2082
2091
self ._builder = None
2083
2092
2084
2093
if not isinstance (manifest_json , str ):
@@ -2108,6 +2117,8 @@ def __init__(self, manifest_json: Any):
2108
2117
)
2109
2118
)
2110
2119
2120
+ self ._initialized = True
2121
+
2111
2122
@classmethod
2112
2123
def from_json (cls , manifest_json : Any ) -> 'Builder' :
2113
2124
"""Create a new Builder from a JSON manifest.
@@ -2150,16 +2161,19 @@ def from_archive(cls, stream: Any) -> 'Builder':
2150
2161
raise C2paError (error )
2151
2162
raise C2paError ("Failed to create builder from archive" )
2152
2163
2164
+ builder ._initialized = True
2153
2165
return builder
2154
2166
2155
2167
def _ensure_valid_state (self ):
2156
2168
"""Ensure the builder is in a valid state for operations.
2157
2169
2158
2170
Raises:
2159
- C2paError: If the builder is closed or invalid
2171
+ C2paError: If the builder is closed, not initialized, or invalid
2160
2172
"""
2161
2173
if self ._closed :
2162
2174
raise C2paError (Builder ._ERROR_MESSAGES ['closed_error' ])
2175
+ if not self ._initialized :
2176
+ raise C2paError ("Builder is not properly initialized" )
2163
2177
if not self ._builder :
2164
2178
raise C2paError (Builder ._ERROR_MESSAGES ['closed_error' ])
2165
2179
@@ -2187,6 +2201,9 @@ def _cleanup_resources(self):
2187
2201
pass
2188
2202
finally :
2189
2203
self ._builder = None
2204
+
2205
+ # Reset initialized state after cleanup
2206
+ self ._initialized = False
2190
2207
except Exception :
2191
2208
# Ensure we don't raise exceptions during cleanup
2192
2209
pass
@@ -2219,10 +2236,6 @@ def close(self):
2219
2236
2220
2237
def __enter__ (self ):
2221
2238
self ._ensure_valid_state ()
2222
-
2223
- if not self ._builder :
2224
- raise C2paError ("Invalid Builder when entering context" )
2225
-
2226
2239
return self
2227
2240
2228
2241
def __exit__ (self , exc_type , exc_val , exc_tb ):
@@ -2327,8 +2340,7 @@ def add_ingredient_from_stream(
2327
2340
C2paError.Encoding: If the ingredient JSON or format
2328
2341
contains invalid UTF-8 characters
2329
2342
"""
2330
- if not self ._builder :
2331
- raise C2paError (Builder ._ERROR_MESSAGES ['closed_error' ])
2343
+ self ._ensure_valid_state ()
2332
2344
2333
2345
try :
2334
2346
ingredient_str = ingredient_json .encode ('utf-8' )
@@ -2413,8 +2425,7 @@ def to_archive(self, stream: Any) -> None:
2413
2425
Raises:
2414
2426
C2paError: If there was an error writing the archive
2415
2427
"""
2416
- if not self ._builder :
2417
- raise C2paError (Builder ._ERROR_MESSAGES ['closed_error' ])
2428
+ self ._ensure_valid_state ()
2418
2429
2419
2430
with Stream (stream ) as stream_obj :
2420
2431
result = _lib .c2pa_builder_to_archive (
@@ -2452,8 +2463,7 @@ def _sign_internal(
2452
2463
Raises:
2453
2464
C2paError: If there was an error during signing
2454
2465
"""
2455
- if not self ._builder :
2456
- raise C2paError (Builder ._ERROR_MESSAGES ['closed_error' ])
2466
+ self ._ensure_valid_state ()
2457
2467
2458
2468
# Validate signer pointer before use
2459
2469
if not signer or not hasattr (signer , '_signer' ) or not signer ._signer :
0 commit comments